跳过RDS上的所有从属错误

时间:2016-03-27 09:42:15

标签: amazon-rds

我使用这样的某些my.cnf设置。 RDS实例是否允许这样的选项?

slave-skip-errors = 1062,1054

replicate-ignore-db=verv_raw   

replicate-ignore-table=verv.ox_session

replicate-wild-ignore-table=verv_raw.ox%

replicate-wild-ignore-table=verv_raw.ox%

我知道一次跳过一个错误的过程。

CALL mysql.rds_skip_repl_error;

但我正在寻找的是跳过奴隶上所有错误的选项。是否可以在RDS环境中使用?

2 个答案:

答案 0 :(得分:1)

我通过创建一个像这样的mysql事件调度程序来解决它:

CREATE EVENT repl_error_skipper 
ON SCHEDULE 
EVERY 15 MINUTE
COMMENT 'Calling rds_skip_repl_error to skip replication error'
Do
CALL mysql.rds_skip_repl_error;
/*also you can add other logic */

要设置其他全局变量,您可以在rds参数组中找到并设置这些变量(如果可以更改)(您必须创建新参数组并设置变量值)。

答案 1 :(得分:1)

如前所述,此命令仅跳过一个复制错误。我编写了一个 PHP 脚本来循环遍历它,并通过 cron 作业每分钟运行一次(我的副本被日志卡住了一系列错误查询,而不是在主数据库上执行的)

for($i = 1; $i <= 30; $i++) {
        $db = new mysqli('someserver.rds.amazonaws.com', 'root', 'password');
        $res = $db->query('CALL mysql.rds_skip_repl_error;');
        if(!$res) {
                //echo 'Query failed: ' . $db->error . "\n";
                return;
        }
        //var_dump($res->fetch_assoc());
        $db->close();
        sleep(1);
}

您需要对此进行一些修补(并非每个服务器都只能容忍呼叫之间的一秒和每分钟 30 次呼叫),但它确实有效(尽管以蛮力方式)。您必须每次都创建一个新的数据库连接来运行它。循环打开、运行然后关闭连接。