如何查看mysql的gtid_汇总丨MySQL GTID技术点,看这一篇就够了!
mysql> SELECT * FROM mysql.gtid_executed;
mysql.gtid_executed表是由MySQL服務(wù)器提供給內(nèi)部使用的。它允許副本在副本上禁用二進(jìn)制日志記錄時(shí)使用GTIDs,并允許在二進(jìn)制日志丟失時(shí)保留GTID狀態(tài)。RESET MASTER命令,gtid_executed表將被清除。
服務(wù)意外停止的情況下,當(dāng)前二進(jìn)制日志文件中的gtid集不會(huì)保存在gtid_executed表。在恢復(fù)期間,這些gtid將從二進(jìn)制日志文件添加到表中,以便可以繼續(xù)復(fù)制。
3. gtid_executed
若MySQL服務(wù)器啟用了二進(jìn)制日志,則表mysql.gtid_executed的更新僅在二進(jìn)制rotation時(shí)發(fā)生,因?yàn)榘l(fā)生重啟等情況依舊可以通過掃描二進(jìn)制日志判斷得知當(dāng)前運(yùn)行的GTID位置。
簡(jiǎn)單來說,該表會(huì)記錄當(dāng)前執(zhí)行的GTID
在MySQL 5.6中必須配置參數(shù)log_slave_updates的最重要原因在于當(dāng)slave重啟后,無法得知當(dāng)前slave已經(jīng)運(yùn)行到的GTID位置,因?yàn)樽兞縢tid_executed是一個(gè)內(nèi)存值:
MySQL 5.7將gtid_executed這個(gè)值給持久化。采用的技巧與MySQL 5.6處理SQL thread保存位置的方式一樣,即將GTID值持久化保存在一張InnoDB表中,并與用戶事務(wù)一起進(jìn)行提交,從而實(shí)現(xiàn)數(shù)據(jù)的一致性。
觸發(fā)條件:
在binlog發(fā)生rotate(flush binary logs/達(dá)到max_binlog_size)或者關(guān)閉服務(wù)時(shí),會(huì)把所有寫入到binlog中的Gtid信息寫入到mysql.gtid_executed表。
從庫:如果沒有開啟log_bin或者沒有開啟log_slave_updates,從庫在應(yīng)用relay-log中的每個(gè)事務(wù)會(huì)執(zhí)行一個(gè)insert mysql.gtid_executed操作。
常用命令
1. gtid設(shè)置
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
2. gtid跳過 gtid_next
stop slave;
set gtid_next='d74faa2d-5819-11e8-b248-ac853db70398:10603';
begin;commit;
set gtid_next='automatic';
start slave;
備注;該操作類似于sql_slave_skip_counter,只是跳過錯(cuò)誤,不能保證數(shù)據(jù)一致性,需要人工介入,固強(qiáng)烈建議從機(jī)開啟read_only=1
3. gtid清除gtid_pureged
命令的實(shí)際意義:因沒有binlog信息(expire_logs_days),不考慮這些gtid確認(rèn)和回滾。常用備份恢復(fù),搭建從庫的時(shí)候使用。
自動(dòng)觸發(fā)機(jī)制:flush,服務(wù)器重新啟動(dòng)
使用場(chǎng)景:
在副本上禁用二進(jìn)制日志記錄提交的復(fù)制事務(wù)的GTIDs。
寫入二進(jìn)制日志文件的事務(wù)的GTIDs,該文件現(xiàn)在已被清除。
通過語句set @@GLOBAL.gtid_purged顯式添加到集合中的gtid。
mysqldump --set-gtid-purged=off/on 參數(shù);
是否將GTID_PURGED’添加到輸出中
4. gtid升級(jí)
pos升級(jí)gtid方式,條件允許建議重新搭建從庫的方式。以下方式存在風(fēng)險(xiǎn)。
gtid_mode可選值
ON:完全打開GTID,如果打開狀態(tài)的備庫接受到不帶GTID的事務(wù),則復(fù)制中斷
ON_PERMISSIV:可以認(rèn)為是打開gtid前的過渡階段,主庫在設(shè)置成該值后會(huì)產(chǎn)生GTID,同時(shí)備庫依然容忍帶GTID和不帶GTID的事務(wù)
OFF_PERMISSIVE:可以認(rèn)為是關(guān)閉GTID前的過渡階段,主庫在設(shè)置成該值后不再生成GTID,備庫在接受到帶GTID和不帶GTID事務(wù)都可以容忍。主庫在關(guān)閉GTID時(shí),執(zhí)行事務(wù)會(huì)產(chǎn)生一個(gè)Anonymous_Gtid事件,會(huì)在備庫執(zhí)行:set @@session.gtid_next=‘a(chǎn)nonymous’
OFF:徹底關(guān)閉GTID,如果關(guān)閉狀態(tài)的備庫收到帶GTID的事務(wù),則復(fù)制中斷
從position模式切換到GTID模式:
1)在每個(gè)sever執(zhí)行WARN模式:
這一步設(shè)置之后,使得所有事物都允許違反GTID的一致性
mysql>SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = WARN;
#這是第一個(gè)重要步驟. 您必須確保在進(jìn)入下一步驟之前不會(huì)在錯(cuò)誤日志中生成警告.
2)在每個(gè)sever執(zhí)行ON模式:
以確保所有的事務(wù)都不能違反GTID一致性
mysql>SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = ON;
3)在每個(gè)sever執(zhí)行OFF模式:
這一步表示,新的事務(wù)是匿名的,同事允許復(fù)制的事務(wù)是GTID或是匿名的
mysql>SET @@GLOBAL.GTID_MODE = OFF_PERMISSIVE;
#需要確保這一步操作在所有的服務(wù)器上執(zhí)行
4)在每個(gè)sever執(zhí)行ON模式:
這一步表示,新的事務(wù)是GTID的,同事允許復(fù)制的事務(wù)是GTID或是匿名的
mysql>SET @@GLOBAL.GTID_MODE = ON_PERMISSIVE;
#需要確保這一步操作在所有的服務(wù)器上執(zhí)行
5)在每個(gè)服務(wù)器上,等待狀態(tài)變量ONGOING_ANONYMOUS_TRANSACTION_COUNT為零. 可以使用如下方式查詢:
mysql>SHOW STATUS LIKE 'ONGOING_ANONYMOUS_TRANSACTION_COUNT';
#在所有從庫上查詢?cè)摖顟B(tài),必須為0 才能進(jìn)行下一步。該狀態(tài)寶石已標(biāo)示為匿名的正在#進(jìn)行的事務(wù)數(shù)量,如果狀態(tài)值為0表示無事務(wù)等待被處理
等待生成到步驟5的所有事務(wù)復(fù)制到所有服務(wù)器. 可以在不停止更新的情況下執(zhí)行此操作:唯一重要的是所有anonymous transactions都被復(fù)制了.
6)GTID_MODE = ON在每所有服務(wù)器上執(zhí)行:
mysql>SET @@GLOBAL.GTID_MODE = ON;
7)修改每個(gè)my.cnf文件:
gtid-mode=ON
ENFORCE_GTID_CONSISTENCY = ON
8)上面復(fù)制雖然配置了GTID模式,但還是基于Binlog方式的。可通過選項(xiàng)MASTER_AUTO_POSITION設(shè)置為1,把復(fù)制調(diào)整為基于GTID模式的復(fù)制,具體操作如下:
mysql>STOP SLAVE [FOR CHANNEL 'channel'];
mysql>CHANGE MASTER TO MASTER_AUTO_POSITION = 1 [FOR CHANNEL 'channel'];
mysql>START SLAVE [FOR CHANNEL 'channel'];
5. gtid 壓縮 gtid_executed_compression_period
啟用GTID時(shí),服務(wù)器會(huì)定期在mysql.gtid_executed表上執(zhí)行此類壓縮。通過設(shè)置gtid_executed_compression_period系統(tǒng)變量,可以控制壓縮表之前允許的事務(wù)數(shù),從而控制壓縮率。該變量的默認(rèn)值為1000; 這意味著,默認(rèn)情況下,在每1000次事務(wù)之后執(zhí)行表壓縮。
將gtid_executed_compression_period設(shè)置為0可以防止執(zhí)行壓縮; 但是,如果執(zhí)行此操作,應(yīng)該為gtid_executed表可能需要的磁盤空間量的大幅增加做好準(zhǔn)備。
使用以下語句查詢:
mysql> select thread_id,thread_os_id,name, processlist_command,processlist_statefrom `performance_schema`.threads where name like '%compress%';+-----------+--------------+--------------------------------+---------------------+-------------------+| thread_id |thread_os_id | name |processlist_command | processlist_state |+-----------+--------------+--------------------------------+---------------------+-------------------+| 26 |8024| thread/sql/compress_gtid_table |Daemon | Suspending |+-----------+--------------+--------------------------------+---------------------+-------------------+
備注:如發(fā)現(xiàn) processlist_state 值一直是: "Compressing gtid_executed table"說明進(jìn)行壓縮。記錄鎖的內(nèi)存從操作系統(tǒng)申請(qǐng),所以當(dāng)表gtid_executed不斷增大時(shí),最終會(huì)導(dǎo)致MySQL OOM。
6. binlog_gtid_simple_recovery
MySQL啟動(dòng)或重啟時(shí)在搜索GTIDs期間迭代二進(jìn)制日志文件的方式。就是為了初始化 gtid_executed , gtid_purged參數(shù),掃描binlog 或則 event相關(guān)信息
MySQL 5.7.7或更老版本的二進(jìn)制日志,需要在設(shè)置binlog_gtid_simple_recovery=FALSE,如果存在非gtid的binlog比較多的時(shí)候,會(huì)非常影響性能的。
限制
到目前為止已經(jīng)發(fā)展完善,但存在一些場(chǎng)景是受限的。
1. create table xxx as select:
拆分成兩部分:
create table xxxx like table;
insert into xxxx select *from table;
2. 臨時(shí)表的限制
使用GTID復(fù)制模式:
1.不支持create temporary table 和 drop temporary table。
2.在autocommit=1的情況下可以創(chuàng)建臨時(shí)表,
3.Master端創(chuàng)建臨時(shí)表不產(chǎn)生GTID信息,所以不會(huì)同步到slave,但是在刪除臨時(shí)表的時(shí)候會(huì)產(chǎn)生GTID會(huì)導(dǎo)致,主從中斷.
3.事務(wù)操作
涉及非事務(wù)性存儲(chǔ)引擎的更新,非事務(wù)性存儲(chǔ)引擎事務(wù)性存儲(chǔ)引擎更新表則不能在同一條語句或同一事務(wù)中執(zhí)行。
4.mysql_upgrade
GTID模式和mysql_upgrade。在啟用全局事務(wù)標(biāo)識(shí)符(GTIDs)的情況下運(yùn)行時(shí),不要通過mysql_upgrade(——write binlog選項(xiàng))啟用二進(jìn)制日志記錄。
5.sql_slave_skip_counter
傳統(tǒng)模式的跳過postion方式gtid模式下不支持。
總結(jié)
1. gtid能不能做的更好。返回搜狐,查看更多
像并行復(fù)制的writeset一樣 壓縮機(jī)制
binlog內(nèi)容能不能更簡(jiǎn)潔
gtid能不能實(shí)現(xiàn)物理級(jí)別的復(fù)制模式
總結(jié)
以上是生活随笔為你收集整理的如何查看mysql的gtid_汇总丨MySQL GTID技术点,看这一篇就够了!的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ant vue 兼容性问题_ant de
- 下一篇: lokijs可以用mysql_JavaS