MySQL存儲引擎InnDB核心參數

​大家好,我是anyux。本文介紹MySQL存儲引擎InnDB核心參數。

MySQL存儲引擎InnDB核心參數

參數名稱參數值(默認)作用defalut_storage_engineinnodb設置存儲引擎innodb_file_per_table1是否開啟獨立表空間(1開啟,0關閉)innodb_data_file_pathibdata1:512M:ibdata2:512M:autoextend共享表空間文件個數和大小innodb_flush_log_at_trx_commit1在事務提交時,從內存向磁盤刷寫redo日誌innodb_flush_methodfsync控制著innodb數據文件及redo log的打開、刷寫模式innodb_log_buffer_size16777216確保有足夠大的日誌緩衝區來保存髒數據在被寫入到日誌文件,單位字節innodb_log_file_size50331648該參數決定著mysql事務日誌文件(ib_logfile0)的大小,單位字節innodb_log_files_in_group3控制日誌文件數innodb_log_files_pages_pct75髒頁刷寫策略

innodb_flush_log_at_trx_commit參數解釋

查看參數

<code> select @@innodb_flush_log_at_trx_commit;/<code>

默認為1

innodb_flush_log_at_trx_commit控制的是redo向磁盤刷寫的策略

在瞭解innodb_flush_log_at_trx_commit參數之前,需要了解MySQL服務的整體架構

MySQL具有專門的內存結構,下層有OS buffer,就是文件系統緩存,最後是disk磁盤

redo日誌是在事務發生變化,在數據頁發生變化時,在MySQL的redo buffer中生成redo信息,當commit提交時,就會讀取innodb_flush_log_at_trx_commit參數值。首先它會刷寫到OS buffer中,然後再寫到磁盤文件中。

MySQL先把自身的內存日誌寫入到文件系統層緩存中,再從文件系統層寫入到磁盤中。這是基本的邏輯

MySQL存儲引擎InnDB核心參數

當innodb_flush_log_at_trx_commit=1時,處理過程是怎麼樣的呢

每次執行事務,提交commit時,會立即將MySQL內存的中的數據寫入到文件系統緩存中,文件系統立即將緩存寫入到磁盤中。直到確實將數據寫入到磁盤中,commit命令才算執行成功。當值為1時,數據寫入很安全,保證了數據入庫的安全性

MySQL存儲引擎InnDB核心參數

當innodb_flush_log_at_trx_commit=0時,處理過程是怎麼樣的呢

每秒鐘將數據寫入到磁盤中。每秒會發生很多事務,如果此時斷電有可能丟失1秒內所有事務。因為它在1秒內未將數據寫入到磁盤中

MySQL存儲引擎InnDB核心參數

當innodb_flush_log_at_trx_commit=2時,處理過程是怎麼樣的呢

每次事務提交時,只保證寫入到文件系統緩存中,然後每秒寫入磁盤中

MySQL存儲引擎InnDB核心參數

注意:最安全參數值為1時,會最大限度的保證數據寫入的完全性。對於數據安全性要求高的參數值設置為1.對於一些不重要的數據,參數值設置為0或2都可以,原因是可以減少大量的磁盤I/O。具體值可以根據公司業務調整


<code> The default setting of 1 is required for full ACID compliance. Logs are written and flushed to disk at each transaction commit.
 默認設置為1是完全符合ACID要求的。每次事務提交時,日誌都會寫入並刷新到磁盤。
 
 With a setting of 0, logs are written and flushed to disk once per second. Transactions for which logs have not been flushed can be lost in a crash.
 設置為0時,每秒將日誌寫入並刷新到磁盤一次。未刷新日誌的事務可能在崩潰中丟失。
 
 With a setting of 2, logs are written after each transaction commit and flushed to disk once per second. Transactions for which logs have not been flushed can be lost in a crash.
 設置為2時,每次事務提交後都會寫入日誌,並每秒刷新一次到磁盤。未刷新日誌的事務可能在崩潰中丟失。/<code>


面對SBR和RBR如何選擇呢?

SBR:原樣記錄sql語句,可讀性強,對於範圍操作,批量操作記錄數據少,語義性強。但SBR存在明顯的缺點,就是在對於now()這樣的時間語句也會如實記錄,對於像數據同步,數據恢復時,這些數據會出現問題。所以不建議使用SBR模式

RBR:會逐行記錄變化的值,日誌量較大,但是數據精確,在數據同步,數據恢復時不會出現錯誤。所以推薦使用

MySQL存儲引擎InnDB核心參數

innodb_flush_method參數解釋

它控制的是兩部分,一個是redo buffer的刷寫,另一個是buffer pool的刷寫。redo buffer指緩衝redo log日誌,buffer pool指的是緩衝數據和索引。控制的是刷寫磁盤的時候是否經過文件系統緩存

對於Unix操作系統,有6個可選值,常用的只有三個分別是,fsync,O_DSYNC,O_DIRECT

查看參數

<code> select @@innodb_flush_method;/<code>
MySQL存儲引擎InnDB核心參數

注意,對於Unix操作系統來說,如果innodb_flush_method值為NULL,則默認使用fsync,對於Windows操作系統,如果值為NULL,則默認使用async_unbuffered


當innodb_flush_method=fsync時,處理過程是怎麼樣的呢

第一步,同時將redo buffer 和 buffer pool 寫入到系統緩衝區中。第二步,同時將系統緩衝區的數據刷寫到磁盤中。

MySQL存儲引擎InnDB核心參數

當innodb_flush_method=O_DIRECT時,處理過程是怎麼樣的呢

第一步,將 buffer pool 寫入到磁盤中。第二步,將redo buffer 寫入到系統緩衝區後,再刷寫到磁盤中。

MySQL存儲引擎InnDB核心參數

當innodb_flush_method=O_DSYNC時,處理過程是怎麼樣的呢

第一步,將redo buffer寫入到磁盤中。第二步,將 buffer pool 寫入到系統緩衝區後,再刷寫到磁盤中。

MySQL存儲引擎InnDB核心參數

最高安全模式

innodb_flush_log_at_trx_commit=1

innodb_flush_method=O_DIRECT

最高性能模式

innodb_flush_log_at_trx_commit=0

innodb_flush_method=fsync


innodb_log_files_pages_pct髒頁刷寫策略

有哪些行為會觸發髒頁寫入到磁盤

CSR:基於redo的前滾操作

redo寫空間滿了,將redo日誌寫入到磁盤


分享到:


相關文章: