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

MySQL 權限搞亂後的重裝避坑實錄

     編輯:MySQL 資料庫相關知識

Linux 下 MySQL 權限系統一旦誤操作極易導致無法登入,本文記錄一次真實的「刪庫重裝」避坑全過程,包含 RPM 卸載順序、YUM 重裝、systemd 服務管理、root 密碼重置與遠程授權實戰技巧。

事故起因

  1. 嘗試修改 root@localhost 密碼失敗,導致無法登入。
  2. 參考網路教程刪除匿名用戶 User='',反而損壞權限表結構。
  3. 以 --skip-grant-tables 進入後發現已無 localhost 的 root 用戶,其他 host 的 root 雖有密碼但無實際權限。
  4. 手動插入 localhost root 仍報權限錯誤,決定徹底重裝。

乾淨卸載流程 (CentOS/RHEL RPM)

核心原則:先刪不被依賴的套件,再刪被依賴的。

# 1. 查詢已安裝 MySQL 套件
rpm -qa | grep -i mysql

# 2. 按依賴順序刪除 (典型順序,實際以 rpm 提示為準)
rpm -e mysql-server          # 伺服器端
rpm -e mysql-community-client # 客戶端
rpm -e mysql-community-common # 共用檔案
rpm -e mysql-community-libs   # 函式庫
rpm -e mysql-community-libs-compat # 相容庫

# 3. 清理殘留資料與配置 (謹慎!備份 /var/lib/mysql 先)
rm -rf /var/lib/mysql
rm -f /etc/my.cnf /etc/my.cnf.d/*

YUM 极速重裝

# 安裝核心套件 (含開發庫)
yum install -y mysql-community-server mysql-community-devel

# 啟動並設定開機自啟
systemctl start mysqld
systemctl enable mysqld

systemd 服務管理陷阱

CentOS 7+ 使用 systemd,傳統 service mysqld start 會重導向:

Redirecting to /bin/systemctl start mysqld.service
Job failed. See system journal and 'systemctl status' for details.

排查步驟:

  1. 查看日誌:journalctl -u mysqld -xe 或 /var/log/mysqld.log
  2. 常見錯誤:mysqld_safe A mysqld process already exists
  3. 解決:ps -ef | grep mysql 找到殘留進程 → kill -9 PID → 再次 systemctl start mysqld

Root 密碼正確重置姿勢

錯誤寫法 (舊版本無加密函數):

UPDATE user SET password = '123456' WHERE user = 'root';  -- 明文存儲,驗證失敗

正確寫法 (MySQL 5.7+ authentication_string):

-- 5.7/8.0 官方推薦
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;

-- 或相容舊語法 (5.7 仍支援)
UPDATE mysql.user SET authentication_string = PASSWORD('123456') WHERE User = 'root' AND Host = 'localhost';
FLUSH PRIVILEGES;

遠程連線授權最佳實踐

-- 建議建立專用遠程用戶,而非開放 root
CREATE USER 'app_user'@'%' IDENTIFIED BY 'StrongPass123!';
GRANT SELECT, INSERT, UPDATE, DELETE ON `mydb`.* TO 'app_user'@'%';
FLUSH PRIVILEGES;

-- 若確需 root 遠程 (僅內網受信環境)
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'RootStrongPass123!' WITH GRANT OPTION;
FLUSH PRIVILEGES;

安全加固:

  • 執行 mysql_secure_installation 移除匿名用戶、禁止 root 遠程、刪除 test 庫。
  • 防火牆僅開放應用伺服器 IP:firewall-cmd --add-rich-rule='rule family="ipv4" source address="10.0.0.0/24" port port="3306" protocol="tcp" accept'
  • 配置 bind-address = 0.0.0.0 於 [mysqld] 區段以監聽所有介面。

關鍵教訓總結

  1. 權限表不可手動 DELETE/INSERT,務必使用 CREATE USER、GRANT、ALTER USER 官方語句。
  2. 密碼修改必須用加密函數或 ALTER USER,明文寫入 password/authentication_string 會導致驗證失效。
  3. systemd 時代請用 systemctl 管理服務,勿混用 service 命令。
  4. 重裝前備份 /var/lib/mysql,避免資料永久遺失。
  5. 生產環境嚴禁 root 遠程登入,採用最小權限原則建立應用專用帳號。

這次「翻車」雖然痛苦,但徹底釐清了 MySQL 權限體系、systemd 服務管理與密碼機制,避坑指南留存備查。

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