天天看點

Slave_SQL線程異常終止處理之跳過錯誤附pt工具安裝錯誤排查

手動跳過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

繼續閱讀