Если при попытке подсоединения к серверу 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 tes
t приводит к ошибкеAccess denied
, то, возможно, в таблицеuser
имя вашего хоста указано неверно. Одна из распространенных проблем здесь заключается в том, что в полеHost
записи, хранящейся в таблицеuser
, задается только имя хоста, в то время как процедуры разрешения имен, используемые вашей системой, возвращают полностью определенное доменное имя (или наоборот). Например, если в таблице user имеется запись со значением'tcx'
в полеhost
, а DNS при этом сообщает MySQL, что имя хоста -'tcx.subnet.se'
, эта запись действовать не будет. Попробуйте добавить в таблицуuser
запись, указав в колонкеHost
IP-адрес хоста. (В качестве альтернативы можно добавить в таблицуuser
запись со значением в полеHost
, содержащим шаблонный символ, например'tcx.%'
. Но использовать имена хостов, оканчивающиеся на'%'
- небезопасно и делать это не рекомендуется!)Если команда
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
: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
. Это позволяет заставить сервер приступить к использованию новых таблиц привилегий без завершения его работы и перезагрузки.Если ничего не помогает, запустите демон
mysqld
daemon с опцией отладки (например--debug=d,general,query
). В результате будет выведена информация о неудачных подсоединениях, с указанием хоста и пользователя, а также обо всех обработанных командах. Обратитесь к разделу See Раздел D.1.2, «Создание трассировочных файлов».Если у вас имеется какая-либо проблема с таблицами привилегий MySQL и вы полагаете, что необходимо сообщить о ней в список рассылки, нужно обязательно приложить к своему отчету распечатку таблиц привилегий MySQL. Это можно сделать с помощью команды
mysqldump mysql
. Отчет о проблеме, как и в других случаях, отправляется с помощью скриптаmysqlbug
. Обратитесь к разделу See Раздел 1.8.1.3, «Как отправлять отчеты об ошибках или проблемах». В некоторых случаях для выполнения скриптаmysqldump
возможно, потребуется перезапуститьmysqld
с опцией--skip-grant-tables
.