萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

解決 MySQL "The user specified as a definer ('root'@'%') does not exist" 錯誤

錯誤現象

The user specified as a definer ('root'@'%') does not exist

通常發生於:

  • 匯入含有 DEFINER='root'@'%' 的 View、Stored Procedure、Trigger、Event
  • 目標 MySQL 實例不存在 root@% 使用者
  • 重裝/遷移 MySQL 後權限表未同步

快速修復

方法一:建立缺失使用者並授權(推薦)

mysql -u root -p
mysql> CREATE USER 'root'@'%' IDENTIFIED BY 'StrongPassword123!';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES;

方法二:修改匯出檔案的 DEFINER(遷移前處理)

# 匯出時排除 DEFINER
mysqldump --skip-definer -u root -p dbname > dump.sql

# 或匯出後批次替換
sed -i "s/DEFINER=\`root\`@\`%\`/DEFINER=\`root\`@\`localhost\`/g" dump.sql
# 或移除 DEFINER 子句
sed -i 's/DEFINER=[^ ]* //g' dump.sql

方法三:匯入時強制忽略 DEFINER(MySQL 5.7.24+ / 8.0.13+)

mysql -u root -p --skip-definer dbname < dump.sql

根因分析

MySQL 物件(View/Procedure/Trigger/Event)建立時會綁定 DEFINER(預設為建立者 CURRENT_USER)。執行時檢查 DEFINER 是否存在於 mysql.user,不存在則報錯。常見於:

  • 跨實例遷移(源有 root@%,目標無)
  • 使用 mysqldump 未加 --skip-definer
  • 手動建立 root@% 後被刪除或重命名

最佳實踐

  1. 遷移前執行 SELECT USER, HOST FROM mysql.user; 對比源目標使用者
  2. 匯出生產庫常態加 --skip-definer --routines --triggers --events
  3. 應用層避免使用 root 連接,建立專用服務帳號
  4. 定期審計 mysql.proc、information_schema.VIEWS 中的 DEFINER 合規性
copyright © 萬盛學電腦網 all rights reserved