首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

Linux/Unix 下 MySQL Root 密碼遺失緊急重置腳本化操作指南

     編輯:MySQL 綜合教學

適用場景

  • 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 "============================================"

關鍵細節解析

  1. --skip-networking:防止跳過權限期間外部連入,僅本地 Unix Socket 可連。
  2. authentication_string:5.7+ 密碼列名,5.6 用 Password,腳本可用 SELECT VERSION() 動態判斷。
  3. FLUSH PRIVILEGES:刷新權限緩存,使修改即時生效。
  4. 腳本結束後**必須**移除 --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;"
# ... 後續同單實例

安全加固建議(重置後必做)

  1. 運行 mysql_secure_installation:移除匿名用戶、禁止 Root 遠程登錄、刪除 test 庫、刷新權限。
  2. 創建業務專用賬號,授予最小權限,禁用 Root 應用直連。
  3. 啟用 validate_password 組件強制密碼複雜度。
  4. 配置防火牆/安全組僅允許應用服務器 IP 訪問 3306。
  5. 審計日誌: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';"
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved