在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

談談MySQL 8.0 binlog中精準的時間戳

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

1、相關解釋

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

original_commit_timestamp:代表主庫提交的時間,不管有多少級聯的從庫這個時間永遠是主庫提交事務時候的時間。當然在主庫上其就等于 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 關于 thd->variables.original_commit_timestamp

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

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

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

2.2 生成方式

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

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

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

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

2.3 相關警告

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

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

這就是大家經常遇到的警告。

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

3、其運維中的意義

3.1 在延時從庫中的應用

如果配置了延遲從庫,則使用的是 immediate_commit_timestamp 作為延遲從庫應用 event 的計算標準,因為這里 event 來自 relay log,因此 immediate_commit_timestamp 是 IO 線程連接庫(A->B->C,C 為延遲從庫,則這里為B庫提交事務的時間)的事務提交時間,在函數 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 是有很大區別的,后者為 binlog header 中 timestamp 的時間,其在整個復制鏈路中并不會改變,其幾乎為命令發起的時間,而不是事務提交的時間。我們以 A->B->C 為列,其中 C 為一個延遲從庫。

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

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

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

WaitinguntilMASTER_DELAYsecondsaftermasterexecutedevent

3.2 主庫判定事務的提交時刻和語句發起時間

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

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

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

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

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

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

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

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

主庫發起語句時間:1209

主庫提交事務時間:1213

從庫提交事務時間:1259

3.3 更加精確的延遲

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

ps.replication_applier_status_by_worker: SQL 線程或者 WORKER 執行相關

ps.replication_connection_status: IO 線程相關

ps.replication_applier_status_by_coordinator: 協調線程相關

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

LAST_PROCESSED_TRANSACTION_END_BUFFER_TIMESTAMP: 表示協調線程將事務分發給 WORKER 線程的時間

LAST_APPLIED_TRANSACTION_END_APPLY_TIMESTAMP: 表示應用完事務的時間

具體代碼中可以斷點在:

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 和協調線程都包含了這樣一個事務的監控信息,因此可以在視圖中打印出來。

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







審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • SQL
    SQL
    +關注

    關注

    1

    文章

    768

    瀏覽量

    44177
  • MySQL
    +關注

    關注

    1

    文章

    817

    瀏覽量

    26628

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

文章出處:【微信號:OSC開源社區,微信公眾號:OSC開源社區】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    大數據監控binlog組件的maxwell組件

    大數據實時監控mysql數據庫binlog(二)
    發表于 05-16 11:24

    binlog有什么意義/工作模式/優缺點

      Linux運維是現下較為火熱的職業崗位之一。學習Linux技術的人越來越多。Linux運維學習過程,binlog有什么意義?binlog有哪些工作模式?都有哪些優缺點?binlog
    發表于 01-29 17:24

    時間的簡介與實現

    時間時間簡介時間的實現時間
    發表于 02-28 06:23

    mysql數據庫同步原理

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

    騰訊云打造MySQL 8.0全新引擎,進一步加速客戶產業升級

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

    MySQL 5.7與MySQL 8.0 性能對比

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

    UNIX時間和北京時間的相互轉換

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

    uCOS-III(2) 時間

    時間時間簡介時間的實現時間
    發表于 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
    的頭像 發表于 01-13 15:30 ?776次閱讀

    Java時間的使用

    Java時間的使用
    的頭像 發表于 11-06 16:04 ?234次閱讀
    Java<b class='flag-5'>中</b><b class='flag-5'>時間</b><b class='flag-5'>戳</b>的使用

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

    用習慣了MySQL5.7,當在MySQL8.0里創建用戶時,習慣性直接敲GRANT指令,結果報錯了
    的頭像 發表于 08-11 10:16 ?2274次閱讀

    mysql主從復制的原理

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

    mysql8.0默認字符集是什么

    MySQL 8.0 默認字符集是 utf8mb4。 MySQL 8.0 是當前最新的開源關系型數據庫管理系統,由Oracle公司開發和維護。MySQ
    的頭像 發表于 11-16 14:48 ?1846次閱讀

    數據庫數據恢復—未開啟binlogMysql數據庫數據恢復案例

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

    GitHub底層數據庫無縫升級到MySQL 8.0的經驗

    目標 (SLO) 的情況下升級主機集群(1200 多臺 MySQL 主機)絕非易事。其團隊表示,為了升級到 MySQL 8.0,他們規劃、測試和升級本身總共花費了一年多的時間,并且需要
    的頭像 發表于 12-13 10:21 ?537次閱讀
    GitHub底層數據庫無縫升級到<b class='flag-5'>MySQL</b> <b class='flag-5'>8.0</b>的經驗
    主站蜘蛛池模板: 午夜精品视频任你躁| 日本免费黄色录像| 国内91视频| 男女一级特黄a大片| 国产成人精品日本| 六月丁香六月婷婷| 日本x色视频| 天天色色网| 亚洲国产成人精品不卡青青草原| 美女扒开尿口给男人爽的视频| 亚洲乱码尤物193yw在线播放| 欧美午夜视频一区二区三区| 午夜精品网站| 亚洲午夜一级毛片| 曰本裸色私人影院噜噜噜影院| 久久免费视频精品| 免费一级成人毛片| 免费毛片大全| 国产精品久久久久影院色老大| 久久青草免费91观看| 国产一级做a爰片久久毛片| 看全色黄大色大片免费久久| 国产美女一区二区三区| 狠狠躁夜夜躁人人爽天天段| 久久鲁视频| 一级黄色片在线看| 狠狠操狠狠搞| 最新黄色在线| 在线h网站| 免费伦费一区二区三区四区| 精品视频一区二区三区| 禁漫羞羞入口| 视频一区日韩| 欧美色视频日本片免费高清| 欧美色视频网| 有没有免费的视频在线观看| 国产午夜在线视频| 亚洲haose在线观看| 久久久久久免费播放一级毛片| 色综合天天综一个色天天综合网| 色妞视频资源在线观看|