圖文結合帶你搞懂MySQL日誌之relay log(中繼日誌)

来源:https://www.cnblogs.com/greatsql/archive/2023/01/14/17052055.html
-Advertisement-
Play Games

GreatSQL社區原創內容未經授權不得隨意使用,轉載請聯繫小編並註明來源。 GreatSQL是MySQL的國產分支版本,使用上與MySQL一致。 作者: KAiTO 文章來源:GreatSQL社區原創 什麼是中繼日誌(relay log) 中繼日誌(relay log)只在主從伺服器架構的從伺服器 ...


  • GreatSQL社區原創內容未經授權不得隨意使用,轉載請聯繫小編並註明來源。
  • GreatSQL是MySQL的國產分支版本,使用上與MySQL一致。
  • 作者: KAiTO
  • 文章來源:GreatSQL社區原創

什麼是中繼日誌(relay log)

中繼日誌(relay log)只在主從伺服器架構的從伺服器上存在。從伺服器(slave)為了與主伺服器(Master)保持一致,要從主伺服器讀取二進位日誌的內容,並且把讀取到的信息寫入本地的日誌文件中,這個從伺服器本地的日誌文件就叫中繼日誌。然後,從伺服器讀取中繼日誌,並根據中繼日誌的內容對從伺服器的數據進行更新,完成主從伺服器的數據同步

搭建好主從伺服器之後,中繼日誌預設會保存在從伺服器的數據目錄下。

文件名的格式是:從伺服器名 - relay-bin.序號。中繼日誌還有一個索引文件:從伺服器名 - relay-bin.index,用來定位當前正在使用的中繼日誌。

file

(主從複製原理圖)

從伺服器I/O線程將主伺服器的二進位日誌(binlog)讀取過來記錄到從伺服器本地文件,然後從伺服器SQL線程會讀取中繼日誌的內容並應用到從伺服器,從而使從伺服器和主伺服器的數據保持一致。

中繼日誌的作用

中繼日誌用於主從伺服器架構中,從伺服器用來存放主伺服器二進位日誌內容的一個中間文件。從伺服器通過讀取中繼日誌的內容,來同步主伺服器上的操作。

中繼日誌是連接mastert(主伺服器)和slave(從伺服器)的信息,它是複製的核心,I/O線程將來自master的binlog存儲到中繼日誌中,中繼日誌充當緩衝,這樣master不必等待slave執行完成就可以發送下一個binlog。

查看中繼日誌

中繼日誌文件的格式與二進位日誌文件相同,並且可以 使用 mysqlbinlog 進行讀取

SET TIMESTAMP= 1615352328 /*!*/;
BEGIN
/*!*/;
# at 900
#211413 11:33:46 server id 1 end_log_pos 832 CRC32 0xcc16d651 Table_map:
`kaito`.`test` mapped to number 91
# at 950
#211413 11:33:46 server id 1 end_log_pos 872 CRC32 0x07e4047c Delete_rows: table id
91 flags: STMT_END_F -- server id 1 是主伺服器,意思是主伺服器刪了一行數據
BINLOG '
CD95YBMBAAAAMgAAAEADAAAAAFsAAAAAAAEABGRlbW8ABHRlc3QAAQMAAQEBAFHWFsw=
CD95YCABAAAAKAAAAGgDAAAAAFsAAAAAAAEAAgAB/wABAAAAfATkBw==
'/*!*/;
# at 1000

這一段的意思是,主伺服器(“server id 1”)對錶 kaito.test 進行了 2 步操作:

  • 定位到表 kaito.test 編號是 91 的記錄,日誌位置是 832
  • 刪除編號是 91 的記錄,日誌位置是 872

相關參數解析

通過語句:show variables like '%relay%' 查看先骨幹的relay的所有相關參數如下:

