1. 程式人生 > >關於MySQL的commit非規律性失敗案例的深入分析

關於MySQL的commit非規律性失敗案例的深入分析

案例描述:

  一個普通的事務提交,在應用裡面會提示commit超時,失敗。

一、理論知識

1、關於commit原理,事務提交過程

  1、尋找修改的資料頁:

    1、如果該資料頁在記憶體中,則直接是記憶體讀;

    2、如果該資料頁記憶體中沒有,物理讀,就從磁碟調入記憶體;

  2、磁碟中的undo頁調入記憶體;

  3、先將原來的資料存入undo,然後修改資料(資料頁成髒頁);

  4、修改資料的資訊生成redo資料存入log_buffer(記憶體buffer_pool的一個空間,預設16M)中;

mysql> show variables like '%log_buffer%
'; +------------------------+----------+ | Variable_name | Value | +------------------------+----------+ | innodb_log_buffer_size | 16777216 | +------------------------+----------+ 1 row in set (0.01 sec)

  5、log_buffer通過log執行緒(後臺執行緒,非常勤快),持續不斷的將redo資訊寫入disk的innodb_log_file中;

mysql> show variables like
'innodb_log_file%'; +---------------------------+----------+ | Variable_name | Value | +---------------------------+----------+ | innodb_log_file_size | 50331648 | | innodb_log_files_in_group | 2 | +---------------------------+----------+ 2 rows in set (0.01 sec)

  6、事務提交,刻意觸發log執行緒,將剩餘的log_buffer中的redo資料資訊寫入磁碟中,資料量已剩不多,寫完提交成功。

注意:

  1、修改記錄前,一定要先寫日誌;

    “日誌先行”,這是資料庫最基本的原則。

  2、事務提交過程中,一定要保證日誌先落盤,才能算事務提交完成。

  3、意外掉電,記憶體髒頁丟失,但是磁碟的innodb_log_file中存放了redo日誌資訊,待重啟伺服器,MySQL通過讀取磁碟的log_files資料,自動將資料的修改重新跑一邊。

Q:為什麼mysql commit速度總是很快,儘管事務修改的資料量可能很大?

A:

  因為事務提交,並不是對磁碟資料進行修改,而是將修改資料的redo資訊通過後臺log執行緒寫入磁碟的redo logfile中,完成mysql commit,無論事務修改的資料量有多大,這個過程速度是很快的。

  而記憶體中的髒塊,也就是修改後的資料頁,正常情況下是由後臺相關write執行緒週期性的將髒頁資料刷入磁碟中,保證innodb buffer pool有足夠的乾淨塊、可用塊。

2、關於rollback原理,回滾過程

  1、MySQL讀取記憶體中undo頁資訊

  2、通過undo資訊找到髒頁,反著對資料進行修改

  3、do、undo的時間相同,且都會產成redo資訊

  4、事務提交

MySQL回滾處理機制:

  如果執行緒中斷,事務沒有提交,undo會將記錄此資訊,待另一會話程序連上,檢視該塊資料資訊,MySQL自動回滾進行資料頁修改,然後被讀取。也就是說為了避免系統因為rollback被hang住,通過直接殺死程序的方式,中斷事務,等待後來者要讀取該資料資訊時進行回滾,再返回結果。

Q:rollback為什麼有時候很慢,rollback的風險和風險避免方式?

A:

  rollback的時間取決於回滾前事務修改資料的時間,處理量大回滾時間長,處理量小回滾時間短。

  1、rollback風險:容易導致系統被hang住;

  2、風險避免方式:直接殺死會話程序或是mysql程序。

3、儲存寫入效能分析

Q:mysql commit,儲存為什麼寫速度能夠保持在0ms,極少出現1ms情況?

A:

  對於儲存來說,寫效能相當高:假設儲存cache總有空閒空間的情況下,事務提交,將log buffer中剩餘的很少的redo資料寫入儲存cache,即為完成mysql commit,這個過程是相當快的(能夠保持在0ms,極少出現1ms情況),後續redo資料由cache寫入磁碟的過程是後臺進行。

