中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

mysql日志文件undo?log和redo?log怎么設置

發布時間:2022-04-15 13:39:46 來源:億速云 閱讀:199 作者:iii 欄目:開發技術

本篇內容主要講解“mysql日志文件undo log和redo log怎么設置”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“mysql日志文件undo log和redo log怎么設置”吧!

    1 undo

    1.1 undo是什么

    undo日志用于存放數據修改被修改前的值,假設修改 tba 表中 id=2的行數據,把Name='B' 修改為Name = 'B2' ,那么undo日志就會用來存放Name='B'的記錄,如果這個修改出現異常,可以使用undo日志來實現回滾操作,保證事務的一致性。

    對數據的變更操作,主要來自 INSERT UPDATE DELETE,而UNDO LOG中分為兩種類型,一種是 INSERT_UNDO(INSERT操作),記錄插入的唯一鍵值;一種是 UPDATE_UNDO(包含UPDATE及DELETE操作),記錄修改的唯一鍵值以及old column記錄。

    IdName
    1A
    2B
    3C
    4

    D

    1.2 undo參數

    MySQL跟undo有關的參數設置有這些:

    mysql> show global variables like '%undo%';
    +--------------------------+------------+
    | Variable_name            | Value      |
    +--------------------------+------------+
    | innodb_max_undo_log_size | 1073741824 |
    | innodb_undo_directory    | ./         |
    | innodb_undo_log_truncate | OFF        |
    | innodb_undo_logs         | 128        |
    | innodb_undo_tablespaces  | 3          |
    +--------------------------+------------+
    
    mysql> show global variables like '%truncate%';
    +--------------------------------------+-------+
    | Variable_name                        | Value |
    +--------------------------------------+-------+
    | innodb_purge_rseg_truncate_frequency | 128   |
    | innodb_undo_log_truncate             | OFF   |
    +--------------------------------------+-------+
    • innodb_max_undo_log_size

        控制最大undo tablespace文件的大小,當啟動了innodb_undo_log_truncate 時,undo tablespace 超過innodb_max_undo_log_size 閥值時才會去嘗試truncate。該值默認大小為1G,truncate后的大小默認為10M。

    • innodb_undo_tablespaces 

    設置undo獨立表空間個數,范圍為0-128, 默認為0,0表示表示不開啟獨立undo表空間 且 undo日志存儲在ibdata文件中。該參數只能在最開始初始化MySQL實例的時候指定,如果實例已創建,這個參數是不能變動的,如果在數據庫配置文 件 .cnf 中指定innodb_undo_tablespaces 的個數大于實例創建時的指定個數,則會啟動失敗,提示該參數設置有誤。

    mysql日志文件undo?log和redo?log怎么設置

    如果設置了該參數為n(n>0),那么就會在undo目錄下創建n個undo文件(undo001,undo002 ...... undo n),每個文件默認大小為10M.

    mysql日志文件undo?log和redo?log怎么設置

    什么時候需要來設置這個參數呢?

    當DB寫壓力較大時,可以設置獨立UNDO表空間,把UNDO LOG從ibdata文件中分離開來,指定 innodb_undo_directory目錄存放,可以制定到高速磁盤上,加快UNDO LOG 的讀寫性能。

    • innodb_undo_log_truncate

    InnoDB的purge線程,根據innodb_undo_log_truncate設置開啟或關閉、innodb_max_undo_log_size的參數值,以及truncate的頻率來進行空間回收和 undo file 的重新初始化。

     該參數生效的前提是,已設置獨立表空間且獨立表空間個數大于等于2個。

    purge線程在truncate undo log file的過程中,需要檢查該文件上是否還有活動事務,如果沒有,需要把該undo log file標記為不可分配,這個時候,undo log 都會記錄到其他文件上,所以至少需要2個獨立表空間文件,才能進行truncate 操作,標注不可分配后,會創建一個獨立的文件undo_<space_id>_trunc.log,記錄現在正在truncate 某個undo log文件,然后開始初始化undo log file到10M,操作結束后,刪除表示truncate動作的 undo_<space_id>_trunc.log 文件,這個文件保證了即使在truncate過程中發生了故障重啟數據庫服務,重啟后,服務發現這個文件,也會繼續完成truncate操作,刪除文件結束后,標識該undo log file可分配。

    • innodb_purge_rseg_truncate_frequency

    用于控制purge回滾段的頻度,默認為128。假設設置為n,則說明,當Innodb Purge操作的協調線程 purge事務128次時,就會觸發一次History purge,檢查當前的undo log 表空間狀態是否會觸發truncate。

    1.3 undo空間管理

    如果需要設置獨立表空間,需要在初始化數據庫實例的時候,指定獨立表空間的數量。

    UNDO內部由多個回滾段組成,即 Rollback segment,一共有128個,保存在ibdata系統表空間中,分別從resg slot0 - resg slot127,每一個resg slot,也就是每一個回滾段,內部由1024個undo segment 組成。

    回滾段(rollback segment)分配如下:

    • slot 0 ,預留給系統表空間;

    • slot 1- 32,預留給臨時表空間,每次數據庫重啟的時候,都會重建臨時表空間;

    • slot33-127,如果有獨立表空間,則預留給UNDO獨立表空間;如果沒有,則預留給系統表空間;

    回滾段中除去32個提供給臨時表事務使用,剩下的 128-32=96個回滾段,可執行 96*1024 個并發事務操作,每個事務占用一個 undo segment slot,注意,如果事務中有臨時表事務,還會在臨時表空間中的 undo segment slot 再占用一個 undo segment slot,即占用2個undo segment slot。如果錯誤日志中有:Cannot find a free slot for an undo log。則說明并發的事務太多了,需要考慮下是否要分流業務。

    回滾段(rollback segment )采用 輪詢調度的方式來分配使用,如果設置了獨立表空間,那么就不會使用系統表空間回滾段中undo segment,而是使用獨立表空間的,同時,如果回顧段正在 Truncate操作,則不分配。

    mysql日志文件undo?log和redo?log怎么設置

    2 redo

    2.1 redo是什么

    當數據庫對數據做修改的時候,需要把數據頁從磁盤讀到buffer pool中,然后在buffer pool中進行修改,那么這個時候buffer pool中的數據頁就與磁盤上的數據頁內容不一致,稱buffer pool的數據頁為dirty page 臟數據,如果這個時候發生非正常的DB服務重啟,那么這些數據還沒在內存,并沒有同步到磁盤文件中(注意,同步到磁盤文件是個隨機IO),也就是會發生數據丟失,如果這個時候,能夠在有一個文件,當buffer pool 中的data page變更結束后,把相應修改記錄記錄到這個文件(注意,記錄日志是順序IO),那么當DB服務發生crash的情況,恢復DB的時候,也可以根據這個文件的記錄內容,重新應用到磁盤文件,數據保持一致。

    這個文件就是redo log ,用于記錄 數據修改后的記錄,順序記錄。它可以帶來這些好處:

    • 當buffer pool中的dirty page 還沒有刷新到磁盤的時候,發生crash,啟動服務后,可通過redo log 找到需要重新刷新到磁盤文件的記錄;

    • buffer pool中的數據直接flush到disk file,是一個隨機IO,效率較差,而把buffer pool中的數據記錄到redo log,是一個順序IO,可以提高事務提交的速度;

    假設修改 tba 表中 id=2的行數據,把Name='B' 修改為Name = 'B2' ,那么redo日志就會用來存放Name='B2'的記錄,如果這個修改在flush 到磁盤文件時出現異常,可以使用redo log實現重做操作,保證事務的持久性。

    IdName
    1A
    2B
    3C
    4

    D

    這里注意下redo log 跟binary log 的區別,redo log 是存儲引擎層產生的,而binary log是數據庫層產生的。假設一個大事務,對tba做10萬行的記錄插入,在這個過程中,一直不斷的往redo log順序記錄,而binary log不會記錄,知道這個事務提交,才會一次寫入到binary log文件中。binary log的記錄格式有3種:row,statement跟mixed,不同格式記錄形式不一樣。

    2.2 redo 參數

    • innodb_log_files_in_group

    redo log 文件的個數,命名方式如:ib_logfile0,iblogfile1... iblogfilen。默認2個,最大100個。

    • innodb_log_file_size

    文件設置大小,默認值為 48M,最大值為512G,注意最大值指的是整個 redo log系列文件之和,即(innodb_log_files_in_group * innodb_log_file_size )不能大于最大值512G。

    • innodb_log_group_home_dir

    文件存放路徑

    • innodb_log_buffer_size

    Redo Log 緩存區,默認8M,可設置1-8M。延遲事務日志寫入磁盤,把redo log 放到該緩沖區,然后根據 innodb_flush_log_at_trx_commit參數的設置,再把日志從buffer 中flush 到磁盤中。

    • innodb_flush_log_at_trx_commit

    • innodb_flush_log_at_trx_commit=1,每次commit都會把redo log從redo log buffer寫入到system,并fsync刷新到磁盤文件中。

    • innodb_flush_log_at_trx_commit=2,每次事務提交時MySQL會把日志從redo log buffer寫入到system,但只寫入到file system buffer,由系統內部來fsync到磁盤文件。如果數據庫實例crash,不會丟失redo log,但是如果服務器crash,由于file system buffer還來不及fsync到磁盤文件,所以會丟失這一部分的數據。

    • innodb_flush_log_at_trx_commit=0,事務發生過程,日志一直激勵在redo log buffer中,跟其他設置一樣,但是在事務提交時,不產生redo 寫操作,而是MySQL內部每秒操作一次,從redo log buffer,把數據寫入到系統中去。如果發生crash,即丟失1s內的事務修改操作。

    • 注意:由于進程調度策略問題,這個“每秒執行一次 flush(刷到磁盤)操作”并不是保證100%的“每秒”。

    mysql日志文件undo?log和redo?log怎么設置

    2.3 redo 空間管理

    Redo log文件以ib_logfile[number]命名,Redo log 以順序的方式寫入文件文件,寫滿時則回溯到第一個文件,進行覆蓋寫。(但在做redo checkpoint時,也會更新第一個日志文件的頭部checkpoint標記,所以嚴格來講也不算順序寫)。

    實際上redo log有兩部分組成:redo log buffer 跟redo log file。buffer pool中把數據修改情況記錄到redo log buffer,出現以下情況,再把redo log刷下到redo log file:

    • Redo log buffer空間不足

    • 事務提交(依賴innodb_flush_log_at_trx_commit參數設置)

    • 后臺線程

    • 做checkpoint

    • 實例shutdown

    • binlog切換

    3 undo及redo如何記錄事務

    3.1 Undo + Redo事務的簡化過程

    假設有A、B兩個數據,值分別為1,2,開始一個事務,事務的操作內容為:把1修改為3,2修改為4,那么實際的記錄如下(簡化):

      A.事務開始.

      B.記錄A=1到undo log.

      C.修改A=3.

      D.記錄A=3到redo log.

      E.記錄B=2到undo log.

      F.修改B=4.

      G.記錄B=4到redo log.

      H.將redo log寫入磁盤。

      I.事務提交

    3.2  IO影響

    Undo + Redo的設計主要考慮的是提升IO性能,增大數據庫吞吐量。可以看出,B D E G H,均是新增操作,但是B D E G 是緩沖到buffer區,只有G是增加了IO操作,為了保證Redo Log能夠有比較好的IO性能,InnoDB 的 Redo Log的設計有以下幾個特點:

      A. 盡量保持Redo Log存儲在一段連續的空間上。因此在系統第一次啟動時就會將日志文件的空間完全分配。 以順序追加的方式記錄Redo Log,通過順序IO來改善性能。

      B. 批量寫入日志。日志并不是直接寫入文件,而是先寫入redo log buffer.當需要將日志刷新到磁盤時 (如事務提交),將許多日志一起寫入磁盤.

      C. 并發的事務共享Redo Log的存儲空間,它們的Redo Log按語句的執行順序,依次交替的記錄在一起,以減少日志占用的空間。例如,Redo Log中的記錄內容可能是這樣的:

         記錄1: <trx1, insert &hellip;>
         記錄2: <trx2, update &hellip;>
         記錄3: <trx1, delete &hellip;>
         記錄4: <trx3, update &hellip;>
         記錄5: <trx2, insert &hellip;>

      D. 因為C的原因,當一個事務將Redo Log寫入磁盤時,也會將其他未提交的事務的日志寫入磁盤。

      E. Redo Log上只進行順序追加的操作,當一個事務需要回滾時,它的Redo Log記錄也不會從Redo Log中刪除掉。

    3.3 恢復

    前面說到未提交的事務和回滾了的事務也會記錄Redo Log,因此在進行恢復時,這些事務要進行特殊的的處理。有2種不同的恢復策略:

      A. 進行恢復時,只重做已經提交了的事務。

      B. 進行恢復時,重做所有事務包括未提交的事務和回滾了的事務。然后通過Undo Log回滾那些

         未提交的事務。

      MySQL數據庫InnoDB存儲引擎使用了B策略, InnoDB存儲引擎中的恢復機制有幾個特點:

      A. 在重做Redo Log時,并不關心事務性。 恢復時,沒有BEGIN,也沒有COMMIT,ROLLBACK的行為。也不關心每個日志是哪個事務的。盡管事務ID等事務相關的內容會記入Redo Log,這些內容只是被當作要操作的數據的一部分。

      B. 使用B策略就必須要將Undo Log持久化,而且必須要在寫Redo Log之前將對應的Undo Log寫入磁盤。Undo和Redo Log的這種關聯,使得持久化變得復雜起來。為了降低復雜度,InnoDB將Undo Log看作數據,因此記錄Undo Log的操作也會記錄到redo log中。這樣undo log就可以象數據一樣緩存起來,而不用在redo log之前寫入磁盤了。

         包含Undo Log操作的Redo Log,看起來是這樣的:
         記錄1: <trx1, Undo log insert <undo_insert &hellip;>>
         記錄2: <trx1, insert &hellip;>
         記錄3: <trx2, Undo log insert <undo_update &hellip;>>
         記錄4: <trx2, update &hellip;>
         記錄5: <trx3, Undo log insert <undo_delete &hellip;>>
         記錄6: <trx3, delete &hellip;>

      C. 到這里,還有一個問題沒有弄清楚。既然Redo沒有事務性,那豈不是會重新執行被回滾了的事務?

         確實是這樣。同時Innodb也會將事務回滾時的操作也記錄到redo log中。回滾操作本質上也是對數據進行修改,因此回滾時對數據的操作也會記錄到Redo Log中。

         一個回滾了的事務的Redo Log,看起來是這樣的:

         記錄1: <trx1, Undo log insert <undo_insert &hellip;>>
         記錄2: <trx1, insert A&hellip;>
         記錄3: <trx1, Undo log insert <undo_update &hellip;>>
         記錄4: <trx1, update B&hellip;>
         記錄5: <trx1, Undo log insert <undo_delete &hellip;>>
         記錄6: <trx1, delete C&hellip;>
         記錄7: <trx1, insert C>
         記錄8: <trx1, update B to old value>

         記錄9: <trx1, delete A>

    一個被回滾了的事務在恢復時的操作就是先redo再undo,因此不會破壞數據的一致性。

    到此,相信大家對“mysql日志文件undo log和redo log怎么設置”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    都安| 黎川县| 灵武市| 淮滨县| 麟游县| 富宁县| 德昌县| 九江市| 乌拉特中旗| 山西省| 正镶白旗| 黔东| 汝阳县| 黄山市| 江川县| 九龙县| 莆田市| 姚安县| 鸡东县| 青州市| 策勒县| 巴林右旗| 银川市| 千阳县| 前郭尔| 沭阳县| 泸水县| 南充市| 乌恰县| 黄陵县| 荔波县| 琼海市| 泾川县| 临西县| 察哈| 万山特区| 宝丰县| 肇源县| 潮安县| 肥城市| 健康|