首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 密碼重置進階方案:--init-file 單次重啟優雅重置

     編輯:MySQL 資料庫相關知識

傳統 --skip-grant-tables 重置密碼需兩次重啟(啟動跳過授權 → 修改密碼 → 正常重啟)。本文介紹 --init-file 參數實現**單次重啟**重置,並結合 --skip-networking 確保安全窗口期零外部連接風險。

方案對比

方案重啟次數安全窗口適用場景
--skip-grant-tables (傳統)2 次臨時實例無授權、可被任意連接緊急、舊版本
--skip-grant-tables --skip-networking2 次僅本地 Socket 可連,較安全生產環境傳統法
--init-file (推薦)1 次啟動即執行 SQL、無無授權窗口標準化運維、自動化腳本

--init-file 單次重啟標準流程

1. 準備 SQL 文件 (如 /root/reset_root.sql)

-- 必須以分號結尾,無註釋
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongPass123';
FLUSH PRIVILEGES;

⚠️ MySQL 5.7 用 UPDATE mysql.user SET authentication_string=PASSWORD('...') WHERE User='root';

2. 停止服務並以 init-file 啟動

systemctl stop mysqld
mysqld_safe --init-file=/root/reset_root.sql --user=mysql &

實例啟動過程中自動執行文件內 SQL,完成密碼重置。

3. 驗證並清理

# 等待幾秒後測試
mysql -u root -p'NewStrongPass123' -e "SELECT 1;"

# 立即刪除/清空 SQL 文件,防洩露
shred -u /root/reset_root.sql
# 或
echo "" > /root/reset_root.sql

4. 正常化服務 (若用 mysqld_safe 前台啟動)

# Ctrl+C 停止前台 mysqld_safe
systemctl start mysqld  # 啟動系統服務
# 或直接用 systemctl restart mysqld (若 init-file 已在配置文件中臨時添加)

系統服務化:將 init-file 納入 systemd (生產標準)

1. 創建臨時 override

systemctl edit mysqld
# 編輯器中添加:
[Service]
ExecStartPre=/bin/sh -c 'echo "ALTER USER '\''root'\''@'\''localhost'\'' IDENTIFIED BY '\''NewStrongPass123'\''; FLUSH PRIVILEGES;" > /var/lib/mysql/init_reset.sql'
ExecStart=/usr/sbin/mysqld --init-file=/var/lib/mysql/init_reset.sql $@
# 保存退出

2. 重啟生效

systemctl daemon-reload
systemctl restart mysqld

3. 驗證後移除 override

systemctl edit mysqld
# 刪除剛添加的內容,保存
systemctl daemon-reload
systemctl restart mysqld

安全加固細節

  • 文件權限:chmod 600 /root/reset_root.sql、屬主 mysql:mysql。
  • 網絡隔離:如極度敏感,啟動參數加 --skip-networking,僅本地 Socket 可連。
  • 審計日誌:操作前後記錄時間、操作人、票據號,納入變更管理系統。

總結

--init-file 重置密碼:**單次重啟、無無授權窗口、可系統服務化、可自動化腳本化**,是現代 MySQL 運維的標準姿勢。將上述流程封裝為 Ansible Playbook / Shell 函數,納入應急預案庫,關鍵時刻一鍵執行。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved