適用場景
- Root 密碼遺失、DBA 離職無交接。
- 自動化運維腳本需無密碼登入初始化。
- 安全審計要求定期輪換 Root 密碼。
標準重置流程(停服 → 跳過權限 → 改密 → 恢復)
#!/bin/bash
# reset_mysql_root.sh
# 用法:sudo ./reset_mysql_root.sh [新密碼]
# 未提供新密碼則生成 32 位隨機強密碼
set -euo pipefail
NEW_PASS="${1:-$(openssl rand -base64 32 | tr -d '/+=' | cut -c1-32)}"
MYSQLD_SAFE="/usr/bin/mysqld_safe"
MYSQL="/usr/bin/mysql"
MYSQLADMIN="/usr/bin/mysqladmin"
SOCKET="/var/lib/mysql/mysql.sock" # 按實際 my.cnf 調整
DATADIR="/var/lib/mysql"
echo "[INFO] Stopping MySQL..."
systemctl stop mysqld 2>/dev/null || service mysql stop 2>/dev/null || pkill mysqld
echo "[INFO] Starting mysqld_safe with --skip-grant-tables --skip-networking..."
$MYSQLD_SAFE --skip-grant-tables --skip-networking --socket=$SOCKET --datadir=$DATADIR --user=mysql > /tmp/mysqld_safe.log 2>&1 &
SAFE_PID=$!
sleep 3 # 等待啟動
echo "[INFO] Resetting root password..."
$MYSQL --socket=$SOCKET -e "USE mysql; UPDATE user SET authentication_string='' WHERE User='root' AND Host='localhost'; FLUSH PRIVILEGES;"
echo "[INFO] Stopping mysqld_safe..."
kill $SAFE_PID
sleep 2
echo "[INFO] Starting MySQL normally..."
systemctl start mysqld 2>/dev/null || service mysql start
sleep 3
echo "[INFO] Setting new strong password..."
$MYSQL -uroot -e "ALTER USER 'root'@'localhost' IDENTIFIED BY '$NEW_PASS'; FLUSH PRIVILEGES;"
echo "============================================"
echo "MySQL Root 密碼已重置"
echo "New Password: $NEW_PASS"
echo "請立即記錄並妥善保管!"
echo "============================================"
關鍵細節解析
--skip-networking:防止跳過權限期間外部連入,僅本地 Unix Socket 可連。
authentication_string:5.7+ 密碼列名,5.6 用 Password,腳本可用 SELECT VERSION() 動態判斷。
FLUSH PRIVILEGES:刷新權限緩存,使修改即時生效。
- 腳本結束後**必須**移除
--skip-grant-tables 並正常重啟,否則存在極大安全風險。
多實例環境適配
# 假設實例配置:/etc/my.cnf.3306 /etc/my.cnf.3307
# 重置 3306 實例
mysqld_safe --defaults-file=/etc/my.cnf.3306 --skip-grant-tables --skip-networking &
mysql --defaults-file=/etc/my.cnf.3306 -uroot -e "UPDATE mysql.user SET authentication_string='' WHERE User='root'; FLUSH PRIVILEGES;"
# ... 後續同單實例
安全加固建議(重置後必做)
- 運行
mysql_secure_installation:移除匿名用戶、禁止 Root 遠程登錄、刪除 test 庫、刷新權限。
- 創建業務專用賬號,授予最小權限,禁用 Root 應用直連。
- 啟用
validate_password 組件強制密碼複雜度。
- 配置防火牆/安全組僅允許應用服務器 IP 訪問 3306。
- 審計日誌:
audit_log 插件記錄所有 DDL/DML。
Windows 版本對應操作
net stop mysql
mysqld.exe --skip-grant-tables --skip-networking --console
# 新開 CMD
mysql -uroot
UPDATE mysql.user SET authentication_string='' WHERE User='root' AND Host='localhost';
FLUSH PRIVILEGES;
EXIT;
# 關閉 --skip-grant-tables 視窗
net start mysql
mysql -uroot -e "ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPass@123';"