4.2.11 Причины появления ошибок Access denied
("в доступе отказано")
Если при попытке подсоединения к серверу MySQL вы сталкиваетесь с ошибкой
Access denied
, то воспользуйтесь приведенным ниже списком. В нем
перечислены меры, которые можно принять для решения этой проблемы:
-
Запускали ли вы после инсталляции MySQL скрипт
mysql_install_db
для
установки начального содержимого таблиц привилегий? Если нет, сделайте
это. Обратитесь к разделу See section 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 section 4.3.7 Задание паролей. Если вы забыли пароль для пользователя root
, то
перезапустите mysqld
с опцией --skip-grant-tables
и измените пароль.
Обратитесь к разделу See section A.4.2 Как переустановить забытый пароль пользователя root
. Такая
ошибка может появляться даже в том случае, если вы не задавали пароля
вообще - это значит, что в каком-то файле `my.ini' имеется неверный пароль.
Обратитесь к разделу See section 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 section 4.3.3 Когда изменения в привилегиях вступают в силу.
-
Если не удается добиться, чтобы пароль работал, помните, что функция
PASSWORD()
должна использоваться, если вы задаете пароль с помощью
операторов INSERT
, UPDATE
или SET PASSWORD
. Если же вы задаете пароль
с помощью оператора GRANT ... INDENTIFIED BY
или команды mysqladmin
passwor
d, функция PASSWORD()
не нужна. Обратитесь к разделу See section 4.3.7 Задание паролей.
-
localhost
- это синоним имени вашего локального хоста, и, если хост
явно не задан, также устанавливаемое по умолчанию имя хоста, к
которому клиенты пытаются подключиться. Однако подсоединения к
localhost
не действуют, если в вашей рабочей системе используются
MIT-потоки (подсоединения к 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 section 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 section F Переменные окружения. Если есть подозрение, что
клиент отсылает неверные устанавливаемые по умолчанию параметры
подсоединения, в случае, когда вы не задаете их в командной строке,
проверьте ваше окружение и файл `my.cnf' в своей домашней директории.
Можете также проверить конфигурационные файлы MySQL относящиеся ко все
системе, хотя параметры клиентского подсоединения вряд ли указаны
именно здесь. Обратитесь к разделу See section 4.1.2 Файлы параметров `my.cnf'. Если ошибка
Access denied
возникает при
выполнении вашей клиентской программы без каких-либо опций, убедитесь,
что ни в одном из ваших файлов опций не указан старый пароль!
Обратитесь к разделу See section 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 section E.1.2 Создание трассировочных файлов.
-
Если у вас имеется какая-либо проблема с таблицами привилегий MySQL и
вы полагаете, что необходимо сообщить о ней в список рассылки, нужно
обязательно приложить к своему отчету распечатку таблиц привилегий
MySQL. Это можно сделать с помощью команды
mysqldump mysql
. Отчет о
проблеме, как и в других случаях, отправляется с помощью скрипта
mysqlbug
. Обратитесь к разделу See section 1.8.1.3 Как отправлять отчеты об ошибках или проблемах. В некоторых случаях для выполнения скрипта mysqldump
возможно,
потребуется перезапустить mysqld
с опцией --skip-grant-tables
.
Add your own comment.