最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解MySQL 重做日志(redo log)與回滾日志(undo logo)

 更新時間:2020年08月30日 11:56:05   作者:MySQL技術(shù)  
這篇文章主要介紹了MySQL redo與undo日志的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)MySQL,感興趣的朋友可以了解下

前言:

前面文章講述了 MySQL 系統(tǒng)中常見的幾種日志,其實還有事務(wù)相關(guān)日志 redo log 和 undo log 沒有介紹。相對于其他幾種日志而言, redo log 和 undo log 是更加神秘,難以觀測的。本篇文章將主要介紹這兩類事務(wù)日志的作用及運維方法。

1.重做日志(redo log)

我們都知道,事務(wù)的四大特性里面有一個是 持久性 ,具體來說就是只要事務(wù)提交成功,那么對數(shù)據(jù)庫做的修改就被永久保存下來了,不可能因為任何原因再回到原來的狀態(tài)。那么 MySQL 是如何保證一致性的呢?最簡單的做法是在每次事務(wù)提交的時候,將該事務(wù)涉及修改的數(shù)據(jù)頁全部刷新到磁盤中。但是這么做會有嚴重的性能問題,主要體現(xiàn)在兩個方面:

  • 因為 Innodb 是以頁為單位進行磁盤交互的,而一個事務(wù)很可能只修改一個數(shù)據(jù)頁里面的幾個字節(jié),這個時候?qū)⑼暾臄?shù)據(jù)頁刷到磁盤的話,太浪費資源了。
  • 一個事務(wù)可能涉及修改多個數(shù)據(jù)頁,并且這些數(shù)據(jù)頁在物理上并不連續(xù),使用隨機 IO 寫入性能太差。

因此 MySQL 設(shè)計了 redo log ,具體來說就是只記錄事務(wù)對數(shù)據(jù)頁做了哪些修改,這樣就能完美地解決性能問題了(相對而言文件更小并且是順序IO)。

redo log 包括兩部分:一個是內(nèi)存中的日志緩沖(redo log buffer),另一個是磁盤上的日志文件(redo log file)。MySQL 每執(zhí)行一條 DML 語句,先將記錄寫入 redo log buffer ,后續(xù)某個時間點再一次性將多個操作記錄寫到 redo log file 。

默認情況下,redo log 在磁盤上由名為 ib_logfile0 和 ib_logfile1 的兩個物理文件展示。redo log 相關(guān)參數(shù)簡單介紹如下:

  • innodb_log_files_in_group:redo log 文件的個數(shù),命名方式如:ib_logfile0,iblogfile1... iblogfilen。默認2個,最大100個。
  • innodb_log_file_size:單個 redo log 文件設(shè)置大小,默認值為 48M,最大值為512G,注意最大值指的是整個 redo log 系列文件之和,即(innodb_log_files_in_group * innodb_log_file_size )不能大于最大值512G。
  • innodb_log_group_home_dir:指定 redo log 文件組所在的路徑,默認./ ,表示在數(shù)據(jù)庫的數(shù)據(jù)目錄下。
  • innodb_log_buffer_size:redo log buffer 大小,默認16M。延遲事務(wù)日志寫入磁盤,把 redo log 放到該緩沖區(qū),然后根據(jù) innodb_flush_log_at_trx_commit 參數(shù)的設(shè)置,再把日志從 buffer 中 flush 到磁盤中。
  • innodb_flush_log_at_trx_commit:控制 redo log 刷新到磁盤的策略,默認為1。值為1,每次 commit 都會把 redo log 從 redo log buffer 寫入到 system ,并 fsync 刷新到磁盤文件中。值為2,每次事務(wù)提交時 MySQL 會把日志從 redo log buffer 寫入到 system ,但只寫入到 file system buffer,由系統(tǒng)內(nèi)部來 fsync 到磁盤文件。如果數(shù)據(jù)庫實例 crash ,不會丟失 redo log,但是如果服務(wù)器 crash,由于 file system buffer 還來不及 fsync 到磁盤文件,所以會丟失這一部分的數(shù)據(jù)。值為0,表示事務(wù)提交時不進行寫入 redo log 操作,這個操作僅在 master thread 中完成,而在 master thread 中每1秒進行一次重做日志的 fsync 操作,因此實例 crash 最多丟失1秒鐘內(nèi)的事務(wù)。

更改 redo log 及其 buffer 大小是需要重啟數(shù)據(jù)庫實例的,建議初始化時做好評估??梢赃m當(dāng)加大 redo log 組數(shù)和大小,特別是你的數(shù)據(jù)庫實例更新比較頻繁的情況下。但也不推薦 redo log 設(shè)置過大。

2.回滾日志(undo log)

undo log 主要用于保證數(shù)據(jù)的原子性,保存了事務(wù)發(fā)生之前的數(shù)據(jù)的一個版本,可以用于回滾。比如一條 INSERT 語句,對應(yīng)一條 DELETE 的 undo log ,對于每個 UPDATE 語句,對應(yīng)一條相反的 UPDATE 的 undo log ,這樣在發(fā)生錯誤時,就能回滾到事務(wù)之前的數(shù)據(jù)狀態(tài)。同時,undo log 也是 MVCC (多版本并發(fā)控制) 實現(xiàn)的關(guān)鍵。