4、儲存級別的災備(同城災備)

  1、災備同步過程:commit

    1、redo、binlog寫入本地儲存cache;

    2、通過網路同步binlog寫入遠端同步的伺服器的儲存cache中;

    3、響應本地資料庫;

    4、事務提交成功;

  2、風險:

    網路出現問題(訊號斷續,纜線斷了),導致寫hang住,commit超時失敗。

  3、解決:

    通過超時設定,網路中斷超過限制,自動將同步改為災備非同步,儘可能少的影響業務commit超時失敗。

二、分析與處理

  儲存寫效能比較差,很多時段會達到5ms,甚至於10ms以上

    備註:災備同步已經停止的情況下。

1、儲存中BBU問題,出現監控BBU的bug;

  解決:重啟BBU,不行就更新BBU。

2、cache被佔滿

  1、海量資料寫入,commit資料佔滿cache;

  2、硬碟I/O異常,異常SQL導致的海量物理讀;

  解決:索引優化。

3、儲存效能差

  解決:找老闆掏錢,更換優質裝置。

相關推薦

關於MySQL的commit規律性失敗案例深入分析 關於MySQL的commit規律性失敗案例深入分析

關於MySQL的commit非規律性失敗案例的深入分析   案例描述:   一個普通的事務提交,在應用裡面會提示commit超時,失敗。 一、理論知識 1、關於commit原理,事務提交過程   1、尋找修改的資料頁:

關於MySQL的commit規律性失敗案例深入分析

案例描述:   一個普通的事務提交,在應用裡面會提示commit超時,失敗。 一、理論知識 1、關於commit原理,事務提交過程   1、尋找修改的資料頁:     1、如果該資料頁在記憶體中,則直接是記憶體讀;     2、如果該資料頁記憶體中沒有,物理讀,就從磁

Redis偶發連接失敗案例分析

function diff tcl 版本升級 prot his 部分 判斷 etc 【作者】 張延俊:攜程技術保障中心資深DBA,對數據庫架構和疑難問題分析排查有濃厚的興趣。 壽向晨:攜程技術保障中心高級DBA,主要負責攜程Redis及DB的運維工作,在自動化運維,流程化及

Redis偶發連線失敗案例分析

【作者】 張延俊:攜程技術保障中心資深DBA,對資料庫架構和疑難問題分析排查有濃厚的興趣。 壽向晨:攜程技術保障中心高階DBA,主要負責攜程Redis及DB的運維工作,在自動化運維,流程化及監控排障等方面有較多的實踐經驗,喜歡深入分析問題,提高團隊運維效率。 【問題描述】  生產環境有一個Redis會偶爾發生

Redis Cluster的FailOver失敗案例分析

場景:       使用redis clusterRC1部署叢集,6臺機器,每臺部署16個例項,每個master使用一個slave,node_timeout為預設值(15s)。kill掉其中一個master發現failover完成不了。通過cluster nodes觀察,

敏捷專案管理基礎及失敗案例分析-(丁仿)

Scrum 敏捷開發 基礎及失敗成功案例分析 什麼是敏捷開發方法?何謂Scrum? 看到敏捷,想到的是什麼? 有人說是動作敏捷、反映靈敏,速度快; 有人說是多快好省; 有人說是沒有制度,

深入分析ReentrantLock公平鎖和公平鎖的區別

在ReentrantLock中包含了公平鎖和非公平鎖兩種鎖,通過檢視原始碼可以看到這兩種鎖都是繼承自Sync,而Sync又繼承自AbstractQueuedSynchronizer,而AbstractQueuedSynchronizer又繼承自AbstractOwnableSynchronizer,下面是類的

深入分析 verilog 阻塞和阻塞賦值

越是看似簡單、經常接觸的。我們越是不知其所以然。這就是我寫本文的原因。         阻塞和非阻塞賦值一般使用在程序中,包括always和initial程序、assign賦值等操作中。         在Verilog HDL中,描述程序的基本語句是always和initial。always過程反覆執行其

深入分析Volatile的實現原理

