当我使用 mysqldump 将数据导入到 Amazon Relational Database Service (Amazon RDS) for MySQL 数据库实例时,会出现 1227 或定义者错误。
解决方法
要查看数据库事件和更改,请查看二进制日志。有关详细信息,请参阅 MySQL 网站上的 The binary log(二进制日志)。
错误 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 因为 Amazon RDS 没有 superuser 权限而尝试为 localhost 创建用户时,就会出现定义者错误。您可能会看到类似于以下内容的错误:
“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 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 数据库实例导出数据