MySQL RDS复制与LOAD DATA INFILE一起消失

时间:2013-09-10 23:17:12

标签: mysql sql amazon-web-services replication rds

我遇到一个简单的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`)'

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

CREATE TABLE `test` (
`name` varchar(25) NOT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 

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

# cat test.csv
steve,24
bob,34
courtney,12
ben,28
aidan,15

然后导入它(忽略警告,我没有得到我的分隔符,但数据进入):

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

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

mysql> status;
--------------
mysql  Ver 14.14 Distrib 5.5.27, for FreeBSD9.0 (amd64) using  5.2

Connection id:          13481
Current database:       testdb
Current user:           testuser@ip-10-50-99-59.eu-west-1.compute.internal
SSL:                    Not in use
Current pager:          more
Using outfile:          ''
Using delimiter:        ;
Server version:         5.6.13-log MySQL Community Server (GPL)
Protocol version:       10
Connection:             saturn.xxxxxxxxxxx.eu-west-1.rds.amazonaws.com via TCP/IP
Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    latin1
Conn.  characterset:    latin1
TCP port:               3306
Uptime:                 8 hours 52 min 23 sec

Threads: 3  Questions: 775195  Slow queries: 0  Opens: 51017  Flush tables: 1  Open tables: 2000  Queries per second avg: 24.268

如果有人可以提供帮助,那会爱吗

感谢

史蒂夫

2 个答案:

答案 0 :(得分:2)

这个中断的原因主要是因为只读副本正在重放二进制日志,当它到达你的LOAD DATA LOCAL INFILE语句时,它没有那个文件。

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

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

答案 1 :(得分:0)

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

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

CALL mysql.rds_skip_repl_error;

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

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