innodb的redo log以及與binary log的區別
innoDB重做日誌
記錄資料庫頁的變化,諸如space id/page no/operation code/data,大致原理等同於oracle redo log,可用於crash recovery,但是其功能有一定侷限。
執行crash recovery時所操作的頁必須是consistent,如果頁已經損壞則無法recover,幸好及時引入了double write功能
日誌頭儲存著最近一次checkpoint資訊,日誌以記錄而非頁的方式寫入,採用512位元組對齊(與磁碟扇區同等),SSD可以設定4096位元組;
Redo log不能歸檔,因此必須迴圈利用,其相應設定引數為innodb_log_file_size/innodb_log_files_in_group/innodb_log_group_home_dir
選擇合適的檔案大小對innodb寫效能至關重要,通常一個檔案至少能夠容納一個小時的日誌量
Mysql採用fuzzy checkpoint機制,每次讀取最老的髒頁而非全部髒頁,將其LSN作為檢查點記錄到日誌檔案(這之前的LSN對應的日誌和資料都寫入檔案,不需要恢復);
恢復資料檔案時,innodb掃描日誌檔案的檢查點資訊,只恢復page LSN> checkpoint LSN的內容
redo log重新整理條件
每秒重新整理一次,由master thread執行;
事務commit,由引數innodb_flush_log_at_trx_commit決定,0表示不重新整理,1同步重新整理,2非同步重新整理至磁碟
相關引數
Innodb_log_buffer_size:快取redo log以待重新整理至磁碟,預設8M;經常發生大事務的時候可適當調大;
Innodb_log_file_size:日誌檔案大小,預設5M,上限為4G(InnoDB最初只為32位系統設計);越大則檢查點發生次數就越少,但crash recovery時間就越長;
Innodb_log_files_in_group:日誌檔案數量,預設為2,上限100;
Innodb_flush_log_at_trx_commit:
同oracle一樣,commit返回前提交所有的redo log,不同的是,innodb提供innodb_flush_log_at_trx_commit引數定製化commit返回時日誌是否重新整理到磁碟,
innodb_flush_log_at_trx_commit = 0 /* Write log buffer to log about once a second and flush */
innodb_flush_log_at_trx_commit = 1 /* Write log buffer to log and flush to disk */
innodb_flush_log_at_trx_commit = 2 /* Write log buffer to log and flush about once per second */
設定為1 時資料庫crash仍能保證資料一致性,而作業系統crash則可能導致部分redo丟失;
可使用有備用電池的儲存與之互補,即提升速度又能保證資料一致性
二進位制日誌
頭部有4位元組偏移量;
二進位制日誌以格式描述事件開始,日誌輪換時間結束;
格式描述事件包括該檔案的版本號/mysql版本以及日誌資訊, 以及標誌binlog是否正常關閉;日誌輪換包含下一個binlog名稱;
根據複製方式不同,二進位制記錄的內容也不一樣:
statement記錄sql本身;
row則以二進位制形式呈現,每1行可能包含前映象或後映象,包含3中型別write_rows_log_event/update_rows_log_event/delete_rows_log_event;
何時重新整理
Sync_binlog:預設為0,如果設定為N,則在N次binlog寫後呼叫fdatasync()將其重新整理至磁碟;使用autocommit時1個sql為1次寫,否則1個事務為1次寫;
N=1的安全度最高,在mysql crash時最多丟失一個事務,但也最慢;
相關引數
Max_binlog_size:規定binlog的最大尺寸,範圍為4k – 1G
binlog_cache_size:每個客戶端分配一個,當伺服器支援事務引擎且啟用bin log時使用,用於記錄事務快取以便寫入binlog;
此引數有個演化史:
5.5.3 – 5.5.8:非事務語句也分配同等大小的binlog cache,實際分配的cache為此引數的2倍;
5.5.9引入binglog_stmt_cache_size,專門分配非事務語句;
與之對應的還有max_binlog_cache_size,假定某事務大小超過此設定,會抱錯generates a Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage
與二進位制日誌區別
1 二進位制日誌記錄所有引擎的日誌,而重做日誌只記錄InnoDB
2二進位制日誌記錄事務的具體操作內容,而後者記錄每個頁更改的物理情況
3前者用於point-in-time恢復,後者用於crash recovery;如果mysql發生介質損壞,則需要從備份中恢復然後應用binary log執行point-in-time recovery
4 bin log大小達到上限或者flush log會生成一個新的檔案,而redo log只能迴圈利用
5 bin log有索引檔案,儲存所有bin log檔案列表
6 bin log可由每個執行緒寫(加鎖以避免混亂),而redo log只能由master thread寫
什麼是double write buffer
分2部分:記憶體中的buffer(2M);共享表空間中連續的128頁(2M);重新整理髒頁時先透過memcpy將其複製到doublewrite buffer,接著分2次將其重新整理到共享表空間,然後呼叫fsync同步髒頁到磁碟;
即先將髒資料順序寫入共享表空間,然後再呼叫fsync寫入資料檔案,如果此時OS崩潰,recovery時可以從共享表空間找到該頁的副本,將其copy的資料檔案然後應用redo log
由引數innodb_doublewrite決定,預設為true
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15480802/viewspace-755325/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL中redo log、undo log、binlog關係以及區別MySql
- MySQL的Redo log 以及Bin logMySql
- mysql日誌:redo log、binlog、undo log 區別與作用MySql
- InnoDB文件筆記(二)—— Redo Log筆記
- CAD的ShowDialog與普通ShowDialog的區別
- Redo log 的分享與記憶
- git log與git reflog區別Git
- weblogic,tomcat,JBoss以及Websphere的區別WebTomcat
- MySQL中的redo log和undo logMySql
- Redo Log之一:理解Oracle redo logOracle Redo
- logminer工具對redo log或archive log的挖掘Hive
- standby redo log的理解
- thchnique 與 technology的區別及用法
- RMAN Catalog 和 Nocatalog 的區別
- undo log和redo log
- Innodb與MyISAM的區別
- MyISAM與InnoDB的區別
- log_buffer和 Redo Buffers有什麼區別啊
- 關於 log_archive_dest與log_archive_dest_n a的區別Hive
- zt:alter system switch logfile與ALTER SYSTEM ARCHIVE LOG CURRENT的區別Hive
- (轉)老白的理解REDO LOG
- 修改oracle redo log的大小Oracle Redo
- Redo Log之二:遷移redo log到不同的儲存路徑
- log_archive_dest與log_archive_dest_n區別Hive
- alter system switch log file 與 archive log current/all 區別Hive
- mysql的binary-log操作MySql
- redo log 和 binlog 的一些總結
- redo的等待log file sync和log file parallel write和redo size設定Parallel
- systemverilog中module與program的區別
- MySQL Binary LogMySql
- mysql關於ib_logfile事務日誌和binary log二進位制日誌的區別MySql
- MySQL中的redo log和checkpointMySql
- redo logfile的維護操作
- Redo Log Buffer的大小設定
- RMAN - backup archivelog all 與 backup database plus archivelog 區別HiveDatabase
- MySQL 備份軟體 Xtrabackup 的 xtrabackup_binlog_pos_innodb和xtrabackup_binlog_info 檔案區別MySql
- Git log 和 Git reflog 區別Git
- MySQL:Redo & binlogMySql