如何解决在 Amazon RDS for MySQL 或 MariaDB 上使用 mysqldump 时遇到的错误?
上次更新时间:2020 年 8 月 19 日
简短描述
使用 mysqldump 时可能会遇到以下错误:
- 无法执行 FLUSH TABLES WITH READ LOCK 错误
- Max_allowed_packet 错误
- SUPER 权限和 DEFINER 错误
- 连接丢失或中止错误
解决方法
无法执行 FLUSH TABLES WITH READ LOCK 错误
使用 mysqldump 的 --master-data 选项导出数据时,您可能会遇到类似于以下内容的错误:
"mysqldump: Couldn't execute 'FLUSH TABLES WITH READ LOCK': Access denied for user 'user'@'%' (using password: YES) (1045)"
--master-data 选项获取 FLUSH TABLES WITH READ LOCK。这需要 Amazon RDS 主用户所没有的 SUPER 权限,并且 Amazon RDS 不支持 GLOBAL READ LOCK。当 MySQL 运行 CHANGE MASTER TO 语句来获取日志信息时,它会在 mysqldump 文件中记录二进制日志文件的名称和位置(坐标)。有关更多信息,请参阅 MySQL 文档中的 ER_ACCESS_DENIED_ERROR 部分。
要解决此错误,请删除 --master-data 选项。删除此选项后,您将无法在 mysqldump 中获得确切的日志位置。要解决此问题,请在应用程序停止时获取 mysqldump,或者从 Amazon RDS 只读副本中获取 mysqldump。这些,您就可以通过执行 SHOW SLAVE STATUS 获取确切的日志位置,因为停止副本将确认二进制日志位置没有改变。按照以下步骤从此 RDS 数据库实例的 Amazon RDS MySQL 只读副本中创建 mysqldump。
1. 为二进制日志保留设置值。
2. 通过在只读副本上运行以下命令来停止复制:
CALL mysql.rds_stop_replication;
3. 从只读副本中获取没有 --master-data=2 的 mysqldump。
4. 在副本上运行 SHOW SLAVE STATUS 并捕获 Master_Log_File 和 Exec_Master_Log_Pos。
5. 如果将副本用于应用程序,请使用以下存储的程序再次启动复制:
CALL mysql.rds_start_replication;
如果副本不用于应用程序,则可以将其删除。
Max_allowed_packet 错误
使用 mysqldump 导出数据时,您可能会遇到类似于以下内容的错误:
"Error 2020: Got packet bigger than 'max_allowed_packet' bytes when dumping table `tb_name` at row: XX"
当 mysqldump 命令请求的数据包大于为 RDS 数据库实例设置的 max_allowed_packet 参数的值时,会发生此错误。有关更多信息,请参阅 MySQL 文档中的数据包太大部分。
要解决 max_allowed_packet 错误,请增加 max_allowed_packet 的全局值,或者在 mysqldump 中为该会话配置 max_allowed_packet(而不是为整个数据库全局配置)。例如,您可以将命令修改成类似于以下内容:
$ mysqldump --max_allowed_packet=1G ......
SUPER 权限和 DEFINER 错误
使用 mysqldump 将数据导入运行 MySQL 或 MariaDB 的 RDS 数据库实例时,您可能会遇到类似于以下内容的错误:
"ERROR 1227 (42000) at line XX: Access denied; you need (at least one of) the SUPER privilege(s) for this operation"
此错误表示以下一个或多个问题:
- 目标 RDS 数据库实例启用了二进制日志(备份保留期 > 0),并且 mysqldump 文件包含一个对象,例如触发器、视图、函数或事件。有关更多信息,请参阅如何解决在 Amazon RDS MySQL 实例上启用复制或自动备份出现的错误 1227?
- 您导入的 mysqldump 文件尝试使用 RDS 数据库实例中不存在的 DEFINER 属性用户创建对象,或者您尝试创建没有所需的 SUPER 用户权限的属性用户。有关更多信息,请参阅我在使用 mysqldump 将数据导入我的 Amazon RDS for MySQL 实例时如何解决 definer 错误?
- 错误消息中引用的行中的命令需要 RDS 数据库实例中未提供的 SUPER 权限。
连接丢失或中止错误
使用 mysqldump 导入数据时,您可能会遇到类似于以下内容的错误:
"mysqldump: error 2013: lost connection to mysql server during query when dumping table"
--或者--
"mysqldump: Aborted connection XXXXXX to db: 'db_name' user: 'master_user' host: 'XXXXXXX' (Got timeout writing communication packets)"
有关此错误的原因和解决方法的详细信息,请参阅如何解决连接 Amazon RDS for MySQL 数据库实例时出现的“MySQL server has gone away”错误?
相关信息
请参阅 MySQL 文档中的 mysqldump 部分