Ubuntu 如何重設 MySQL 的 root 密碼

leamen發表於2019-06-28

MySQL 下建立新使用者、新資料庫、設定訪問許可權控制都需要用到 root 密碼,忘記密碼就只能重置密碼了,但是網上搜到的結果我依然不能重置密碼,只能自己動手找文件,並且將結果記錄於此,以備以後查閱!

方案一:官方文件提供(推薦)

  1. 殺死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
  1. 確保 MySQL 對該檔案有讀取許可權
    
    # 如果不確定,改成‘777’
    chmod 777 mysql-init

chown mysql:mysql mysql-init

4. 通過下面命令啟動 MySQL
```bash
mysqld --init-file=/home/ubuntu/mysql-init &
  1. 成功啟動之後,刪除剛才建立的檔案
    rm -f mysql-init
  2. 現在正常重啟就可以使用剛才建立的 root 密碼登入了

    如果依然不能重置密碼,請將上邊建立的檔案的內容修改成如下內容,並重復 3-5 步驟

    UPDATE mysql.user
    SET authentication_string = PASSWORD('MyNewPass'), password_expired = 'N'
    WHERE User = 'root' AND Host = 'localhost';
    FLUSH PRIVILEGES;

方案二:安全模式重置法(網上最常見的搜尋結果)

思路:以安全模式啟動 MySQL ,這樣不需要密碼可以直接以 root 身份登入,然後重設密碼。

  1. 停掉 MySQL 服務:

    sudo service mysql stop  

    以上命令適用於 Ubuntu 和 Debian 。CentOS、Fedora 和 RHEL 下使用 mysqld 替換 mysql

  2. 以安全模式啟動MySQL:

    sudo mysqld_safe --skip-grant-tables --skip-networking &  

    注意我們加了 --skip-networking ,避免遠端無密碼登入 MySQL。

  3. 用 root 登入,無需密碼:

    mysql -u root
  4. 重設密碼:

    mysql> use mysql;  
    mysql> update user set password=PASSWORD("mynewpassword") where User='root';  
    mysql> flush privileges; 

    注意,命令後需要加分號。

  5. 重設完畢後,我們退出,然後啟動 MySQL 服務:

    mysql> quit

    quit 不需要分號。

  6. 重啟服務:

    sudo service mysql restart
    # 如果不能重啟,可能需要手動殺死 mysql 相關程式,再重啟

    如果不是 Debian 系列,而是 CentOS、Fedora 和 RHEL 的話,需要用mysqld替換mysql

  7. 現在可以嘗試用新密碼登入了:

    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

相關文章