redo
是引擎層的日誌,並且是InnoDB特有的。InnoDB的redo log
是有固定大小的,好比能夠配置爲 一組4個文件(logfile-1,logfile-2,logfile-3,logfile-4),每一個文件的大小是1GB,那麼它總共能夠記錄4GB的操做。一個環狀循環結構,從頭開始寫,寫到末尾又回到開始循環寫。mysql
結構圖:sql
write pos
是當前記錄的位置,一邊寫一邊後移,環狀結構,寫到3號文件末尾就會回到0號文件開頭。checkpoint是當前擦除的位置,也是日後推移而且循環的。注意擦除記錄前要把記錄更新到數據文件(這裏能夠聯想 粉板 老闆正式記帳本的例子)
WAL
的全稱是write-Ahead-Logging
,它的關鍵點就是先寫日誌,再寫磁盤
。具體說,當有一條記錄須要更新的時候,InoDB引擎會先記錄到redo log,並更新內存,這時候更新就算完成了。同時InnoDb引擎會在適當的時候,將這個操做記錄更新到磁盤裏面,而這個更新每每是在系統比較空閒的時候作。crash-safe
。只要數據庫的物理記錄還在redo log中,就是服務器數據庫出現問題重啓,數據庫恢復後,數據記錄仍然能夠恢復。Mysql基礎架構總體分爲兩部分:Server層和引擎層,引擎層主要負責存儲相關的事宜。上面說到在引擎層有本身的日誌,並且只在InnoDB引擎中才有。Server層也有本身的日誌,稱爲binlog(歸檔日誌)。它是採用追寫入日誌的方式。追加寫是指binlog文件寫到必定大小後會切換到下一個,並不會覆蓋之前的日誌。數據庫
只依靠redo日誌的crash-safe特性在應對數據庫誤刪,表數據誤刪等操做時候,有些時候redo日誌是無力的,可是binlog日誌解決這些問題,由於binlog會記錄全部的邏輯操做,而且採用「追加寫」的形式。bash
舉個例子若是公司員工發現某天下午有一個誤刪表數據操做,要求找回數據,應該怎麼作?(注:這裏要考慮是在剛備份以後誤刪除,仍是備份以前誤刪除,下面的例子是在備份以前刪除的,找以前刪除的數據)服務器
redo日誌與binlog日誌有哪些不一樣? 其實上面好多都提到過,再次總結一遍,加深印象。架構
環狀結構
,循環寫,空間固定會用完,用完後須要擦除;binlog是能夠追加寫入的。「追加寫」是隻belog文件寫到必定大小後會切換到下一個,並不會覆蓋之前的日誌。數據庫語句:學習
mysql> update Student set c=c+1 where ID=2;
複製代碼
經過分析這一條更新語句,畫出流程圖,問題3也就獲得解決。ui
注意流程圖的最後三步,這是更新語句和日誌關係密切的地方,將redo日誌拆成了兩個步驟:prepare和commit,它倆的中間是執行器寫入binlog。(注:若是不這麼作,假如一個日誌提交成功的時候,另外一個日誌提交以前發生了數據庫發生了崩潰,可是crash-safe恢復或者誤刪庫恢復的時候可能形成兩者數據不統一出現問題。)redo logspa
innodb_flush_log_at_trx_commit
這個參數設置成 1 的時候,表示每次事務的 redo log 都直接持久化到磁盤。這個參數我建議你設置成 1,這樣能夠保證 MySQL 異常重啓以後數據不丟失。3d
binlog
sync_binlog 這個參數設置成 1 的時候,表示每次事務的 binlog 都持久化到磁盤。這個參數我也建議你設置成 1,這樣能夠保證 MySQL 誤刪除操做(刪除表數據,刪除庫數據) 經過binlog 仍可恢復。
你們會不會想有了redo日誌就能夠了,爲何還要出現binlog日誌呢?
解答:
這裏有一個問題:若是在擦除和記帳重合那一刻,數據庫異常重啓了,新的數據庫操做會怎麼記錄,是擦除一部分,記錄上,會丟失,仍是等待重啓後往上添加數據?
關於數據庫備份,是一天一備比較好,仍是一週一備份比較好,通常備份文件保留多久?提出問題4解決
解答:對於數據庫備份週期這個問題,須要考慮如下指標:數據存量、增量、備份成本、恢復效率。
總的來講就是和項目,需求,場景有不少關係。
寫入redo日誌也是io操做,數據更新直接寫入磁盤也是io操做,爲何說寫入redo日誌效率高節省io成本呢?
解答:redo日誌的寫入是順序寫入的,不用去「找位置」,而直接更新數據到磁盤的話,須要到磁盤中找到位置再寫入,確定前者的效率高。
以上內容是關於數據庫日誌系統的講解,同時解決了我開篇提出的幾個數據庫日誌相關的問題,但願能幫助你們更好的瞭解學習數據庫,若是有問題能夠隨時關注公衆號聯繫,互相學習哦。