擁有 UPDATE 權限於 mysql.user 表的帳號 (如另一管理員帳號)。
-- 直接更新
UPDATE mysql.user SET authentication_string=PASSWORD('new_password') WHERE User='root';
FLUSH PRIVILEGES;
MySQL 8.0+ 使用 authentication_string 欄位,5.7 用 Password。
# 命令列工具
mysqladmin -u root -p'old_password' password 'new_password'
# 或 SQL
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';
-- 8.0+ 支援
SET PASSWORD FOR 'root'@'localhost' = 'new_password';
原理:複製 mysql.user 表檔案到可寫入的庫 (如 test),用低權限帳號修改後複製回來,發送 SIGHUP 重載權限。
innodb_file_per_table):
cp /var/lib/mysql/mysql/user.{MYD,MYI} /var/lib/mysql/test/
chown mysql:mysql /var/lib/mysql/test/user.*
mysql -u low_user -p
USE test;
UPDATE user SET authentication_string=PASSWORD('new_pwd') WHERE User='root';
mv /var/lib/mysql/mysql/user.MYD /var/lib/mysql/mysql/user.MYD.bak
mv /var/lib/mysql/mysql/user.MYI /var/lib/mysql/mysql/user.MYI.bak
cp /var/lib/mysql/test/user.{MYD,MYI} /var/lib/mysql/mysql/
chown mysql:mysql /var/lib/mysql/mysql/user.*
# 發送 SIGHUP 重載權限 (不重啟進程)
kill -SIGHUP $(pgrep -n mysqld)
mysql -u root -p'new_pwd' -e "SELECT 1;"
# 1. my.cnf 加入
[mysqld]
skip-grant-tables
skip-networking
# 2. 重啟 mysqld
# 3. 免密登入修改
UPDATE mysql.user SET authentication_string=PASSWORD('new_pwd') WHERE User='root';
FLUSH PRIVILEGES;
# 4. 移除配置,再次重啟