0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

談?wù)凪ySQL 8.0 binlog中精準的時間戳

OSC開源社區(qū) ? 來源:愛可生開源社區(qū) ? 2023-12-28 09:37 ? 次閱讀

1、相關(guān)解釋

immediate_commit_timestamp:代表是當前數(shù)據(jù)庫提交的時間,從庫/主庫都分別代表其提交的時間。

original_commit_timestamp:代表主庫提交的時間,不管有多少級聯(lián)的從庫這個時間永遠是主庫提交事務(wù)時候的時間。當然在主庫上其就等于 immediate_commit_timestamp 的時間。

它們的生成時間都是在從 binlog cache 寫入到 binlog 文件的時候,生成 GTID event 的時候,也就是 commit 的 flush 階段,我們簡稱這個為 提交時間

但是需要注意的是 MGR 中主庫的 original_commit_timestamp 和 immediate_commit_timestamp 生成稍有提前(group_replication_trans_before_commit),并不是這里說的提交時間。

2、生成流程

2.1 關(guān)于 thd->variables.original_commit_timestamp

因為 original_commit_timestamp 來自這個值,一般情況下其值都是 UNDEFINED_COMMIT_TIMESTAMP,但是從庫上這個值會在應(yīng)用 GTID event 的時候更改為主庫帶過來的 original_commit_timestamp,因為主庫 original_commit_timestamp 就是提交時間,因此從庫的 thd->variables.original_commit_timestamp 也就設(shè)置為了主庫的提交時間。

但是有一個例外,就是 5.7 向 8.0 同步的時候,因為沒有這個值因此會被設(shè)置為 0。如下:

# original_commit_timestamp=0 (1970-01-01 0800.000000 CST)
# immediate_commit_timestamp=1703237689977004 (2023-12-22 1749.977004 CST)

2.2 生成方式

這個其實比較簡單,就是在函數(shù) MYSQL_BIN_LOG::write_transaction 中生成的,大概為:

immediate_commit_timestamp = 獲取的當前時間
original_commit_timestamp = thd->variables.original_commit_timestamp
(前面描述了thd->variables.original_commit_timestamp主庫不會設(shè)置為特定的值,其為 UNDEFINED_COMMIT_TIMESTAMP)

如果 original_commit_timestamp 等于 UNDEFINED_COMMIT_TIMESTAMP,那么它就是主庫,應(yīng)該將設(shè)置
original_commit_timestamp = immediate_commit_timestamp,這樣主庫的 original_commit_timestamp 
和 immediate_commit_timestamp 就相同了

否則 original_commit_timestamp 有特定的值,那么就是從庫,因為這個值來自 
thd->variables.original_commit_timestamp,前面說了他是應(yīng)用 GTID event 的值。

2.3 相關(guān)警告

當發(fā)現(xiàn)從庫的提交時間還比主庫的提交時間更慢的時候,顯然這是不合適的,就會出現(xiàn)這個警告如下:

