當我使用 mysqldump 將資料匯入 Amazon Relational Database Service (Amazon RDS) for MySQL DB 執行個體時,出現 1227 或定義器錯誤。
解決方法
若要查看資料庫事件和變更,請查看二進位日誌。如需詳細資訊,請參閱 MySQL 網站上的二進位日誌。
錯誤 1227
當您啟動二進位記錄,且 mysqldump 檔案包含儲存的物件 (例如觸發程序、檢視、函式或事件) 時,您可能會收到下列錯誤:
"Error: 1227 SQLSTATE: 42000 (ER_SPECIFIC_ACCESS_DENIED_ERROR) Access denied; you need (at least one of) the %s privilege(s) for this operation."
若要解決此錯誤,請完成下列步驟:
- 在您為資料庫執行個體建立的自訂資料庫參數群組中,將 log_bin_trust_function_creators 參數設定為 True。
- 在對執行個體執行傾印檔案之前,請從傾印檔案中移除像是 SET @ @SESSION .SQL_LOG_BIN= 0; 這類的命令列。
定義器錯誤
當 MySQL 嘗試以目標資料庫中不存在的資料庫使用者身分建立物件時,就會發生定義器錯誤。或者,當 MySQL 嘗試為 localhost 建立使用者時,會出現定義器,因為 Amazon RDS 沒有超級使用者權限。您可能會遇到類似以下的錯誤:
"Definer error: example: /*!50003 CREATE*/ /*!50017 DEFINER=`root`@`localhost`*/ /*!50003 TRIGGER customer_update AFTER UPDATE ON `customer` FOR EACH ROW" error message."
若要解決該錯誤,請執行下列動作。
移除 DEFINER 行
找到 DEFINER 行,然後將其刪除:
/*!50017 DEFINER=`root`@`localhost`*/
輸出範例:
/*!50003 CREATE*/ /*!50003 TRIGGER customer_update AFTER UPDATE ON `customer` FOR EACH ROW
重新命名 DEFINER 使用者
將 root 重新命名為 masteruser,並將 localhost 重新命名為 %host:
/*!50017 DEFINER=`masteruser`@`%host`*/
輸出範例:
/*!50003 CREATE*/ /*!50017 DEFINER=`masteruser`@`%`*/ /*!50003 TRIGGER customer_update AFTER UPDATE ON `customer` FOR EACH ROW
**注意:**您可以使用 % 作為所有主機的萬用字元。
移除 DEFINER 選項,然後建立或重新建立傾印檔案
MySQL 傾印公用程式不包含移除 DEFINER 的選項。部分 MySQL 用戶端工具在建立邏輯備份時,會提供忽略 DEFINER 的選項,但此功能預設無法使用。若要確定您是否有忽略 DEFINER 的選項,請查看您偏好的 MySQL 用戶端文件。MySQL 命令列用戶端無法排除 DEFINER。不過,您可以使用用戶端和第三方工具來移除 DEFINER,或尋找並取代使用者名稱和主機。
若要在 Linux、macOS 或 Windows Subsystem for Linux (WSL) 中尋找並刪除 DEFINER 行,請執行下列命令:
sed -i -e 's/DEFINER=`root`@`localhost`//g' dump.sql
若要在 Linux、macOS 或 WSL 中尋找並取代使用者名稱和主機,請執行以下命令:
sed -i -e 's/DEFINER=`root`@`localhost`/DEFINER=`masteruser`@`%`/g' dump.sql
**注意:**將 masteruser 替換為您 Amazon RDS 主要使用者的名稱。
相關資訊
Amazon RDS for MySQL
使用複寫從 MySQL 資料庫執行個體匯出資料