Что означает access denied. Причины появления ошибок Access denied ('в доступе отказано')

  • 29.04.2019
28 июля 2015 в 11:50

Дело о загадочном Access denied

  • Microsoft SQL Server

Утром в службу поддержки обратился один из разработчиков корпоративного приложения. Он не мог сделать копию с базы данных MS SQL Server, и просил выяснить причину ошибки.

Первое с чего стоит начать - проверить ошибку на воспроизводимость.
Попробуем снять копию командой:
BACKUP DATABASE TO DISK=N"\\FS1\Backup\sdb_full.bak" WITH COPY_ONLY

Что еще за COPY_ONLY?

WITH COPY_ONLY - очень полезный ключ. Он позволит не нарушить в системе резервного копирования последовательность дифференциальных копий

Действительно, попытка снять копию заканчивалась ошибкой:

Что может вызвать такую проблему?

SQL Server запускается от встроенной учетной записи «Network Service»

На всякий случай проверяем разрешение имени сервера FS1 по короткому имени и по FQDN. Оба имени разрешаются и, что важно, указывают на один и тот же сервер. Открываем сетевую папку, проверяем разрешения на NTFS и Share Permissions. Все в порядке, учетная запись сервера SQL1 имеет разрешение на запись.

Может быть проблемы с NTLM, Kerberos? Попробуем снять резервную копию, используя FQDN сервера.

BACKUP DATABASE TO DISK=N"\\FS1.contoso.test\Backup\sdb_full.bak" WITH COPY_ONLY

Интересно. С использованием FQDN резервная копия успешно создалась. Что это значит? Разве что ситуация стала еще более запутанной.

SQL Server перезапускать в рабочее время нельзя. Оставаться в ночь не хотелось бы.

Когда ничего непонятно, лучший друг администратора - Wireshark или Microsoft Network Monitor. Если снять хороший дамп, то можно или разобраться, или уж запутаться так запутаться.

Ставить на ответственный сервер Microsoft Network Monitor теоретически безопасное мероприятие, но жизнь так часто вносит коррективы в самые безопасные начинания.

Перезагружаться нельзя, ставить монитор нежелательно. Тогда воспользуемся службой Windows Event Tracing .

Включили трассировку:
netsh trace start persistent=yes capture=yes tracefile=c:\temp\trace.etl
Повторили команду резервного копирования несколько раз:
BACKUP DATABASE TO DISK=N"\\FS1\Backup\sdb_full.bak" WITH COPY_ONLY BACKUP DATABASE TO DISK=N"\\FS1\Backup\sdb_full.bak" WITH COPY_ONLY BACKUP DATABASE TO DISK=N"\\FS1\Backup\sdb_full.bak" WITH COPY_ONLY
Остановили трассировку:
netsh trace stop

Открываем файл в Microsoft Network Monitor на рабочей станции администратора:

Каждый раз при попытке снятия копии появляется событие KDC_ERR_PREAUTH_REQUIRED с загадочным пользователем DBAdmin. Это не учетная запись сотрудника, администратора, под ней не запускается SQL Server.
KDC_ERR_PREAUTH_REQUIRED означает, что учетные данные неверны.

Но резервное копирование выполняется в контексте службы «MS SQL Server», а она запущена под «Network Service». Причем здесь DBAdmin?

В Windows есть «Диспетчер учетных данных», он же «Credentials Manager», позволяющий сохранять учетные данные для различных сетевых ресурсов. Его можно вызвать командой «control userpasswords2» или «netplwiz»:

Давайте проверим, нет ли в контексте учетной записи компьютера «SQL1\Network Service» сохраненных альтернативных учетных данных для сервера FS1.

Для того, чтобы запустить процесс от имени другого пользователя, воспользуемся psexec.

Если запустить psexec с ключем "-s", мы попадем в контекст «Local System». Не подойдет.

Для того, чтобы попасть в контекст «Network Service» запускаем утилиту со следующими ключами:
psExec.exe -i -u “nt authority\network service” cmd.exe

Проверим, повторяется ли в контексте «Network Service» ошибка Access Denied при обращении к серверу FS1:

Ошибка воспроизводится.

Проверим сохраненные учетные данные. Запустить «control userpasswords2» без колдовства с Explorer не получится. Да и не надо, для работы с «Credentials Manager» из командной строки есть утилита cmdkey.exe.

Для того, чтобы вывести сохраненные учетные данные выполним команду:
cmdkey /list

Никаких сохраненных учетных данных не обнаружено. Еще интереснее.

Итак, что мы знаем на текущий момент:

  1. В контексте учетной записи компьютера «SQL1\Network Service» при обращении по протоколу SMB к серверу FS1 возвращается ошибка Access Denied
  2. При обращении к серверу по FQDN FS1.contoso.test ошибка не возвращается
  3. Обращение к серверу FS1 происходит с использованием учетной записи DBAdmin, которая нигде в явном виде не используется
  4. В контексте «SQL1\Network Service» в Credentials Manager учетные данные не сохранялись
Подождите, а ведь учетные данные можно сохранить не только в Credentials Manager, но и в памяти службы «Lanman Workstation» .

