Причини появи помилок access denied (в доступі відмовлено) - документація mysql 4, 5 російською

Якщо при спробі підключення до сервера MySQL ви стикаєтеся з помилкою Access denied. то скористайтеся наведеними нижче списком. У ньому перераховані заходи, які можна вжити для вирішення цієї проблеми:

Запускали ви після інсталяції MySQL скрипт mysql_install_db для установки початкового вмісту таблиць привілеїв? Якщо немає, зробіть це. Зверніться до розділу Завдання початкових привілеїв MySQL. Перевірте початкові привілеї за допомогою наступної команди:

Підключення повинно відбутися без збою. Слід також переконатися, що в каталозі бази даних MySQL є файл user.MYD. Зазвичай він знаходиться в директорії PATH / var / mysql / user.MYD. де PATH - шлях до кореневого каталогу інсталяції MySQL.

Після нової інсталяції слід під'єднатися до сервера і створити користувачів, а також встановити для них права доступу:

Сервер дозволить під'єднання, тому що користувач MySQL з ім'ям користувача root початково не має пароля. Але в цьому полягає також і ризик порушення безпеки системи, тому при створенні інших користувачів MySQL, вам, крім іншого, слід задати пароль для користувача root. Якщо при спробі під'єднання від імені користувача root ви отримаєте наступну помилку:

це означає, що в таблиці user відсутній запис із значенням 'root' в стовпці User і mysqld не може визначити ім'я хоста для вашого клієнта. В цьому випадку необхідно перезапустити сервер з опцією --skip-grant-tables і відредагувати файл / etc / hosts або \ windows \ hosts. додавши в нього запис для вашого хоста.

Якщо ви зіткнетеся з такою помилкою, як:

це означає, що використовується невірний пароль. Зверніться до розділу Завдання паролів. Якщо ви забули пароль для користувача root. то запустіть mysqld з опцією --skip-grant-tables і змініть пароль. Зверніться до розділу Як перевстановити забутий пароль користувача root. Така помилка може з'являтися навіть в тому випадку, якщо ви не задавали пароля взагалі - це значить, що в якомусь файлі my.ini є невірний пароль. Зверніться до розділу Файли параметрів my.cnf. Скасувати використання файлів опцій можна за допомогою опції the --no-defaults. як показано нижче:

Запускали ви скрипт mysql_fix_privilege_tables при оновленні наявної інсталяції MySQL, якщо встановлена ​​версія - більш рання, ніж 3.22.11, а оновлюється вона до 3.22.11 або пізнішої? Якщо немає, зробіть це. Починаючи з MySQL 3.22.11, коли оператор GRANT став функціональним, структура таблиць привілеїв змінилася.

Якщо під час сеансу ваші привілеї змінилися, то, можливо, їх змінив привілейований користувач. Перезавантаження таблиць привілеїв відбивається не тільки на нових приєднаних клієнтів, але також на вже наявних, як це показано в розділі Коли зміни в привілеї вступають в силу.

Якщо не вдається домогтися, щоб пароль працював, пам'ятайте, що функція PASSWORD () повинна використовуватися, якщо ви задаєте пароль за допомогою операторів INSERT. UPDATE або SET PASSWORD. Якщо ж ви задаєте пароль за допомогою оператора GRANT. INDENTIFIED BY або команди mysqladmin password. функція PASSWORD () не потрібна. Зверніться до розділу Завдання паролів.

localhost - це синонім імені вашого локального хоста, і, якщо хост явно не заданий, також встановлюється за умовчанням ім'я хоста, до якого клієнти намагаються підключитися. Однак приєднання до localhost не діють, якщо в вашій робочій системі використовуються MIT-потоки і MySQL старше версії 3.23.27 (приєднання до localhost здійснюються з використанням сокетів Unix, а вони не підтримувалися тоді технологією MIT-потоків). Щоб в таких системах ця проблема не виникала, слід явно задати ім'я серверного хоста за допомогою опції --host. Таким чином буде встановлено підключення до сервера mysqld по протоколу TCP / IP. В цьому випадку в записах таблиці user. що зберігається на серверному хості, має бути зазначено реальне ім'я хоста. (Це справедливо навіть для тих випадків, коли клієнтська програма і сервер запускаються на одному хості).

