Если при попытке подсоединения к серверу MySQL вы сталкиваетесь с ошибкой
Access denied, то воспользуйтесь приведенным ниже списком. В нем
перечислены меры, которые можно принять для решения этой проблемы:
-
Запускали ли вы после инсталляции MySQL скрипт
mysql_install_dbдля установки начального содержимого таблиц привилегий? Если нет, сделайте это. Обратитесь к разделу See Раздел 4.3.4, «Задание изначальных привилегий MySQL». Проверьте первоначальные привилегии с помощью следующей команды:shell> mysql -u root test
Подсоединение должно произойти без сбоя. Следует также убедиться, что в каталоге базы данных MySQL имеется файл
user.MYD. Обычно он находится в директорииPATH/var/mysql/user.MYD, гдеPATH- путь к корневому каталогу инсталляции MySQL. -
После новой инсталляции следует подсоединиться к серверу и создать пользователей, а также установить для них права доступа:
shell> mysql -u root mysql
Сервер разрешит подсоединение, т.к. пользователь MySQL с именем пользователя
rootисходно не имеет пароля. Но в этом заключается также и риск нарушения безопасности системы, поэтому при создании остальных пользователей MySQL, вам, помимо прочего, следует задать пароль для пользователяroot. Если при попытке подсоединения от имени пользователя root вы получите следующую ошибку:Access denied for user: '@unknown' to database mysql
это означает, что в таблице
userотсутствует запись со значением'root'в столбцеUserиmysqldне может определить имя хоста для вашего клиента. В этом случае необходимо перезапустить сервер с опцией--skip-grant-tablesи отредактировать файл/etc/hostsили\windows\hosts, добавив в него запись для вашего хоста. -
Если вы столкнетесь с такой ошибкой, как:
shell> mysqladmin -u root -pxxxx ver Access denied for user: 'root@localhost' (Using password: YES)
это означает, что используется неверный пароль. Обратитесь к разделу See Раздел 4.3.7, «Задание паролей». Если вы забыли пароль для пользователя
root, то перезапуститеmysqldс опцией--skip-grant-tablesи измените пароль. Обратитесь к разделу See Раздел A.4.2, «Как переустановить забытый пароль пользователяroot». Такая ошибка может появляться даже в том случае, если вы не задавали пароля вообще - это значит, что в каком-то файлеmy.iniимеется неверный пароль. Обратитесь к разделу See Раздел 4.1.2, «Файлы параметровmy.cnf». Отменить использование файлов опций можно с помощью опции the--no-defaults, как показано ниже:shell> mysqladmin --no-defaults -u root ver
-
Запускали ли вы скрипт
mysql_fix_privilege_tablesпри обновлении имеющейся инсталляции MySQL, если установленная версия - более ранняя, чем 3.22.11, а обновляется она до 3.22.11 или более поздней? Если нет, сделайте это. Начиная с MySQL 3.22.11, когда операторGRANTстал функциональным, структура таблиц привилегий изменилась. Если во время сеанса ваши привилегии изменились, то, возможно, их изменил суперпользователь. Перезагрузка таблиц привилегий отражается не только на новых подсоединениях клиентов, но также на уже имеющихся, как это показано в разделе See Раздел 4.3.3, «Когда изменения в привилегиях вступают в силу».
Если не удается добиться, чтобы пароль работал, помните, что функция
PASSWORD()должна использоваться, если вы задаете пароль с помощью операторовINSERT,UPDATEилиSET PASSWORD. Если же вы задаете пароль с помощью оператораGRANT ... INDENTIFIED BYили командыmysqladmin password, функцияPASSWORD()не нужна. Обратитесь к разделу See Раздел 4.3.7, «Задание паролей».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-оператор:mysql> SELECT * FROM user;
В результате будет выведена запись со столбцами
HostиUser, соответствующими имени вашего компьютера и вашему имени пользователя MySQL. Сообщение об ошибке
Access deniedинформирует вас о том, под каким именем вы пытаетесь войти в систему, об имени хоста, с которого вы пытаетесь установить соединение, и о том, использовали ли вы при этом пароль или нет. Как правило, в таблицеuserбудет одна запись, точно соответствующая имени хоста и имени пользователя, указанным в сообщении об ошибке. Например, если вы получите сообщение об ошибке, в котором сказаноUsing password: NO, это означает, что вы пытались войти в систему, не указав пароль.-
Если при попытке подсоединения не с того компьютера, на котором работает сервер MySQL, а с другого, вы получите сообщение об ошибке, приведенное ниже, то в таблице
userотсутствует строка с таким именем хоста:Host ... is not allowed to connect to this MySQL server
Чтобы исправить эту ошибку, с помощью утилиты командной строки
mysql(на серверном хосте!) добавьте строку в таблицуuser,dbилиhostс комбинацией имени пользователя/хоста, соответствующей той, которую вы используете при попытке подсоединения. Затем выполните командуmysqladmin flush-privileges. Если вы используете MySQL версии, отличной от Version 3.22, и вам неизвестно имя хоста или IP-адрес компьютера, с которого вы подсоединяетесь, введите в таблицу user запись со значением'%'в полеHostи перезапуститеmysqldна серверной машине с опцией--log. Когда соединение с клиентской машины будет установлено, вы найдете в журнале регистрации MySQL информацию об имени хоста, с которого вы подсоединились. (После этого следует заменить в записи таблицыuserзначение'%'настоящим именем хоста, из журнала регистрации. Иначе ваша система останется незащищенной.)В Linux причиной такой ошибки может быть то, что бинарная версия MySQL скомпилирована с версией glibc, отличной от используемой вами. В этом случае нужно будет либо обновить ОС/glibc, используемые вами, либо загрузить исходный код MySQL и скомпилировать сервер самостоятельно. Как правило, исходный RPM компилируется и инсталлируется элементарно, так что это не составит серьезной проблемы.
-
Если будет выдано сообщение об ошибке, в котором имя хоста не указано вообще или указан IP-адрес, хотя вы при попытке подсоединения указывали имя хоста:
shell> mysqladmin -u root -pxxxx -h some-hostname ver Access denied for user: 'root@' (Using password: YES)
то это означает, что ошибка возникает при попытке MySQL сопоставить IP-адрес с именем хоста. В этом случае вы можете выполнить команду
mysqladmin flush-hosts, чтобы сбросить внутреннюю кэш-память DNS. Обратитесь к разделу See Раздел 5.5.5, «Как MySQL использует DNS». Вот некоторые способы решения этой проблемы:Попробуйте выяснить, что не так с вашим сервером DNS, и устраните неисправность.
Задайте IP-адреса вместо имен хостов таблицах привилегий MySQL.
Запустите
mysqldс опцией--skip-name-resolve.Запустите
mysqldс опцией--skip-host-cache.Подключитесь к
localhostесли ваш сервер и клиент работают на одном и том же компьютере.Поместите имена клиентских машин в каталог
/etc/hosts.
Если команда
mysql -u root testработает успешно, а командаmysql -h your_hostname -u root test приводит к ошибкеAccess denied, то, возможно, в таблицеuserимя вашего хоста указано неверно. Одна из распространенных проблем здесь заключается в том, что в полеHostзаписи, хранящейся в таблицеuser, задается только имя хоста, в то время как процедуры разрешения имен, используемые вашей системой, возвращают полностью определенное доменное имя (или наоборот). Например, если в таблице user имеется запись со значением'tcx'в полеhost, а DNS при этом сообщает MySQL, что имя хоста -'tcx.subnet.se', эта запись действовать не будет. Попробуйте добавить в таблицуuserзапись, указав в колонкеHostIP-адрес хоста. (В качестве альтернативы можно добавить в таблицуuserзапись со значением в полеHost, содержащим шаблонный символ, например'tcx.%'. Но использовать имена хостов, оканчивающиеся на'%'- небезопасно и делать это не рекомендуется!)Если команда
mysql -u user_name testработает успешно, а командаmysql -u user_name other_db_name - нет, то в таблице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:Access to database denied
Если в записи, выбранной из таблицы
db, столбецHost- пустой, удостоверьтесь, что в таблицеhostимеется по крайней мере одна соответствующая запись, указывающая, к каким хостам относится запись из таблицыdb. Если ошибка возникает при выполнении SQL-командыSELECT ... INTO OUTFILEилиLOAD DATA INFILE, то в вашей записи из таблицыuser, вероятно, отсутствует разрешение на предоставление привилегииFILE. Помните, что клиентские программы будут использовать параметры подсоединения, указанные файлах конфигурации или переменных окружения. Обратитесь к разделу See Приложение E, Переменные окружения. Если есть подозрение, что клиент отсылает неверные устанавливаемые по умолчанию параметры подсоединения, в случае, когда вы не задаете их в командной строке, проверьте ваше окружение и файл
my.cnfв своей домашней директории. Можете также проверить конфигурационные файлы MySQL относящиеся ко все системе, хотя параметры клиентского подсоединения вряд ли указаны именно здесь. Обратитесь к разделу See Раздел 4.1.2, «Файлы параметровmy.cnf». Если ошибкаAccess deniedвозникает при выполнении вашей клиентской программы без каких-либо опций, убедитесь, что ни в одном из ваших файлов опций не указан старый пароль! Обратитесь к разделу See Раздел 4.1.2, «Файлы параметров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. Это позволяет заставить сервер приступить к использованию новых таблиц привилегий без завершения его работы и перезагрузки.Если ничего не помогает, запустите демон
mysqlddaemon с опцией отладки (например--debug=d,general,query). В результате будет выведена информация о неудачных подсоединениях, с указанием хоста и пользователя, а также обо всех обработанных командах. Обратитесь к разделу See Раздел D.1.2, «Создание трассировочных файлов».Если у вас имеется какая-либо проблема с таблицами привилегий MySQL и вы полагаете, что необходимо сообщить о ней в список рассылки, нужно обязательно приложить к своему отчету распечатку таблиц привилегий MySQL. Это можно сделать с помощью команды
mysqldump mysql. Отчет о проблеме, как и в других случаях, отправляется с помощью скриптаmysqlbug. Обратитесь к разделу See Раздел 1.8.1.3, «Как отправлять отчеты об ошибках или проблемах». В некоторых случаях для выполнения скриптаmysqldumpвозможно, потребуется перезапуститьmysqldс опцией--skip-grant-tables.