<pre name="code" class="sql">sync_master_info = 1 sync_relay_log_info = 1 relay_log_info_repository = FILE
参数意思是:sql线程每次执行完了一个事务,就会记录在master.info和relay.info文件里。即:
START TRANSACTION; -- Statement 1 -- ... -- Statement N COMMIT; -- Update replication info files
由于在记录relay.info的时候宕机,relay.info未更新,机器重启恢复后会从之前的POS点再次执行,这样就执行了两条同样的SQL,就会报1032和1062错误,同步就挂了。
于是我建议他们设置:
relay_log_info_repository = TABLE relay_log_recovery = 1
alter table mysql.slave_relay_log_info engine=innodb;
参数意思是:把relay.info改成记录在slave_relay_log_info表里,并改成innodb引擎,并开启relay_log_recovery中继日志自我修复功能。即:
START TRANSACTION; -- Statement 1 -- ... -- Statement N -- Update replication info COMMIT;
这样sql线程执行完事务后,立即会更新slave_relay_log_info表,如果在更新过程中宕机,事务会回滚,slave_relay_log_info表并不会记录同步的点,下次重新同步复制时,从之前的POS点再次执行。