MySQL 5.7 版本中,undo log 默認存放在共享表空間 ibdata 中。也可以在初始化時通過配置參數(shù)改成獨立的文件,簡單介紹幾個 undo log 相關(guān)參數(shù):

  • innodb_max_undo_log_size:控制最大 undo tablespace 文件的大小,當(dāng)啟動了innodb_undo_log_truncate 時,undo tablespace 超過 innodb_max_undo_log_size 閥值時才會去嘗試truncate。該值默認大小為1G,truncate后的大小默認為10M。
  • innodb_undo_tablespaces:設(shè)置 undo 獨立表空間個數(shù),范圍為0-128,5.7版本默認為0,0表示不開啟獨立undo表空間。該參數(shù)只能在最開始初始化 MySQL 實例的時候指定。
  • innodb_undo_directory:設(shè)置 undo 表空間的存放目錄,默認數(shù)據(jù)目錄。
  • innodb_undo_log_truncate:設(shè)置 undo 表空間是否自動截斷回收。該參數(shù)生效的前提是,已設(shè)置獨立表空間且獨立表空間個數(shù)大于等于2個。

undo log 相關(guān)參數(shù)一般很少改動。MySQL 8.0 默認啟用了獨立表空間,可能 undo log 表空間的大小設(shè)置更靈活些。

總結(jié):

本篇文章主要介紹了 redo log 及 undo log 的作用和相關(guān)參數(shù)設(shè)置,文章寫的比較匆忙,如有錯誤,可以留言指出。關(guān)于這兩類日志更深層次的內(nèi)容,可能筆者功力還不到,未能寫到更加透徹。好了,MySQL 相關(guān)日志的兩篇文章已經(jīng)寫完了,希望各位能學(xué)到一點知識。

相關(guān)文章

  • Linux安裝Mysql8.0.20并配置主從復(fù)制(一主一從,雙主雙從)

    Linux安裝Mysql8.0.20并配置主從復(fù)制(一主一從,雙主雙從)

    本文主要介紹了Linux安裝Mysql8.0.20并配置主從復(fù)制,包含一主一從和雙主雙從,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-06-06
  • MySQL遞歸CTE案例解析

    MySQL遞歸CTE案例解析

    MySQL 8.0 引入的遞歸CTE(公共表表達式),為層級數(shù)據(jù)查詢提供了簡潔高效的解決方案,本文將從基礎(chǔ)概念出發(fā),逐步深入遞歸CTE的語法、實戰(zhàn)場景、常見問題與優(yōu)化技巧,幫助你徹底掌握這一強大工具,感興趣的朋友跟隨小編一起看看吧
    2025-12-12
  • MySQL數(shù)據(jù)庫表內(nèi)容的增刪查改操作實例詳解

    MySQL數(shù)據(jù)庫表內(nèi)容的增刪查改操作實例詳解

    對于刪除操作來說,是將表單個或者多個數(shù)據(jù)進行刪除,而截斷則是對整個表進行操作,會將整個表數(shù)據(jù)都清除,本文給大家介紹MySQL數(shù)據(jù)庫表內(nèi)容的增刪查改操作大全,感興趣的朋友一起看看吧
    2025-04-04
  • MySQL的主從備份方式(一主一從)

    MySQL的主從備份方式(一主一從)

    這篇文章主要介紹了MySQL的主從備份方式(一主一從),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • MySQL數(shù)據(jù)庫修改密碼以及設(shè)置密碼永過期問題

    MySQL數(shù)據(jù)庫修改密碼以及設(shè)置密碼永過期問題

    這篇文章主要介紹了MySQL數(shù)據(jù)庫修改密碼以及設(shè)置密碼永過期問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • MySQL復(fù)制表結(jié)構(gòu)與數(shù)據(jù)的命令介紹

    MySQL復(fù)制表結(jié)構(gòu)與數(shù)據(jù)的命令介紹

    這篇文章主要介紹了MySQL復(fù)制表結(jié)構(gòu)與數(shù)據(jù)的命令,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-07-07
  • Mac下忘記Mysql的root用戶密碼的解決方法

    Mac下忘記Mysql的root用戶密碼的解決方法

    mac中安裝MySQL時系統(tǒng)會自動為root 賬戶生成一個密碼(改密碼一般為一個不好記的字符串),若自己沒有記住改密碼,這時 mysql 就無法進入了。解決方案是修改root 賬戶的密碼,問題是mysql進不去如何修改,下面就是改問題的解決方法:
    2017-03-03
  • ubuntu下mysql版本升級到5.7

    ubuntu下mysql版本升級到5.7

    這篇文章主要為大家詳細介紹了ubuntu下mysql版本升級到5.7的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • Mysql?查詢患某種疾病的患者語句

    Mysql?查詢患某種疾病的患者語句

    select?語句的作用是根據(jù)輸入的條件返回指定的數(shù)據(jù)結(jié)果,select?的語法可以有很多種查詢的組合,基本上能夠滿足我們所有的查詢數(shù)據(jù)需求,這篇文章主要介紹了Mysql?查詢患某種疾病的患者,需要的朋友可以參考下
    2022-10-10
  • 深入MYSQL中的COLLATE

    深入MYSQL中的COLLATE

    MYSQL COLLATE是用于指定字符集的排序規(guī)則的關(guān)鍵詞,它可以用于在查詢中對字符數(shù)據(jù)進行排序和比較,具有一定的參考價值,感興趣的可以了解一下
    2023-08-08

最新評論

新邵县| 昭苏县| 龙胜| 扎兰屯市| 南投市| 武鸣县| 安多县| 虎林市| 抚顺市| 平湖市| 册亨县| 南开区| 陇西县| 丹东市| 孝义市| 紫云| 东辽县| 邵武市| 若尔盖县| 常德市| 凤翔县| 丰台区| 锡林浩特市| 奎屯市| 买车| 双辽市| 措美县| 会同县| 甘德县| 明水县| 内乡县| 社会| 北京市| 随州市| 郁南县| 安图县| 屏山县| 遂平县| 花莲县| 前郭尔| 霍林郭勒市|