日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

如何查看mysql的gtid_汇总丨MySQL GTID技术点,看这一篇就够了!

發(fā)布時(shí)間:2023/12/2 数据库 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何查看mysql的gtid_汇总丨MySQL GTID技术点,看这一篇就够了! 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。