我遇到一个简单的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
如果有人可以提供帮助,那会爱吗
感谢
史蒂夫
答案 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时,此问题自行解决。