Linux 下 MySQL 權限系統一旦誤操作極易導致無法登入,本文記錄一次真實的「刪庫重裝」避坑全過程,包含 RPM 卸載順序、YUM 重裝、systemd 服務管理、root 密碼重置與遠程授權實戰技巧。
root@localhost 密碼失敗,導致無法登入。User='',反而損壞權限表結構。--skip-grant-tables 進入後發現已無 localhost 的 root 用戶,其他 host 的 root 雖有密碼但無實際權限。localhost root 仍報權限錯誤,決定徹底重裝。核心原則:先刪不被依賴的套件,再刪被依賴的。
# 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 install -y mysql-community-server mysql-community-devel
# 啟動並設定開機自啟
systemctl start mysqld
systemctl enable mysqld
CentOS 7+ 使用 systemd,傳統 service mysqld start 會重導向:
Redirecting to /bin/systemctl start mysqld.service
Job failed. See system journal and 'systemctl status' for details.
排查步驟:
journalctl -u mysqld -xe 或 /var/log/mysqld.logmysqld_safe A mysqld process already existsps -ef | grep mysql 找到殘留進程 → kill -9 PID → 再次 systemctl start mysqld錯誤寫法 (舊版本無加密函數):
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 庫。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] 區段以監聽所有介面。CREATE USER、GRANT、ALTER USER 官方語句。password/authentication_string 會導致驗證失效。這次「翻車」雖然痛苦,但徹底釐清了 MySQL 權限體系、systemd 服務管理與密碼機制,避坑指南留存備查。