mysql 日志重做,設置MySQL重做日志大小

什么是InnoDB事務日志

你有沒有在文本編輯器中使用過撤消或重做的功能,想像一下編輯器在那種場景下的操作?我確信你應該使用過。你相信嗎?事務型數據庫有同樣的功能。可能不完全一樣,但原理是相同的。

就像當你編輯文字時始終有能力撤消數步的重要性一樣,重做和撤消功能也對事務型數據一樣重要。為什么呢?

主要有兩個原因:

1.回滾事務(那是撤消)

2.在數據庫崩潰的情況下回放已提交的事務(那是重做)

撤消

當你使用的是事務存儲引擎(假設是InnoDB),你更改一個記錄時,更改並沒有馬上寫入數據文件。

首先,它們被寫入到一個硬盤上特定的文件叫做事務日志。同時,它們也更改了內存 – InnoDB緩沖池。現在新InnoDB頁面包含了已更改的記錄叫臟數據。

被復制到硬盤上特別區域的原始未被更改的頁面叫做回滾段。

如果有人在提交之前使用ROLLBACK中斷了一個事務,撤消操作就發生了 – 你的記錄已經被還原到原始狀態。

由於更改還沒有被寫入到數據文件,這個操作相當簡單 – InnoDB僅僅需要從回滾段中提取舊頁面,從內存中擦除臟頁,並在事務日志中標記那個事務已經回滾。

所以你看,數據文件從沒有被更改,因為在執行隨機寫操作以把臟數據刷新到硬盤之前你已經把所有更改取消了。

重做

當你提交事務,然后InnoDB確認你的提交,更改准備寫入到實際的數據文件。

現在你認為它們會被馬上寫入到硬盤的數據文件,事實上不是這樣的。為什么?因為這樣做效率非常低。反而,更改僅僅被寫入到事務日志(因為是順序寫,速度會很快,稱為重做日志記錄),而更改的記錄仍然在日志中 – InnoDB緩沖池的臟頁,過一定的時間才刷新到硬盤。

這時候MySQL崩潰了!

猜猜MySQL會怎樣做?

如果MySQL(實際上是InnoDB)沒有重做日志,僅僅是保留了臟頁在內存中 – 所有未被刷新到硬盤已提交的事務將會永久丟失。

幸運的是,所以的更改總會寫入到事務日志,

所以InnoDB需要做的就是在重做日志中找到上一次的checkpoint(已同步數據到硬盤的位置),然后重做未同步到硬盤已提交的事務。

日志大小

你可能想知道的一個事就是如何正確設置innodb_log_file_size的大小。 規則很簡單:

小日志文件使寫入速度更慢,崩潰恢復速度更快

大日志文件使寫入更快,崩潰恢復速度更慢

由於事務日志相當於一個寫緩沖,而小日志文件會很快的被寫滿,這時候就需要頻繁地刷新到硬盤,速度就慢了。如果產生大量的寫操作,MySQL可能就不能足夠快地刷新數據,那么寫性能將會降低。

大的日志文件,另一方面,在刷新操作發生之前給你足夠的空間來使用。反過來允許InnoDB填充更多的頁面。

對於崩潰恢復 – 大的重做日志意味着在服務器啟動前更多的數據需要讀取,更多的更改需要重做,這就是為什么崩潰恢復慢了。

重做日志大小

最后,讓我們來談談如何找出重做日志的正確大小。

幸運的是,你不需要費力算出正確的大小,這里有一個經驗法則:

在服務器繁忙期間,檢查重做日志的總大小是否夠寫入1-2小時。

你如何知道InnoDB寫入多少,下面有一個方法:

mysql> pager grep seq

mysql> show engine innodb status\G select sleep(60); show engine innodb status\G

Log sequence number 1777308180429

...

Log sequence number 1777354541591

mysql> nopager

mysql> select (1777354541591-1777308180429)*60/1024/1024;

+--------------------------------------------+

| (1777354541591-1777308180429)*60/1024/1024 |

+--------------------------------------------+

| 2652.80696869 |

+--------------------------------------------+

1 row in set (0.00 sec)

在這個60s的采樣情況下,InnoDB每小時寫入2.6GB數據。所以如果innodb_log_files_in_group沒有更改(默認是2,是InnoDB重復日志的最小數字),然后設置innodb_log_file_size為2560M,那么你實際上兩個日志文件加起來有5GB,夠你寫兩小時數據了。

更改重做日志大小

更改innodb_log_file_size的難易程度和能設置多大取決於你現在使用的MySQL版本。

特別地,如果你使用的是5.6之前的版本,你不能僅僅的更改變量,期望服務器會自動重啟。

好了,下面是步驟:

1.在my.cnf更改innodb_log_file_size

2.停止mysql服務器

3.刪除舊的日志,通過執行命令rm -f /var/lib/mysql/ib_logfile*

4.啟動mysql服務器 – 應該需要比之前長點的時間,因為需要創建新的事務日志。

最后,需要注意的是,有些mysql版本(比如5.6.2)限制了重做日志大小為4GB。所以在你設置innodb_log_file_size為2G或者更多時,請先檢查一下MySQL的版本這方面的限制。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值