MySQL歷史更新 mysql之日誌

2021-10-18 22:05:13 字數 1367 閱讀 2290

我是李福春,我在準備面試,今天的題目是:

mysql的redolog和binlog有什麼區別?

答: 如下面的**,

redolog vs binlog

然後我們擴充套件一下,因為日誌主要是記錄的修改日誌,分別加深分析一下:

redolog

redolog是innodb儲存引擎特有的物理日誌,記錄的是資料頁做了什麼改動。

它的儲存空間是固定的,類似乙個圓環。日誌空間寫完,需要把相關的操作執行,資料刷到磁碟上釋放空間。

redolog可以有效保證mysql的crash-safe; 即mysql系統故障重啟,也可以從redolog中恢復;

一般把innodb_flush_log_at_trx_commit=1,即設定redolog每次事務提交日誌落盤,可以更有效的保證crash-safe

binlog

是一種mysql-server層的邏輯修改日誌,有兩種格式:

1,statement格式,記錄的是sql;

2, row格式,記錄了兩行,更新前和更新後的結果;

為了保證系統可以從奔潰狀態恢復,設定引數 sync_binlog=1,即事務提交,binlog落盤;

如何快速恢復mysql:

1,找到最近的備份,恢復到臨時庫;

2,找到備份的binlog,重放到你需要的時刻。

一條update語句歷程

比如有一張表:

user(id int primarykey auto_increment , age int default 0 )engin=innodb ;

執行一條sql語句:

update user set age=age+1 where id=2 ;

那麼,這條update語句是如何經過mysql的體系結構和日誌檔案呢?

1,執行器首先通過儲存引擎讀介面得到這行資料;(如果記憶體有則返回,不存在從硬碟中取出放入記憶體再返回)

2,執行器把這行資料的age+1,然後呼叫儲存引擎的寫介面,寫入資料到記憶體;

3,儲存引擎把更新操作寫入redolog,日誌狀態為prepare ,告訴執行器事務完成更新操作;

4, 執行器把這個操作寫入binlog,日誌落盤;

5,執行器提交事務,呼叫儲存日誌寫到redolog,日誌狀態為commit,

binlog,redolog都可以表示事務的狀態;

兩階段提交:保證了binlog,redolog在系統奔潰重啟之後的事務狀態的一致;

小結本篇分析了redolog和binlog的區別。

然後分別介紹了binlog,redolog所處的mysql的體系結構位置,實際運維過程中的配置引數。

最後追蹤了一條update語句的執行歷程,以及兩種日誌的寫入過程,然後點明兩階段提交是為了保證兩種日誌的事務一致性。

mySQL之單錶更新

在資料表插入記錄後,如果有欄位更改的需求呢?update low primary ignore table refernece set col name1 col name2 where where condition root localhost test update user set age ...

mysql更新時間 Mysql 更新時間

mysql時間加減函式為date add date sub 定義和用法 date add 函式向日期新增指定的時間間隔。date sub 函式向日期減少指定的時間間隔。語法date add date,interval expr type date sub date,interval expr typ...

mysql 批量更新 MySQL批量更新

我有2個表 mysql data details accounts invoices 理想情況下,每個data details都應具有accounts invoices id.data details有乙個帶有accounts invoices主鍵的外來鍵 由於某種原因,有data details記...