成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

MySQL事務已提交,數據卻丟了,趕緊檢查下這個配置!!!

數據庫 MySQL
既然redo log能保證事務的ACID特性,那為什么還會出現,水友提問中出現的“數據庫崩潰,丟數據”的問題呢?一起看下redo log的實現細節。

有個水友提問:

沈老師,我們有一次MySQL崩潰,重啟后發現有些已經提交的事務對數據的修改丟失了,不是說事務能保證ACID特性么,想問下什么情況下可能導致“事務已經提交,數據卻丟失”呢?

這個問題有點復雜,得先從redo log說起。

為什么要有redo log?

事務提交后,必須將事務對數據頁的修改刷(fsync)到磁盤上,才能保證事務的ACID特性。

這個刷盤,是一個隨機寫,隨機寫性能較低,如果每次事務提交都刷盤,會極大影響數據庫的性能。

隨機寫性能差,有什么優化方法呢?

架構設計中有兩個常見的優化方法:

  • 先寫日志(write log first),將隨機寫優化為順序寫;
  • 將每次寫優化為批量寫;

這兩個優化,數據庫都用上了。

先說第一個優化,將對數據的修改先順序寫到日志里,這個日志就是redo log。

假如某一時刻,數據庫崩潰,還沒來得及將數據頁刷盤,數據庫重啟時,會重做redo log里的內容,以保證已提交事務對數據的影響被刷到磁盤上。

一句話,redo log是為了保證已提交事務的ACID特性,同時能夠提高數據庫性能的技術。

既然redo log能保證事務的ACID特性,那為什么還會出現,水友提問中出現的“數據庫崩潰,丟數據”的問題呢?一起看下redo log的實現細節。

redo log的三層架構?

畫了一個丑圖,簡單說明下redo log的三層架構:

  • 粉色,是InnoDB的一項很重要的內存結構(In-Memory Structure),日志緩沖區(Log Buffer),這一層,是MySQL應用程序用戶態;
  • 屎黃色,是操作系統的緩沖區(OS cache),這一層,是OS內核態;
  • 藍色,是落盤的日志文件。

redo log最終落盤的步驟如何?

首先,事務提交的時候,會寫入Log Buffer,這里調用的是MySQL自己的函數WriteRedoLog;

接著,只有當MySQL發起系統調用寫文件write時,Log Buffer里的數據,才會寫到OS cache。注意,MySQL系統調用完write之后,就認為文件已經寫完,如果不flush,什么時候落盤,是操作系統決定的;

畫外音:有時候打日志,明明printf了,tail -f卻看不到,就是這個原因,操作系統還沒有刷盤。

最后,由操作系統(當然,MySQL也可以主動flush)將OS cache里的數據,最終fsync到磁盤上。

操作系統為什么要緩沖數據到OS cache里,而不直接刷盤呢?

這里就是將“每次寫”優化為“批量寫”,以提高操作系統性能。

數據庫為什么要緩沖數據到Log Buffer里,而不是直接write呢?

這也是“每次寫”優化為“批量寫”思路的體現,以提高數據庫性能。

畫外音:這個優化思路,非常常見,高并發的MQ落盤,高并發的業務數據落盤,都可以使用。 redo log的三層架構,MySQL做了一次批量寫優化,OS做了一次批量寫優化,確實能極大提升性能,但有什么副作用嗎?

畫外音:有優點,必有缺點。

這個副作用,就是可能丟失數據:

  • 事務提交時,將redo log寫入Log Buffer,就會認為事務提交成功;
  • 如果寫入Log Buffer的數據,write入OS cache之前,數據庫崩潰,就會出現數據丟失;
  • 如果寫入OS cache的數據,fsync入磁盤之前,操作系統崩潰,也可能出現數據丟失;

畫外音:如上文所說,應用程序系統調用完write之后(不可能每次write后都立刻flush,這樣寫日志很蠢),就認為寫成功了,操作系統何時fsync,應用程序并不知道,如果操作系統崩潰,數據可能丟失。

任何脫離業務的技術方案都是耍流氓:

  • 有些業務允許低效,但不允許一丁點數據丟失;
  • 有些業務必須高性能高吞吐,能夠容忍少量數據丟失。

MySQL是如何折衷的呢?

MySQL有一個參數:

innodb_flush_log_at_trx_commit

能夠控制事務提交時,刷redo log的策略。

目前有三種策略:

策略一:最佳性能(innodb_flush_log_at_trx_commit=0)

  • 每隔一秒,才將Log Buffer中的數據批量write入OS cache,同時MySQL主動fsync。
  • 這種策略,如果數據庫崩潰,有一秒的數據丟失。

策略二:強一致(innodb_flush_log_at_trx_commit=1)

  • 每次事務提交,都將Log Buffer中的數據write入OS cache,同時MySQL主動fsync。
  • 這種策略,是InnoDB的默認配置,為的是保證事務ACID特性。

