Как перезапустить MySQL с помощью --skip-grant-tables, если вы не можете использовать пароль root?

Как перезапустить MySQL с помощью --skip-grant-tables, если вы не можете использовать пароль root?

Мне нужно перезапустить 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.

Связанный контент