Если подключить диск с параметром /savecred, то учетные данные сохранятся в Credentials Manager:

Net use \\FS1\Backup /persistent:yes /savecred
Если опустить параметр /savecred, то учетные данные сохранятся в памяти службы до перезагрузки
net use \\FS1\Backup /persistent:yes /user:DBAdmin
Проверим нет ли у нас сохраненных подключений:
net use

Есть! Теперь понятно, почему при обращении к FS1 возвращалась ошибка, а к FS1.contoso.test - нет.

Удалим сохраненные подключения:

Net use * /delete

Проверяем резервное копирование:

Проблема решена.

А в чем же было дело? Причина ошибки весьма нетривиальна. Внутри корпоративного приложения от имени SQL Server был подключен сетевой диск под пользователем DBAdmin, который из-за ошибки в приложении не был в дальнейшем отключен. Спустя некоторое время у пользователя DBAdmin, вероятно сменился пароль, или сервер был перезагружен. И вот он, загадочный Access denied!

Какие для себя можно сделать выводы?

  1. Когда вы выполняете резервное копирование SQL Server, обращение к сетевым ресурсам производится от имени учетной записи службы SQL Server, а не от пользователя, запустившего команду BACKUP DATABASE. Следует помнить об этом, настраивая разрешения.
  2. Всегда снимайте дополнительные полные резервные копии с ключом WITH COPY_ONLY. SQL Server помечает страницы данных, измененные после полного резервного копирования, и в дифференциальную копию попадают только измененные страницы. Логично, что после каждого полного резервного копирования, состояние страниц очищается. Ключ позволяет не очищать отметку страниц, и последовательность не будет нарушена.
  3. В случае ошибки «Access denied» не лишним будет проверить, повторяется ли ошибка и по имени узла, по FQDN, по IP адресу.
  4. Вы можете попасть в контекст безопасности нужной учетной записи, запустив psexec с ключем -U.
  5. Для вывода учетных данных из службы хранения ключей используется утилита cmdkey.
  6. Для вывода сохраненных подключенных сетевых подключений используйте команду net use.

Спасибо за внимание.

ERR_NETWORK_ACCESS_DENIED — это очередная ошибка в Google Chrome, которая указывает на то, что не удалось зайти на запрашиваемый сайт, так как браузеру было отказано в доступе. Чаще всего, данная проблема возникает, когда какое-то программное обеспечение начинает блокировать создание сетевого подключения. Вспомните все недавно установленные приложения, так как именно они и могут производить блокировку.

Также это могло произойти в результате работы вашего антивирусного программного обеспечения или же фаервола, который начал блокировать определенные сетевые подключения. Так или иначе сейчас мы попытаемся исправить ошибку ERR_NETWORK_ACCESS_DENIED в Google Chrome.

Методы решения ERR_NETWORK_ACCESS_DENIED

Метод №1 Проверка работающего ПО на вашем компьютере

Попробуйте открыть нужные вам ресурсы с помощью какого-то иного браузера, например, Internet Explorer или Firefox. Если все открывается как надо, то что-то очевидно блокирует ваше сетевое подключение. Скорее всего, в ошибке ERR_NETWORK_ACCESS_DENIED виноват ваш Брандмауэр Windows.

Все что вам нужно сделать, так это пройти в настройки своего фаервола и посмотреть на правила сетевых подключений. Убедитесь, что там нет никаких настроек, которые бы были выставлены на блокировку вашего браузера.

Метод №2 Проверка сетевого соединения или роутера

Очередной причиной проблемы в виде ошибки ERR_NETWORK_ACCESS_DENIED может стать непосредственно неполадки с сетевым подключением или же с роутером, если вы используете таковой.

Порой в операционной системе могут происходить какие-то изменения, которые приводят к таким вот сложностям с соединением. Зайдите в настройки подключения и проверьте, стоят ли еще ваши прежние настройки.

Если же вы используете роутер, то просто попробуйте его перезапустить. Наиболее часто проблема заключается именно в некорректной работе роутера. Также проблема может заключаться в вашем провайдере и неполадки возникли с его стороны, но тут уж вам сделать ничего не удастся.

Метод №3 Удаление профиля Google Chrome

Два предыдущие метода можно было считать больше за какие-то советы, что, отчасти, так и есть. В случае третьего метода, вам понадобиться удалить свой профиль для для браузера, так как именно он и может являться причиной ошибки ERR_NETWORK_ACCESS_DENIED в Google Chrome. Для этого сделайте следующее:

  • Нажмите Win+R для открытия окна «Выполнить».
  • Впишите в пустую строку %LOCALAPPDATA%\Google\Chrome\User Data\ или %USERPROFILE%\Local Settings\Application Data\Google\Chrome\User Data\ (если вы пользователь Windows XP).
  • Найдите папку под названием Default и переименуйте ее в папку default.old .

Если все дело заключалось в некорректных настройках вашего профиля, то это поможет исправить ошибку ERR_NETWORK_ACCESS_DENIED.

