主頁 > 資料庫 > MySQL四種日志binlog/redolog/relaylog/undolog

MySQL四種日志binlog/redolog/relaylog/undolog

2023-04-05 16:28:25 資料庫

優質博文:IT-BLOG-CN

一、binlog

binlog記錄資料庫表結構和表資料變更,比如update/delete/insert/truncate/create,它不會記錄select,存盤著每條變更的SQL陳述句和XID事務Id等等,binlog日志檔案如下:

[[email protected]]# mysqlbinlog mysql-binlog.0000012
..........
# at 523
# 168654 20:22:43 server id 1 end_log_pos 843 Query thread_id=3 exec_time=0 error_code=0
SET TIMESTAMP=156521934/*!*/;
INSERT INTO student('name','age','sex') VALUES('ZZX',20,'1');  # 執行的SQL陳述句
/*!*/;
# at 669
#168654 20:22:45 server id 1 end_log_pos 876 Xid = 12              #執行的時間和事務ID

主要有兩個作用:復制和恢復資料
【1】MySQL架構為了高可用性都是一主多從,從服務器需要與主服務器保持資料一致,這就是通過binlog進行復制;
【2】資料庫的資料如果被誤刪,可以通過binlog資料進行恢復,

因為binlog記錄了資料庫表的邏輯變更,所以可以用binlog進行主從復制和恢復資料,

二、redo log

MySQL執行SQL修改陳述句時,肯定是先把這條記錄查出來,然后再將這條進行進行修改,因為Mysql的基本存盤結構是頁,記錄都存在頁里邊,所以MySQL是先把這條記錄所在的頁找到,然后把該頁加載到記憶體中,將對應記錄進行修改,現在就可能存在一個問題:如果在記憶體中把資料改了,還沒來得及落磁盤,而此時的資料庫掛了,導致這次修改丟失了怎么辦?

如果每個請求都需要將資料立馬同步到磁盤,那速度會很慢,MySQL可能也頂不住,所以MySQL引入了redo log,記憶體寫完了,然后會寫一份redo log,這份redo log記載著這次在某個頁上做了什么修改

redo log的時候,也會有buffer,是先寫buffer,再真正落到磁盤中的,至于從buffer什么時候落磁盤,會有配置供我們配置,

redo log也是需要寫磁盤的,但它的好處就是順序IO(我們都知道順序IO比隨機IO快非常多),

所以,redo log的存在為了:當我們修改的時候,寫完記憶體了,但資料還沒真正寫到磁盤的時候,此時我們的資料庫掛了,我們可以根據redo log來對資料進行恢復,因為redo log是順序IO,所以寫入的速度很快,并且redo log記載的是物理變化(x頁做了y修改),檔案的體積很小,恢復速度很快,

三、binlog與redolog的區別

兩個日志較為相似,這里總結下兩者的主要區別:
【1】存盤內容不同: binlog記載的是update/delete/insert這樣的SQL陳述句,而redo log記載的是物理修改的內容(x頁修改了y),redo log記錄的是資料的物理變化,binlog記錄的是資料的邏輯變化,

【2】功能: redo log的作用是為持久化而生的,寫完記憶體,如果資料庫掛了,那我們可以通過redo log來恢復記憶體還沒來得及刷到磁盤的資料,將redo log加載到記憶體里邊,那記憶體就能恢復到掛掉之前的資料了,
binlog的作用是復制和恢復而生的,主從服務器需要保持資料的一致性,通過binlog來同步資料,如果整個資料庫的資料都被洗掉了,binlog存盤著所有的資料變更情況,那么可以通過binlog來對資料進行恢復,

如果整個資料庫的資料都被洗掉了,那我可以用redo log的記錄來恢復嗎?
不能,因為功能的不同,redo log 存盤的是物理資料的變更,如果我們記憶體的資料已經刷到了磁盤了,那redo log的資料就無效了,所以redo log不會存盤著歷史所有資料的變更,檔案的內容會被覆寫的,

【3】寫入細節不同: redo logMySQLInnoDB引擎所產生的,binlog無論MySQL任何引擎都會有的,
InnoDB是有事務的,事務的四大特性之一:持久性就是靠redo log來實作的(如果寫入記憶體成功,但資料還沒真正刷到磁盤,如果此時的資料庫掛了,我們可以靠redo log來恢復記憶體的資料,這就實作了持久性),

上面也提到,在修改的資料的時候,binlog會記載著變更的類容,redo log也會記載著變更的內容,(只不過一個存盤的是物理變化,一個存盤的是邏輯變化),那他們的寫入順序是什么樣的呢?

redo log事務開始的時候,就開始記錄每次的變更資訊,而binlog是在事務提交的時候才記錄,

于是新有的問題又出現了:我寫其中的某一個log,失敗了,那會怎么辦?現在我們的前提是先寫redo log,再寫binlog,我們來看看:
? ■ 如果寫redo log失敗了,那我們就認為這次事務有問題,回滾,不再寫binlog
? ■ 如果寫redo log成功了,寫binlog,寫binlog寫一半了,但失敗了怎么辦?我們還是會對這次的事務回滾,將無效的binlog給洗掉(因為binlog會影響從庫的資料,所以需要做洗掉操作)
? ■ 如果寫redo logbinlog都成功了,那這次算是事務才會真正成功,

