您好,登錄后才能下訂單哦!
在GTID-based復(fù)制中,如何擴(kuò)容一個(gè)只讀實(shí)例?
這里使用mysqldump工具在Master節(jié)點(diǎn)上進(jìn)行數(shù)據(jù)備份,注意一個(gè)關(guān)鍵參數(shù):--set-gtid-purged[=name],該參數(shù)代表在備份文件中,哪些GTID已執(zhí)行過了,在change master時(shí),復(fù)制將從這些GTID之后進(jìn)行。
--set-gtid-purged[=name]
Add 'SET @@GLOBAL.GTID_PURGED' to the output. Possible
values for this option are ON, OFF and AUTO. If ON is
used and GTIDs are not enabled on the server, an error is
generated. If OFF is used, this option does nothing. If
AUTO is used and GTIDs are enabled on the server, 'SET
@@GLOBAL.GTID_PURGED' is added to the output. If GTIDs
are disabled, AUTO does nothing. If no value is supplied
then the default (AUTO) value will be considered.
mysqldump命令如下:
$ bin/mysqldump --user=root --password='123456' --socket=/home/mysql/mysql3309/tmp/mysql.sock --default-character-set=utf8mb4 --events --routines --triggers --force --hex-blob --quick --single-transaction --set-gtid-purged=ON --databases db1 lg > /tmp/bak/data.sql
Warning: A partial dump from a server that has GTIDs will by default include the GTIDs of all transactions, even those that changed suppressed parts of the database. If you don't want to restore GTIDs, pass --set-gtid-purged=OFF. To make a complete dump, pass --all-databases --triggers --routines --events.?
觀察備份文件data.sql,會(huì)發(fā)現(xiàn)兩處值得注意的地方:
·使用備份文件導(dǎo)入數(shù)據(jù)時(shí),將會(huì)話級(jí)系統(tǒng)變量@@SESSION.SQL_LOG_BIN設(shè)置為了0,即不產(chǎn)生二進(jìn)制日志。
SET @MYSQLDUMP_TEMP_LOG_BIN = @@SESSION.SQL_LOG_BIN;
SET @@SESSION.SQL_LOG_BIN= 0;
...
SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;
·設(shè)置了全局系統(tǒng)變量@@GLOBAL.GTID_PURGED。
SET @@GLOBAL.GTID_PURGED='0c34233d-b2e1-11e9-85cf-080027f22add:1-2,
32a0c858-b59f-11e9-b069-0800270c3d91:1-2,
447e96e1-b59f-11e9-95fe-0800270c3d91:1-2,
4fdc13e1-b59e-11e9-b5e0-080027f22add:1-9,
b8282f18-b59e-11e9-83b0-0800270c3d91:1-5';
同時(shí)也設(shè)置了@@GLOBAL.GTID_EXECUTED,這就是復(fù)制從何處開始的依據(jù)。確切的說是,@@GLOBAL.GTID_EXECUTED為空時(shí),才能設(shè)置@@GLOBAL.GTID_PURGED,否則報(bào)錯(cuò)如下。同時(shí)@@GLOBAL.GTID_EXECUTED會(huì)設(shè)置成和@@GLOBAL.GTID_PURGED具有相同的值。
ERROR 1840 (HY000): @@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty.
Query OK, 1 row affected (0.00 sec)
導(dǎo)入備份數(shù)據(jù)前,觀察新Slave節(jié)點(diǎn)上@@GLOBAL.GTID_PURGED,和@@GLOBAL.GTID_EXECUTED的值。
[root@mysql.sock][(none)]> select @@GLOBAL.GTID_PURGED;
+----------------------+
| @@GLOBAL.GTID_PURGED |
+----------------------+
|? ? ? ? ? ? ? ? ? ? ? |
+----------------------+
1 row in set (0.00 sec)
[root@mysql.sock][(none)]>?
[root@mysql.sock][(none)]> select @@GLOBAL.GTID_EXECUTED;
+------------------------+
| @@GLOBAL.GTID_EXECUTED |
+------------------------+
|? ? ? ? ? ? ? ? ? ? ? ? |
+------------------------+
1 row in set (0.00 sec)
導(dǎo)入數(shù)據(jù)后,再觀察。
[root@mysql.sock][(none)]> source /tmp/bak/data.sql;
...
[root@mysql.sock][lg]> select @@GLOBAL.GTID_PURGED;
+-------------------------------------------------+
| @@GLOBAL.GTID_PURGED |
+-------------------------------------------------+
| 0c34233d-b2e1-11e9-85cf-080027f22add:1-2,
32a0c858-b59f-11e9-b069-0800270c3d91:1-2,
447e96e1-b59f-11e9-95fe-0800270c3d91:1-2,
4fdc13e1-b59e-11e9-b5e0-080027f22add:1-9,
b8282f18-b59e-11e9-83b0-0800270c3d91:1-5 |
+-------------------------------------------------+
1 row in set (0.00 sec)
[root@mysql.sock][lg]> select @@GLOBAL.GTID_EXECUTED;
+-------------------------------------------------+
| @@GLOBAL.GTID_EXECUTED |
+-------------------------------------------------+
| 0c34233d-b2e1-11e9-85cf-080027f22add:1-2,
32a0c858-b59f-11e9-b069-0800270c3d91:1-2,
447e96e1-b59f-11e9-95fe-0800270c3d91:1-2,
4fdc13e1-b59e-11e9-b5e0-080027f22add:1-9,
b8282f18-b59e-11e9-83b0-0800270c3d91:1-5 |
+-------------------------------------------------+
1 row in set (0.00 sec)
最后change master即可。
CHANGE MASTER TO
MASTER_HOST='10.0.2.6',
MASTER_USER='repl',
MASTER_PASSWORD='123456',
MASTER_PORT=3309,
MASTER_AUTO_POSITION = 1;
注意,在一些特殊場景下,可能需要手動(dòng)設(shè)置@@GLOBAL.GTID_PURGED。
在GTID-based的復(fù)制中,如何設(shè)置級(jí)聯(lián)復(fù)制呢,要求復(fù)制拓?fù)淙缦拢渲屑^代表數(shù)據(jù)的復(fù)制方向,括號(hào)中的部分還不存在。
S <- M (-> M' -> S')
若先建立M' -> S'的復(fù)制關(guān)系,使用mysqldump在M上備份數(shù)據(jù),然后導(dǎo)入M',數(shù)據(jù)會(huì)從M'復(fù)制到S'嗎,通過上面知道,導(dǎo)入數(shù)據(jù)時(shí)設(shè)置了@@SESSION.SQL_LOG_BIN= 0,所以數(shù)據(jù)不會(huì)從M'復(fù)制到S',這點(diǎn)是和Position-based復(fù)制不一樣的,即如下方式不會(huì)設(shè)置SQL_LOG_BIN。
$ bin/mysqldump --user=root --password='123456' --socket=/home/mysql/mysql3309/tmp/mysql.sock --default-character-set=utf8mb4 --events --routines --triggers --force --hex-blob --quick --single-transaction --set-gtid-purged=OFF --master-data=2 --databases db1 lg > /tmp/bak/2data.sql
所以正確的思路是,用備份數(shù)據(jù)同時(shí)恢復(fù)M'和S',然后建立M' -> S',最后建立M -> M'。
對于Failover,由于不需要指定位點(diǎn)信息,直接change master即可,比Position-based復(fù)制簡潔很多。另,通過前面幾篇文章的介紹,也可以發(fā)現(xiàn)GTID-based的復(fù)制比Position-based復(fù)制在數(shù)據(jù)一致性方面更加嚴(yán)格,不像Position-based復(fù)制隨便指定個(gè)位點(diǎn),若復(fù)制過程無報(bào)錯(cuò),就可以繼續(xù)。
PS:使用xtrabackup備份數(shù)據(jù)時(shí),上面的思路是完全成立的。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。