跳至内容

当我使用 mysqldump 将数据导入到我的 Amazon RDS for MySQL 数据库实例时,如何解决 1227 和定义者错误?

2 分钟阅读
0

当我使用 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.”

要解决此错误,请完成以下步骤:

  1. 在您为数据库实例创建的自定义数据库参数组中,将 log_bin_trust_function_creators 参数设置为 True
  2. 在针对实例运行文件之前,从转储文件中移除 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 数据库实例导出数据