簡單來說:MySQL需要保證redo logbinlog的資料是一致的,如果不一致,那就亂套了,
? ■ 如果redo log寫失敗了,而binlog寫成功了,那假設記憶體的資料還沒來得及落磁盤,機器就掛掉了,那主從服務器的資料就不一致了,(從服務器通過binlog得到最新的資料,而主服務器由于redo log沒有記載,沒法恢復資料)
? ■ 如果redo log寫成功了,而binlog寫失敗了,那從服務器就拿不到最新的資料了,

MySQL通過兩階段提交來保證redo logbinlog的資料是一致的,

階段1:InnoDB redo log寫盤,InnoDB事務進入prepare狀態
階段2:binlog寫盤,InooDB事務進入commit狀態

每個事務binlog的末尾,會記錄一個XID event,標志著事務是否提交成功,也就是說,恢復程序中,binlog最后一個XID event之后的內容都應該被purge

如果binlog沒有正常關閉,mysql server可能crash過,我們需要呼叫MYSQL_BIN_LOG::recover:找到最后一個XID完成最后一次事務的兩階段提交InnoDB commit,因此,需要遍歷binlog檔案,找到最后一個合法event集合,并purge無效binlog

四、relay-log

從服務器I/O執行緒將主服務器的二進制日志讀取過來記錄到從服務器本地檔案,然后從服務器SQL執行緒會讀取relay-log日志的內容并應用到從服務器,從而使從服務器和主服務器的資料保持一致

show variables like '%relay%';
 
#結果
+---------------------------+----------------------------------+
| Variable_name             | Value                            |
+---------------------------+----------------------------------+
| max_relay_log_size        | 0                                |
| relay_log                 | relay-mysql                      |
| relay_log_basename        | /var/lib/mysql/relay-mysql       |
| relay_log_index           | /var/lib/mysql/relay-mysql.index |
| relay_log_info_file       | relay-log.info                   |
| relay_log_info_repository | FILE                             |
| relay_log_purge           | ON                               |
| relay_log_recovery        | ON                               |
| relay_log_space_limit     | 0                                |
| sync_relay_log            | 10000                            |
| sync_relay_log_info       | 10000                            |
+---------------------------+----------------------------------+

max_relay_log_sizerelay log允許的最大值,如果該值為0,則默認值為max_binlog_size (1G),如果不為0,則max_relay_log_size則為最大的relay_log檔案大小;

relay_log: 定義relay_log的位置和名稱,如果值為空,則默認位置在資料檔案的目錄;

relay_log_index:定義relay_log索引的位置和名稱,記錄有幾個relay_log檔案,默認為2

cat /var/lib/mysql/relay-mysql.index
 
#結果
./relay-mysql.000241
./relay-mysql.000242

relay_log_info_file:定義relay-log.info的位置和名稱,relay-log.info記錄master主庫的binary_log的恢復位置和從庫relay_log的位置;

[root@localhost ~]# cat /var/lib/mysql/relay-log.info
 
#結果
7
./relay-mysql.000242
19421766
mysql-bin.000094
34300252
0
0
1

relay_log_purge:是否自動清空中繼日志,默認值為1(啟用);

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

sync_relay_log:當設定為1時,slaveI/O執行緒每次接收到master發送過來的binlog日志都要寫入系統緩沖區,然后刷入relay log中繼日志里,這樣是最安全的,因為在崩潰的時候,你最多會丟失一個事務,但會造成磁盤的大量I/O,當設定為0時,并不是馬上就刷入中繼日志里,而是由作業系統決定何時來寫入,雖然安全性降低了,但減少了大量的磁盤I/O操作,這個值默認是0,可動態修改;

sync_relay_log_info:這個引數和sync_relay_log引數一樣,

五、undo log

undo log主要有兩個作用:回滾和多版本控制MVCC

在資料修改的時候,不僅記錄了redo log,還記錄undo log,如果因為某些原因導致事務失敗或回滾了,可以用undo log進行回滾

undo log主要存盤的也是邏輯日志,比如我們要insert一條資料了,那undo log會記錄的一條對應的delete日志,我們要update一條記錄時,它會記錄一條對應相反的update記錄,

這也應該容易理解,畢竟回滾嘛,跟需要修改的操作相反就好,這樣就能達到回滾的目的,因為支持回滾操作,所以我們就能保證:“一個事務包含多個操作,這些操作要么全部執行,要么全都不執行”,【原子性】

因為undo log存盤著修改之前的資料,相當于一個前版本,MVCC實作的是讀寫不阻塞,讀的時候只要回傳前一個版本的資料就行了,

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/549192.html

標籤:其他

上一篇:讀SQL進階教程筆記08_處理數列

下一篇:mysql精確查年齡

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more