MySQL 權限系統基於 mysql.user 表。啟動參數 --skip-grant-tables 讓服務器跳過權限表加載,允許無密碼以 root 身份登錄,從而修改密碼。本質是暫時降級安全模式,操作後必須立即恢復。
--skip-grant-tables 啟動實例 (臨時跳過權限)
# 1. 管理員 CMD 停止服務
net stop MySQL80
# 2. 啟動跳過權限 (需指定配置文件路徑)
"C:\Program Files\MySQL\MySQL Server 8.0\bin\mysqld.exe" --defaults-file="C:\ProgramData\MySQL\MySQL Server 8.0\my.ini" --skip-grant-tables --console
# 3. 新開 CMD 窗口免密登錄
mysql -uroot
# 4. 修改密碼 (5.7+ authentication_string 列)
UPDATE mysql.user SET authentication_string='' WHERE User='root' AND Host='localhost';
FLUSH PRIVILEGES;
# 或推薦語法
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongPass#2024';
# 5. Ctrl+C 停止臨時實例,正常啟動服務
net start MySQL80
# 1. 停止服務
systemctl stop mysqld
# 2. 創建臨時配置覆蓋 (systemd drop-in,不改動主配置)
mkdir -p /etc/systemd/system/mysqld.service.d/
cat > /etc/systemd/system/mysqld.service.d/skip-grant.conf <<'EOF'
[Service]
ExecStartPre=
ExecStartPre=/usr/bin/mysqld_pre_systemd --skip-grant-tables
EOF
systemctl daemon-reload
# 3. 啟動
systemctl start mysqld
# 4. 免密登錄修改密碼
mysql -uroot
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongPass#2024';
FLUSH PRIVILEGES;
EXIT;
# 5. 移除臨時配置並重啟
rm /etc/systemd/system/mysqld.service.d/skip-grant.conf
systemctl daemon-reload
systemctl restart mysqld
# 停止
/etc/init.d/mysqld stop
# 或
killall mysqld
# 啟動跳過權限 (後台運行)
mysqld_safe --skip-grant-tables &
# 登錄修改
mysql -uroot
UPDATE mysql.user SET Password=PASSWORD('NewPass') WHERE User='root';
FLUSH PRIVILEGES;
# 正常重啟
killall mysqld
/etc/init.d/mysqld start
/usr/local/etc/rc.d/mysql-server stop
/usr/local/bin/mysqld_safe --skip-grant-tables &
mysql -uroot
# 修改密碼...
killall mysqld
/usr/local/etc/rc.d/mysql-server start
# 1. 提交當前容器為新鏡像 (備份)
docker commit mysql-container mysql-backup:$(date +%F)
# 2. 以臨時命令啟動新容器掛載數據卷
docker run -d --name mysql-temp \
-v mysql-data:/var/lib/mysql \
mysql:8.0 mysqld --skip-grant-tables
# 3. 進入容器修改
docker exec -it mysql-temp mysql -uroot
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPass';
FLUSH PRIVILEGES;
# 4. 清理臨時容器,重啟原容器
docker rm -f mysql-temp
docker restart mysql-container
| 版本 | 密碼列名 | 修改語法 | 注意事項 |
|---|---|---|---|
| 5.6 及之前 | Password | UPDATE mysql.user SET Password=PASSWORD('new') WHERE User='root'; | PASSWORD() 函數加密 |
| 5.7 | authentication_string | UPDATE mysql.user SET authentication_string=PASSWORD('new') WHERE User='root'; | 推薦 ALTER USER |
| 8.0 | authentication_string | ALTER USER 'root'@'localhost' IDENTIFIED BY 'new'; | 默認 caching_sha2_password 插件,PASSWORD() 已移除 |
DELETE FROM mysql.user WHERE User='';DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost','127.0.0.1','::1');DROP DATABASE test; DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';FLUSH PRIVILEGES;mysql_secure_installation (交互式完成以上所有)mysqld 讀寫數據目錄,臨時 setenforce 0 或配置 mysqld_t 上下文skip-grant-tables 極度危險: 任何人可無密訪問,務必在內網/防火牆保護下操作,完成即移除mysql -uroot -S /var/lib/mysql/mysql.sock 指定 socketcp -a /var/lib/mysql /var/lib/mysql.bak.$(date +%F)skip-grant-tablesRoot 密碼恢復的核心是「受控降級安全模式」。掌握跨平台標準流程、版本差異語法、systemd 現代化管理方式,並建立「備份→操作→驗證→加固」閉環,才能在生產故障中從容應對。最佳預防:使用密碼管理器、定期輪換、配置 validate_password 強度插件、啟用審計日志。