MySQL 下建立新使用者、新資料庫、設定訪問許可權控制都需要用到 root 密碼,忘記密碼就只能重置密碼了,但是網上搜到的結果我依然不能重置密碼,只能自己動手找文件,並且將結果記錄於此,以備以後查閱!
方案一:官方文件提供(推薦)
- 殺死MySQL相關程式
如果 MySQL 伺服器正在執行,請將其停止。找到包含伺服器程式 ID 的 .pid 檔案。此檔案的確切位置和名稱取決於你的發行版、主機名和配置。常見的位置是 `/var/lib/mysql/`,` /var/run/mysqld/`和 `/usr/local/mysql/data/` 。 實在不行就 `ps -aux|grep mysqld` 命令,然後 `kill` 掉對應程式吧
通過傳送一個給
mysqld
程式傳送一個kill
訊號來結束MySQL程式(注意:不是kill -9
)注意:kill 後面的的命令是在反引號內,不是單引號
# 下邊這條命令是示例命令,執行並不能成功 kill `cat /mysql-data-directory/host_name.pid`
kill cat /run/mysqld/mysqld.pid
2. 建立一個包含修改使用者密碼命令的檔案. (**假設該檔案是 `/home/ubuntu/mysql-init` **)
```bash
# 5.7.6以及之後版本執行這條命令
echo 'ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass';' > mysql-init
# 5.7.6之前版本執行這條命令
echo 'SET PASSWORD FOR 'root'@'localhost' = PASSWORD('MyNewPass');' > mysql-init
- 確保 MySQL 對該檔案有讀取許可權
# 如果不確定,改成‘777’ chmod 777 mysql-init
chown mysql:mysql mysql-init
4. 通過下面命令啟動 MySQL
```bash
mysqld --init-file=/home/ubuntu/mysql-init &
- 成功啟動之後,刪除剛才建立的檔案
rm -f mysql-init
- 現在正常重啟就可以使用剛才建立的 root 密碼登入了
如果依然不能重置密碼,請將上邊建立的檔案的內容修改成如下內容,並重復 3-5 步驟
UPDATE mysql.user SET authentication_string = PASSWORD('MyNewPass'), password_expired = 'N' WHERE User = 'root' AND Host = 'localhost'; FLUSH PRIVILEGES;
方案二:安全模式重置法(網上最常見的搜尋結果)
思路:以安全模式啟動 MySQL ,這樣不需要密碼可以直接以 root 身份登入,然後重設密碼。
-
停掉 MySQL 服務:
sudo service mysql stop
以上命令適用於 Ubuntu 和 Debian 。CentOS、Fedora 和 RHEL 下使用
mysqld
替換mysql
。 -
以安全模式啟動MySQL:
sudo mysqld_safe --skip-grant-tables --skip-networking &
注意我們加了
--skip-networking
,避免遠端無密碼登入 MySQL。 -
用 root 登入,無需密碼:
mysql -u root
-
重設密碼:
mysql> use mysql; mysql> update user set password=PASSWORD("mynewpassword") where User='root'; mysql> flush privileges;
注意,命令後需要加分號。
-
重設完畢後,我們退出,然後啟動 MySQL 服務:
mysql> quit
quit 不需要分號。
-
重啟服務:
sudo service mysql restart # 如果不能重啟,可能需要手動殺死 mysql 相關程式,再重啟
如果不是 Debian 系列,而是 CentOS、Fedora 和 RHEL 的話,需要用
mysqld
替換mysql
。 -
現在可以嘗試用新密碼登入了:
mysql -u root -pnewpassword # 注意,-p 和密碼間不能有空格。 # 或者 mysql -u root -p #回車之後輸入密碼
其中
-u
也可以與root
連在一起,如mysql -uroot -p
注意
自從MySQL5.7.6起,刪除了‘password’欄位,改用‘authentication_string’欄位儲存密碼
修改時可能遇到下邊這個問題
ubuntu@ubuntu:~$ sudo mysqld_safe --skip-grant-tables --skip-networking
2019-06-28T01:27:24.687004Z mysqld_safe Logging to syslog.
2019-06-28T01:27:24.690188Z mysqld_safe Logging to '/var/log/mysql/error.log'.
2019-06-28T01:27:24.693132Z mysqld_safe Directory '/var/run/mysqld' for UNIX socket file don't exists.
解決方法
mkdir -p /var/run/mysqld
chown mysql:mysql /var/run/mysqld
方案三:主要適用於Debian以及Ubuntu等Debian的衍生系統
在 Ubuntu 和 Debian 系統上,有一個 debian-sys-maint
使用者,Debian 類系統下一些系統指令碼對 MySQL 的操作是通過這個使用者完成的。所以我們可以通過這個使用者來修改 root 密碼。該使用者的密碼可以在 /etc/mysql/debian.cnf
下找到:
# Automatically generated for Debian scripts. DO NOT TOUCH!
[client]
host = localhost
user = debian-sys-maint
password = PASSWORD
socket = /var/run/mysqld/mysqld.sock
[mysql_upgrade]
host = localhost
user = debian-sys-maint
password = PASSWORD
socket = /var/run/mysqld/mysqld.sock
basedir = /usr
用該使用者登入 MySQL 後,也可以修改密碼:
sudo mysql -u debian-sys-maint -p