При работе с системой MySQL могут возникнуть самые разные ошибки, и на этапе освоения программы разобраться с ними может быть сложно. Одна из наиболее распространенных проблем - ошибка 1045, которая сопровождается сообщением Access denied for user ‘root’@’localhost’ (Using password: YES и NO) . Сегодня я расскажу, как ее исправить.

Понять суть проблемы можно, переведя сообщение об ошибке на русский язык. Означает оно, что пользователю с именем root на машине localhost запрещен доступ к БД при использовании пароля или без него .

Ошибка 1045 возникает из-за запрета доступа к базе данных

Причины ошибки Access denied for user ‘root’@’localhost’

Чтобы свободно получить доступ в MySQL, должно совпасть три параметра, описывающих пользователя базы данных - имя, название машины и пароль . Если есть какие-то несовпадения, доступ будет запрещен. Самая простая причина проблемы - неправильный ввод пароля. Кроме этого, вызывать ошибку может неправильный синтаксис.

В системе MySQL нет простой зависимости имя пользователя – пароль, название хоста играет важную роль в получении доступа к БД. Оно может иметь вид IP-адреса, доменного имени, ключевого слова (например, localhost) или символа, объединяющего несколько машин в группу (например, % - любой хост, кроме локального).

Ошибка имеет ключ (Using password: NO) при входе в БД через браузер

Наиболее распространенные ошибки при обращении к БД:

  1. При присвоении прав новому пользователю не был указан адрес машины, с которой он может подключаться. В таком случае ему автоматически будет разрешено пользоваться БД с любого хоста, кроме локального, и при попытке подключения с localhost возникнет ошибка доступа.
  2. Неправильно расставленные кавычки. Если при создании пользователя написать ‘username@localhost’, это будет значить, что username@localhost может подключаться с любой машины, кроме локальной, а не что username может подключаться с компьютера localhost. Логин пользователя и имя машины должны иметь свою пару кавычек.
  3. Использование пароля при его отсутствии в базе данных.

В зависимости от того, при каком способе подключения к БД возникает ошибка Access denied for user ‘root’@’localhost’ (Using password: YES или NO), используются разные методы решения проблемы.

Как исправить ошибку 1045 в MySQL

Если ошибка Access denied for user ‘root’@’localhost’ (Using password: YES и NO) появляется с указанием Using password: YES, проблема заключается в неправильном вводе пароля. Проверить это можно, открыв таблицу mysql.user, в которой хранятся данные обо всех пользователях.

В таблице mysql.user хранятся данные для входа пользователей

Порядок действий таков:

  1. Откройте таблицу пользователей.
  2. Проверьте, существует ли пользователь root с хостом localhost. Если он есть, смотрите на поле «password». Если там пусто, зайти в базу можно без ввода пароля. Если там что-то есть, значит, вы вводите неправильный пароль.
  3. Смените пароль командой SET PASSWORD.
  4. Если пользователя root нет, создайте его, установите пароль и предоставьте ему права.

После этого в базу данных можно зайти. Если изменить данные не получается, следует использовать параметр —skip-grant-tables, который отменяет все настройки разрешений.

Строки, которые нужно изменить в файле конфигурации

Если ошибка появляется с ключом (Using password: NO), нужно сделать следующее изменить файл config.inc.php, указав в нем правильные данные. Если проблема возникает при установке MySQL, нужно удалить базы данных старой версии программы или сменить пароль для доступа к ним, используя режим —skip-grant-tables.

Таким образом, ошибка Access denied for user ‘root’@’localhost’ (Using password: YES или NO) возникает при несоответствии пароля и имени пользователя и легко исправляется заменой данных для входа.

Вконтакте

Если не удается добиться, чтобы пароль работал, помните, что функция 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 . Если ошибка 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 .


Если при попытке подсоединения к серверу MySQL вы сталкиваетесь с ошибкой Access denied , то воспользуйтесь приведенным ниже списком. В нем перечислены меры, которые можно принять для решения этой проблемы:

    Запускали ли вы после инсталляции MySQL скрипт mysql_install_db для установки начального содержимого таблиц привилегий? Если нет, сделайте это. Обратитесь к разделу . Проверьте первоначальные привилегии с помощью следующей команды:

    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)

    это означает, что используется неверный пароль. Обратитесь к разделу . Если вы забыли пароль для пользователя root , то перезапустите mysqld с опцией --skip-grant-tables и измените пароль. Обратитесь к разделу . Такая ошибка может появляться даже в том случае, если вы не задавали пароля вообще - это значит, что в каком-то файле my.ini имеется неверный пароль. Обратитесь к разделу . Отменить использование файлов опций можно с помощью опции 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 стал функциональным, структура таблиц привилегий изменилась.

    Если во время сеанса ваши привилегии изменились, то, возможно, их изменил суперпользователь. Перезагрузка таблиц привилегий отражается не только на новых подсоединениях клиентов, но также на уже имеющихся, как это показано в разделе .

    Если не удается добиться, чтобы пароль работал, помните, что функция 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-оператор:

    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. Обратитесь к разделу . Вот некоторые способы решения этой проблемы:

    • Попробуйте выяснить, что не так с вашим сервером 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 .

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

    Если вы вносите изменения в таблицы привилегий непосредственно (с помощью операторов 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 .