mysql gtid ha_MySQl新特性 GTID
GTID簡介
概念
全局事務(wù)標(biāo)識符(GTID)是創(chuàng)建的唯一標(biāo)識符,并與在源(主)服務(wù)器上提交的每個事務(wù)相關(guān)聯(lián)。此標(biāo)識符不但是唯一的,而且在給定復(fù)制設(shè)置中的所有服務(wù)器上都是唯一的。所有交易和所有GTID之間都有一對一的映射關(guān)系。
GTID由source_id和transaction_id組成
GTID = source_id:transaction_id
server_uuid一般為source_id
GTID集合
GTID總是保存在主從之間。這意味著您可以通過檢查二進(jìn)制日志來確定應(yīng)用于任何從屬設(shè)備的任何事務(wù)的來源。另外,一旦給定GTID的事務(wù)在給定的服務(wù)器上被提交,任何具有相同GTID的后續(xù)事務(wù)都被該服務(wù)器忽略。因此,在主站上提交的事務(wù)只在從站上應(yīng)用一次,這有助于保證一致性。
GTID的生成和生命周期:
1,事務(wù)在主服務(wù)器上執(zhí)行并提交。使用主服務(wù)器的UUID和此服務(wù)器上尚未使用的最小非零事務(wù)序列號為該事務(wù)分配一個GTID; GTID被寫入到master的二進(jìn)制日志中
2,在將二進(jìn)制日志數(shù)據(jù)發(fā)送到從站并存儲在從站的中繼日志中,從站讀取GTID并設(shè)置gtid_next這告訴slave,下一個事務(wù)必須使用這個GTID記錄。
3,從服務(wù)器驗證這個GTID是否應(yīng)用此事務(wù)。
4,因為gtid_next不是空的,把git_next也就是從主機(jī)中獲得的GTID寫入到二進(jìn)制日志中。
mysql.gtid_executed表
該mysql.gtid_executed表使從機(jī)能夠在從機(jī)上禁用二進(jìn)制日志記錄時使用GTID,并且可以在二進(jìn)制日志丟失時保留GTID歷史記錄。
若將mysql.gtid_executed表復(fù)位,執(zhí)行RESET MASTER
表格提供會周期性的壓縮 當(dāng)數(shù)量達(dá)到executed_gtid_compression_period值或者日志輪轉(zhuǎn)時候mysql壓縮儲存,值默認(rèn)為1000,壓縮線程thread/sql/compress_gtid_table
mysql> SELECT * FROM performance_schema.threads WHERE NAME LIKE'%gtid%'\G
*************************** 1. row ***************************
THREAD_ID: 26
NAME: thread/sql/compress_gtid_table
TYPE: FOREGROUND
PROCESSLIST_ID: 1
PROCESSLIST_USER: NULL
PROCESSLIST_HOST: NULL
PROCESSLIST_DB: NULL
PROCESSLIST_COMMAND: Daemon
PROCESSLIST_TIME: 1509
PROCESSLIST_STATE: Suspending
PROCESSLIST_INFO: NULL
PARENT_THREAD_ID: 1
ROLE: NULL
INSTRUMENTED: YES
HISTORY: YES
CONNECTION_TYPE: NULL
THREAD_OS_ID: 18677
實踐
兩臺機(jī)器
172.16.10.53
172.16.10.54
步驟
1,將master 設(shè)置read-only,使slave趕上master更新速度
mysql >set global read-only
注:read-only 設(shè)置時候super用戶可寫,普通用戶不可寫。
2,停止兩臺機(jī)器
>mysqladmin -uroot -p shutdown
3,修改配置,啟用GTID功能,要啟用基于GTID的復(fù)制,必須通過將gtid_mode變量 設(shè)置為啟用GTID模式啟動每個服務(wù)器 ON,并enforce_gtid_consistency 啟用變量以確保只記錄對基于GTID的復(fù)制安全的語句。在slave機(jī)器啟動之前,使用--skip-slave-start禁用slave的復(fù)制進(jìn)程。
由于在MySQL 5.7.5中增加了mysql.gtid_executed,所以不需要slave機(jī)器啟用二進(jìn)制日志記錄來使用GTID 。這意味著您可以使用GTID但沒有二進(jìn)制日志記錄的從服務(wù)器。為了能夠復(fù)制,主設(shè)備必須始終啟用二進(jìn)制日志記錄。而slave,只需要配置這些變量:
gtid_mode=ON
enforce-gtid-consistency=true
不過為了高可用的切換,推薦選擇如下配置
gtid_mode=ON #必選
enforce-gtid-consistency=true #必選
log-bin=mysql #5.6必選 5.7.5和它之后可選,為了高可用,最好設(shè)置
server-id=1 #開啟log-bin的必須設(shè)置
log-slave-updates=ON # 5.6必選 5.7.5和它之后可選,為了高可用切換,最好設(shè)置ON
4, 配置slave使用GTID來進(jìn)行同步數(shù)據(jù),當(dāng)然需要在master給slave開通權(quán)限
grant replication slave on *.* to repl@"172.16.10.53" identified by "password";
設(shè)置GTID同步模式
change master to master_host='172.16.10.53',master_user='repl',master_port=3306,master_password="password",master_auto_position=1;
注意:非端口號需要加上引號
5,做一個新的備份,啟用GTID之前創(chuàng)建的現(xiàn)有備份現(xiàn)在不能再在這些服務(wù)器上使用,因為您啟用了GTID。在這一點上做一個新的備份,這樣你就不會沒有可用的備份。
比如說物理備份。
6,啟動slave的同步進(jìn)程
mysql> start slave
問題
在啟動slave同步進(jìn)程時候,查看日志出現(xiàn)如下問題
2018-01-17T09:48:18.116983Z 1 [Warning] Slave SQL for channel '': If a crash happens this configuration does not guarantee that the relay log info will be consistent, Error_code: 0
什么!!not consistent,絕對不能忍
在網(wǎng)上查了下添加如下配置就好了
在my.cnf中設(shè)置,
relay_log_info_repository = TABLE
master_info_repository = TABLE
relay_log_recovery = on
報錯原因:
MySQL5.6版本號開始支持把master.info和relay-log.info的內(nèi)容寫入到mysql庫的表中。
master.info--> mysql.slave_master_info
relay-log.info--> mysql. slave_relay_log_info
同一時候在MySQL5.6版本號中,添加了 Slave crash-safe replication功能,為了保證mysql的replication可以crash-safe。slave_master_info和slave_relay_log_info表必須使用事務(wù)型的存儲引擎(InnoDB),不要嘗試去手動改動這兩張表的內(nèi)容。
同一時候,Slave還要開啟relay_log_recovery功能。
解決方法:
設(shè)置master_info_repository和relay_log_info_repository的值為TABLE。同一時候開啟relay_log_recovery功能。
GTID的故障處理和恢復(fù)。
1,簡單的復(fù)制,在新服務(wù)器上重現(xiàn)所有標(biāo)識符和事務(wù)的最簡單方法是將新服務(wù)器變?yōu)榫哂腥繄?zhí)行歷史記錄的主服務(wù)器的從服務(wù)器,并在兩臺服務(wù)器上啟用全局事務(wù)標(biāo)識符,缺點是較慢,且需要master保持所有的bin-log
2,使用mysqldump的方式,設(shè)置新slave機(jī)器(較快)
首先使用mysqldump命令備份
mysqldump --single-transaction --set-gtid-purged=OFF --triggers --routines --events -uroot -p >all.sql
此時會出現(xiàn)提示
mysqldump: [Warning] Using a password on the command line interface can be insecure.
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.
若不需要進(jìn)行GTID的恢復(fù)和從庫設(shè)置,則可以添加--set-gtid-purged=OFF 關(guān)閉(默認(rèn)為ON)
若需要進(jìn)行GTID的主從設(shè)置則--set-gtid-purged=ON 既可
mysqldump --single-transaction --set-gtid-purged=ON --triggers --routines --events -uroot -p >all.sql
查看sql文件中會出現(xiàn)以下語句,設(shè)置GTID_PURGED來跳過一些事務(wù)。
--
-- GTID state at the beginning of the backup
--
SET @@GLOBAL.GTID_PURGED='7abe211e-fb4f-11e7-b16e-000c29ba88ca:1-69726';
然后在slave機(jī)器上進(jìn)行恢復(fù)(需要slave開啟GTID功能),在恢復(fù)時候可能需要下面問題。
[root@localhost ~]# mysql -uroot -pMysql3200$%^ test < /tmp/all.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1840 (HY000) at line 24: @@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty.
解決辦法:登錄執(zhí)行reset master 清空 GTID_EXECUTED
[root@localhost ~]# mysql -uroot -p
mysql> reset master;
Query OK, 0 rows affected (0.02 sec)
導(dǎo)入binlog后,再start slave既可。
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 172.16.10.53
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql.000005
Read_Master_Log_Pos: 777138
Relay_Log_File: localhost-relay-bin.000018
Relay_Log_Pos: 88658
Relay_Master_Log_File: mysql.000005
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
3,使用空事務(wù)處理故障
情況1:
主鍵重復(fù)
Last_Error: Could not execute Write_rows event on table test.a; Duplicate entry '500' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log mysql.000005, end_log_pos 651107
方法1:
注入空事務(wù)
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set: 7abe211e-fb4f-11e7-b16e-000c29ba88ca:66253-68381:69091-70362
Executed_Gtid_Set: 7abe211e-fb4f-11e7-b16e-000c29ba88ca:1-70362,
9a455b69-fb4f-11e7-b993-000c29e8a43c:1
(root@Slave)[tempdb]>stop slave sql_thread;
(root@Slave)[tempdb]>set gtid_next='7abe211e-fb4f-11e7-b16e-000c29ba88ca:70363';
(root@Slave)[tempdb]>begin;commit;
(root@Slave)[tempdb]>set gtid_next='AUTOMATIC';
(root@Slave)[tempdb]>start slave sql_thread;
(root@Slave)[tempdb]>show slave status \G
方法2:
刪除沖突行
使用GTID的限制
涉及非事務(wù)性存儲引擎的更新。對使用非事務(wù)性存儲引擎的表進(jìn)行的更新與在同一事務(wù)中使用事務(wù)性存儲引擎的表的更新混合在一起會導(dǎo)致將多個GTID分配給同一事務(wù)。
CREATE TABLE ... SELECT語句。在使用基于行的復(fù)制時,該語句實際上被記錄為兩個單獨(dú)的事件 - 一個用于創(chuàng)建表,另一個用于將源表中的行插入剛剛創(chuàng)建的新表中。當(dāng)這個語句在一個事務(wù)中被執(zhí)行時,這些事件在某些情況下可能會被接收到相同的事務(wù)標(biāo)識符,這意味著包含插入事務(wù)的事務(wù)被從機(jī)跳過。
創(chuàng)建臨時表。
GTID模式和mysql_upgrade,當(dāng)服務(wù)器在啟用全局事務(wù)標(biāo)識符(GTID)時候,不要用mysql_upgrade --write-binlog啟用二進(jìn)制日志記錄。
總結(jié)
以上是生活随笔為你收集整理的mysql gtid ha_MySQl新特性 GTID的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows应用替代方案接龙
- 下一篇: Qt定时器的精度问题