MySQL 服務啟動時日誌報錯 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it. 或 Table 'mysql.plugin' doesn't exist,導致服務無法正常提供服務。本文解析根因、提供標準修復步驟與預防措施。
mysql 系統庫(含 plugin、user、db、tables_priv 等權限表)未正確初始化或被誤刪/遷移丟失。my.cnf 中 datadir 路徑,但未將原 datadir 下的 mysql 系統庫目錄遷移至新路徑。datadir/mysql 目錄。mysql_upgrade(5.7→8.0 必須)。# 1. 停止服務
systemctl stop mysqld
# 2. 找到舊 datadir 路徑(含 mysql 目錄)
# 假設舊路徑 /var/lib/mysql_old,新路徑 /data/mysql
cp -rp /var/lib/mysql_old/mysql /data/mysql/
# 3. 確保權限
chown -R mysql:mysql /data/mysql/mysql
chmod -R 750 /data/mysql/mysql
# 4. 啟動服務
systemctl start mysqld
# 1. 停止服務
systemctl stop mysqld
# 2. 清空/備份新 datadir
mv /data/mysql /data/mysql.bak.$(date +%s)
mkdir -p /data/mysql
chown mysql:mysql /data/mysql
# 3. 初始化系統表(MySQL 5.7+)
mysqld --initialize-insecure --user=mysql --datadir=/data/mysql
# --initialize-insecure:生成隨機 root 密碼寫入 ~/.mysql_secret
# --initialize:生成臨時密碼寫入 error log
# 4. 啟動服務
systemctl start mysqld
# 5. 登錄修改密碼(若用 initialize-insecure)
mysql -u root --skip-password
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongPass123!';
FLUSH PRIVILEGES;
# 5.7 → 8.0 升級後,服務啟動前必須執行
mysql_upgrade --user=root --password --force
# 檢查並修復系統表結構、重建索引、更新權限表
# 完成後重啟服務
systemctl restart mysqld
# 1. 檢查錯誤日誌無 plugin 相關報錯
tail -f /var/log/mysqld.log
# 2. 登錄檢查系統表
mysql -u root -p -e "SHOW TABLES FROM mysql LIKE 'plugin';"
# 應輸出:+----------------+ | Tables_in_mysql (plugin) | +----------------+ | plugin | +----------------+
# 3. 檢查插件系統正常
mysql -u root -p -e "SHOW PLUGINS;"
mysql_upgrade,不可跳過。mysqldump --all-databases --routines --events --triggers 或物理備份 xtrabackup 全量備份 datadir。chattr +i /data/mysql/mysql 防誤刪(謹慎使用,升級時需解除)。Table mysql.plugin doesn't exist 本質是系統庫缺失。核心修復:遷移舊系統庫目錄 或 重新初始化 + mysql_upgrade。操作前務必備份現有數據目錄。規範運維流程(datadir 遷移清單、升級清單)可徹底杜絕此類故障。