Мне нужно перезапустить MySQL в Ubuntu 16.04 с --skip-grant-tables
включенной опцией, но либо я не знаю свой пароль root, либо он не работает. Как мне установить --skip-grant-tables
без пароля?
Когда я пробую это как обычный пользователь:
mysqld --skip-grant-tables
Я вижу это:
mysqld: Can't change dir to '/var/lib/mysql/' (Errcode: 13 - Permission denied)
Итак, я откопал этот пример из /etc/init.d/mysql и добавил параметр --skip-grant-tables
:
su - mysql -s /bin/bash -c "/usr/sbin/mysqld --skip-grant-tables"
Password:
su: Authentication failure
Итак, su не работает, и пароль root тоже не работает. Я также попробовал это:
sudo su - mysql -s /bin/bash -c "/usr/sbin/mysqld --skip-grant-tables"
No directory, logging in with HOME=/
Как запустить mysql с опцией --skip-grant-tables?
решение1
Если вы не знаете свой пароль root (или возникла ошибка, например, 'ERROR 1045 (28000): Access denied for user 'root'@'localhost'
препятствует доступу), вы можете получить доступ, добавив опцию в файл конфигурации MySQL. Сначала откройте его для редактирования:
sudo nano /etc/mysql/my.cnf
Затем найдите [mysqld]
и введите следующие значения под ним:
[mysqld]
# For debugging and recovery only #
skip-grant-tables
skip-networking
###################################
Как вы видите, трюк с добавлением параметров командной строки здесь заключается в удалении --
из начала параметра. Теперьперезапустите службу mysqlи вы можете получить доступ к своим таблицам, чтобы сбросить пароль пользователя root или сделать почти все, что вам нужно. (Однако вы ничего не можете сделать с таблицами привилегий, поскольку они не загружены.)
Остерегаться.Пока вы находитесь в этом режиме, любой вошедший в систему пользователь имеет доступ ко всей вашей базе данных. Вот почему я добавил опцию skip-networking
выше, чтобы удаленные пользователи не могли получить доступ к таблицам, пока вы восстанавливаетесь.
Обязательно закомментируйте эти строки и перезапустите MySQL еще раз, когда закончите, чтобы повторно защитить сервер.
решение2
Из комментариев.
Для конфигураций init.rc:
Самый простой способ — временно изменить /etc/init.d/mysql, включив эту опцию --skip-grant-tables
, а затем запустить его с помощью этого скрипта (/etc/init.d/mysql start).
В новеньких системах, таких как Ubuntu 16.04, это необходимо сделать в
/lib/systemd/system/mysql.service
.