innodb_flush_method和innodb_flush_log_at_trx_commit
innodb_flush_log_at_trx_commit:
主要控制了innodb將log buffer中的資料寫入日誌檔案並flush磁碟的時間點,取值分別為0、1、2三個。0,表示當事務提交時,不做日誌寫入操作,而是每秒鐘將log buffer中的資料寫入日誌檔案並flush磁碟一次;1,則在每秒鐘或是每次事物的提交都會引起日誌檔案寫入、flush磁碟的操作,確保了事務的 ACID;設定為2,每次事務提交引起寫入日誌檔案的動作,但每秒鐘完成一次flush磁碟操作。顯然,設定為0或2可以減小系統的io壓力,特別是0 時,速度最快,提高mysql寫操作的吞吐量,但mysql或作業系統的崩潰、斷電都可能會引起資料的丟失,設定為2時os的崩潰和斷電可能會引起資料的 丟失。
innodb_flush_method:
影響了伺服器flush資料或日誌檔案的方法。具體有三個選值:預設的default,innodb使用fsync()函式flush資料和日誌文 件;O_DIRECT,innodb使用O_DIRECT的方式開啟資料檔案,並使用fsync()函式flush資料和日誌文 件;O_DSYNC,innodb使用O_SYNC開啟並flush日誌檔案,使用fsync()函式flush資料檔案。
注:在類unix作業系統中,檔案的開啟方式為O_DIRECT會最小化緩衝對io的影響,該檔案的io是直接在使用者空間的buffer上操作 的,並且io操作是同步的,因此不管是read()系統呼叫還是write()系統呼叫,資料都保證是從磁碟上讀取的;O_SYNC方式表示以同步io的 方式開啟檔案,任何寫操作都將阻塞到資料寫入物理磁碟後才返回。fsync(int filedes)函式只對由檔案描述符filedes指定的單一檔案起作用,並且等待寫磁碟操作結束,然後返回。fdatasync(int filedes)函式類似於fsync,但它隻影響檔案的資料部分。而除資料外,fsync還會同步更新檔案的元資訊到磁碟。
sync_binlog:
影響了binary log的fllush,當為1時,每個事物提交後,mysql將用fdatasync()函式將二進位制日誌同步到磁碟上;當為0時,mysql不會做額外的flush,而是依靠os的flush。
做過一些相應的測試,獲得一些以上三引數搭配使用的結論:
1)O_DIRECT的flush_method更適合於作業系統記憶體有限的情況下(可以避免不必要的對交換空間的讀寫操作),否則,它會由於禁用了os的緩衝降低對資料的讀寫操作的效能。
2)Sync_binlog為1時,每個含有修改操作的事物提交後,mysql將把二進位制日誌同步到磁碟上,增大了io壓力,引起相應瓶頸,會降低對資料寫操作的效率。而select操作不寫入binary log,所以不受任何影響。
3)對於innodb_flush_log_at_trx_commit與innodb_flush_method的不同組合(0|1|2,default|O_DSYNC)(對於O_DIRECT的情況特殊,已經在1)中單獨做了總結在此不累述)分析得:
①(0, default)每秒鐘呼叫fsync()同步一次innodb logfile,io壓力小,效能高,但可能損失資料;
②(1, default)每秒鐘和每次commit呼叫fsync()同步一次innodb logfile,保證資料完整的同時,加大了io壓力,吞吐量相對低;
③(2, default)速度介於前兩者之間,也不能完全保證資料的安全;
④(0,O_DSYNC)每秒同步日誌及資料檔案,吞吐量等情況應與(0, default)基本一致;
⑤(1,O_DSYNC)每秒鐘和每次commit同步資料及日誌檔案,相應於(1, default)情況一致;
⑥(2,O_DSYNC)雖然innodb_flush_log_at_trx_commit設定為2,innodb被告知每次事務提交引起寫入 日誌檔案的動作,每秒鐘完成一次flush磁碟操作,但由於O_DSYNC的設定使得os對日誌自動做了同步工作,所以吞吐量等情況與(1, default)和(1,O_DSYNC)相一致。[@more@]
主要控制了innodb將log buffer中的資料寫入日誌檔案並flush磁碟的時間點,取值分別為0、1、2三個。0,表示當事務提交時,不做日誌寫入操作,而是每秒鐘將log buffer中的資料寫入日誌檔案並flush磁碟一次;1,則在每秒鐘或是每次事物的提交都會引起日誌檔案寫入、flush磁碟的操作,確保了事務的 ACID;設定為2,每次事務提交引起寫入日誌檔案的動作,但每秒鐘完成一次flush磁碟操作。顯然,設定為0或2可以減小系統的io壓力,特別是0 時,速度最快,提高mysql寫操作的吞吐量,但mysql或作業系統的崩潰、斷電都可能會引起資料的丟失,設定為2時os的崩潰和斷電可能會引起資料的 丟失。
innodb_flush_method:
影響了伺服器flush資料或日誌檔案的方法。具體有三個選值:預設的default,innodb使用fsync()函式flush資料和日誌文 件;O_DIRECT,innodb使用O_DIRECT的方式開啟資料檔案,並使用fsync()函式flush資料和日誌文 件;O_DSYNC,innodb使用O_SYNC開啟並flush日誌檔案,使用fsync()函式flush資料檔案。
注:在類unix作業系統中,檔案的開啟方式為O_DIRECT會最小化緩衝對io的影響,該檔案的io是直接在使用者空間的buffer上操作 的,並且io操作是同步的,因此不管是read()系統呼叫還是write()系統呼叫,資料都保證是從磁碟上讀取的;O_SYNC方式表示以同步io的 方式開啟檔案,任何寫操作都將阻塞到資料寫入物理磁碟後才返回。fsync(int filedes)函式只對由檔案描述符filedes指定的單一檔案起作用,並且等待寫磁碟操作結束,然後返回。fdatasync(int filedes)函式類似於fsync,但它隻影響檔案的資料部分。而除資料外,fsync還會同步更新檔案的元資訊到磁碟。
sync_binlog:
影響了binary log的fllush,當為1時,每個事物提交後,mysql將用fdatasync()函式將二進位制日誌同步到磁碟上;當為0時,mysql不會做額外的flush,而是依靠os的flush。
做過一些相應的測試,獲得一些以上三引數搭配使用的結論:
1)O_DIRECT的flush_method更適合於作業系統記憶體有限的情況下(可以避免不必要的對交換空間的讀寫操作),否則,它會由於禁用了os的緩衝降低對資料的讀寫操作的效能。
2)Sync_binlog為1時,每個含有修改操作的事物提交後,mysql將把二進位制日誌同步到磁碟上,增大了io壓力,引起相應瓶頸,會降低對資料寫操作的效率。而select操作不寫入binary log,所以不受任何影響。
3)對於innodb_flush_log_at_trx_commit與innodb_flush_method的不同組合(0|1|2,default|O_DSYNC)(對於O_DIRECT的情況特殊,已經在1)中單獨做了總結在此不累述)分析得:
①(0, default)每秒鐘呼叫fsync()同步一次innodb logfile,io壓力小,效能高,但可能損失資料;
②(1, default)每秒鐘和每次commit呼叫fsync()同步一次innodb logfile,保證資料完整的同時,加大了io壓力,吞吐量相對低;
③(2, default)速度介於前兩者之間,也不能完全保證資料的安全;
④(0,O_DSYNC)每秒同步日誌及資料檔案,吞吐量等情況應與(0, default)基本一致;
⑤(1,O_DSYNC)每秒鐘和每次commit同步資料及日誌檔案,相應於(1, default)情況一致;
⑥(2,O_DSYNC)雖然innodb_flush_log_at_trx_commit設定為2,innodb被告知每次事務提交引起寫入 日誌檔案的動作,每秒鐘完成一次flush磁碟操作,但由於O_DSYNC的設定使得os對日誌自動做了同步工作,所以吞吐量等情況與(1, default)和(1,O_DSYNC)相一致。[@more@]
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7916042/viewspace-1056696/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- innodb_flush_log_at_trx_commitMIT
- innodb_flush_log_at_trx_commit引數的直白理解MIT
- 【MySQL】五、sync_binlog innodb_flush_log_at_trx_commit 淺析MySqlMIT
- MySQL:Innodb:innodb_flush_log_at_trx_commit引數影響的位置MySqlMIT
- mysql插入慢之所innodb_flush_log_at_trx_commit引數的意義MySqlMIT
- 路徑中./和../和/
- ../和./和/的區別
- not in 和 not exists 比較和用法
- xftp和xshell,xftp和xshell的下載和安裝FTP
- #和&
- !=和<>
- ABAP和Java的destination和JNDIJava
- @NotEmpty和@NotBlank和@NotNull小結Null
- 字首和與二維字首和
- ♻️同步和非同步;並行和併發;阻塞和非阻塞非同步並行
- XML基本操作-建立(DOM和LOINQ)和LINQ查詢和儲存XML
- workman 和swoole 區別 和異同
- 寬鬆相等和嚴格相等(==和===)
- 淺談mouseenter和mouseover,mouseout和mouseleave
- csv和excel讀取和下載Excel
- Cookie 和 Session 關係和區別CookieSession
- javafx 和swing_整合JavaFX和SwingJava
- 檔案路徑問題( ./ 和 ../ 和 @/ )
- 堆和棧的概念和區別
- ThymeleafViewResolver和SpringTemplateEngine和SpringResourceTemplateResolver的關係ViewSpring
- 尤拉計劃739:和的和
- 【-Flutter/Dart 語法補遺-】 sync* 和 async* 、yield 和yield* 、async 和 awaitFlutterDartAI
- if if和if else if
- ul和
- 字首和
- equals 和 ==
- Redis RDB和AOF取捨和選擇Redis
- ssr、ss和vpn介紹和區別
- 使用Jquery和JSON的州和城市列表jQueryJSON
- VM和Container 虛擬機器和容器AI虛擬機
- 和AI談倫理、道德和謊言AI
- 堆和棧的解釋和區別
- lodsb、stosb(和lodsw、stosw和lodsd、stosd指令)
- vue和react的相同點和不同點VueReact