策略三:折衷(innodb_flush_log_at_trx_commit=2)

  • 每次事務提交,都將Log Buffer中的數據write入OS cache;
  • 每隔一秒,MySQL主動將OS cache中的數據批量fsync。

畫外音:磁盤IO次數不確定,因為操作系統的fsync頻率并不是MySQL能控制的。

  • 這種策略,如果操作系統崩潰,最多有一秒的數據丟失。

畫外音:因為OS也會fsync,MySQL主動fsync的周期是一秒,所以最多丟一秒數據。

講了這么多,回到水友的提問上來,數據庫崩潰,重啟后丟失了數據,有很大的可能,是將innodb_flush_log_at_trx_commit參數設置為0了,這位水友最好和DBA一起檢查一下InnoDB的配置。

可能有水友要問,高并發的業務,InnoDB運用哪種刷盤策略最合適?

高并發業務,行業最佳實踐,是使用第三種折衷配置(=2),這是因為:

  • 配置為2和配置為0,性能差異并不大,因為將數據從Log Buffer拷貝到OS cache,雖然跨越用戶態與內核態,但畢竟只是內存的數據拷貝,速度很快;
  • 配置為2和配置為0,安全性差異巨大,操作系統崩潰的概率相比MySQL應用程序崩潰的概率,小很多,設置為2,只要操作系統不崩潰,也絕對不會丟數據。

總結

(1) 為了保證事務的ACID特性,理論上每次事務提交都應該刷盤,但此時效率很低,有兩種優化方向:

  • 隨機寫優化為順序寫
  • 每次寫優化為批量寫

(2) redo log是一種順序寫,它有三層架構:

  • MySQL應用層:Log Buffer
  • OS內核層:OS cache
  • OS文件:log file

(3) 為了滿足不同業務對于吞吐量與一致性的需求,MySQL事務提交時刷redo log有三種策略:

  • 0:每秒write一次OS cache,同時fsync刷磁盤,性能好;
  • 1:每次都write入OS cache,同時fsync刷磁盤,一致性好;
  • 2:每次都write入OS cache,每秒fsync刷磁盤,折衷;

(4) 高并發業務,行業內的最佳實踐,是:

innodb_flush_log_at_trx_commit=2

知其然,知其所以然,希望大家有收獲。

責任編輯:趙寧寧 來源: 架構師之路
相關推薦

2025-06-30 08:43:50

網關代碼

2013-03-22 09:04:11

施密特Google Now蘋果

2022-04-28 09:02:55

Gitcommitlint配置

2010-03-24 09:09:00

Opera MiniIphone

2022-11-16 17:10:25

MySQL數據事務

2023-02-27 14:42:46

MySQLSQL

2022-07-27 08:52:10

MySQL二階段提交

2023-02-02 07:06:10

2024-05-21 14:12:07

2022-01-03 07:18:05

臟讀幻讀 MySQL

2022-06-29 11:01:05

MySQL事務隔離級別

2024-07-03 10:26:17

2024-01-02 07:55:26

MySQLRedolog緩存

2025-02-26 08:26:38

2021-03-17 00:05:50

分布式事務提交

2009-02-11 13:08:29

事務提交事務管理Spring

2020-06-17 16:56:36

數據庫MySQL跨行事務

2017-08-22 17:10:45

數據庫MySQL事務模型

2021-01-05 10:48:38

RedisAOF日志RDB快照
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久新视频 | 91视频国产区 | 欧美亚洲国产一区二区三区 | 久在线| 国产精品成人在线 | 综合亚洲视频 | 国产精品久久久久久久久久久久 | 国产精品亚洲综合 | 成人精品一区 | 九一精品 | 欧美一区二区 | 亚洲最色网站 | 91人人爽| 一区二区三区国产精品 | 久久久久国产精品 | 老子午夜影院 | 日本激情一区二区 | 天天操 夜夜操 | 国产91视频免费 | 一本岛道一二三不卡区 | 欧美阿v| 午夜精品一区二区三区在线视频 | 日韩在线h | 亚洲一区二区三区四区五区午夜 | 国产在线精品一区二区三区 | 伊人久久麻豆 | 中文字幕日韩欧美 | 日韩欧美久久精品 | 亚洲欧美一区二区三区1000 | 国产精品久久久久久久久久久久冷 | 精品国产精品国产偷麻豆 | 国产乱码精品1区2区3区 | 国产日韩在线观看一区 | 久久狠狠 | 久久成人久久 | 亚洲国产精品人人爽夜夜爽 | 日韩一区二区三区在线看 | 在线成人免费视频 | 亚洲v日韩v综合v精品v | 国产免费一区 | 黄色三级在线播放 |