mysql> show variables like '%relay%';
+---------------------------+---------------------------------------+
| Variable_name             | Value                                 |
+---------------------------+---------------------------------------+
| max_relay_log_size        | 0                                     |
| relay_log                 | kaito-relay-bin                       |
| relay_log_basename        | /var/lib/mysql/kaito-relay-bin        |
| relay_log_index           | /var/lib/mysql/kaito-relay-bin.index  |
| relay_log_info_file       | relay-log.info                        |
| relay_log_info_repository | TABLE                                 |
| relay_log_purge           | ON                                    |
| relay_log_recovery        | OFF                                   |
| relay_log_space_limit     | 0                                     |
| sync_relay_log            | 10000                                 |
| sync_relay_log_info       | 10000                                 |
+---------------------------+---------------------------------------+
11 rows in set (0.00 sec)
  • max_relay_log_size:標記relay log 允許的最大值,如果該值為0,則預設值為max_binlog_size(1G);如果不為0,則max_relay_log_size則為最大的relay_log文件大小;

  • relay_log:定義relay_log的位置和名稱,如果值為空,則預設位置在數據文件的目錄(datadir),文件名預設為host_name-relay-bin.nnnnnn

  • relay_log_index:同relay_log,定義relay_log的位置和名稱;一般和relay-log在同一目錄

  • relay_log_info_file:設置relay-log.info的位置和名稱(relay-log.info記錄MASTER的binary_log的恢複位置和relay_log的位置)

  • relay_log_purge:是否自動清空不再需要中繼日誌時。預設值為1(啟用)。

  • relay_log_recovery:當slave從庫宕機後,假如relay-log損壞了,導致一部分中繼日誌沒有處理,則自動放棄所有未執行的relay-log,並且重新從master上獲取日誌,這樣就保證了relay-log的完整性。預設情況下該功能是關閉的,將relay_log_recovery的值設置為 1時,可在slave從庫上開啟該功能,建議開啟。

  • relay_log_space_limit:防止中繼日誌寫滿磁碟,這裡設置中繼日誌最大限額。

    • 註意!但此設置存在主庫崩潰,從庫中繼日誌不全的情況,不到萬不得已,不推薦使用!
  • sync_relay_log:這個參數和sync_binlog是一樣的,當設置為1時,slave的I/O線程每次接收到master發送過來的binlog日誌都要寫入系統緩衝區,然後刷入relay log中繼日誌里,這樣是最安全的,因為在崩潰的時候,你最多會丟失一個事務,但會造成磁碟的大量I/O
    當設置為0時,並不是馬上就刷入中繼日誌里,而是由操作系統決定何時來寫入,雖然安全性降低了,但減少了大量的磁碟I/O操作。這個值預設是0,可動態修改,建議採用預設值。

  • sync_relay_log_info:這個參數和sync_relay_log參數一樣,當設置為1時,slave的I/O線程每次接收到master發送過來的binlog日誌都要寫入系統緩衝區,然後刷入relay-log.info里,這樣是最安全的,因為在崩潰的時候,你最多會丟失一個事務,但會造成磁碟的大量I/O。當設置為0時,並不是馬上就刷入relay-log.info里,而是由操作系統決定何時來寫入,雖然安全性降低了,但減少了大量的磁碟I/O操作。這個值預設是0,可動態修改,建議採用預設值。

以上只是簡單的介紹了每個參數的作用,這些參數具體的設置還是需要根據每個用戶的實際系統情況進行設置的;

參考文章


Enjoy GreatSQL

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1 簡介 為了更好的版本控制和問題定位,我們需要知道正在運行的應用是什麼版本,什麼時候打包的,Git的相關信息等。通過/actuator/info可以幫助我們獲取這些信息。 2 配置 首先要有actuator的依賴: <dependency> <groupId>org.springframework ...
  • .Net6中想實現對某個網址截屏,可通過Selenium模擬訪問網址並實現截圖。 實現 安裝Nuget包 <PackageReference Include="Selenium.Chrome.WebDriver" Version="85.0.0" /> <PackageReference Inclu ...
  • ABP Framework 在架構上有四大目標:模塊化、DDD、多租戶和微服務。從 `7.0` 更新的功能來看,其側重點轉向微服務場景的實現,比如:Dapr 集成、動態許可權和功能、外部本地化、分散式實體緩存服務,都是對微服務和分散式架構所提出的解決方案。 ...
  • public class SerializeHelper { #region 二進位格式 /// <summary> /// Binary 序列化使用前需要標記類可序列化 /// </summary> /// <param name="fileName">序列化到指定的文件</param> /// ...
  • Helix 解碼庫提供了MP3內容的MPEG相容解碼, 支持可變比特率, 恆定比特率以及立體聲和單聲道音頻格式. Helix 的定點解碼庫專門針對ARM處理器進行了優化. Helix 解碼庫是以幀為解碼單位的, 一次解碼一幀, 運行需要占用的資源很少, 可以在任何能夠執行長整數乘法運算(兩個32位輸... ...
  • 以下介紹PY32F0系列在Ubuntu下如何使用GCC Arm Embedded Toolchain環境進行開發和燒錄. GitHub 倉庫地址: https://github.com/IOsetting/py32f0-template ...
  • PY32F0 屬於 32位 M0 內核的MCU, 配置上有 16KF+2KR, 20KF+3KR, 32KF+4KR, 64KF+8KR 這些組合, 根據外設的豐富程度分成了 PY32F002, PY32F003, PY32F030, PY32F072 這四個系列, 另外還有一家芯嶺科技貼牌的 XL... ...
  • 本文主要目的是在拿到一個藍牙模塊後,將其作為從機來對一些基本的軟體功能進行測試,用以快速驗證是否滿足基本的使用需求和功能指標。 ...
一周排行
    -Advertisement-
    Play Games
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...