2

我在使用简单的 RDS 只读副本时遇到了一个令人费解的问题,当我们在主服务器上执行 LOAD DATA LOCAL 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`)'

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

创建表`测试`(
`name` varchar(25) NOT NULL,
  `age` int(11) 默认为空,
  主键(`名称`)
) 引擎=InnoDB 默认字符集=latin1

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

# 猫测试.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,适用于 FreeBSD9.0 (amd64) 使用 5.2

连接编号:13481
当前数据库:testdb
当前用户:testuser@ip-10-50-99-59.eu-west-1.compute.internal
SSL:未使用
当前寻呼机:更多
使用输出文件:''
使用分隔符:;
服务器版本:5.6.13-log MySQL Community Server (GPL)
协议版本:10
连接:saturn.xxxxxxxxxxx.eu-west-1.rds.amazonaws.com 通过 TCP/IP
服务器字符集:latin1
Db 字符集:latin1
客户端字符集:latin1
康涅狄格字符集:latin1
TCP端口:3306
正常运行时间:8 小时 52 分 23 秒

线程:3 问题:775195 慢查询:0 打开:51017 刷新表:1 打开表:2000 每秒查询平均:24.268

如果有人可以提供帮助,我会很高兴

谢谢

史蒂夫

4

2 回答 2

2

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

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

所以解决方案是:在对主服务器执行任何 LOAD DATA LOCAL INFILE 之后,您必须删除您的只读副本并重新创建它。

于 2013-10-25T18:34:12.823 回答
0

根据 AWS 技术支持,这是通过 LOAD DATA INFILE 导入 CSV 时的一个已知问题。

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

CALL mysql.rds_skip_repl_error;

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

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

于 2014-04-21T21:43:32.030 回答