前提:擁有**操作系統 Root 權限**(非 MySQL Root)。無系統 Root 權限請先解決 OS 級授權。
# 1. 編輯 /etc/sudoers,取消註釋 %wheel ALL=(ALL) ALL # 2. 將用戶加入 wheel 組 usermod -aG wheel tommy # 3. 重新登錄,使用 sudo su - 獲取 Root
# /etc/sudoers 添加 tommy ALL=(ALL) ALL
# /etc/passwd 修改用戶 UID 為 0 tommy:x:0:500:tommy:/home/tommy:/bin/bash
# 正確姿勢 systemctl stop mysqld # 或 /etc/init.d/mysqld stop # ❌ 禁用 pkill mysql # 會導致:mysqld dead but subsys locked # 若已誤用,需 systemctl start mysqld 再 stop
systemctl start mysqld ps -ef | grep mysql # 關鍵輸出:/usr/bin/mysqld_safe --datadir=/var/lib/mysql ... # 記住路徑:/usr/bin/
systemctl stop mysqld /usr/bin/mysqld_safe --skip-grant-tables >/dev/null 2>&1 &
等待 5 秒確保啟動完成。
/usr/bin/mysql -u root mysql
# 進入 mysql> 提示符後執行:
UPDATE user SET authentication_string=PASSWORD('new_password') WHERE User='root';
FLUSH PRIVILEGES;
EXIT;
版本差異提示:
authentication_stringpassword修改後直接 SHOW DATABASES 會報錯:ERROR 1820 (HY000): You must SET PASSWORD before executing this statement
mysql -u root -p
# 輸入新密碼登錄
SET PASSWORD = PASSWORD('new_password');
FLUSH PRIVILEGES;
SHOW DATABASES; -- 驗證成功
# 需知舊密碼 mysqladmin -u root -p password 'new_password' # 輸入舊密碼即可
| 問題 | 原因 | 解決 |
|---|---|---|
| mysqld_safe 找不到 | 安裝路徑非標準 | find / -name mysqld_safe 或 rpm -ql mysql-server | grep mysqld_safe |
| --skip-grant-tables 無效 | 未完全停止原進程 | pkill -9 mysqld; pkill -9 mysqld_safe 徹底清理 |
| 密碼修改不生效 | 列名錯誤(password vs authentication_string) | DESC mysql.user 確認列名 |
| FLUSH PRIVILEGES 後仍報 1820 | 需執行 SET PASSWORD 正式生效 | 按本文第 5 節操作 |
| 啟動報錯:Can't create test file | datadir 權限或路徑錯誤 | 檢查 --datadir 參數與目錄擁有者 |
dba@'%'),授予所需權限,**禁用 Root 遠程登錄**。validate_password 插件強制複雜度。