我在使用运行 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_File 和 Exec_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 数据库实例启用函数、过程和触发器?