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

2 分钟阅读
0

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

简述

使用 mysqldump 时您可能会收到以下错误:

  • 无法执行“刷新带读取锁定的表”错误
  • Max_allowed_packet 错误
  • 超级权限和定义者错误
  • 连接丢失或中断错误

解决方法

无法执行“刷新带读取锁定的表”错误

使用 mysqldump 通过 --master-data 选项导出数据时,您可能会收到以下类似错误:

“mysqldump: 无法执行‘刷新带读取锁定的表’: 用户“user'@'%”访问被拒绝(使用密码: 是)(1045)”

--master-data 选项将获取刷新带读取锁定的表。这需要 Amazon RDS 主用户没有的超级权限,而且 Amazon RDS 不支持全局读取锁定。当 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_FileExec_Master_Log_Pos

5.    如果您的应用程序使用此副本,使用以下存储过程重新开始复制:

CALL mysql.rds_start_replication;

如果您的应用程序不使用此副本,可以将其删除。

Max_allowed_packet 错误

使用 mysqldump 导出数据时,您可能会收到以下类似错误:

“错误 2020: 在行上转储表 `tb_name` 时,收到超过‘max_allowed_packet’字节的数据包: XX”

当 mysqldump 命令请求的数据包大于为您的 RDS 数据库实例设置的 max_allowed_packet 参数的值时,会出现此错误。有关更多信息,请参阅 MySQL 文档中的数据包太大

要解决 max_allowed_packet 错误,增加 max_allowed_packet 的全局值,或在 mysqldump 中为该会话配置 max_allowed_packet(不是为整个数据库全局配置)。例如,您可以修改以下类似命令:

$ mysqldump --max_allowed_packet=1G ......

超级权限和定义者错误

使用 mysqldump 将数据导入运行 MySQL 或 MariaDB 的 RDS 数据库实例时,您可能会收到以下类似错误:

“行 XX 出现 1227 (42000) 错误: 访问被拒绝;您需要(至少其中一项)超级权限来执行此操作”

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

连接丢失或中断错误

使用 mysqldump 导入数据时,您可能会收到以下类似错误:

“mysqldump:错误 2013:转储表时与 mysql 服务器的连接在查询过程中丢失”

--或--

“mysqldump: XXXXXX 与 db: 'db_name' 用户‘master_user’主机的连接中止: ‘XXXXXXX’(写入通信包超时)”

有关此错误的原因和解决方法的更多信息,请参阅如何解决连接到 Amazon RDS MySQL 数据库实例时出现的“MySQL 服务器消失”错误?


相关信息

MySQL 文档中的 mysqldump

如何为 Amazon RDS for MySQL 数据库实例启用函数、过程和触发器?