手動跳過1個或更多個事務
/* 傳統點位模式複制 */
SQL>set global sql_slave_skip_counter=1;
SQL>start sql_thread;
/* GTID模式複制 */
SQL>set gtid_next='e29d3917-9dbb-11e9-8b64-e4434b6e2c80:11103335-16054791';
SQL>begin;commit;
SQL>set gtid_next='AUTOMATIC';
自動連續跳過錯誤
若是一直報錯,然則,這些報錯又可以忽略可以怎麼處置,此時也有許多方式,通常使用的是如下幾種:
方式一: 使用pt-slave-restart工具跳過對應錯誤
然則使用pt-slave-restart工具跳過報錯時,必須關閉多線程複制,由于工具分不清到底哪個線程複制出了問題,然後會報類似如下的報錯:
Cannot skip transactions properly because GTID is enabled and slave_parallel_workers > 0. See 'GLOBAL TRANSACTION IDS' in the tool's documentation
處置步驟為:
/* 暫停并行複制 */
SQL> set global slave_parallel_workers=0;
/* 使用pt-slave-restart工具跳過錯誤(填寫錯誤号)*/
pt-slave-restart --user=root --password='[email protected]' --socket=/data/mysql3306/tmp/mysql.sock --error-numbers=1062
/* 不再報錯時,再開啟并行複制 */
mysql> set global slave_parallel_workers=8;
方法二:在設定檔案裡設定跳過指定錯誤
在設定檔案[mysqld]項裡加入參數slave-skip-errors
slave-skip-errors=1032,1062
然則,此方式存在一個緻命瑕玷:該參數是靜态參數,無法動态修改,需要修改設定檔案後重新開機資料庫方可生效。
幂等模式
由于手動跳過事務時,會忽略相同僚務下的其他正常的SQL在從庫的應用;pt-slave-restart工具需要住手多線程複制,影響從庫應用速率;設定slave-skip-errors又需要重新開機資料庫方可生效。那麼有沒有一種方式既不會跳過多餘的SQL,又無需重新開機資料庫也不影響從庫應用SQL的速率呢?謎底是有的,也就是将slave_exec_mode參數設定為IDEMPOTENT,即幂等模式(默以為嚴酷模式STRICT)。
/* 線上動态修改 */
SQL > set global slave_exec_mode='IDEMPOTENT';
改為幂等模式後,可以忽略1032及1062的錯誤,對統一事務内的其他SQL無影響,依舊能正常執行。
附pt工具安裝錯誤排查
percona-toolkit執行時遇到install_driver(mysql) failed: Attempt to reload DBD/mysql.pm aborted錯誤
執行pt-table-checksum報錯如下:
[[email protected] ~]# pt-table-checksum S=/data/mysql/mysqldata3306/sock/mysql.sock,h=localhost
11-01T17:07:02 install_driver(mysql) failed: Attempt to reload DBD/mysql.pm aborted.
Compilation failed in require at (eval 14) line 3.
at /usr/local/bin/pt-table-checksum line 1623
而主機上已經安裝了相應的軟體包:
[[email protected] ~]# rpm -qa | grep -i mysql
perl-DBD-MySQL-4.013-3.el6.x86_64
mysql-libs-5.1.73-8.el6_8.x86_64
發現系統沒有加載mysql的動态連結庫:
[[email protected] ~]# ldconfig -p | grep mysql
那就添加一下:
[[email protected] ~]# echo '/usr/local/mysql/lib' > /etc/ld.so.conf.d/mysql.conf
[[email protected] ~]# ldconfig
[[email protected] ~]# ldconfig -p | grep mysql
libmysqlclient.so.20 (libc6,x86-64) => /usr/local/mysql/lib/libmysqlclient.so.20
再次執行pt-table-checksum仍然報錯:
[[email protected] ~]# pt-table-checksum S=/data/mysql/mysqldata3306/sock/mysql.sock,h=localhost
11-01T17:07:02 install_driver(mysql) failed: Attempt to reload DBD/mysql.pm aborted.
Compilation failed in require at (eval 14) line 3.
at /usr/local/bin/pt-table-checksum line 1623
這裡需要把libmysqlclient.so檔案複制一份到/usr/lib64/mysql/libmysqlclient.so.18
如果還是沒有找到:
找到 mysql的動态連結庫:
[[email protected] ~]# ldd /usr/lib64/perl5/auto/DBD/mysql/mysql.so
linux-vdso.so.1 => (0x00007ffecb770000)
libmysqlclient.so.18 => not found --還是沒有找到
libz.so.1 => /lib64/libz.so.1 (0x00007f3be2321000)
需要重裝下perl-DBD-MySQL包
[[email protected] lib]# yum reinstall perl-DBD-MySQL