Якщо при спробі підключення до бази даних за допомогою команди mysql -u user_name db_name виникає помилка Access denied. причина цього, можливо, криється в таблиці user. Щоб перевірити це, виконайте команду mysql -u root mysql і введіть наступний SQL-оператор:

В результаті буде виведена запис за допомогою стовпців Host і User. відповідними імені вашого комп'ютера і вашому імені користувача MySQL.

Повідомлення про помилку Access denied інформує вас про те, під яким ім'ям ви намагаєтеся увійти в систему, про ім'я хоста, з якого ви намагаєтеся встановити з'єднання, і про те, чи використовували ви при цьому пароль чи ні. Як правило, в таблиці user буде один запис, точно відповідна імені хоста і імені користувача, зазначеним в повідомленні про помилку. Наприклад, якщо ви отримаєте повідомлення про помилку, в якому сказано Using password: NO. це означає, що ви намагалися увійти в систему, не вказавши пароль.

Якщо при спробі підключення не за тим комп'ютером, на якому працює сервер MySQL, а з іншого, ви отримаєте повідомлення про помилку, наведене нижче, то в таблиці user відсутній рядок з таким ім'ям хоста:

У Linux причиною такої помилки може бути те, що бінарна версія MySQL скомпільована з версією glibc, відмінної від використовуваної вами. В цьому випадку потрібно буде або оновити ОС / glibc, використовувані вами, або завантажити вихідний код MySQL і скомпілювати сервер самостійно. Як правило, вихідний RPM компілюється і інсталюється елементарно, так що це не складе серйозної проблеми.

Спробуйте з'ясувати, що не так з вашим сервером DNS, і може бути несправною.

Запустіть mysqld з опцією --skip-name-resolve.

Запустіть mysqld з опцією --skip-host-cache.

Підключіться до localhost якщо ваш сервер і клієнт працюють на одному і тому ж комп'ютері.

Помістіть імена клієнтських машин в каталог / etc / hosts.

Якщо команда mysql -u user_name test працює успішно, а команда mysql -u user_name other_db_nam e - немає, то в таблиці db немає запису, що відповідає other_db_name.

Якщо команда mysql -u user_name db_name виконується успішно на тому комп'ютері, де встановлено сервер, а mysql -u host_name -u user_name db_name не працює при виконанні її на інший клієнтської машині, то в таблицях user або db ця клієнтська машина не зареєстрована.

Якщо не вдається з'ясувати причину помилки Access denied. видаліть з таблиці user всі записи, в яких значення в поле Host включає шаблонні символи (записи, що містять символи ''% '' або '' _ ''). Дуже поширеною помилкою є наступна: користувач вставляє новий запис із значенням '%' в поле Host і багатозначно 'some user' - в поле User. вважаючи, що після цього для під'єднання з тієї ж самої машини він зможе використовувати localhost. Такий розрахунок є невірним, і причина тут в тому, що встановлюються за замовчуванням привілеї включають запис із значенням 'localhost' в поле Host і порожнім полем User. І оскільки в цьому записі значення 'localhost' більш конкретно, ніж '%', то саме вона при приєднанні з localhost передує новому записі і, відповідно, буде обрана і спрацює! Правильним в цьому випадку буде вставити другий запис із значенням 'localhost' в поле Host і значенням 'some_user' - в поле User або видалити запис зі значенням 'localhost' в поле Host і порожнім полем User.

Якщо ви отримаєте наступну помилку, то ця проблема, можливо, пов'язана з таблицею db або таблицею host:

Якщо в запису, вибраної з таблиці db. стовпець Host - порожній, упевніться, що в таблиці host є принаймні одна відповідний запис, яка вказує, до яких хостам відноситься запис з таблиці db. Якщо помилка виникає при виконанні SQL-команди SELECT. INTO OUTFILE або LOAD DATA INFILE. то у вашій записи з таблиці user. ймовірно, відсутній дозвіл на надання привілеї FILE.

Пам'ятайте, що клієнтські програми будуть використовувати параметри під'єднання, зазначені файлах конфігурації або змінних оточення. Зверніться до розділу Змінні оточення. Якщо є підозра, що клієнт відсилає невірні встановлюються за замовчуванням параметри під'єднання, в разі, коли ви не задаєте їх в командному рядку, перевірте ваше оточення і файл my.cnf в своїй домашній директорії. Можете також перевірити конфігураційні файли MySQL відносяться до все системі, хоча параметри клієнтського підключення навряд чи вказані саме тут. Зверніться до розділу Файли параметрів my.cnf. Якщо помилка Access denied виникає при виконанні вашої клієнтської програми без будь-яких опцій, переконайтеся, що ні в одному з ваших файлів опцій не вказано старий пароль! Зверніться до розділу Файли параметрів my.cnf.

Якщо ви вносите зміни в таблиці привілеїв безпосередньо (за допомогою операторів INSERT або UPDATE), а ваші зміни, схоже, ігноруються, то слід видати оператор FLUSH PRIVILEGES або виконати команду mysqladmin flush-privileges - для того, щоб змусити сервер перечитати таблиці привілеїв. В іншому випадку ваші зміни вступлять в силу лише при подальшому перезапуску сервера. Пам'ятайте, що після того, як ви задасте пароль від імені користувача, вам потрібно буде вказувати його тільки після скидання привілеїв, тому що сервера ще не буде відомо про те, що ви змінили пароль!

При виникненні проблеми з доступом при використанні Perl-, PHP-, Python- або ODBC-програм, спробуйте встановити з'єднання з сервером за допомогою команди mysql -u user_name db_name або команди mysql -u user_name -pyour_pass db_name. Якщо ваш клієнт mysql забезпечує під'єднання, то проблема пов'язана не з привілеями доступу, а з вашою програмою. (Зауважимо, що між -p і паролем пробілу немає; для завдання пароля можна також використовувати синтаксичну структуру --password = your_pass. Якщо ви використовуєте тільки саму опцію -p. MySQL запросить у вас пароль)

При тестуванні запускайте демон mysqld з опцією --skip-grant-tables. Тоді ви зможете змінювати таблиці привілеїв MySQL і за допомогою скрипта mysqlaccess перевіряти, справили чи зроблені вами зміни бажаний ефект. Якщо результати вас влаштовують, виконайте команду mysqladmin flush-privileges. щоб наказати сервера mysqld приступити до використання нових таблиць привілеїв. Увага. перезавантаження таблиць привілеїв скасовує опцію --skip-grant-tables. Це дозволяє змусити сервер приступити до використання нових таблиць привілеїв без завершення його роботи і перезавантаження.

Якщо нічого не допомагає, запустіть демон mysqld daemon з опцією налагодження (наприклад --debug = d, general, query). В результаті буде виведено інформацію про невдалі під'єднання, з зазначенням хоста і користувача, а також про всі оброблених командах. Зверніться до розділу Створення файлів трасувань.

Якщо у вас є яка-небудь проблема з таблицями привілеїв MySQL і ви вважаєте, що необхідно повідомити про неї в список розсилки, потрібно обов'язково прикласти до свого звіту роздруківку таблиць привілеїв MySQL. Це можна зробити за допомогою команди mysqldump mysql. Звіт про проблему, як і в інших випадках, відправляється за допомогою скрипта mysqlbug. Зверніться до розділу Як відправляти звіти про помилки або проблеми. У деяких випадках для виконання скрипта mysqldump можливо, буде потрібно перезавантажити mysqld з опцією --skip-grant-tables.