色五月色开心色婷婷色丁香,五月婷婷丁香花综合网,婷婷丁香五月激情综合在线,五月婷婷六月丁香动漫,婷婷丁香五月激情综合在线,丁香花中文字幕在线观看,播五月色五月开心五月网,开心激情综合网,狠狠色丁香婷婷综合最新地址,丁香视频在线观看,狠狠做六月爱婷婷综合av,久久激情五月丁香伊人

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營的一線實(shí)戰(zhàn)洞察。

MySQL Undo Log 深度解析:事務(wù)回滾與 MVCC 的底層支柱

MySQL Undo Log 深度解析:事務(wù)回滾與 MVCC 的底層支柱 一、引言理解事務(wù)與并發(fā)之前先讀懂 Undo Log在 MySQL 的日常開發(fā)中我們幾乎每天都在與事務(wù)打交道開啟事務(wù)、執(zhí)行 DML、提交或回滾。很多開發(fā)者能夠熟練使用事務(wù)的四大特性 ACID也知道 InnoDB 之所以能支持事務(wù)與多版本并發(fā)控制MVCC離不開 Redo Log、Binlog 和 Undo Log 三大日志體系的協(xié)同工作。但真正深入到底層時Undo Log 往往是最容易被低估、也最容易被誤解的一環(huán)。一個常見的誤區(qū)是很多人認(rèn)為 Undo Log 就是用來做事務(wù)回滾的僅僅在事務(wù)失敗或者用戶手動執(zhí)行 ROLLBACK 時才發(fā)揮作用。事實(shí)上Undo Log 的職責(zé)遠(yuǎn)遠(yuǎn)不止于此。它既是「事務(wù)回滾」的物理基礎(chǔ)也是「MVCC 多版本并發(fā)控制」能夠?qū)崿F(xiàn)讀不阻塞寫、寫不阻塞讀的關(guān)鍵支柱。如果把 InnoDB 的事務(wù)機(jī)制比作一座建筑那么 Undo Log 就是埋在地基里的鋼筋——平時看不見卻決定了整座建筑的穩(wěn)定性。本文將從「是什么、為什么、怎么用、怎么優(yōu)化」四個維度對 MySQL InnoDB 的 Undo Log 進(jìn)行系統(tǒng)性的深度解析。內(nèi)容涵蓋 Undo Log 的物理存儲結(jié)構(gòu)、邏輯記錄格式、事務(wù)回滾機(jī)制、MVCC 實(shí)現(xiàn)原理、Purge 清理機(jī)制、與 Redo Log 的協(xié)同關(guān)系以及生產(chǎn)環(huán)境中的參數(shù)調(diào)優(yōu)與故障排查方法。希望通過這篇文章能夠幫助讀者建立起對 Undo Log 的完整認(rèn)知真正理解事務(wù)回滾與 MVCC 的底層支柱是如何運(yùn)行的。在開始之前需要先明確一個范圍本文討論的是 InnoDB 存儲引擎中的 Undo Log。MySQL 服務(wù)層的 Binlog 是記錄邏輯變更的歸檔日志MGR 等組件也有自己的日志體系它們與 InnoDB 內(nèi)部的 Undo Log 在職責(zé)和實(shí)現(xiàn)上是完全不同的。本文所有分析均以 MySQL 8.0 版本為主要參照同時會指出與 5.7 及更早版本之間的關(guān)鍵差異。二、Undo Log 是什么先建立概念邊界Undo Log直譯過來是「回滾日志」。它是 InnoDB 存儲引擎為了支持事務(wù)的回滾操作而記錄的一種邏輯日志。所謂邏輯日志是指它記錄的不是磁盤上某個頁面的物理字節(jié)變化而是記錄了一種「邏輯上的變更描述」——例如某個事務(wù)向某張表的某一行插入了一條數(shù)據(jù)或者把某一行的某個字段從舊值修改成了新值。當(dāng)需要回滾時InnoDB 會按照 Undo Log 中記錄的描述執(zhí)行反向操作從而把數(shù)據(jù)恢復(fù)到修改之前的狀態(tài)。2.1 邏輯日志與物理日志的區(qū)別為了準(zhǔn)確理解 Undo Log 的本質(zhì)必須把「邏輯日志」和「物理日志」區(qū)分清楚。InnoDB 體系中Redo Log 是一種物理日志它記錄的是對數(shù)據(jù)頁的物理修改例如「在表空間 X 的第 N 個頁的偏移量 M 處寫入了 4 個字節(jié)的數(shù)據(jù) 0x00000001」。這種日志與存儲結(jié)構(gòu)強(qiáng)綁定必須按照物理位置原樣重放redo才能恢復(fù)數(shù)據(jù)頁到崩潰前的狀態(tài)。與 Redo Log 不同Undo Log 記錄的是邏輯操作例如「表 T 的這一行記錄被插入」「這一行記錄的 c1 字段從 10 變成了 20」。這些描述不關(guān)心具體的頁號和偏移量反而更像是 SQL 層面反向操作的半成品模板。正因?yàn)槭沁壿嫷腢ndo Log 可以被用于回滾操作——只要把記錄里描述的操作反過來執(zhí)行即可。也正因?yàn)槭沁壿嫷耐粋€ Undo Log 記錄可以被多個并發(fā)的讀事務(wù)反復(fù)讀取用于構(gòu)建數(shù)據(jù)的歷史版本這就是 MVCC 的基礎(chǔ)。2.2 Undo Log 不是「備份」還有一個必須澄清的概念Undo Log 保存的是「這次修改之前的樣子」但不要把它理解成對整行數(shù)據(jù)或者整張表的快照備份。對于一次 UPDATE 操作如果只修改了一個索引中的若干列Undo Log 通常只記錄足夠恢復(fù)這些列的信息而不是整行所有列的完整副本。對于一次 INSERT 操作Undo Log 則記錄所插入行的主鍵以便回滾時能夠精確地找到并刪除這條數(shù)據(jù)。這種「按需記錄」的設(shè)計是為了在保證可回滾能力的前提下盡量減少 Undo Log 的磁盤占用和寫入開銷。明確了這些邊界之后我們可以給 Undo Log 下一個更完整的定義Undo Log 是 InnoDB 存儲引擎為支持事務(wù)回滾與 MVCC 而維護(hù)的邏輯日志它以「撤銷記錄」的形式保存數(shù)據(jù)修改前的信息通過反向操作將數(shù)據(jù)恢復(fù)到修改前狀態(tài)并通過版本鏈為一致性讀提供歷史數(shù)據(jù)版本。三、Undo Log 的核心作用兩大職責(zé)缺一不可Undo Log 在整個 InnoDB 事務(wù)體系中承擔(dān)著兩個核心職責(zé)它們分別對應(yīng)事務(wù)的原子性與隔離性。3.1 職責(zé)一事務(wù)回滾保證原子性Atomicity事務(wù)回滾是 Undo Log 最直觀的作用。所謂原子性是指一個事務(wù)中的所有操作要么全部成功要么全部失敗。當(dāng)用戶顯式執(zhí)行 ROLLBACK或者事務(wù)因?yàn)楫惓?、死鎖、超時等原因被強(qiáng)制終止時InnoDB 必須能夠撤銷這個事務(wù)已經(jīng)執(zhí)行過的所有變更把數(shù)據(jù)庫恢復(fù)到事務(wù)開始之前的狀態(tài)。這個「撤銷」的過程本質(zhì)上就是把事務(wù)執(zhí)行期間產(chǎn)生的一系列 Undo Log 記錄按照相反的順序依次重放。例如一個事務(wù)依次執(zhí)行了三條語句插入一行、更新一行、刪除一行那么回滾時就按照「恢復(fù)刪除的行、還原更新的行、刪除插入的行」的順序逐條執(zhí)行撤銷。這種后進(jìn)先出的處理方式與程序調(diào)用棧的行為高度一致能夠保證嵌套操作和先后依賴關(guān)系都不會被破壞。3.2 職責(zé)二MVCC 一致性讀保證隔離性Isolation如果說事務(wù)回滾體現(xiàn)的是 Undo Log 的「回退」能力那么 MVCC 體現(xiàn)的就是它的「留存」能力。InnoDB 默認(rèn)的隔離級別是可重復(fù)讀REPEATABLE READ同時又以「快照讀不加鎖」的方式支持高并發(fā)。在這種機(jī)制下一個只讀事務(wù)在開啟時生成一個 ReadView讀視圖此后它讀取到的數(shù)據(jù)必須始終是「事務(wù)快照」對應(yīng)的版本而不能被其他事務(wù)后續(xù)提交的修改所干擾。假設(shè)事務(wù) A 開啟后讀取了某一行數(shù)據(jù)隨即事務(wù) B 修改了這一行并提交。按照 MVCC 的要求事務(wù) A 再次讀取同一行時仍然應(yīng)該看到舊值。這個「舊值」保存在哪里答案就是 Undo Log。每當(dāng)事務(wù)修改數(shù)據(jù)時InnoDB 都會把修改前的值寫入 Undo Log并把當(dāng)前記錄中的回滾指針Roll Pointer指向這條 Undo 記錄。多個事務(wù)的連續(xù)修改會形成一條版本鏈鏈上的每一個節(jié)點(diǎn)都對應(yīng)一次歷史修改。一致性讀沿著這條版本鏈回溯結(jié)合 ReadView 中的活躍事務(wù)列表判斷哪個版本對當(dāng)前事務(wù)可見從而呈現(xiàn)出穩(wěn)定一致的快照數(shù)據(jù)??梢赃@樣總結(jié)Undo Log 既負(fù)責(zé)「刪除不該存在的修改」也負(fù)責(zé)「找回已經(jīng)消失的歷史」。前者支撐事務(wù)回滾后者支撐 MVCC。理解這兩條主線是掌握 Undo Log 全部知識的前提。四、Undo Log 的物理存儲從表空間到磁盤文件在理解了概念之后我們把視角下沉到物理層看看 Undo Log 到底存放在哪里、以什么形式組織。4.1 歷史演進(jìn)從系統(tǒng)表空間到獨(dú)立 Undo 表空間在 MySQL 5.6 及更早的版本中Undo Log 默認(rèn)存放在共享的系統(tǒng)表空間ibdata 文件中。這種做法帶來兩個明顯的問題第一系統(tǒng)表空間的文件無法在線收縮一旦 Undo Log 膨脹即使大量數(shù)據(jù)已不再需要磁盤空間也難以釋放第二Undo Log 與數(shù)據(jù)字典、Change Buffer 等其他對象混在一起既增加了管理復(fù)雜度也容易產(chǎn)生 I/O 爭用。從 MySQL 5.7 開始InnoDB 支持配置獨(dú)立的 Undo 表空間將 Undo Log 從系統(tǒng)表空間中剝離出來。到了 MySQL 8.0獨(dú)立 Undo 表空間成為默認(rèn)且強(qiáng)制推薦的方式。默認(rèn)安裝會創(chuàng)建兩個 Undo 表空間文件undo_001 和 undo_002存放在數(shù)據(jù)目錄下。這種設(shè)計使得 Undo Log 的膨脹與收縮不再受制于系統(tǒng)表空間也為后面的在線截斷truncate操作提供了可能。4.2 Undo 表空間與回滾段Rollback Segment每個 Undo 表空間內(nèi)部被劃分為若干個回滾段Rollback Segment?;貪L段是管理 Undo 頁的容器每個回滾段內(nèi)部維護(hù)一個或多個undo segment而 undo segment 又由一組連續(xù)的 undo 頁組成。回滾段的引入本質(zhì)上是為了在并發(fā)事務(wù)之間分?jǐn)?Undo Log 的分配與管理減少鎖競爭。在 MySQL 8.0 中每個 Undo 表空間默認(rèn)包含 128 個回滾段。這些回滾段被進(jìn)一步劃分給不同用途其中約 32 個為駐留在內(nèi)存中的臨時回滾段用于臨時表其余為普通回滾段用于持久化表。每個回滾段又維護(hù)著 1024 個 undo slot用于分配給不同的事務(wù)。事務(wù)開啟后會從某個回滾段中申請一個或多個 undo slot并在該 slot 中記錄自己的 Undo 日志直到事務(wù)結(jié)束。4.3 相關(guān)參數(shù)與配置下面通過一個表格集中說明與 Undo 表空間相關(guān)的關(guān)鍵參數(shù)。這些參數(shù)在 MySQL 8.0 中具有代表性理解它們有助于在生產(chǎn)環(huán)境中做出正確決策。參數(shù)名含義默認(rèn)值或說明innodb_undo_tablespacesUndo 表空間數(shù)量MySQL 8.0 中棄用由文件定義決定innodb_max_undo_log_size單個 Undo 表空間的最大大小默認(rèn) 1073741824 字節(jié)即 1GBinnodb_undo_log_truncate是否開啟 Undo 表空間自動截斷默認(rèn) ONinnodb_undo_directoryUndo 表空間的存放目錄通常指向數(shù)據(jù)目錄innodb_rollback_segments回滾段數(shù)量默認(rèn) 128innodb_purge_threads后臺 Purge 線程數(shù)量默認(rèn) 4最大 32innodb_purge_batch_size每批 Purge 處理的 Undo 頁數(shù)量默認(rèn) 300需要特別說明的是MySQL 8.0 中通過 SQL 語句可以動態(tài)創(chuàng)建和刪除 Undo 表空間使 DBA 能夠在實(shí)例不中斷服務(wù)的前提下擴(kuò)展 Undo 容量。例如可以通過CREATE UNDO TABLESPACE語句新增一個 Undo 表空間也可以通過ALTER UNDO TABLESPACE ... SET INACTIVE將其標(biāo)記為不活躍并在滿足條件后執(zhí)行在線 shrink。4.4 文件命名與識別默認(rèn)安裝的 MySQL 8.0 會在數(shù)據(jù)目錄生成類似undo_001、undo_002這樣的文件。用戶自定義的 Undo 表空間文件后綴通常為.ibu例如undo_003.ibu。這些文件在服務(wù)器啟動時會被自動識別并加載前提是它們已經(jīng)被記錄在數(shù)據(jù)字典中。理解文件命名規(guī)則有助于在磁盤規(guī)劃時預(yù)先分配足夠的空間避免后續(xù)遇到容量瓶頸。五、Undo Log 的分層邏輯結(jié)構(gòu)物理文件只是最外層的容器。要真正理解 Undo Log 的工作方式還需要深入它的內(nèi)部邏輯結(jié)構(gòu)理解版本鏈和記錄格式是如何組織的。5.1 行記錄中的關(guān)鍵字段在 InnoDB 的聚簇索引主鍵索引記錄中除了用戶定義的數(shù)據(jù)列外還包含若干隱藏的系統(tǒng)列。其中與 Undo Log 直接相關(guān)的是兩個字段DB_TRX_ID事務(wù) ID記錄最后一次修改該行數(shù)據(jù)的事務(wù) ID。它標(biāo)識了「當(dāng)前這個行版本是由哪個事務(wù)產(chǎn)生的」。DB_ROLL_PTR回滾指針指向該行上一個版本的 Undo 記錄構(gòu)成版本鏈的指針。當(dāng)一行數(shù)據(jù)被事務(wù)修改時InnoDB 會在 Undo Log 中寫入一條撤銷記錄內(nèi)容包含修改前的數(shù)據(jù)或不完整信息。隨后把這行新數(shù)據(jù)的回滾指針指向這條 Undo 記錄并更新事務(wù) ID 為當(dāng)前事務(wù) ID。通過不斷重復(fù)這個過程一條數(shù)據(jù)的多個歷史版本就被串聯(lián)成了一條鏈表。鏈表的最新節(jié)點(diǎn)是當(dāng)前數(shù)據(jù)頁中的行記錄更早的節(jié)點(diǎn)則分散存放在 Undo Log 中。5.2 版本鏈的形成過程舉一個具體的例子來演示版本鏈?zhǔn)侨绾我徊讲綐?gòu)建的。假設(shè)存在一張表t(id INT PRIMARY KEY, name VARCHAR(50))初始時有一條數(shù)據(jù)(1, Alice)由事務(wù) ID 為 100 的事務(wù)插入。初始狀態(tài)行記錄為(1, Alice)DB_TRX_ID 100DB_ROLL_PTR 指向插入時的 Undo 記錄。事務(wù) 101 執(zhí)行UPDATE t SET nameBob WHERE id1InnoDB 先寫入一條 Update Undo 記錄其中保存修改前的值nameAlice以及舊版本的回滾指針。然后更新行記錄為(1, Bob)DB_TRX_ID 101DB_ROLL_PTR 指向剛才寫入的 Undo 記錄。事務(wù) 102 執(zhí)行UPDATE t SET nameCindy WHERE id1同理寫入新的 Undo 記錄保存nameBob行記錄更新為(1, Cindy)DB_TRX_ID 102DB_ROLL_PTR 指向最新 Undo 記錄。經(jīng)過這兩次修改后版本鏈從新到舊依次是Cindy當(dāng)前行→ BobUndo 1→ AliceUndo 2再指向插入 Undo 記錄。一個需要讀取舊快照的事務(wù)會沿著這條鏈逐步回溯直到找到對它的 ReadView 可見的版本。這里有一個容易被忽略的細(xì)節(jié)Update Undo 記錄中保存的舊值字段可能并不是完整的列集合。對于非更新索引鍵的更新Undo 記錄通常只包含被修改列以及定位所需的主鍵列。而對于更新了二級索引的場景InnoDB 還會額外記錄被修改的二級索引信息以便回滾時同步恢復(fù)二級索引。這種按需記錄的設(shè)計雖然精巧但也要求我們在分析 Undo 數(shù)據(jù)時不能簡單地把它當(dāng)成整行快照來理解。5.3 INSERT Undo 與 UPDATE Undo根據(jù)操作類型Undo 記錄可以大致分為兩類INSERT Undo和UPDATE Undo。這種分類不是可有可無的命名差異而是直接影響著后續(xù) Purge 時機(jī)的關(guān)鍵因素。INSERT Undo對應(yīng) INSERT 操作。因?yàn)樾虏迦氲男袑ζ渌聞?wù)原本就不可見所以一旦事務(wù)提交這條 Insert Undo 記錄就立即失去了作用不存在需要看到「插入之前」版本的其他事務(wù)。因此 Insert Undo 在事務(wù)提交后即可被安全清理。UPDATE Undo對應(yīng) UPDATE 和 DELETE 操作。由于其他事務(wù)的舊 ReadView 可能仍然需要訪問被修改前的數(shù)據(jù)這類 Undo 記錄在事務(wù)提交后必須保留一段時間直到確認(rèn)沒有任何活動事務(wù)還需要舊版本時才能被 Purge 線程清理。正是這種「Insert Undo 提交即無用、Update Undo 需要延遲清理」的差異決定了 Purge 機(jī)制的核心邏輯。理解了這一點(diǎn)也就理解了為什么有些批量插入場景下 Undo 空間回收很快而大量更新刪除場景下 Undo 空間會長時間保持高位。六、事務(wù)回滾的內(nèi)部機(jī)制有了前面的存儲與結(jié)構(gòu)鋪墊現(xiàn)在可以深入分析事務(wù)回滾的完整流程?;貪L看似簡單但內(nèi)部涉及 Undo 記錄的解析、反向操作的執(zhí)行、鎖與事務(wù)狀態(tài)的維護(hù)等一系列細(xì)節(jié)。6.1 回滾的觸發(fā)場景事務(wù)回滾并非只發(fā)生在用戶顯式輸入 ROLLBACK 的時候。實(shí)際生產(chǎn)環(huán)境中回滾的觸發(fā)場景要豐富得多用戶顯式執(zhí)行ROLLBACK語句。連接斷開時未提交事務(wù)被服務(wù)器自動回滾。事務(wù)執(zhí)行超過innodb_lock_wait_timeout設(shè)定的鎖等待時間。發(fā)生死鎖InnoDB 選擇犧牲其中一個事務(wù)作為死鎖受害者。復(fù)制、崩潰恢復(fù)等場景中部分未完成事務(wù)的清理。DDL 隱式提交之前若先前事務(wù)存在錯誤導(dǎo)致無法繼續(xù)。無論由哪種場景觸發(fā)回滾的底層邏輯都是統(tǒng)一的定位到該事務(wù)對應(yīng)的 Undo 日志按相反順序重放撤銷操作。6.2 回滾的執(zhí)行流程當(dāng)一個事務(wù)需要回滾時InnoDB 大致按照以下步驟執(zhí)行第一步定位 Undo 記錄。事務(wù)在其啟動時會從回滾段中申請并持有相應(yīng)的 undo slot。這些 slot 中記錄了該事務(wù) Undo 日志鏈的最后一個節(jié)點(diǎn)的位置?;貪L時從最后一個節(jié)點(diǎn)開始沿著向前指針逐步向前遍歷逐一取出該事務(wù)產(chǎn)生的 Undo 記錄。第二步解析 Undo 記錄并生成反向操作。InnoDB 讀取每條 Undo 記錄的格式識別其類型INSERT 或 UPDATE解析出主鍵、被修改列、舊值等信息然后在內(nèi)存中構(gòu)造對應(yīng)的反向操作。如果是 Insert Undo反向操作是刪除該行如果是 Update Undo反向操作是把舊值寫回對應(yīng)列并同步處理可能涉及的二級索引。第三步逐條執(zhí)行反向操作。按照與事務(wù)執(zhí)行相反的順序依次將這些反向操作應(yīng)用到數(shù)據(jù)行上。需要注意的是執(zhí)行反向操作本身也會產(chǎn)生新的數(shù)據(jù)變更。但這里有一個重要區(qū)別回滾過程中產(chǎn)生的這些變更不需要再寫入新的 Undo Log。因?yàn)樵?InnoDB 的設(shè)計中事務(wù)一旦進(jìn)入回滾階段其回滾進(jìn)度由已知的 Undo 鏈唯一確定即使回滾中途再次發(fā)生崩潰恢復(fù)時也只需依據(jù)原有 Undo Log 繼續(xù)完成回滾而無需依賴回滾動作自身的新日志。第四步同步維護(hù)鎖與狀態(tài)。在回滾過程中之前由該事務(wù)持有的行鎖、間隙鎖等會隨著對應(yīng)操作的撤銷而逐步釋放?;貪L全部完成后事務(wù)狀態(tài)被標(biāo)記為完全回滾相關(guān)資源被回收undo slot 被標(biāo)記為可復(fù)用。6.3 回滾與 Redo Log 的關(guān)系一個經(jīng)常被問到的問題是既然有 Redo Log 保證崩潰后數(shù)據(jù)的持久化為什么回滾還需要 Undo Log兩者會不會沖突答案是兩者職責(zé)不同、互補(bǔ)而非沖突。Redo Log 解決的是「已提交數(shù)據(jù)在崩潰后如何重放恢復(fù)」它保證的是持久性Durability。Undo Log 解決的是「未提交數(shù)據(jù)如何撤銷」以及「舊版本如何被讀取」它保證的是原子性和隔離性。在崩潰恢復(fù)時InnoDB 會先利用 Redo Log 重放所有已寫入磁盤頁的物理操作把數(shù)據(jù)庫推進(jìn)到崩潰前的物理狀態(tài)隨后再掃描 Undo Log找出崩潰時尚未提交的事務(wù)對它們執(zhí)行回滾。這個過程通常被稱為「redo 重做 undo 撤銷」。兩者先后配合最終使數(shù)據(jù)庫達(dá)到一致狀態(tài)。更進(jìn)一步講Undo Log 本身在被寫入時也會產(chǎn)生 Redo Log因?yàn)?Undo 頁和普通數(shù)據(jù)頁一樣都是內(nèi)存中的頁對象都需要通過 Redo 機(jī)制保證其持久性。這也解釋了為什么 Undo 相關(guān)操作頻繁時Redo Log 的寫入量也會明顯增加。七、MVCC 與 Undo Log一致性讀的實(shí)現(xiàn)原理MVCC 是 InnoDB 實(shí)現(xiàn)高并發(fā)讀寫的核心機(jī)制而 Undo Log 是 MVCC 得以運(yùn)轉(zhuǎn)的存儲基礎(chǔ)。本節(jié)將聚焦 MVCC 與 Undo Log 之間的協(xié)作關(guān)系把「快照讀為什么能看到合適的歷史版本」這個問題徹底講清楚。7.1 當(dāng)前讀與快照讀首先區(qū)分兩種讀操作。當(dāng)前讀Current Read讀取的是數(shù)據(jù)的最新已提交版本例如SELECT ... FOR UPDATE、SELECT ... LOCK IN SHARE MODE以及 UPDATE、DELETE 語句內(nèi)部對行的讀取。當(dāng)前讀通常會加鎖直接讀取行記錄的最新內(nèi)容。快照讀Snapshot Read則不一樣。普通的SELECT語句在默認(rèn)隔離級別下就是快照讀它不加鎖通過 MVCC 讀取符合事務(wù)快照的數(shù)據(jù)版本??煺兆x看到的不是物理頁上的最新行記錄而是根據(jù) ReadView 和版本鏈計算出來的「歷史版本」。這里的版本鏈正是由 Undo Log 串聯(lián)起來的。7.2 ReadView 的構(gòu)成與判斷規(guī)則在可重復(fù)讀隔離級別下快照讀會在事務(wù)中第一次讀取時生成一個 ReadView。在讀已提交READ COMMITTED隔離級別下每次快照讀都會重新生成 ReadView。ReadView 主要包含以下關(guān)鍵信息m_ids生成 ReadView 時系統(tǒng)中所有活躍事務(wù)尚未提交的事務(wù)的事務(wù) ID 列表。min_trx_id活躍事務(wù)列表中最小的事務(wù) ID。max_trx_id即將分配給下一個事務(wù)的事務(wù) ID 上限。creator_trx_id生成該 ReadView 的事務(wù)自身 ID。當(dāng)一致性讀訪問一行數(shù)據(jù)時會拿到該行當(dāng)前版本的 DB_TRX_ID然后按照以下規(guī)則判斷這個版本是否可見如果 DB_TRX_ID 等于 creator_trx_id說明該行是當(dāng)前事務(wù)自己修改的可見。如果 DB_TRX_ID 小于 min_trx_id說明修改該行的事務(wù)在 ReadView 生成前已經(jīng)提交可見。如果 DB_TRX_ID 大于等于 max_trx_id說明修改該行的事務(wù)在 ReadView 生成后才啟動不可見。如果 DB_TRX_ID 位于 min_trx_id 和 max_trx_id 之間則需要進(jìn)一步判斷它是否在活躍事務(wù)列表 m_ids 中若在活躍列表中說明該事務(wù)尚未提交不可見若不在則說明已經(jīng)提交可見。如果當(dāng)前行版本的 DB_TRX_ID 對 ReadView 不可見InnoDB 就會沿回滾指針找到上一版本的 Undo 記錄取出其中的舊值及更早的回滾指針繼續(xù)按同樣規(guī)則判斷直到找到第一個可見版本或者到達(dá)版本鏈末端判定該行完全不存在為止。這個查找過程就是「快照讀 Undo 版本鏈」的完整工作流程。7.3 可重復(fù)讀與讀已提交的差異借助 ReadView 的生成時機(jī)可以非常清晰地解釋兩種隔離級別在快照讀上的行為差異。在可重復(fù)讀級別下ReadView 在事務(wù)的第一次快照讀時生成并持續(xù)作用于整個事務(wù)期間。因此事務(wù)內(nèi)后續(xù)的所有快照讀都使用同一個 ReadView。即使其他事務(wù)在此期間提交了修改這些修改對應(yīng)的 DB_TRX_ID 對舊 ReadView 而言仍然是「不可見」的所以事務(wù)內(nèi)反復(fù)讀取同一行會得到相同的結(jié)果實(shí)現(xiàn)了可重復(fù)讀。在讀已提交級別下每次快照讀都會重新生成 ReadView。每次生成的 ReadView 都會反映最新的已提交事務(wù)集合。因此一個事務(wù)在前后兩次普通 SELECT 之間如果其他事務(wù)提交了修改第二次 SELECT 就能看到新的數(shù)據(jù)。這正是「讀已提交」得名的原因。值得注意的是MySQL 的 MVCC 通過一致性讀解決了大多數(shù)幻讀問題尤其在可重復(fù)讀級別下普通快照讀不會出現(xiàn)幻讀。但對于當(dāng)前讀如加鎖的 SELECT FOR UPDATE可重復(fù)讀級別仍需依靠間隙鎖Gap Lock來防止對同一范圍的并發(fā)插入才能完整地防住幻讀。這個細(xì)節(jié)與本節(jié)的 Undo 主題相關(guān)度有限但有助于澄清「MVCC 是否徹底解決幻讀」這一常見疑問。八、Purge 機(jī)制Undo Log 的生命周期終結(jié)Undo Log 不是永久存在的。它從產(chǎn)生到消亡要經(jīng)歷「寫入、提交、等待、清理」四個階段。其中最后一個階段由后臺的 Purge 機(jī)制完成。Purge 機(jī)制的健康程度直接決定了 Undo 空間是否會無限膨脹、歷史版本鏈?zhǔn)欠駮o限拉長。8.1 為什么不能立即刪除 Undo Log表面上看一個事務(wù)提交之后它的修改已經(jīng)生效對應(yīng)的 Undo Log 似乎就可以刪除了。但問題在于系統(tǒng)中可能還存在其他更早開啟的只讀事務(wù)它們的 ReadView 仍然把這些已經(jīng)提交的修改視為「不可見」從而需要沿著版本鏈訪問更舊的數(shù)據(jù)。如果在這些事務(wù)結(jié)束之前就刪除 Undo 記錄它們的后續(xù)一致性讀就會找不到正確的歷史版本發(fā)生數(shù)據(jù)不一致。因此Undo Log 的清理必須滿足一個條件沒有任何活動的 ReadView 還需要依賴這條 Undo 記錄。用更形式化的語言描述就是一個事務(wù)產(chǎn)生的 Undo 記錄只有在所有可能需要讀取其歷史版本的事務(wù)都已結(jié)束后才能被清理。Purge 線程負(fù)責(zé)做這樣的全局判斷并批量執(zhí)行清理。8.2 Purge 的工作流程Purge 線程的工作大致可以分為以下幾個步驟第一步確定可清理邊界。系統(tǒng)會維護(hù)一個「最老活躍 ReadView」的快照。對于每個 Undo 記錄判斷其對應(yīng)事務(wù)是否已經(jīng)被提交并且其事務(wù) ID 是否早于最老活躍 ReadView 的可見邊界。滿足條件的記錄才是可清理的候選。第二步批量讀取 Undo 頁面。Purge 線程按照回滾段和 Undo 頁的順序批量加載候選的 Undo 記錄而不是隨機(jī)地逐條讀取。批量處理可以減少 I/O 次數(shù)提高清理效率。第三步解析并執(zhí)行清理。對每一條候選記錄根據(jù)其類型執(zhí)行相應(yīng)動作。對于 Insert UndoPurge 會刪除其在索引中的對應(yīng)記錄因?yàn)椴迦氲氖聞?wù)已經(jīng)提交且沒有任何快照需要看到它對于 Update UndoPurge 需要更新索引中記錄的版本鏈指針把鏈頭指向更早的版本使這條中間版本不再被引用。第四步釋放 Undo 空間。當(dāng)一個 Undo 頁上的所有記錄都被清理后這個頁就可以被回收。對于獨(dú)立 Undo 表空間當(dāng)達(dá)大文件縮容條件時還會觸發(fā)在線截斷truncate把表空間物理文件縮小釋放磁盤空間。可以看到Purge 實(shí)際上承擔(dān)了兩種看似相反的工作它既要刪除 Insert Undo 對應(yīng)的記錄也要修復(fù) Update Undo 的版本鏈。理解這兩類清理動作的差異有助于分析 Purge 延遲時數(shù)據(jù)庫表現(xiàn)出的具體癥狀。8.3 Purge 延遲的常見原因與影響在實(shí)際運(yùn)維中Purge 延遲是一個高頻問題。所謂 Purge 延遲是指產(chǎn)生 Undo Log 的速度超過了 Purge 清理的速度導(dǎo)致 Undo 空間持續(xù)增長、版本鏈越來越長。造成 Purge 延遲的常見原因包括存在長時間未提交或長時間存活的只讀事務(wù)其舊 ReadView 卡住了可清理邊界導(dǎo)致大量 Undo 無法清理。大量熱行被高頻更新版本鏈過長。雖然單個版本鏈的追溯是計數(shù)的但過長鏈條會明顯拖慢一致性讀的性能。Purge 線程數(shù)量不足或負(fù)載過高。默認(rèn) 4 個 Purge 線程在面對高寫入壓力時可能成為瓶頸。二級索引多、數(shù)據(jù)量大導(dǎo)致 Purge 清理索引條目成本高。磁盤 I/O 能力不足Purge 批量讀寫遭受到瓶頸。Purge 延遲帶來的影響是多方面的磁盤空間被 Undo 表空間占用一致讀需要回溯更長的版本鏈查詢變慢數(shù)據(jù)庫運(yùn)行一段時間后整體性能下降。因此監(jiān)控 Purge 延遲應(yīng)當(dāng)是 DBA 日常巡檢的重要組成部分。九、Undo Log 與 Redo Log、Binlog 的協(xié)同單獨(dú)看 Undo Log 已經(jīng)足夠復(fù)雜而它真正發(fā)揮作用時往往是和 Redo Log、Binlog 協(xié)同工作的。把這三者的關(guān)系梳理清楚有助于建立完整的 InnoDB 日志認(rèn)知。9.1 一次 UPDATE 語句的完整日志旅程以一條簡單的 UPDATE 語句為例看看它在 InnoDB 內(nèi)部的日志流轉(zhuǎn)過程UPDATE users SET balance balance - 100 WHERE id 888;假設(shè)這條語句在一個顯式事務(wù)中執(zhí)行以下是簡化后的一次執(zhí)行流程第一步定位并加鎖。InnoDB 根據(jù)主鍵找到目標(biāo)行加上排他鎖讀取當(dāng)前行版本。第二步寫入 Undo Log。在內(nèi)存中構(gòu)造該行的舊值生成一條 Update Undo 記錄并把它寫入回滾段中的 Undo 頁。同時更新行記錄的 DB_ROLL_PTR 指向這條 Undo 記錄。寫入 Undo 頁的過程中還會同步生成相應(yīng)的 Redo Log以保護(hù) Undo 頁的持久性。第三步修改數(shù)據(jù)頁并寫 Redo Log。修改數(shù)據(jù)頁內(nèi)存中的行記錄隨后把數(shù)據(jù)頁的物理變更寫入 Redo Log。此時數(shù)據(jù)頁在內(nèi)存中的新版本尚未刷盤但 Redo Log 記錄了所有必要的物理信息。第四步事務(wù)提交。提交時觸發(fā) Redo Log 的刷盤。對于開啟 Binlog 的場景提交階段還會先寫 Binlog再執(zhí)行 InnoDB 的兩階段提交確保兩者一致。第五步Post-commit 處理。事務(wù)提交后其 Undo 記錄進(jìn)入待 Purge 狀態(tài)。Insert Undo 可立即清理候選Update Undo 則等待所有相關(guān)舊 ReadView 結(jié)束后由 Purge 清理。從這條鏈路可以清晰地看出Undo Log、Redo Log 與 Binlog 各司其職Undo Log 負(fù)責(zé)提供舊版本、支撐回滾與 MVCCRedo Log 負(fù)責(zé)崩潰時重放物理修改Binlog 負(fù)責(zé)歸檔、復(fù)制與基于時間點(diǎn)的恢復(fù)。它們在事務(wù)的各個階段緊密銜接共同保證了 ACID 與高可用能力。9.2 崩潰恢復(fù)中的協(xié)作崩潰恢復(fù)Crash Recovery時InnoDB 的日志協(xié)作表現(xiàn)得最為集中。數(shù)據(jù)庫異常宕機(jī)后的啟動過程大致如下掃描 Redo Log重放其中所有已記錄但可能未落盤的物理修改使數(shù)據(jù)頁恢復(fù)到崩潰時刻的狀態(tài)。掃描 Undo Log識別出崩潰時所有尚未提交的事務(wù)。對這些未提交事務(wù)執(zhí)行回滾撤銷它們在數(shù)據(jù)頁上的修改并清理相關(guān)鎖與狀態(tài)。對已經(jīng)提交但尚未完成 Purge 的事務(wù)恢復(fù) Purge 邊界信息交由后臺線程繼續(xù)清理 Undo。從這個過程可以看出「先 redo、后 undo」的順序是保證數(shù)據(jù)正確的關(guān)鍵。如果順序顛倒先回滾再重放就可能導(dǎo)致已提交事務(wù)的修改被錯誤地撤銷或者未提交事務(wù)的修改殘留下來。InnoDB 通過對 Redo Log 和 Undo Log 的精確順序控制保證了無論何時崩潰數(shù)據(jù)庫都能在重啟后收斂到一個一致狀態(tài)。十、Undo Log 的監(jiān)控與診斷對開發(fā)者而言理解原理固然重要但在生產(chǎn)環(huán)境中能夠快速定位 Undo Log 相關(guān)的問題往往更有實(shí)際價值。本節(jié)介紹一些常用的監(jiān)控指標(biāo)、系統(tǒng)視圖與診斷方法。10.1 關(guān)鍵監(jiān)控指標(biāo)以下指標(biāo)可以幫助我們判斷 Undo Log 與 Purge 的健康狀況History list length當(dāng)前尚未被 Purge 的 Undo 記錄數(shù)量。這個值越高說明 Undo 積壓越嚴(yán)重通常也意味著版本鏈越長。Undo 表空間大小觀察文件是否持續(xù)膨脹以及是否出現(xiàn)無法截斷的情況。Purge 線程繁忙度通過SHOW ENGINE INNODB STATUS查看 Purge 是否持續(xù)處于忙碌狀態(tài)。長事務(wù)數(shù)量與時長長時間存活的事務(wù)是卡住 Purge 的主要元兇。其中 History list length 是最直觀的指標(biāo)通常可以通過以下查詢在 information_schema 中獲取SHOW ENGINE INNODB STATUS\G該命令輸出的 TRANSACTIONS 段中會包含類似如下的信息History list length 287451當(dāng) History list length 持續(xù)增長且長時間不下降時就應(yīng)該立即排查是否有長事務(wù)存在。10.2 定位長事務(wù)排查長事務(wù)最常用的系統(tǒng)表是information_schema.innodb_trx。通過該表可以查看當(dāng)前所有活動事務(wù)的開始時間、事務(wù)狀態(tài)、執(zhí)行的 SQL 等信息。例如下面的查詢可以按事務(wù)開始時間排序找出運(yùn)行時間最長的幾個事務(wù)SELECT trx_id, trx_state, trx_started, TIMESTAMPDIFF(SECOND, trx_started, NOW()) AS duration_seconds, trx_mysql_thread_id, trx_query FROM information_schema.innodb_trx ORDER BY trx_started ASC LIMIT 10;如果查到的某個事務(wù)只執(zhí)行了普通 SELECT 卻長時間不結(jié)束它可能持有舊 ReadView正在卡住 Purge。雖然普通 SELECT 不加行鎖但它對一致性讀的依賴會直接影響 Undo 的清理邊界。這類事務(wù)需要與應(yīng)用側(cè)配合及時發(fā)現(xiàn)并結(jié)束無意義的長時間連接。10.3 查看 Undo 表空間狀態(tài)在 MySQL 8.0 中可以通過information_schema.innodb_tablespaces查看 Undo 表空間的狀態(tài)信息。與文件系統(tǒng)層面觀測文件大小結(jié)合可以判斷某個 Undo 表空間是否處于活躍截斷狀態(tài)、是否出現(xiàn)異常膨脹。另外SHOW STATUS LIKE Innodb_%中的若干計數(shù)器也值得關(guān)注例如與 Undo 相關(guān)的回滾段使用情況、Purge 處理批次數(shù)等。雖然單個計數(shù)器不能直接定位問題但把它們與 History list length、磁盤空間、事務(wù)時長等指標(biāo)結(jié)合起來能夠形成相當(dāng)清晰的診斷圖景。十一、Undo Log 相關(guān)的性能優(yōu)化實(shí)踐理解原理與診斷方法之后本節(jié)聚焦于優(yōu)化實(shí)踐。優(yōu)化 Undo Log 相關(guān)性能目標(biāo)通常有兩個一是減少 Undo Log 對磁盤空間和 I/O 的壓力二是避免長版本鏈拖慢一致性讀。11.1 合理設(shè)置 Undo 表空間在部署階段就應(yīng)該為 Undo 表空間預(yù)留合理的容量。如果一個實(shí)例的寫入壓力很大默認(rèn)的兩個 1GB 上限表空間可能很快會被撐滿并頻繁觸發(fā)截斷。此時可以提前創(chuàng)建多個 Undo 表空間并適當(dāng)調(diào)大innodb_max_undo_log_size。不過調(diào)大上限并不意味著可以無限放任 Undo 生長Promote 及時清理才是根本。關(guān)于硬盤類型強(qiáng)烈建議將 Undo 表空間存放在高 IOPS 的 NVMe SSD 上。由于 Undo 的寫入是隨機(jī)的、高頻的且 Purge 也會產(chǎn)生隨機(jī)讀與寫機(jī)械硬盤很容易成為整個系統(tǒng)吞吐的瓶頸。如果條件允許把 Undo 表空間與數(shù)據(jù)文件、Redo Log 分開部署可以進(jìn)一步降低 I/O 爭用。11.2 控制事務(wù)粒度與時長長事務(wù)是 Undo 膨脹、Purge 卡住、版本鏈過長的最常見根因。優(yōu)化 Undo 相關(guān)性能首要任務(wù)就是縮短事務(wù)時長、控制事務(wù)粒度??梢詮囊韵聨讉€方面入手避免在事務(wù)中執(zhí)行耗時的業(yè)務(wù)邏輯、遠(yuǎn)程調(diào)用、用戶交互等操作。大批量數(shù)據(jù)變更時根據(jù)業(yè)務(wù)容忍度合理拆分事務(wù)例如每處理 1000 行提交一次。對只讀查詢及時關(guān)閉連接或提交事務(wù)避免舊 ReadView 長時間駐留。使用監(jiān)控告警手段自動發(fā)現(xiàn)并終止超過閾值的長事務(wù)。事務(wù)越短產(chǎn)生 Undo 后能被 Purge 掉的速度就越快版本鏈也越短一致性讀的代價就越小。11.3 調(diào)整 Purge 并發(fā)度在寫入壓力較高的場景下適當(dāng)增加 Purge 線程數(shù)量可以提升清理速度。參數(shù)innodb_purge_threads默認(rèn)是 4最大可設(shè)置為 32。需要注意的是并不是 Purge 線程越多越好。Purge 線程增多會消耗更多 CPU 和 I/O如果系統(tǒng)資源本身緊張反而可能影響前臺業(yè)務(wù)。建議結(jié)合實(shí)際負(fù)載通過觀察 History list length 的變化趨勢來逐步調(diào)整。此外innodb_purge_batch_size控制每批從歷史鏈中讀取的 Undo 頁數(shù)量。默認(rèn) 300 對大多數(shù)場景是合理的。只有在確認(rèn) Purge 明顯跟不上寫入、且 I/O 能力足夠時才考慮適當(dāng)調(diào)大該值。11.4 避免不必要的海量 DML某些業(yè)務(wù)模式天然會產(chǎn)生大量 Undo例如高頻對同一批行做無差別更新、大量整表刪除后重新插入等。如果能從業(yè)務(wù)層面減少不必要的 DML往往比任何參數(shù)調(diào)優(yōu)都更有效。例如對于整表數(shù)據(jù)重算優(yōu)先考慮批量重建而非逐行 UPDATE。對于需要清空表數(shù)據(jù)的場景在條件允許時使用TRUNCATE代替DELETE。TRUNCATE 在 InnoDB 中是 DDL 操作通過重建表空間釋放空間不會產(chǎn)生大量行級 Undo因此效率遠(yuǎn)高于逐行 DELETE。合理利用「插入后更新」的批處理策略減少重復(fù)修改同一行的次數(shù)。11.5 定期處理歷史表對于歷史數(shù)據(jù)歸檔而言如果每次都通過在事務(wù)里大量 DELETE 來清理過期數(shù)據(jù)會長時間占用 Undo 空間并產(chǎn)生沉重的 Purge 負(fù)擔(dān)。更優(yōu)的做法是按分區(qū)進(jìn)行歸檔刪除或者采用分區(qū)交換、備份后 TRUNCATE 分區(qū)等方式以更小的 Undo 代價完成大范圍數(shù)據(jù)清理。綜合而言Undo 相關(guān)性能優(yōu)化的核心思想可以歸納為一句話讓 Undo 記錄盡快變得不再被需要并讓 Purge 有能力及時把它們清走。一切參數(shù)調(diào)整都應(yīng)圍繞這個目標(biāo)展開。十二、常見誤區(qū)與疑難問題解惑在對 Undo Log 有了系統(tǒng)和深入的了解之后再來審視一些常見誤區(qū)會更有體會。本節(jié)挑選了若干開發(fā)者與 DBA 經(jīng)常問到的問題逐一進(jìn)行分析和澄清。12.1 「Undo Log 在磁盤上回滾是不是從磁盤讀取日志」不完全是。Undo Log 所在頁也同普通數(shù)據(jù)頁一樣遵循 InnoDB 的緩沖池Buffer Pool管理機(jī)制。事務(wù)執(zhí)行時Undo 記錄首先寫入內(nèi)存中的 Undo 頁再由后臺刷盤機(jī)制異步落盤?;貪L時優(yōu)先從緩沖池讀取相關(guān) Undo 頁若頁已被淘汰則從磁盤讀入內(nèi)存。因此回滾的代價并不等同于每次都觸發(fā)磁盤讀緩沖池的命中率會顯著影響回滾性能。這也是為什么內(nèi)存配置不足、緩沖池頻繁換出時回滾可能變得很慢。12.2 「Undo Log 越大回滾越快」恰恰相反。Undo 記錄越多、版本鏈越長回滾與一致性讀的代價通常越高。對于回滾而言一個執(zhí)行了大量操作的事務(wù)其回滾需要逐條撤銷所有操作工作量和操作數(shù)量成正比。對于一致性讀而言版本鏈越長回溯的成本越高。因此從性能角度看應(yīng)盡量讓 Undo 保持精簡而不是追求「大」。不過對于 Purge 遲遲無法推進(jìn)、Undo 大量積壓的情況磁盤空間足夠大確實(shí)能避免事務(wù)因空間不足而失敗。所以準(zhǔn)確的說法是需要為 Undo 預(yù)留充足空間以避免運(yùn)行故障但持續(xù)的 Undo 膨脹本身是性能隱患信號。12.3 「DELETE 刪除的數(shù)據(jù)馬上就不占空間了嗎」不是。DELETE 只是把數(shù)據(jù)標(biāo)記為刪除并在 Undo 中寫入一條 Update Undo 記錄。真正把數(shù)據(jù)從物理上清理掉的動作由 Purge 完成后才發(fā)生對于頁內(nèi)已刪除的行可能還要等頁整理或重建才最終釋放。因此DELETE 之后表空間文件通常不會立刻變小這是正?,F(xiàn)象。除非使用 TRUNCATE 或在線重建表等手段否則表空間大小不會因?yàn)?DELETE 而立即收縮。12.4 「READ COMMITTED 就不需要 MVCC 了嗎」需要而且同樣依賴 Undo Log。讀已提交只是每次快照讀都生成新 ReadView而不是放棄使用一致性讀。它仍然需要通過版本鏈找到滿足 ReadView 可見性的歷史版本。只不過由于每次讀都刷新視圖舊版本被需要的時間窗口更短Purge 可以更積極地清理。從 Undo 清理角度看讀已提交通常比可重復(fù)讀更「輕快」。12.5 「關(guān)閉 Binlog 后 Undo Log 就不再需要了」錯誤。Binlog 與 Undo Log 是兩個獨(dú)立體系前者位于服務(wù)層后者位于 InnoDB 存儲引擎層。即使關(guān)閉 BinlogInnoDB 仍然需要 Undo Log 來保證事務(wù)回滾與 MVCC兩者沒有替代關(guān)系。關(guān)閉 Binlog 只會影響復(fù)制、歸檔與時間點(diǎn)恢復(fù)能力并不會讓 InnoDB 的事務(wù)機(jī)制退化。12.6 「History list length 為 0 就代表沒有 Undo 了」History list length 為 0 說明當(dāng)前沒有尚未清理的已提交事務(wù)的 Undo 記錄但這不代表 Undo 表空間文件大小為 0。因?yàn)轫撁娴姆峙渑c回收是批量進(jìn)行的即使所有記錄都已清理已分配的 Undo 頁也可能尚未被釋放或表空間尚未截斷。表空間大小的下降通常滯后于 History list length 的下降。十三、實(shí)戰(zhàn)案例一次典型的長事務(wù)導(dǎo)致的 Undo 膨脹為了把這些知識串起來本節(jié)通過一個虛構(gòu)但貼近真實(shí)場景的案例完整演示一次 Undo 膨脹的發(fā)現(xiàn)、分析與處理過程。13.1 現(xiàn)象某業(yè)務(wù)數(shù)據(jù)庫出現(xiàn)響應(yīng)變慢監(jiān)控顯示查詢延遲升高同時磁盤使用率在短時間內(nèi)從 40% 快速上升到 80%。DBA 登錄實(shí)例后執(zhí)行SHOW ENGINE INNODB STATUS發(fā)現(xiàn)如下關(guān)鍵信息History list length 1520367 ... Trx id counter 2090123 Purge done for trxs n:o 1980345 undo n:o 0History list length 已經(jīng)超過 150 萬說明有大量 Undo 記錄積壓未被清理。同時磁盤空間告急初步判斷為 Undo 表空間膨脹所致。13.2 分析進(jìn)一步查詢information_schema.innodb_trx發(fā)現(xiàn)存在一個已經(jīng)運(yùn)行超過 2000 秒的事務(wù)它的trx_state為 RUNNINGtrx_query顯示為一個簡單的 SELECT 查詢SELECT * FROM orders WHERE status PENDING;這個事務(wù)本身并沒有修改大量數(shù)據(jù)但它長時間沒有提交一直持有一個舊的 ReadView。與此同時業(yè)務(wù)側(cè)有大量的訂單狀態(tài)更新在持續(xù)提交。由于這些更新發(fā)生在該舊 ReadView 之后它們對應(yīng)的 Undo 記錄無法被 Purge因?yàn)槟莻€長時間存活的只讀事務(wù)「理論上」還需要看到更新前的舊版本。于是大量 Undo 被卡住History list length 持續(xù)上漲。13.3 定位與處理DBA 通過trx_mysql_thread_id關(guān)聯(lián)到進(jìn)程列表找到了這個長事務(wù)對應(yīng)的應(yīng)用連接。經(jīng)過與應(yīng)用方確認(rèn)該連接源自一個忘記顯式提交或關(guān)閉的 ORM 會話。處理方式如下立即通過KILL結(jié)束該連接使舊 ReadView 失效解除 Purge 的阻塞。觀察 History list length確認(rèn)它開始下降。排查應(yīng)用側(cè)的連接管理修復(fù)「查詢后不提交、連接長期掛起」的問題。增加針對事務(wù)「運(yùn)行時間超過閾值」的監(jiān)控告警防止類似問題再次發(fā)生。13.4 后續(xù)優(yōu)化在解決本次故障后團(tuán)隊(duì)還采取了如下長期優(yōu)化措施將只讀查詢從寫事務(wù)鏈路中剝離盡量使用自動提交模式對于必須保持開啟的事務(wù)嚴(yán)格縮短其生命周期。完善長事務(wù)監(jiān)控與自動告警將閾值設(shè)置為 30 秒。根據(jù)業(yè)務(wù)寫入量評估 Undo 表空間容量適當(dāng)增加 Undo 表空間數(shù)量并調(diào)整innodb_max_undo_log_size。定期演練磁盤空間不足的應(yīng)急預(yù)案包括使用在線 Undo 表空間截斷、清理歷史分區(qū)數(shù)據(jù)等手段。這個案例雖然簡單卻完整覆蓋了「識別癥狀、分析指標(biāo)、定位根因、執(zhí)行處置、長期加固」的故障處理閉環(huán)。它提醒我們很多所謂的 Undo 問題根源并不在 Undo Log 本身而在事務(wù)的生命周期管理。十四、Undo Log 的未來演進(jìn)與最佳實(shí)踐總結(jié)任何技術(shù)都不是一成不變的。了解 Undo Log 的現(xiàn)狀與演進(jìn)方向有助于在面對未來版本升級時做出更從容的判斷。14.1 版本演進(jìn)回顧回顧 Undo Log 的版本演進(jìn)可以看到一條清晰的趨勢從共享走向獨(dú)立從不可收縮走向在線管理從經(jīng)驗(yàn)調(diào)優(yōu)走向可觀測、可控制的精細(xì)化運(yùn)維。MySQL 5.5 及以前Undo 存放在系統(tǒng)表空間管理粗糙。MySQL 5.6開始支持獨(dú)立的 Undo 表空間但存在若干限制。MySQL 5.7進(jìn)一步增強(qiáng)了 Undo 表空間的數(shù)量控制與在線截斷能力。MySQL 8.0獨(dú)立 Undo 表空間全面成熟支持動態(tài)創(chuàng)建、刪除、標(biāo)記不活躍和在線 shrink回滾段數(shù)量默認(rèn)提升至 128Purge 可配置性增強(qiáng)。14.2 最佳實(shí)踐清單結(jié)合全篇內(nèi)容這里給出一份可操作的 Undo Log 最佳實(shí)踐清單供開發(fā)與運(yùn)維人員參考部署階段使用 MySQL 8.0 的獨(dú)立 Undo 表空間將 Undo 目錄放在高性能 SSD 上根據(jù)寫入負(fù)載預(yù)留空間合理設(shè)置innodb_max_undo_log_size。開發(fā)階段嚴(yán)格控制事務(wù)粒度與時長避免在事務(wù)中執(zhí)行遠(yuǎn)程調(diào)用和慢業(yè)務(wù)邏輯對大批量 DML 采取分批提交策略能用 TRUNCATE 就不用 DELETE 清理整表。運(yùn)維階段監(jiān)控 History list length、Undo 表空間文件大小、長事務(wù)時長和磁盤使用率設(shè)置閾值告警定期檢查information_schema.innodb_trx。優(yōu)化階段當(dāng)發(fā)現(xiàn) Purge 延遲時先排查長事務(wù)源頭再評估是否需要增加 Purge 線程避免盲目調(diào)大innodb_purge_batch_size關(guān)注低效 DML 的業(yè)務(wù)優(yōu)化。容量規(guī)劃將 Undo 空間納入容量模型預(yù)留至少能容納「最長可能事務(wù)窗口內(nèi)產(chǎn)生的最大 Undo 量」的空間并預(yù)留足夠的剩余磁盤空間。14.3 結(jié)語如果把 MySQL 比作一臺精密的機(jī)器那么 Undo Log 就是這臺機(jī)器中那一組看似不起眼卻至關(guān)重要的逆轉(zhuǎn)齒輪。它讓已經(jīng)發(fā)生的數(shù)據(jù)修改可以安全地被撤銷讓尚未開始的讀事務(wù)可以穩(wěn)定地看到過去也讓不同生命周期的事務(wù)得以在同一套存儲結(jié)構(gòu)上和諧共處。真正理解了 Undo Log才能理解事務(wù)回滾為什么可靠理解 MVCC 為什么高效也才能在生產(chǎn)環(huán)境中對性能與容量做出更準(zhǔn)確地判斷。本文從概念、存儲、結(jié)構(gòu)、回滾、MVCC、Purge、日志協(xié)同、監(jiān)控、優(yōu)化、疑難問題和實(shí)戰(zhàn)案例等多個維度對 MySQL InnoDB 的 Undo Log 進(jìn)行了系統(tǒng)而深入的解析。希望讀者能夠?qū)⑦@些知識轉(zhuǎn)化為實(shí)際的開發(fā)規(guī)范與運(yùn)維策略在日常工作中少走彎路更從容地應(yīng)對與事務(wù)和并發(fā)相關(guān)的各類挑戰(zhàn)。技術(shù)海洋廣闊Undo Log 只是其中一塊磚石。但它所體現(xiàn)的「用可控的冗余換取可靠的回退與并發(fā)能力」這一思想貫穿于幾乎所有現(xiàn)代數(shù)據(jù)庫與分布式系統(tǒng)的設(shè)計之中。愿每一位讀到這里的同行都能透過這塊磚石看見更廣闊的工程之美。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
人人操人人摸超碰| 老熟女乱子伦中文字幕一区二区| 绯色一区二区三区不卡少妇| 亚洲经典啪啪| 精品国产AV一区天美传媒| 性爱乱伦网址| 国产精品农村妇女| 久久综合女优| 色婷婷丁香五月| 午夜欧美精品久久久| 欧洲Au麻豆| 啪啪啪精品| 综合九九| 国产精品经典一卡久久久| 久久永久无码人妻视频| 蜜臀Av一区二区三区| 日本综合久久| av无线看| 风月影院十八禁| 99xav| 亚洲影视综合网| 亚洲一区中文精品| 日韩欧美蜜桃精品久久中文字幕久久| 久久精品一区| 人人操人人uiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii | 免费看日本操逼视频| 国内精品久9| 一级啊性爱在线视频| 岛国黄片网站| 黑人性暴力毛片| 日日狠狠久久偷偷色综合免费| 大香蕉99999| 国产欧美后入| 亚洲日韩青青草色月| 一块操欧美性爱| 激情综合网五月婷婷五月天| 欧美综合天天| 毛片99-全集电影手机免费观看完整-B029AV | 91伊人| av情色影音| 一本一道vs波多野结衣| av网站国产主播在线| 精品乱码在线观看| 天天日天天干天天整| 成人小电影网站tex| 亚洲97网站| 亚洲综合113页| www.av在线视频| 黄色一区二区秘书性感| 日韩无码一区二区三区| 男人的午夜天堂| 欧美精品庄| 熟妇视频一区二区三区在线| 日本ZZ高免费A级视频| 凹凸 69堂 在线播放| 91久久国产综合精品| 国产一级片| 久草免费福利在线播放| 粉嫩av在线一区二区| 欧美夜色| 91在线精品一区二区三区| 中文字幕、久久精品国产2020、久久综合久久自在自线精品自、亚洲 | 久久一区二区高清免费| 男人高清无码一区二区| 女人精品内射国产99| 亚洲色天堂九9| 亚洲欧美首页| 精品人妻1区| 密臀视频三区免费网站| 人妻干天天| 色97干| 日韩有码 一区二区三区| 秋霞一集毛片观看| 国产精品国产自产高清AV| 成人免费性爱视视| 四虎AV在线观看| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 精品国产一区探花在线观看| 狠狠色狠狠色狠狠五月| 999岛国大片| 99这里只有精品| 人人澡综合涩| 天天综合网AV91| 国内精品嫩模A∨私拍小视频| 国产精品大香蕉| 亚欧毛片基地国产毛片基地| 午夜男女爽爽爽在线视频 | 国产日韩精品一区二区三区| 亚洲风情在线观看| 日韩丝袜二区| 少妇高潮喷水无套久久久久久| 又摸又舔在线观看网站| 国产精品农村妇女| 精品一区二区亚洲国产| 五月香婷婷| 2019天天操天天爽天天拍| 夜夜操夜夜高潮夜夜爽国产精品区| 亚洲天天更新| 操操啪| 一二三四视频在线社区中文字幕| 婷婷爽人人婷婷爽视频| 午夜αv| 中国亚洲呦女专区| 91爱欧美| 97精品免费| 99青青草国产视频| 91美女视频在线观看| 国产中文字幕曰本毛片| 亚洲精品一二三四区| 精品综合久久久久久97| 日本三级一区二区 在线| 日韩性爱电影一区 | 日本操逼视频在线| 婷婷久草一区二区三区| 人人妻人人色| 国产后入式在线观看| 国产成年女人免费视频播放a| 麻豆国产尤物AV| 欧美少妇高潮视频| 99re久久| 女优大全 - 91n| 99操99| 亚洲女优有码无码高清| 操操啪| 国产一区二区精品久久久不卡蜜臀| 亚洲一卡2卡3卡4卡乱码网站 | 亚洲一二三精品久久网 | 夜夜天天噜狠狠爱2021| 另类图片亚洲加勒比另类图片亚洲加勒比另类图片亚洲加勒比 | 99久久久久久亚洲精品不卡| 精品高清一区二区三区三州| 神马午夜久久久| 少妇久久久久久| 精品人妻一区二区三区-国产| 日欧毛片久久| 懂色av色欲av蜜臀av| 欧美一区二区日韩传媒搭讪精品| 黑人狂躁日本妞一区二区三区| 丰满精品人妻少妇久久字幕| 亚洲黄色a级片| 婷婷丁香人妻| 蜜臀AV成人精品蜜臀AV久久| 一本久道在线综合视频| 亚洲好色人妻| 色哟哟-国产专区| {男男暴菊gay无套网站| 亚洲资源一区| 日韩婷婷| 亚洲学生妹高清av| 中亚精品极乱| 无人区高清电影免费观看一区二区三 www.qmcai2.com | 天天综合精品| 伊人宅男大香蕉| 色五月婷婷久久| 精品人妻一区二区三区在| 欧美大香蕉在线观看| 日本性爱欧美性爱| 中国91AV| 日日夜夜青青草母狗| 亚洲天堂性爱| 91天堂色男人的天堂| 校园春色美腿丝袜| 九九热精品| 国产97视频| 国产美女激情| 色色无码| 去干网最新版| AV和黑人在线播放| 麻豆91熟妇人妻中文字幕茄子| 男人的天堂2018.| 乱伦日本色图AⅤ| 91精品国产91久久福利| 丝袜美腿av女优在线| 我中文字幕6区| 亚洲二区精品在线观看| 97视频在线播放| 啊啊啊要高潮了| 亚洲色图91欧美日韩| 91亚洲精品青草| a'v在线资源| 精品无码产区一区二| 无码91| 四虎免费在线观看| 亚洲欧美校园| 久久宗合97| 久久鲁夜| 嗯嗯嗯嗯啊啊啊好紧好大| 日韩性爱小视频在线观看| 中国国产精品一区视频| 欧美激情综合| 99re欧美| 91视频女生| 日韩欧美被操黄免费观看| 亚洲九九夜夜| 狠狠激情综合狠狠操中文字幕| 亚洲啪啪视频免费| 射久久| 人人澡人人澡人人| 韩国国产欧美情侣视频在线| 色欲色香天天天综合网www-亚洲综合国| 极品极品色影院| 日本高清_区二区三区| 日韩无码一级黄色av片| 91精品国产一区三一| 超碰午夜| 久久久久921| 中文字幕女同在线| 黄色一区三区| 影音资源男人日韩| 蜜臀aV午夜一区二区三区| 亚州色站 日韩电影| 蜜臀国产AV中文字幕| 热久久这里只有精品| 国产激情片在线观看| 天堂中文日本在线观看| 国产福利小视频高清在线观看| 亚洲图片色图欧美另类| 福利色色| 日本色婷婷| 120分钟婬片免费看| 98福利在线视频| 超碰精品| 欧美一品道| 劲爆欧美人妖三区91| 屌妞视频久久久久久久| 亚洲在钱| 97视频在线| 久久久久久九九九| 草草草视频在线免费看| 亚洲欧美综合区自拍另类| 国产理论视频在线播放| 久久草在线综合视频| 色哟哟511老熟女| 五月天综合在线| 综合网欧美在线| 亚州操操穴网| 欧美人人天天网| 97精品视频在线播放| 久久精品成人| 少妇综合| 在线无码操| 五月丁香综合| 91亚洲欧美综合高清在线| 狠狠干婷婷| 久久亚洲av成人无码国产| 99精品在线| 七久久久| 人妻精品4K4K4K4K4| 东北老女人的激情视频| 乱操9999| a片在线播放| 91丨熟女丨丰满熟女| 婷婷91| 国产日韩精品一区二区三区| www.成人无码| 国产成人欧美一区二区三区的国产| 亚洲av影院在线观看| 裸体美女国产免费久久久网站| 丝袜天堂| 国产色综合亚洲色综合吹潮| 久9热| 色婷婷综合久久中文字幕雪峰 | 老熟女综合| av天堂精品久久| 日本三级黄页| 欧美第五页| 亚洲日韩视频二区| 色综合美国| 精品视频一区二区| 黄色一区二区秘书性感| 狠狠热这里都是精品| 日韩在线观看AV| 日韩黄色av中文字幕| 国产欧美一区激情交| 精品久久大胆人体| 午夜性生活av免费在线看| 视频分类 国内精品| 国产精品自拍xxxx| 熟女一区二区| 欧美激情激情xxxx欧美专区| 97精品综合久久| 亚洲精品97中文字幕| 天天日天天干天天操| 久久久麻豆精品| 久久久久亚洲精品| 五月丁香激情四射| 婷婷五月天网| 亚洲色阁| 精品无码一区二区| 天天日天天干天天操| 国产精品天干天干综合网麻豆 | www.AV有限公司一区| 97国产综合欧美| 久久综合国产精品国产| 亚熟在线| 亚洲一区二区三区播放在线| 欧美曰韩国产精品| A级毛片在线看免费| 日韩精品.久久精品.AV女优.天美传媒| 中日高清无码操逼视频| 懂色av中文字幕| 一级啊性爱在线视频| 中国熟女网站| 国产精品一级特黄aaa大片在线观看| 国内操逼视频二区| 人人干黄色| 爱爱动态试试看6 0秒| 亚洲成a人v欧美综合天堂下载 | 蜜臀久久99精品久久久久久成人小说| 欧美一区二区亚洲天堂| 中文字幕黄色一起草| 色5月婷婷| 深爱伊人影院| 久久手机好看网站| 国产一区二区免费福利片| 日韩内射视频| 中文字幕一区电影在线观看| 亚洲情色 无码专区| 国产情侣自拍在线播放| 欧美激情专区| 欧美成人综合| 久久丁香五月天| 亚洲图片激情小说| 五十路熟女工口| 亚洲精品啪视频| 久久99干一本高清| 麻豆精品久久久久久久| 亚洲精品国产熟女久久久久久| 久久久久9999精品九九九| 国产精品久久久久久 百度| 精品人妻15区| A啊啊在线观看| 日韩精品中文字幕一| 亚洲综合在线91| 中文字幕在线观看AV| 亚洲成人一区二区精品| 综合亚洲欧美| 91性感网站| 免费一级视频特黄色大片| 欧美天天弄| 亚洲淫乱骚妇AV| 日韩一区二区高清在线观看的| 91色欧美| 日韩少妇无吗| 97综合在线观看| 伊人黄色视频免费观看| 美日韩男女操屄视频| 玖玖超碰熟| 啊好大好舒服| 免费啪啪啪网站18岁| 国产精品懂色tv影视免费观看| 久久妇| 91在线免费观看处女| 最近2019中文字幕国语免费版| 97狠狠| 1.igao73.com 加入收藏 免费专区 国产精品 中文字幕 日韩精品 欧美精品 精彩 | 美日韩男女操屄视频| 任你干在线视频| 九色97| 熟女人妻一区二区三区| 人人操欧美风骚| 91男人综合| 国产精品熟女九九九| 91五月天| 久久9视频| 逼逼逼逼操操操操操操操操操午夜剧场 | 4141514逼喷水三级片| 亚洲AV性爱电影| 五月丁香六月综合缴清无码 | 欧美日韩岛国大片在线观看| 影音先锋少妇| 自拍偷拍国产欧美日韩韩| 不卡视频一区蜜桃视频| 欧美午夜熟妇黑人精品91| 四虎在线免费视频| 91丝袜美腿片| 成年人黄色| 97精品综合久久网| 1234区中文字幕在线观看_青青草国产在线_日韩一区二区 | 日韩乱插| 伦伦成年午夜免费视频| 高清有码一区二区| 天天综合亚洲综合| 最新无码国产| 午夜国产综合视频在线观看| 欧美一二三级精品在线| 欧美精品23| 国产亚洲精品美女久久久久久2021| 看日韩黄片| 91日韩| 农村女一级毛卡片| 日韩性爱一级片| 思思视频免费看网站| 国产精品内射婷婷一级二| 少妇综合| 91c色| 国产女性无套 免费观看| 天堂无码精品国产久| 可以在线观看AV的网站| 一区二区三区精品久久| 97精品综合久久| 中文伊人大香蕉视频| 久久久久熟女| 999 久久久| 久久妇| 九九人妻| 欧美激情专区| 91在线超高颜值国产| 99久久亚洲精品无码毛片潘甜甜| 天天天天天天天天天天干美女| 男人天堂免费| 精品久久久久瑟瑟| 久99热| 天天操夜夜操狠很操| 精品99999| 欧美色图99| 99蜜桃臀久久久欧美精品网站| 亚洲熟妇综合久久久久久| 91岛国动作片| 美女的肌被草喷水视频| 精品亚洲国产成人AV制服丝袜| 日日玩天天干| 午夜久久一区二区无码中出| 亚州欧美色图| 五月天婷婷成人网| 久久网亚洲| 国产特级毛片AAAAAA高潮流水 | 亚洲熟女乱色一区二区三区久久久 | 国产AV激情无码久久无码 | 久久视频,这里只有精品| 久偷拍| 久超碰在| 成人精品久久| 蜜桃臀 后入 一区 二区 三区 在线| 色老汉色| 欧美啪啪啪91| av在线人气| 色香阁在线| 330Dv国产女人终合视频极品人与兽 | 久久超碰com| 熟人人妻少妇精品久久| 欧美色干| 国产美女裸体秘 永久无遮挡| 69天堂| 国产成年女人免费视频播放a| 国产精品嫩草久久久久| 男人的天堂一区三区| 色蜜AV| 久久人妻无码毛片A片麻豆| 97在线观看视频| 一区AV| 亚洲午夜av| 啊啊啊啊啊好大好舒服想要| 2003天天干夜夜操| 欧美一级黄色免费专区| 天天看,天天做| 欧美日韩人人早| 亚洲熟女综合一区二区| 女人被男人桶爽视频网站| 亚欧精品久久久久久久久久久| 情色五月天久久久| 日韩在线国产字幕| 日本女人操逼| 欧美日韩97在线| 国产JDAV无码视频在线观看| 久热99| 亚洲不卡一| a v网站在线播放| 亚洲 欧美 另类 日韩 人妻一区| 操逼操逼操| 日韩另类色图| 精品69网| 欧美熟妇视频| 亚洲开心网| 99re6久热只有精品6在线直播| 日日嗷| 99综合视频一体| 天天天天干| 国产在线观看一区二区三区| 国内精品伊人久久久久影院会| 欧美色图亚洲色图成人在在线| 超碰这里有精品| 91精品人妻偷情| 日韩AV无码网站| 欧美同性恋 的搜索结果 - 91n| 色香欲天天天天综合色| 青操影院| 不卡日本一区二区| 久草电影网| 狠狠干综合| 久久婷婷亚洲欧| 国产成人bd在线观看| 夜夜性| 美女主播色欲91抠b在线播放| 九九综合网| 成人日本视频人妻在线| 国产熟女完整版中字 | 欧美 亚洲 制服 精品| 中文字幕在线观看丝袜| h4610国产人妻| 99久热精品99re6热| 人人手机欧洲亚洲国产人妻| 男人天堂站| 午夜精品久久久久久久| 污电影在线观看| 国产真实子伦对白| 日韩无码a片| 另类视频在线| 美女91网| 日韩AV无码中文一区二区| 婷婷伊人五月| 岛国毛片在线观看免费| 91热热色| 午夜视频久久久久一区| 亚洲久久天堂| 麻豆天美在线喷水AV| 韩日男人的天堂| 亚洲丝袜色| 无遮挡h肉动漫在线观看| 欧美 精品国产制服第一页| 91N综合网| 九九久久国产精品怡红院| 九九九九九用不成了| 欧洲射精91| 大香蕉伊人亚洲| 亚洲日本成人动漫| 插入综合网| 五月丁香久久| 亚洲精品丝袜-不卡成人免费……| 国产av又色又爽又黄| 久久精品中文字幕观看| 黄色香蕉视频网站一区| 成人自拍三级在线观看| 91国产操逼视频| 日韩免费福利在线观看| 国产精品免费1区2区视频| 精品无码秘 人妻一区二区 | 色网色网色网色网色网色| 99999久久精| 综合久久2017| 内射夫妻三片| 日本 色 导航| 午夜大香蕉| www.狠狠干.coom| 亚洲天堂自拍| 蜜乳av一区二区三区四区不卡| 人人妻天天做天天爽| 99久久免费看精品国产一区| AV女优男人的天堂| 福利视频香蕉免费一区二区在线| 亚洲欧洲综合成人av一区| 国产日韩在线播放| 黄页18禁| 超碰到97情色| 国产亚洲深夜激情| 操逼逼无码| 夜夜高潮夜夜爽高清视频一 | 好吊色一区| 欧美激情 一区| 后入福利| 超碰97国产欧美| 亚洲区小说| 丰满欧美放荡少妇在线| 成人区人妻精品一| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 一区二区三区成人| 日本操BAV| 亚洲精品一区二区三区新线路| 嗯……啊…嗯嗯…啊…好舒服| 极品销魂美女一区二区 | 91欧美丨精品丨入口| 黄色在线网站| 精品人妻一区二区三区不卡断| 啊啊啊好大好湿| 天无日色综合| 91爱| 性老妇一区二区三区| 精品人妻一二三| 中文字幕在线播放2中文字幕在线观看2| 精品97久久综合| 97综合| 亚洲五码一区二区三区| 欧美18 在线观看| 久久精品91| 久久久久13| 六月激情婷婷| 欧美 亚洲 制服 精品| 黄色AV影视| 欧美性爱另类综合| 欧美在线观看综合国产| 亚洲密乳AV| 欧美v亚洲v综合v国产v妖精| 国产农村妇女精品| 人妻少妇精品视频一区二区三区| 91女人的网站| 偷拍 亚洲 欧美| 欧美综合色站| 中文字暮97| 韩日欧亚a级| 综合五月婷婷| 99婷婷一区二区| 97自拍一区| 女人喷水视频在线观看| 日韩欧美三级| 色婷婷婷五月天激情四射| 久久人人爽爽人人爽人人片αV| 成人精品水蜜桃久久久久久久| 亚洲黑丝在线| 性爱网站一区二区| 国产激情在线| 国产少妇高潮| 男人的天堂成人的社区| 欧美强奸乱能| 久久性生大片免费观看性| 91在线丝袜视频| 久久久啊啊| 激情久久av一区av二区av| 国产午夜精品在线观看| 久99在线免费观看视频| 日本99一区二区| 91人人看| 九九无码| 欧美日韩性爱操大逼| 免费无码国产精品v片在线观看| 97久久国产精品女不卡| 一本色道熟妇| 99热99re6国产在线播放| 免费网站观看www在线观| 男人兔费天堂| 亚洲中文字幕av| 国产福利精品最新在线| 草草影院最新网址| 天天做天天爱夜夜爽毛片试看| 久夜视频| A 天堂| 国产在线激情视频| 强奸乱伦 亚洲一区| 色吧5亚洲| 欧美片第一页| 日本一级婬片试看三分钟| 99久久精品无码一区二区毛片免费| 新亚洲无码| 久久丁香久草综合网| AV在线性爱| 欧美日韩操逼动图| 色婷久久| 欧美日韩99精品麻豆传媒| 99精品丰满人妻无| 国产自偷| 色黄污美女啪啪啪免费网站| 97热视频在线观看| 欧美久久九九| 亚洲AV无码黄色强奸| 免费a v| 97精品视频在线播放| 蜜臀久久99精品久久久老,,| 日本媚薬中文字幕在线| 国产热RE99久久6国产精品首| 好爽要喷了| 精品中文字幕一区二区l - 百度| 97ai亚洲| 国产男女无套97| 九七超碰人人乐| 夜夜久久久| 久伊人网78| 久久久久免费看少妇A片特黄| 欧美夜夜骑视频| 国产精品久久久久久夜夜夜| 国产成人午夜视频网址| 韩日性爱av| 少妇毛片久久| 人人操人人操人妻人| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 肥臀熟女福利视频一区二区| 国产三级多多影院2022国产AA一级毛片无码 | 91情色| 熟妇人妻一区二区三区| 国产亚州精品美女久久久免费| 精品人妻一区二区三区不卡断 | 一级片在线观看高清无码| 人妻丰满熟妇av无码区蜜桃| 日本一区二区三区四区五区六区七区八区九区| 天堂伊人久久| 少妇熟女视频一区二区三区| 东京热不卡视频| 久肏视频字幕| 亚洲无码超碰免费| 人妻系列无码专区中文有码| 91人人看| 久草免费在线视频| 涩涩这里只有精品视频| 黄页大片在线观看| 怡春院久久| 性影在线视频| 色999偷自拍拍| 人人操人人肉久久精品| 另类 日韩 熟女| 99国产精品免费| 欧美日韩大香蕉| 久久五月份| 九九热只有精品| 天天做日日爱夜夜爽| 麻豆国产成人精品| 日韩无码视频黄色| 欧美第38页| 亚洲久久久久| 精品视频123区小说区| 蜜臀久久99精品久久久久久| 免费黄色片子| 亚洲97超碰| 久都青青视频| 2023天天操夜夜操| 日日干夜夜操视频h| 呦呦影院| 啊啊啊啊啊啊啊啊要喷了| 日韩精品色呦呦| 91黑丝操| 精品久热| 岛国黄片网站| 九色 蝌蚪 熟女自| 麻豆国产尤物AV| 成人线上超碰| 色色色色色色色色综合| 99色综合| 国产成人亚洲精品无码最新在线| 亚洲最大的黄色电影网站。| 国产网红精品| 一本大道青青| 青青草视频在线观看一区二区| 欧美一级久久久久久久大片动画| 欧美线天码中字| 美女露胸露奶头| 干婷婷综合网| 日本黄大片在线观看视频| 久污| 伊人大香蕉在线| 99久久e免费热视| 亚洲一级黄色毛片| 色97综合中文字幕| 曰本精品久久久| 依人大香蕉| 国产福利小视频高清在线观看| 欧美78P| 操淫穴亚洲五月丁香| 精品91摸| 97精品国产97久久久久久免费| 日欧亚洲二三区大片不卡| 久久久久久9| 床戏久久久av一区二区麻豆| 97bbn| 男人网站婷婷| 性性欧美| 久久国产精品熟女人妻| 97视频在线观看播放与子乱对白在线……| 日本性爱少妇| 人人操人人摸人| 强奸乱伦大香蕉| 精品成人亚洲午夜电影| 日本色色视频网站| 中文字幕一区二区三区四区在线视频| 97视频在线看| 草草电影院| 欧美一级A一级a爱片久久| 97久久国产精品女不卡| 999热这里只有精品| 99国产女人| 欧美中文综合| 欧美v亚洲v综合v国产v妖精| 日本久久女同性恋视频| 国产精品嫩草影院午夜两性| 亚瑟国产精品久久无码| 人妻81p| 日韩婷婷| 男人的天堂啪啪啪啪啪蜜桃不卡| 九色97| 极品后入免费视频| 91精品少妇搡搡搡| 精品天堂| 久操网无码在线| 精品一区二区三区蜜桃臀赵总 | 美国日韩黄色片| 日韩人妻资源网| 抽插爽| 熟妇人妻丰满久久久久久久无码| 亚洲婷婷丁香在线| 国产女人极品高潮毛片| 啊灬啊灬啊灬好深灬快高潮了动漫-国产字幕国产在线观看-B049AV | 凹凸视频在线观看伊人| 国产偷仑| 亚洲熟女人妻中文字幕一区二区| 久久内射| 91操人视频| 亚洲综合伊人| 日本高清免费一本视频在线观看| 99热国产| 97伊人超碰| 欧美性爱三区二区| 日韩伦理视频| 九九九九热| 亚洲第一综合| 偷拍视频青青草在线视频| 亚洲熟女性高潮久久久| 禁十八久久| 亚洲视频中文一区| 久操九九九九| 亚洲色图欧美色图另类图片| 91丨九色丨大屁股| 一区二区三区一亚洲中文字幕、综合区灬 | 国产精品点击进入在线影院| 激情五月丁香五月| 亚洲第二页| 91色久| 欧美中文字幕精品人妻| 最新欧洲欧美日本激情网站| 欧美天堂在线| 69超碰综合| 国产精品麻豆成人av| 91偷拍欧美亚洲| 欧美91视频| 91中文字幕在线观看| 中日高清无码操逼视频| 97天天日| 又大又长又粗又爽又黄| 久久久久密臀一区二区| 大香网站| 91制服丝袜中文字幕| 97国伦国色| 午夜福利免费福利视频| 欧美激情1区| 精品国产72| 人人色人人操在线| a网站免费观看| 国产野战露脸在线播放| 涩涩久久精品| 精品人妻二区三区| 顶级丝袜熟女一区二区三区| 久久啊啊| 农村少妇久久久久久久| 玖玖草久草99蜜月一区二区三区| 91国产操逼视频| 熟女人妻一区二区三区免费看 | 美国aaaaa一级黄片| 少妇一区二区三区在线观看| 九九操久久国产免费视频| 熟妇最新先锋一二三区| 亚洲第一精品在线视频 | 青春草A| 91色久| 狠日操| 97九色| 操熟女91| 熟女少妇一区二区三区| 欧美日韩美女精品久草一区二区三区| 欧洲无码一区二区| 久草福利在线资源站| 午夜福利免费福利视频| 亚洲av噜噜噜噜噜噜| 色九色久| 久久九操在线观看| 人人手机欧洲亚洲国产人妻| 大香蕉人妻| 亚洲熟女乱色| 97精品国产97久久久久久免费| 国产三级多多影院2022国产AA一级毛片无码| 友优传媒精品在线一区二区| 人妻激情在线视频| 超碰这里只有精品| 97视频在线观看高清资源| 久久综合乱子伦国产免费| 激激五月| www.一本大99| 97在线欧洲| 三上制服丝AV| 黑人与人妻| 国产精品高朝久久久久久久| 十八禁电影伊人网| 怡红院网站在线视频| 国内精品久9| 青青草依人大香蕉| 78精品| 精品人妻一区二区三区在| 亚洲一区中文精品| 日韩99精品视频综合区| 综合欧美日韩在线观看| 日本天天色| 亚洲一区二区三区麻豆传媒| 91 亚洲情侣偷拍 久久| 五十路熟女人妻一区二区在线观看 | 艹精品| 色香色欲天天综合网天天来吧| 园内精品自拍视频在线播放| 精品亚洲国产成人AV制服丝袜| 青青草天天亲夜夜操网| 久久久9品一区二区三区| 欧美色一二三| 加勒比中文av| 国语精品内射在线观看| 亚洲人成色9999精品久久 | 一本色道无码DVD中文字幕| 影音先锋新男人| www.色婷婷色综合| 午夜啊啊啊| 国产精品人妻无码久久久互動交流 | 亚洲色性情三级| 无码二级三级| 日韩中文字幕视频在线观看| 国精综合一二三区影视| 肥佬影院91| 热九九精品| 少妇九九九九| 国产女人操逼视频| 97精品视频网站| 国产福利电影| 啊啊啊啊啊啊啊国| 精品久久久一本一道| av激情亚洲五月天| 五月综合色| 青青草影视蜜久久| 清纯唯美激情| 九九久久九九久久| 欧美自拍网| 强奸乱伦αv片| 少妇人妻激情四射| 五月天婷精品激情| 肉动漫无遮挡h在线观看| 女人的久久久| 麻豆视频国产一区二区| 久久久久久大| 亚洲精品国产熟女| 大香蕉欧美日韩| 日本羞羞的视频在线播放| 1区2区3区中文字幕日韩| 中文字幕天堂在线| Av色五月| 精品九九国产无码| 久久一二三四五六七八九区区| 嫩草在线视频| 国产精品第一页国产大屁股视频免费区i| 91爆操视频| 九九热精品| xxx亚洲午夜天堂| 人人看欧美性爱| 熟妇激情| 好淫网一二三视区| 俺去俺来也在线www| 99re6在线视频精品免费完整版安卓版| 东亚亚洲无码高清| 97色综合中文网| 欧美成人亚洲精品| 99热66| 国产中文字幕在线点播| 午夜一区| 日韩中文9| 熟女自慰久久久| 丁香六月婷| 国产AV久久久蜜爱影集| 强奸乱伦AV一天堂网| 亚91亚洲网| 日本人体九九九九九九| 国产综合网站在线播放 | 天天插天天干| 女人午夜视频777| 亚洲图片日本AⅤ欧美在线| 91欧美情色| 无码免费一区二区三区啪啪| 欧美精品一区二区少妇免费A片| 99在线精品视频| 狠久久| 青草地一本线一区二区三区| 97欧美久久久久久久| 玖色av| 中文字幕av一区二区三区人妻少妇 | 麻豆60秒| 97色色视频| 一线黄色免费性爱片| 亚洲另类小说卡通动漫| 国产无码高清操逼视频| 一级婬片120分钟试看| 久久国产AⅤ| 日韩不卡毛片Av免费高清| 国产精品无码久久久久2025| 激情黄色片在线观看| 国产婷婷综合在线观看| 一区二区三区美女超清| 最新国产精品| 八人操人人摸人人看| 熟女突然公开看18禁影片| 黑丝少妇| 看黑丝美女操逼青青网站| 色女女女导航| 国产风韵犹存熟妇三区| 啊啊啊在线看| 国产捆绑一区| 久久av一级av少妇av高潮| 久久精品国产亚洲AV清纯| 白丝被操91| 色久桃花影院在线观看| 国产精品九9| 超碰碰小说97| 日韩三级在线观看网站| 国产精品久久久久av| 啊啊啊啊啊啊啊国| 天天操天天舔| 成人麻豆av电影网站| 久久精彩视频9| 欧美色图97| 日本熟女不卡视频| 九九热在线视频| 大香蕉综合| 超碰在线人人射| 亚洲欧美日韩综合在线尤物 | 欧美综合在线91| 亚洲欧洲av影音| 99超碰色| 欧美高清18A片| 狠狠操狠狠| 操一操摸一摸| 天天日日夜夜| 欧美成人精品欧美一级乱黄一区二…| av网页一区二区三区| 大香蕉伊在线久草麻豆天堂故事| 另类亚洲一区二区三区| 人妻嗯啊啊在线播放| 大鸡巴久久| 亚洲五月丁香花狠狠干一区二区三区| 亚洲欧美激情小说| 免费AV播放| 香蕉视频精品亚洲一区二区三区在线播| 在线观看AV片| 九九操久久国产免费视频| 久久久久婷婷| 国产99999| 在线97在线| 亚洲日韩精品一区视频在线| 超碰偷拍| 开心五月激情网| 99久久久无码国产精品性啊聊 | 日本久久999| 777奇米影视777四色| 国产精品久久久亚洲第一牛牛_在线观看| 国产乱伦一二三区| 久久精品一区二区三区四区五区| 东北黄色电影| 一区二区三区机械有限公司| 老熟妇91| 一区二区三区四区在线不卡| 九九色热| 国产女人高潮嗷嗷嗷叫小说 | 日韩丝袜人妻AV| av网页一区二区三区| 丰满少妇一区二区三区免费看| 99综合自拍| 日本欧美国内在线| 日韩免费在线视频观看| 97精品一区| 91人妻Pr| 岛国视频免费在线观看| 精品九区| 婷婷性网| 一区二区三区一亚洲中文字幕、综合区灬 | 天天透伊人| 日本黄 R色 成 人网站| 伊人操你| av网站免费看| 久久线上视频免费看| 伊人久久婷婷| 久热超碰| 99热这里都是精品| 91碰碰| 91在线色综合| 欧美超碰9798| 久久本道| 91亚洲黑人| 亚洲午夜免费狠狠干| 午夜偷拍久久熟女| 欧美日韩小说| 九九碰九九爱97超| 999热日韩精品| 一级一性爱免费视频| 美女骚尻视频| 国产在线激情| av毛片aaaaa免费看| 尤物黄色在线观看网站| 风流老熟女一区二区三区l| 在线无码操| 伊人影院中文字幕| 九九久久久九九| 欧美一品道| 亚洲一区二区AV| 色欲三区| 国产精品麻豆免费视频| 天天躁日日躁AAAXX| 狠狠久久亚洲欧美专区| 久久精品中文字幕观看| 99精品在线| 欧美最大综合网| 亚洲人体视频在线观看| 丁香色婷婷| AV色五月| 91在线限制级| 亚春色色| 久久久久久大| 日本一区二区不卡| 婷婷精品国产一区二区三区日韩| 国产中文字幕曰本毛片| 国产400孕妇孕交群| 伦在线97| 久久久久亚洲av综合波多野制衣| 国产精品点击进入在线影院| 中文字幕青青草| 久久久97| 中文字幕亚洲永久精品| 久久日本熟妇熟色一区| 国产乱子伦一区二区三区免看| 九九碰九九爱97| 性色av网站| 久草加勒比一区在线| 亚洲码和欧洲精品激情系列| 999岛国大片| 人妻丰满熟妇一区二区三| 97欧美综合| 女人天堂网| 国产熟妇一区二区| 色综合中文字幕不卡| 六月婷婷五月丁香| 日va操| a一区二区三区乱码在线| 国产无码成人无码| 曰韩少妇无码| 久热久一区二区三区| 一本久道久久综合狠狠爱| 在线中文字幕极品av| 亚洲综合另类小说色区亚洲成av人片在www | 成人黑料社久久| 偷拍精品一区二区三区| 天天干夜夜肏| 好屌色综合| 蜜臀在线免费观看在线免费观看| 国产人妻精品久久久一区二区三区 | 久久久国产av美女私房| 亚洲风情在线观看| 日韩一卡二卡三卡| 蜜臀av网址| 天天操狠狠日夜夜干超大胆开放com大香蕉视频在线观看 | 天美传媒精品一区二区| 玖玖综合视频| 久久精品无码熟妇一区二区三区视频导航 | 91 亚欧| 大干人妻| 亚洲欧美中日韩| 欧美极品少妇交| 天堂av2019| 亚洲有薄码区日本系列中文字幕| 天天日天天色| 亚洲高清在线| 嗯嗯啊在线视频| 亚洲国男人的天堂| 操人妻少妇中文| 欧美国产日韩清纯唯美| 亚洲中文制服诱惑|