MySQL RDS 复制因加载数据文件而死亡



我在一个简单的 RDS 只读副本上遇到了一个令人困惑的问题,当我们在主服务器上执行加载数据本地 INFILE 时,它会通过以下方式可靠地杀死只读副本:

Error 'Access denied for user ''@'' (using password: NO)' on query. Default database: 'testdb'. Query: 'LOAD DATA INFILE '/rdsdbdata/tmp/SQL_LOAD-5ce65f0d-1a6a-11e3-af1b-12313c014074-352397698-1549.data' IGNORE INTO  TABLE `test` FIELDS TERMINATED BY 't' ENCLOSED BY '' ESCAPED BY '\' LINES TERMINATED BY 'n' (`name`, `age`)'

为了复制这种情况,我有一个简单的主控,并创建了一个名为 test 的表:

创建表"测试"('name' varchar(25) 不为空,  'age' int(11) 默认为空,  主键("名称")) 引擎=InnoDB 默认字符集=拉丁语1

它已成功复制到只读副本。 然后我设置我的输入文件:

# 猫测试.csv史蒂夫,24鲍勃,34考特尼,12本,28艾丹,15

然后导入它(忽略警告,我没有正确使用分隔符,但数据进入了):

mysqlimport --local testdb test.csv
testdb.test: Records: 5  Deleted: 0  Skipped: 0  Warnings: 5

这就是杀死只读副本所需要的一切。 我以您在创建 RDS 实例时创建的用户身份连接到 mysql,因此它应该具有所有权限。 但无论如何,只读副本将有自己的复制用户。 我尝试使读取复制不是只读的,但这似乎不起作用。

Mysql>状态;--------------mysql Ver 14.14 Distrib 5.5.27, for FreeBSD9.0 (amd64) using 5.2连接 ID:13481当前数据库:测试数据库当前用户: testuser@ip-10-50-99-59.eu-west-1.compute.internalSSL:未使用当前寻呼机: 更多使用输出文件:"使用分隔符: ;服务器版本:5.6.13日志MySQL社区服务器(GPL)协议版本:10连接:通过TCP/IP saturn.xxxxxxxxxxx.eu-west-1.rds.amazonaws.com服务器字符集:拉丁语1分贝字符集:拉丁文1客户端字符集:拉丁语1控制室。 字符集:拉丁语1TCP 端口:3306正常运行时间:8 小时 52 分 23 秒线程: 3 问题: 775195 慢查询: 0 打开: 51017 刷新表: 1 打开的表: 2000 每秒查询数 平均: 24.268

如果有人能帮忙,会很高兴

谢谢

史蒂夫

这中断

的原因主要是因为只读副本正在重播二进制日志,当它到达您的 LOAD DATA LOCAL INFILE 语句时,它没有该文件。

RDS 使用快照(而不是重播 bin 日志)从现有数据库创建全新的只读副本。

所以解决方案是:在对主节点执行任何加载数据本地 INFILE 后,您必须删除只读副本并重新创建它。

根据 AWS 技术支持,这是通过加载数据文件导入 CSV 时的已知问题。

对我来说,发出以下命令会导致只读副本跳过错误并成功同步:

CALL mysql.rds_skip_repl_error;

无需删除并重新创建只读副本。

更新:当我将只读副本升级到MySQL 5.6时,此问题自行解决。

最新更新