如果無法使用 root 密碼,如何使用 --skip-grant-tables 重新啟動 MySQL?

如果無法使用 root 密碼,如何使用 --skip-grant-tables 重新啟動 MySQL?

我需要在--skip-grant-tables啟用該選項的情況下在 Ubuntu 16.04 中重新啟動 MySQL,但要么我不知道我的 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=/

如何使用 --skip-grant-tables 啟動 mysql?

答案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.

相關內容