如何解决在 Amazon RDS for MySQL 或 MariaDB 上使用 mysqldump 时遇到的错误?

上次更新时间:2020 年 8 月 19 日

我使用运行 MySQL 或 MariaDB 的 Amazon Relational Database Service (Amazon RDS) 数据库实例。我使用 mysqldump 导入或导出数据,并且遇到错误。如何排查并解决此错误?

简短描述

使用 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_pa​​cket 错误

使用 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"

此错误表示以下一个或多个问题:

连接丢失或中止错误

使用 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”错误?


这篇文章对您有帮助吗?


您是否需要账单或技术支持?