if(original_commit_timestamp>immediate_commit_timestamp&&
!thd->rli_slave->get_c_rli()->gtid_timestamps_warning_logged){//如果原始時間還在于了當前服務(wù)器的提交時間,這是常見的警告
LogErr(WARNING_LEVEL,ER_INVALID_REPLICATION_TIMESTAMPS);//則報警

這就是大家經(jīng)常遇到的警告。

Invalidreplicationtimestamps:originalcommittimestampismorerecentthanthe
immediatecommittimestamp.Thismaybeanissueifdelayedreplicationisactive.
Makesurethatservershavetheirclockssettothecorrecttime.Nofurther
messagewillbeemitteduntilaftertimestampsbecomevalidagain."

3、其運維中的意義

3.1 在延時從庫中的應(yīng)用

如果配置了延遲從庫,則使用的是 immediate_commit_timestamp 作為延遲從庫應(yīng)用 event 的計算標準,因為這里 event 來自 relay log,因此 immediate_commit_timestamp 是 IO 線程連接庫(A->B->C,C 為延遲從庫,則這里為B庫提交事務(wù)的時間)的事務(wù)提交時間,在函數(shù) sql_delay_event 中有如下計算方式:

sql_delay_end=ceil((static_cast(ev)
->immediate_commit_timestamp)/
1000000.00)+
sql_delay;

而對于不支持的延時從庫則計算為:

sql_delay_end=ev->common_header->when.tv_sec+
rli->mi->clock_diff_with_master+sql_delay;

對于 immediate_commit_timestamp 和 ev->common_header->when.tv_sec 是有很大區(qū)別的,后者為 binlog header 中 timestamp 的時間,其在整個復(fù)制鏈路中并不會改變,其幾乎為命令發(fā)起的時間,而不是事務(wù)提交的時間。我們以 A->B->C 為列,其中 C 為一個延遲從庫。

支持 immediate_commit_timestamp 的情況:C 的延遲計算是以B庫提交時刻的時間為計算標準的。也就是其延遲是 B 庫提交后多久 C 庫應(yīng)用。

不支持 immediate_commit_timestamp 的情況:C 的延遲計算是以 A 庫命令發(fā)起的時間為計算標準的。也就是其延遲是 A 庫命令發(fā)起后多久 C 庫應(yīng)用。

很顯然前者的計算方式更為靠譜。在延遲從庫在等待的時候其線程的狀態(tài)為:

WaitinguntilMASTER_DELAYsecondsaftermasterexecutedevent

3.2 主庫判定事務(wù)的提交時刻和語句發(fā)起時間

某些時候我們可能需要知道語句什么時候發(fā)起執(zhí)行的,什么時候提交完成的,這個時候我們考慮使用 immediate_commit_timestamp 和 event header 的 timestamp 進行對比。

對于自動提交的 DML 語句,則 GTID event header 的 timestamp 為語句發(fā)起的時間,而 GTID event 的 immediate_commit_timestamp 為事務(wù)提交的時間,如果差值太大,可能是遇到了鎖(MDL LOCK 或 row lock)之類的問題。如下圖:

1ad9362e-a4a9-11ee-8b88-92fbcf53809c.jpg?1adfae50-a4a9-11ee-8b88-92fbcf53809c.jpg

對于非自動提交的事務(wù),則 GTID event 的 immediate_commit_timestamp 為事務(wù)提交的時間,但是語句開始執(zhí)行的時間需要查看具體語句的 event 才可以,不能查看 GTID event header 的 timestamp,這是 commit 命令發(fā)起的時間,如下圖:

1aebfc5a-a4a9-11ee-8b88-92fbcf53809c.jpg?1af1ade4-a4a9-11ee-8b88-92fbcf53809c.jpg

當然類似,還可以獲取從庫的 binlog 信息來比對主庫是什么時候發(fā)起語句的,什么時候提交事務(wù)的,從庫又是什么時候提交事務(wù)的。類似如下圖,這是我的一個從庫,我這里是一個自動提交的 DML 語句

1af5f7be-a4a9-11ee-8b88-92fbcf53809c.jpg

很明顯,主庫發(fā)起語句時間和主庫提交時間以及從庫提交時間都有一定的差值。

主庫發(fā)起語句時間:1209

主庫提交事務(wù)時間:1213

從庫提交事務(wù)時間:1259

3.3 更加精確的延遲

這部分你在官方文檔有說明,其中主要包含 3 個視圖:

ps.replication_applier_status_by_worker: SQL 線程或者 WORKER 執(zhí)行相關(guān)

ps.replication_connection_status: IO 線程相關(guān)

ps.replication_applier_status_by_coordinator: 協(xié)調(diào)線程相關(guān)

其中大部分和 timestamp 相關(guān)的字段的都是自解釋的,而在 ps.replication_applier_status_by_coordinator 和 ps.replication_applier_status_by_worker 中有兩類字段類似 XXX_BUFFER_TIMESTAMP,XXX_APPLY_TIMESTAMP 比如:

LAST_PROCESSED_TRANSACTION_END_BUFFER_TIMESTAMP: 表示協(xié)調(diào)線程將事務(wù)分發(fā)給 WORKER 線程的時間

LAST_APPLIED_TRANSACTION_END_APPLY_TIMESTAMP: 表示應(yīng)用完事務(wù)的時間

具體代碼中可以斷點在:

Relay_log_info::finished_processing

Relay_log_info::started_processing

上進行觀察,實際上是 Relay_log_info 中多了如下信息:

  /**
    Stores information on the last processed transaction or the transaction
    that is currently being processed.

    STS:
    - timestamps of the currently applying/last applied transaction

    MTS:
    - coordinator thread: timestamps of the currently scheduling/last scheduled
      transaction in a worker's queue
    - worker thread: timestamps of the currently applying/last applied
      transaction
  */
  Gtid_monitoring_info *gtid_monitoring_info;

每個 WORKER 和協(xié)調(diào)線程都包含了這樣一個事務(wù)的監(jiān)控信息,因此可以在視圖中打印出來。

顯然我們就可以通過各種從庫中執(zhí)行的 timestamp 的時間和主庫提交時間也就是 ORIGINAL_COMMIT_TIMESTAMP 計算出來精確的延遲。







審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • SQL
    SQL
    +關(guān)注

    關(guān)注

    1

    文章

    750

    瀏覽量

    43900
  • MySQL
    +關(guān)注

    關(guān)注

    1

    文章

    789

    瀏覽量

    26283

原文標題:再談MySQL 8這兩個精準的時間戳

文章出處:【微信號:OSC開源社區(qū),微信公眾號:OSC開源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    時間同步獲取時間

    新手一枚,對單片機原理還不是很清楚,求教:TinyOS時間同步首先要獲取本地時間,getStartTime(),想知道它是怎么獲取時間
    發(fā)表于 03-20 10:37

    大數(shù)據(jù)監(jiān)控binlog組件的maxwell組件

    大數(shù)據(jù)實時監(jiān)控mysql數(shù)據(jù)庫binlog(二)
    發(fā)表于 05-16 11:24

    binlog有什么意義/工作模式/優(yōu)缺點

      Linux運維是現(xiàn)下較為火熱的職業(yè)崗位之一。學(xué)習(xí)Linux技術(shù)的人越來越多。Linux運維學(xué)習(xí)過程binlog有什么意義?binlog有哪些工作模式?都有哪些優(yōu)缺點?binlog
    發(fā)表于 01-29 17:24

    時間的簡介與實現(xiàn)

    時間時間簡介時間的實現(xiàn)時間
    發(fā)表于 02-28 06:23

    mysql數(shù)據(jù)庫同步原理

    了數(shù)據(jù)庫的訪問壓力,提升整個系統(tǒng)的性能和可用性,降低了大訪問量引發(fā)數(shù)據(jù)庫宕機的故障率。 binlog簡介 MySQL主從同步是基于binlog文件主從復(fù)制實現(xiàn),為了更好的理解主從同步過程,這里簡單介紹一下
    發(fā)表于 09-28 11:49 ?0次下載
    <b class='flag-5'>mysql</b>數(shù)據(jù)庫同步原理

    騰訊云打造MySQL 8.0全新引擎,進一步加速客戶產(chǎn)業(yè)升級

    據(jù)介紹,騰訊云數(shù)據(jù)庫 MySQL 8.0的內(nèi)核可以百分百完全兼容主流MySQL分支。相比官方版本,無論是單機模式、異步模式還是同步模式下, MySQL
    的頭像 發(fā)表于 07-09 14:54 ?2270次閱讀

    MySQL 5.7與MySQL 8.0 性能對比

    背景 測試mysql5.7和mysql8.0分別在讀寫,選定,只寫模式下不同并發(fā)時的性能(tps,qps) 最早 測試使用版本為mysql5.7.22和mysql8.0.15 sysb
    的頭像 發(fā)表于 11-03 09:26 ?1.6w次閱讀
    <b class='flag-5'>MySQL</b> 5.7與<b class='flag-5'>MySQL</b> <b class='flag-5'>8.0</b> 性能對比

    UNIX時間和北京時間的相互轉(zhuǎn)換

    )開始所經(jīng)過的秒數(shù),不考慮閏秒。一個小時表示為UNIX時間格式為:3600秒;一天表示為UNIX時間為86400秒,閏秒不計算。在很多的數(shù)據(jù)
    發(fā)表于 11-21 19:06 ?11次下載
    UNIX<b class='flag-5'>時間</b><b class='flag-5'>戳</b>和北京<b class='flag-5'>時間</b>的相互轉(zhuǎn)換

    uCOS-III(2) 時間

    時間時間簡介時間的實現(xiàn)時間
    發(fā)表于 01-14 16:04 ?4次下載
    uCOS-III(2) <b class='flag-5'>時間</b><b class='flag-5'>戳</b>

    Java時間的使用

    ());System.out.println(nowTime); 輸出: 2022-06-08 11:15:51.014 Long型時間 Long timeLong
    的頭像 發(fā)表于 01-13 15:30 ?689次閱讀

    請問mysql8.0不能在grant時創(chuàng)建用戶是什么原因?

    用習(xí)慣了MySQL5.7,當在MySQL8.0里創(chuàng)建用戶時,習(xí)慣性直接敲GRANT指令,結(jié)果報錯了
    的頭像 發(fā)表于 08-11 10:16 ?1916次閱讀

    mysql主從復(fù)制的原理

    其重放在自己的數(shù)據(jù)庫binlog(Binary Log): 是MySQL中用于記錄主數(shù)據(jù)庫上的所有數(shù)據(jù)變更的二進制文件。
    的頭像 發(fā)表于 11-16 14:18 ?404次閱讀

    mysql8.0默認字符集是什么

    MySQL 8.0 默認字符集是 utf8mb4。 MySQL 8.0 是當前最新的開源關(guān)系型數(shù)據(jù)庫管理系統(tǒng),由Oracle公司開發(fā)和維護。MySQ
    的頭像 發(fā)表于 11-16 14:48 ?1588次閱讀

    數(shù)據(jù)庫數(shù)據(jù)恢復(fù)—未開啟binlogMysql數(shù)據(jù)庫數(shù)據(jù)恢復(fù)案例

    mysql數(shù)據(jù)庫數(shù)據(jù)恢復(fù)環(huán)境: 本地服務(wù)器,windows server操作系統(tǒng) ,部署有mysql單實例,數(shù)據(jù)庫引擎類型為innodb,獨立表空間,無數(shù)據(jù)庫備份,未開啟binlog
    的頭像 發(fā)表于 12-08 14:18 ?930次閱讀
    數(shù)據(jù)庫數(shù)據(jù)恢復(fù)—未開啟<b class='flag-5'>binlog</b>的<b class='flag-5'>Mysql</b>數(shù)據(jù)庫數(shù)據(jù)恢復(fù)案例

    GitHub底層數(shù)據(jù)庫無縫升級到MySQL 8.0的經(jīng)驗

    目標 (SLO) 的情況下升級主機集群(1200 多臺 MySQL 主機)絕非易事。其團隊表示,為了升級到 MySQL 8.0,他們規(guī)劃、測試和升級本身總共花費了一年多的時間,并且需要
    的頭像 發(fā)表于 12-13 10:21 ?394次閱讀
    GitHub底層數(shù)據(jù)庫無縫升級到<b class='flag-5'>MySQL</b> <b class='flag-5'>8.0</b>的經(jīng)驗