這篇文章主要介紹“怎么理解MySQL的GTID復(fù)制”,在日常操作中,相信很多人在怎么理解MySQL的GTID復(fù)制問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”怎么理解MySQL的GTID復(fù)制”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
創(chuàng)新互聯(lián):成立與2013年為各行業(yè)開拓出企業(yè)自己的“網(wǎng)站建設(shè)”服務(wù),為成百上千家公司企業(yè)提供了專業(yè)的網(wǎng)站制作、成都網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)和網(wǎng)站推廣服務(wù), 按需規(guī)劃網(wǎng)站由設(shè)計(jì)師親自精心設(shè)計(jì),設(shè)計(jì)的效果完全按照客戶的要求,并適當(dāng)?shù)奶岢龊侠淼慕ㄗh,擁有的視覺(jué)效果,策劃師分析客戶的同行競(jìng)爭(zhēng)對(duì)手,根據(jù)客戶的實(shí)際情況給出合理的網(wǎng)站構(gòu)架,制作客戶同行業(yè)具有領(lǐng)先地位的。
什么是GTID呢, 簡(jiǎn)而言之,就是全局事務(wù)ID(global transaction identifier ),最初由google實(shí)現(xiàn),官方MySQL在5.6才加入該功能。
GTID是事務(wù)提交時(shí)創(chuàng)建分配的唯一標(biāo)識(shí)符,所有事務(wù)均與GTID一一映射。
GTID的格式類似于:
5882bfb0-c936-11e4-a843-000c292dc103:1
這個(gè)字符串,用“:”分開,前面表示這個(gè)服務(wù)器的server_uuid,這是一個(gè)128位的隨機(jī)字符串,在第一次啟動(dòng)時(shí)生成(函數(shù)generate_server_uuid),對(duì)應(yīng)的variables是只讀變量server_uuid。 它能以極高的概率保證全局唯一性,并存到文件
DATADIR/auto.cnf中。因此要注意保護(hù)這個(gè)文件不要被刪除或修改。
第二部分是一個(gè)自增的事務(wù)ID號(hào),事務(wù)id號(hào)+server_uuid來(lái)唯一標(biāo)示一個(gè)事務(wù)。
mysql> show global variables like '%gtid%'; +--------------------------+------------------------------------------+ | Variable_name | Value | +--------------------------+------------------------------------------+ | enforce_gtid_consistency | ON | | gtid_executed | 5882bfb0-c936-11e4-a843-000c292dc103:1-6 | | gtid_mode | ON | | gtid_owned | | | gtid_purged | | +--------------------------+------------------------------------------+ 5 rows in set (0.00 sec) mysql> show global variables like '%uuid%'; +---------------+--------------------------------------+ | Variable_name | Value | +---------------+--------------------------------------+ | server_uuid | 5882bfb0-c936-11e4-a843-000c292dc103 | +---------------+--------------------------------------+ 1 row in set (0.00 sec) shell> cat auto.cnf [auto] server-uuid=5882bfb0-c936-11e4-a843-000c292dc103
同步主從數(shù)據(jù)
mysql> SET @@global.read_only = ON; Query OK, 0 rows affected (0.01 sec)
停止所有數(shù)據(jù)庫(kù)
shell> mysqladmin -u root -p shutdown
設(shè)置開發(fā)GTID模式并啟動(dòng)所有數(shù)據(jù)庫(kù)
shell> vi my.cnf 添加如下內(nèi)容 ================================================================ [mysqld] gtid_mode=ON log-slave-updates=ON enforce-gtid-consistency=ON #強(qiáng)制GTID的一致性 ================================================================
從庫(kù)指定主庫(kù)
mysql> CHANGE MASTER TO -> MASTER_HOST = host, -> MASTER_PORT = port, -> MASTER_USER = user, -> MASTER_PASSWORD = password, -> MASTER_AUTO_POSITION = 1; mysql> START SLAVE; Query OK, 0 rows affected (0.04 sec)
禁止read-only模式
mysql> SET @@global.read_only = OFF; Query OK, 0 rows affected (0.00 sec)
GTID 模式實(shí)例和非GTID模式實(shí)例是不能進(jìn)行復(fù)制的,要求非常嚴(yán)格,要么都是GTID,要么都不是
gtid_mode 是只讀的,要改變狀態(tài)必須1)關(guān)閉實(shí)例、2)修改配置文件、3) 重啟實(shí)例
更新非事務(wù)引擎表
在同一事務(wù)中更新事務(wù)表與非事務(wù)表將導(dǎo)致多個(gè)GTIDs分配給同一事務(wù)
mysql> cretea table tt (id int) engine=myisam; mysql> insert into tt values(1),(2); mysql> cretea table t (id int) engine=innodb; mysql> insert into t values(1),(2); mysql> set autocommit = 0; mysql> begin; mysql> update t set id = 3 where id =2; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> update tt set id = 3 where id =2; ERROR 1785 (HY000): When @@GLOBAL.ENFORCE_GTID_CONSISTENCY = 1, updates to non-transactional tables can only be done in either autocommitted statements or single-statement transactions, and never in the same statement as updates to transactional tables.
CREATE TABLE … SELECT statements
不安全的基于語(yǔ)句復(fù)制,實(shí)際是兩個(gè)獨(dú)立的事件,一個(gè)用于建表,一個(gè)用于向新表插入源表數(shù)據(jù)。
mysql> create table t engine=innodb as select * from tt; ERROR 1786 (HY000): CREATE TABLE ... SELECT is forbidden when @@GLOBAL.ENFORCE_GTID_CONSISTENCY = 1.
臨時(shí)表
事務(wù)內(nèi)部不能執(zhí)行創(chuàng)建刪除臨時(shí)表語(yǔ)句,但可以在事務(wù)外執(zhí)行,但必須設(shè)置set autocommit = 1
mysql> create temporary table tttt(id int); ERROR 1787 (HY000): When @@GLOBAL.ENFORCE_GTID_CONSISTENCY = 1, the statements CREATE TEMPORARY TABLE and DROP TEMPORARY TABLE can be executed in a non-transactional context only, and require that AUTOCOMMIT = 1. mysql> set autocommit = 1; Query OK, 0 rows affected (0.00 sec) mysql> create temporary table tttt(id int); Query OK, 0 rows affected (0.04 sec)
不執(zhí)行不支持的語(yǔ)句
啟用--enforce-gtid-consistency選項(xiàng)啟動(dòng)GTID模式,上述不支持的語(yǔ)句將會(huì)返回錯(cuò)誤。
a. 忽略復(fù)制錯(cuò)誤
當(dāng)備庫(kù)復(fù)制出錯(cuò)時(shí),傳統(tǒng)的跳過(guò)錯(cuò)誤的方法是設(shè)置sql_slave_skip_counter,然后再START SLAVE。
但如果打開了GTID,就會(huì)設(shè)置失?。?/p>
mysql> stop slave; Query OK, 0 rows affected (0.03 sec) mysql> set global sql_slave_skip_counter = 1; ERROR 1858 (HY000): sql_slave_skip_counter can not be set when the server is running with @@GLOBAL.GTID_MODE = ON. Instead, for each transaction that you want to skip, generate an empty transaction with the same GTID as the transaction
提示的錯(cuò)誤信息告訴我們,可以通過(guò)生成一個(gè)空事務(wù)來(lái)跳過(guò)錯(cuò)誤的事務(wù)。
我們手動(dòng)產(chǎn)生一個(gè)備庫(kù)復(fù)制錯(cuò)誤:
[slave] mysql> alter table t add primary key pk_id(id); Query OK, 2 rows affected (0.12 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> insert into t values(1); mysql> insert into t values(4); mysql> insert into t values(5); mysql> show master status ; +-------------------+----------+--------------+------------------+-------------------------------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +-------------------+----------+--------------+------------------+-------------------------------------------+ | mysql-info.000004 | 914 | | | 5882bfb0-c936-11e4-a843-000c292dc103:1-17 | +-------------------+----------+--------------+------------------+-------------------------------------------+ 1 row in set (0.00 sec) mysql> show slave status \G *************************** 1. row *************************** ... Slave_IO_Running: Yes lave_SQL_Running: No Last_Errno: 1062 Last_Error: Could not execute Write_rows event on table db_test.t; Duplicate entry '1' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log mysql-info.000004, end_log_pos 401 Retrieved_Gtid_Set: 5882bfb0-c936-11e4-a843-000c292dc103:1-15 Executed_Gtid_Set: 5882bfb0-c936-11e4-a843-000c292dc103:1-14, f1e6584a-c935-11e4-a840-000c29348dbe:1 Auto_Position: 1 1 row in set (0.00 sec) mysql> SET @@SESSION.GTID_NEXT= '5882bfb0-c936-11e4-a843-000c292dc103:15'; Query OK, 0 rows affected (0.00 sec) mysql> begin; Query OK, 0 rows affected (0.00 sec) mysql> commit; Query OK, 0 rows affected (0.00 sec) mysql> SET SESSION GTID_NEXT = AUTOMATIC; mysql> start slave; mysql> show slave status\G *************************** 1. row *************************** Slave_IO_Running: Yes Slave_SQL_Running: Yes Last_Errno: 0 Retrieved_Gtid_Set: 5882bfb0-c936-11e4-a843-000c292dc103:1-17 Executed_Gtid_Set: 5882bfb0-c936-11e4-a843-000c292dc103:1-17, f1e6584a-c935-11e4-a840-000c29348dbe:1 Auto_Position: 1 1 row in set (0.00 sec)
再查看show slave status,就會(huì)發(fā)現(xiàn)錯(cuò)誤事務(wù)已經(jīng)被跳過(guò)了。這種方法的原理很簡(jiǎn)單,空事務(wù)產(chǎn)生的GTID加入到GTID_EXECUTED中,
這相當(dāng)于告訴備庫(kù),這個(gè)GTID對(duì)應(yīng)的事務(wù)已經(jīng)執(zhí)行了,此時(shí)主從數(shù)據(jù)不一致。
到此,關(guān)于“怎么理解MySQL的GTID復(fù)制”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!