Linux 下 MySQL 密碼遺失比 Windows 更常見 (無圖形介面)。本文提供 5 種經實測可行的重置方案,涵蓋標準流程、debian 維護帳號、啟動腳本修改、系統服務管理等。
# 1. 停止服務
systemctl stop mysqld
# 或 /etc/init.d/mysqld stop
# 2. 跳過權限表 + 禁用網路 啟動
mysqld_safe --user=mysql --skip-grant-tables --skip-networking &
# 3. 免密登入
mysql -u root mysql
# 4. 修改密碼 (MySQL 5.7+)
UPDATE user SET authentication_string=PASSWORD('新密碼') WHERE User='root';
FLUSH PRIVILEGES;
QUIT;
# 5. 正常重啟
systemctl restart mysqld
# 6. 驗證
mysql -uroot -p'新密碼'
Debian 系安裝 MySQL 會自動建立維護帳號,密碼存於 /etc/mysql/debian.cnf:
# 1. 查看帳號密碼
cat /etc/mysql/debian.cnf
# [client]
# user = debian-sys-maint
# password = xxxxxxxx
# 2. 使用維護帳號登入
mysql -u debian-sys-maint -p
# 輸入上述密碼
# 3. 修改 root 密碼
UPDATE mysql.user SET authentication_string=PASSWORD('新密碼') WHERE User='root';
FLUSH PRIVILEGES;
QUIT;
> ⚠️ 此帳號擁有完整權限,**嚴禁外洩、嚴禁修改密碼**,僅供緊急救援。
# 嘗試用 debian-sys-maint 密碼直接登入 root (視版本而定)
mysql -uroot -p'debian.cnf裡的密碼'
此法不穩定,不建議依賴。
# 1. 停止服務
/etc/init.d/mysqld stop
# 2. 編輯啟動腳本
vi /etc/init.d/mysqld
# 找到啟動行,加入 --skip-grant-tables
/usr/bin/mysqld_safe --skip-grant-tables --datadir="$datadir" --socket="$socketfile" ...
# 3. 啟動服務
/etc/init.d/mysqld start
# 4. 免密登入修改密碼 (同方法一步驟 3-4)
# 5. **關鍵:還原啟動腳本,移除 --skip-grant-tables**
vi /etc/init.d/mysqld # 刪除該參數
# 6. 重啟驗證
/etc/init.d/mysqld restart
mysql -u root -p'新密碼'
> ⚠️ **極高風險**:修改期間任何人可免密存取,**必須加 --skip-networking** 且儘快還原。
# 1. 建立初始化 SQL 檔
cat > /tmp/init_mysql.sql <<'EOF'
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密碼';
FLUSH PRIVILEGES;
EOF
# 2. 停止服務
systemctl stop mysqld
# 3. 以 init-file 啟動 (僅執行一次 SQL 後正常運行)
mysqld --init-file=/tmp/init_mysql.sql --user=mysql --console &
# 4. 等待幾秒,正常重啟
pkill mysqld
systemctl start mysqld
# 5. 驗證
mysql -uroot -p'新密碼'
優點:無需 --skip-grant-tables、無安全窗口、支援 MySQL 8.0 強密碼政策。
| 版本 | 密碼欄位 | 推薦修改語法 |
|---|---|---|
| 5.6 及以下 | Password | SET PASSWORD FOR 'root'@'localhost' = PASSWORD('pwd'); |
| 5.7 | authentication_string | UPDATE user SET authentication_string=PASSWORD('pwd') WHERE User='root'; |
| 8.0+ | authentication_string | ALTER USER 'root'@'localhost' IDENTIFIED BY 'pwd'; |
rm -f /tmp/init_mysql.sql--skip-grant-tables 已移除mysql.user 無匿名帳號、無 % 主機 root 帳號mysql_secure_installation 強化安全