1. 程式人生 > >mysql使用GTID跳過事務

mysql使用GTID跳過事務

GTID跳過有兩種方法,一種是普通的跳過一個事務的方法,另外一個是在基於主庫搭建新的slave的時候.
一、普通跳過一個事務的方法。
通過show slave status\G找到衝突的GTID號.
然後執行
SET gtid_next = '衝突的GTID號';
BEGIN;COMMIT;
SET gtid_next = 'AUTOMATIC';
START SLAVE;
這就可以跳過一個事務了,原理在於通過執行一個空事務代替master傳遞過來的衝突事務.

二、通過備份的dump.sql檔案搭建新的slave.
開啟gtid以後,使用mysqldump備份,一般系統會要求你使用–all-databases引數,避免主庫和從庫有部分資料不一致。
備份以後,dump.sql裡面會有這樣一條語句.

SET @@GLOBAL.GTID_PURGED='0140505e-4230-11e4-b7c9-000c29da163d:1-8,dd079e18-4244-11e4-b851-000c29da163e:1-2';

這個就是當前主庫已經執行過的GTID,也就是dump.sql裡面的資料已經包含的GTID,對於這些GTID,slave是不用執行了,所以我們需要設定slave從這些
GTID以後開始複製.方法就是上面這條sql.
將dump.sql直接匯入到slave以後.就可以直接change master了.

如果你是想通過這個方法跳過某個或者某些GTID,那麼有點不同了.
set @@GLOBAL.GTID_PURGED是有要求的,也就是GTID_PURGED必須為空才可以設定,如何把GTID_PURGED清空呢.也就是需要執行

(root:hostname)[test]> show global variables like '%gtid%';
+--------------------------+-------------------------------------------------------------------------------------------------------------------------------+
| Variable_name            | Value                                                                                                                         |
+--------------------------+-------------------------------------------------------------------------------------------------------------------------------+
| enforce_gtid_consistency | ON                                                                                                                            |
| gtid_executed            | 0140505e-4230-11e4-b7c9-000c29da163d:1-25,
dd079e18-4244-11e4-b851-000c29da163e:1-2,
dda2f003-4244-11e4-b851-000c29da163f:1-3 |
| gtid_mode                | ON                                                                                                                            |
| gtid_owned               |                                                                                                                               |
| gtid_purged              | 0140505e-4230-11e4-b7c9-000c29da163d:1-8,
dd079e18-4244-11e4-b851-000c29da163e:1-2                                            |
+--------------------------+-------------------------------------------------------------------------------------------------------------------------------+
5 rows in set (0.00 sec)

(root:hostname)[test]> reset master;
Query OK, 0 rows affected (0.02 sec)

(root:hostname)[test]> show global variables like '%gtid%';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| enforce_gtid_consistency | ON    |
| gtid_executed            |       |
| gtid_mode                | ON    |
| gtid_owned               |       |
| gtid_purged              |       |
+--------------------------+-------+
5 rows in set (0.00 sec)
(root:hostname)[test]> stop slave;  //清掉SLAVE資訊.
(root:hostname)[test]> reset slave all;

然後設定gtid_purged,這個ID就是你要跳過過的GTID,注意這裡GTID還要包含gtid_executed裡面其他UUID的GTID(本機的可以不再設定了)。

(root:hostname)[test]> set @@global.gtid_purged='0140505e-4230-11e4-b7c9-000c29da163d:1-25,dd079e18-4244-11e4-b851-000c29da163e:1-2';
Query OK, 0 rows affected (0.03 sec)

(root:hostname)[test]> CHANGE MASTER TO MASTER_HOST='192.168.153.150', MASTER_PORT=3306, MASTER_USER='slave',MASTER_PASSWORD='slave', master_auto_position=1;
Query OK, 0 rows affected, 2 warnings (0.20 sec)

(root:hostname)[test]> start slave;
Query OK, 0 rows affected, 1 warning (0.03 sec)
CHANGE MASTER TO MASTER_HOST='192.168.1.136', MASTER_PORT=3306, MASTER_USER='dbadmin',M