queue 鏈接地址 什麽 高速緩存 spa 其中 帶來 系統內存 單詞 引言 在多線程並發編程中synchronized和Volatile都扮演著重要的角色,Volatile是輕量級的synchronized,它在多處理器開發中保證了共享變量的“可見性”。可見性的意思是當

Activity啟動模式的深入分析

啟用 ide net 啟動模式 soft adding class 任務 新的 網上關於Activity啟動模式的文章許多。可是看起來都千篇一律,看完之後我們都能理解這4種啟動模式。只是官方api對singleTask這個啟動模式解釋有些爭議,導致我事實

Buffer源碼深入分析

buffer本機環境:Linux 4.4.0-21-generic #37-Ubuntu SMP Mon Apr 18 18:33:37 UTC 2016 x86_64 x86_64 x86_64 GNU/LinuxBufferBuffer的類圖如下:除了Boolean,其他基本數據類型都有對應的Buffer

深入分析JavaWeb Item13 -- jsp指令具體解釋

性能 異常信息 content ... pin 簡單 markdown 分隔 一個 一、JSP指令簡單介紹   JSP指令(directive)是為JSP引擎而設計的。它們並不直接產生不論什麽可見輸出,而僅僅是告訴引擎怎樣處理JSP頁面中的其余部分。

深入分析JavaWeb Item47 -- Struts2攔截器與文件上傳下載

com custom public 面向切面 lang down pri 多功能 art 一、struts2中的攔截器(框架功能核心) 1、過濾器VS攔截器 過濾器VS攔截器功能是一回事。過濾器是Servlet規範中的技術,能夠對請求和響應進行過濾。

深入分析Java ClassLoader原理

lec version 虛擬機 open rdl nds str rac pro 一、什麽是ClassLoader? 大家都知道。當我們寫好一個Java程序之後。不是管是CS還是BS應用,都是由若幹個.class文件組織而成的一個完整的Java應用程序

<<深入分析javaWeb技術內幕>>讀書筆記-JVM內存管理2

空間 不同 class logs 減少 src 一次 ges jvm垃圾回收 JVM垃圾回收策略 1.靜態內存分配和回收   編譯時已經確定了內存空間大小,程序被加載後則一次性分配好內存空間.程序結束後,則對應棧幀撤銷,分配的靜態內存空間則被回收. 2.動態內存分配和回收

RF失敗案例重跑

ges com 執行 包括 pybot 針對 根據 tro cnblogs 1.1 失敗案例重跑 該功能主要是針對上次連跑失敗的案例需要重新執行測試的情況,可自動識別上次執行失敗的案例並進行重跑,無需手動選擇相應的案例,簡單高效。 1.5.1.

Servlet工作原理(讀許令波《深入分析javaWeb技術內幕》)筆記

container 創建 onf 應用 最重要的 深入分析 conf con 技術內幕 在介紹servlet的工作原理之前首先我們要先了解一下與servlet配套的servlet容器,本文以tomcat為例 1.Tomcat容器的基礎知識 Tomcat的容器是分級管理共分為

深入分析_linux_spinlock_實現機制【轉】

源碼 idt 內存 獲取 編寫 存在 www 浪費 理論 轉自:http://blog.csdn.net/electrombile/article/details/51289813 在 x86 平臺上,spinlock 主要通過處理器的 lock 指令前綴實現當某個線

深入分析Java ClassLoader的原理

reflect 打包成 dog ret tail package nod jdk1 分析 一、什麽是ClassLoader? 大家都知道,當我們寫好一個Java程序之後,不是管是CS還是BS應用,都是由若幹個.class文件組織而成的一個完整的Java應用

深入分析一波,你們說的雲安全到底是什麽鬼?

基於 區塊鏈 workload 策略 直接 未來 國家 場景 大數據 雲安全到底是什麽?是傳統廠商的盒子的iso化?是雲廠商自身具備的安全能力?還是SaaS提供安全服務?這些觀點都比較片面,作為聊天話題還可以,但落地還需要認真討論。 一、雲安全標準 要想了解雲安全