mysql之 redo log

張衝andy發表於2018-08-25

重做日誌(redo log)

前言:之前一直弄不清楚 mysql 裡面 bin log 和 innodb log 檔案的區別,在腦子裡面一直有個疑問 binlog 日誌檔案已經可以用來進行
資料庫的日誌備份恢復了,怎麼又多了一個 redo log 檔案了。相信也有很多人有這個疑惑,現在把整個過程文件整理出來,希望對大家有所幫忙。

如果對 Oracle 很瞭解,那麼在整個學習 innoDB log 的時候,可以把聯
機重做日誌的那套理論套在學習 innoDB log 上面,幾乎是一樣的;


1、innodb log 的基礎知識
innodb log 顧名思義:即 innodb 儲存引擎產生的日誌,也可以稱為
重做日誌檔案,預設在 innodb_data_home_dir 下面有兩個檔案
ib_logfile0 和 ib_logfile1。MySQL 官方手冊中將這兩個檔案叫文
InnoDB 儲存引擎的日誌檔案;

檢視日誌檔案位置:
[root@rh55 ~]# cat /etc/my.cnf
# Uncomment the following if you are using InnoDB tables
#innodb_data_home_dir = /usr/local/mysql/data
#innodb_data_file_path = ibdata1:10M:autoextend
#innodb_log_group_home_dir = /usr/local/mysql/data
# You can set .._buffer_pool_size up to 50 - 80 %
# of RAM but beware of setting memory usage too high
#innodb_buffer_pool_size = 16M
#innodb_additional_mem_pool_size = 2M
# Set .._log_file_size to 25 % of buffer pool size
#innodb_log_file_size = 5M
#innodb_log_buffer_size = 8M
#innodb_flush_log_at_trx_commit = 1
#innodb_lock_wait_timeout = 50
[root@rh55 ~]# cd /usr/local/mysql/data/
[root@rh55 data]# ls -l
total 28732
-rw-rw---- 1 mysql mysql 18874368 Jun 10 16:52 ibdata1
-rw-rw---- 1 mysql mysql 5242880 Jun 10 16:52 ib_logfile0
-rw-rw---- 1 mysql mysql 5242880 Jun 10 16:52 ib_logfile1
drwxr-xr-x 5 mysql mysql 4096 Jun 19 14:12 mysql
drwx------ 2 mysql mysql 4096 Jun 10 16:52
performance_schema
drwxr-xr-x 2 mysql mysql 4096 Jun 10 16:18 test


innodb log 的作用:當 MySQL 的例項和介質失敗的時候,Innodb儲存引擎就會使用 innodb log 檔案進行恢復,保證資料庫的完整性;

innodb log 的寫原理:(請容許我再放下 InnoDB 的原理圖,並且建議把這張圖看到吐)


每個 InnDB 儲存引擎至少有 1 個重做日誌檔案組(group),每個檔案組下至少有兩個重做日誌檔案,預設的為 ib_logfile0、ib_logfile1;
日誌組中每個重做日誌的大小一致,並迴圈使用;

InnoDB 儲存引擎先寫重做日誌檔案,當檔案滿了的時候,會自動切換到日誌檔案 2,當重做日誌檔案 2 也寫滿時,會再切換到重做日
志檔案 1;為了保證安全和效能,請設定每個重做日誌檔案設定映象,並分配到不同的磁碟上面;

(發現以上特性跟 ORACLE 的連線重做日誌檔案簡直是一樣的)


2、innodb log 的相關引數

執行指令碼:show variables like 'innodb%log%'; 檢視重做日誌的相關引數
mysql> show variables like 'innodb%log%';

常用設定的引數有:
innodb_mirrored_log_groups 映象組的數量,預設為 1,沒有映象;
innodb_log_group_home_dir 日誌組所在的路徑,預設為 data 的home 目錄;
innodb_log_files_in_group 日誌組的數量,預設為 2;
innodb_log_file_size 日誌組的大小,預設為 5M;
innodb_log_buffer_size 日誌緩衝池的大小,圖上為 30M

3、引數的相關調優
3.1 重做日誌檔案的大小設定跟 ORACLE 一樣,面臨的問題是相似的。

當 innodb log 設定過大的時候,可能會導致系統崩潰後恢復需要很長的時間;
當 innodb log 設定過小的時候,當一個事務產生大量的日誌的時候,需要多次切換重做日誌檔案,會產生類似如下的報警;
130702 12:53:13 InnoDB: ERROR: the age of the last checkpoint
is 2863217109,
InnoDB: which exceeds the log group capacity 566222311.
InnoDB: If you are using big BLOB or TEXT rows, you must set the
InnoDB: combined size of log files at least 10 times bigger than the


4、重做日誌與二進位制日誌的區別
4.1 記錄的範圍不同:二進位制日誌會記錄 MySQL 的所有儲存引擎的日誌記錄(包括 InnoDB、MyISAM 等),而 InnoDB 儲存引擎的重做日誌只會記錄其本身的事務日誌。
4.2 記錄的內容不同:二進位制日誌檔案記錄的格式可以為STATEMENT 或者 ROW 也可以是 MIXED,其記錄的都是關於一個事務的具體操作內容。
InnoDB 儲存引擎的重做日誌檔案記錄的關於每個頁的更改的物理情況。
4.3 寫入的時間也不同:二進位制日誌檔案是在事務提交前進行記錄的,而在事務進行的過程中,不斷有重做日誌條目被寫入到重做日誌檔案中。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31383567/viewspace-2212831/,如需轉載,請註明出處,否則將追究法律責任。

相關文章