萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

Linux MySQL 忘記密碼找回 5 種方法完整指南

Linux 環境 MySQL root 密碼重置 5 大實戰方法

Linux 下 MySQL 密碼遺失比 Windows 更常見 (無圖形介面)。本文提供 5 種經實測可行的重置方案,涵蓋標準流程、debian 維護帳號、啟動腳本修改、系統服務管理等。

方法一:標準 --skip-grant-tables 流程 (最通用)


# 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/Ubuntu 專用 debian-sys-maint 帳號

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.cnf 密碼嘗試 root 登入 (未驗證)


# 嘗試用 debian-sys-maint 密碼直接登入 root (視版本而定)
mysql -uroot -p'debian.cnf裡的密碼'

此法不穩定,不建議依賴。

方法四:修改啟動腳本永久加入 --skip-grant-tables (生產慎用!)


# 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** 且儘快還原。

方法五:MySQL 8.0+ 官方 init-file 方式 (最乾淨、安全)


# 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 及以下PasswordSET PASSWORD FOR 'root'@'localhost' = PASSWORD('pwd');
5.7authentication_stringUPDATE user SET authentication_string=PASSWORD('pwd') WHERE User='root';
8.0+authentication_stringALTER USER 'root'@'localhost' IDENTIFIED BY 'pwd';

安全收尾必做

  • 刪除臨時 SQL 檔:rm -f /tmp/init_mysql.sql
  • 確認 --skip-grant-tables 已移除
  • 檢查 mysql.user 無匿名帳號、無 % 主機 root 帳號
  • 執行 mysql_secure_installation 強化安全
copyright © 萬盛學電腦網 all rights reserved