binlog冪等性恢復的問題

2021-08-20 13:21:16 字數 2262 閱讀 4620

上周五去乙個公司面試,聊到乙個問題,面試官說基於某個備份+binlog來恢復,如果沒有備份的postion或者時間點

恢復資料的時候,可以往前多應用一些binlog,資料也是一樣的。因為binlog是冪等的。

第一感覺是這樣不行,看示例:

create tablet(

aint(11) not null auto_increment,

bvarchar(20) default null,

cint,

primary key (a)

); create table t1 like t;

create table t2 like t;

reset master;

insert into t(a,b,c) values(1,』a』,100);

flush logs;

insert into t(a,b,c) values(2,』a』,200);

flush logs;

insert into t(a,b,c) values(3,』c』,100);

flush logs;

delete from t where b=』a』;

flush logs;

set sql_log_bin=0;

insert into t1 select * from t;

set sql_log_bin=1;

flush logs;

insert into t(a,b,c) values(100,』100』,100);

update t set b=』aa』 where a=100;

flush logs;

flush logs;

insert into t2 select * from t;

delete from t;

insert into t select * from t1;

把binlog解析出來

可以看到,資料恢復出來與之前的一致。

但是如果binlog往前一些呢。上面的binlog我們是從第5個binlog開始備份的。下面從第二個binlog開始執行恢復。

多出了一條記錄!!!

原因在於:mysql-bin.000004裡面刪除delete from t where b=』a』;包括兩條記錄(a=1,a=2),在乙個事務裡面。要麼成功,要麼失敗。

而從mysql-bin.000002開始執行的時候,由於表裡面沒有a=2的記錄,所以a=2插入成功,但是刪除的時候,a=1沒有,事務不成功。導致多了一條記錄

由此可見,從基於備份時間點之前,應用binlog來恢復,資料是不一致的。

但是如果從第乙個binlog起, 執行多次不會有問題。

原子性 冪等性

原子性 如果這個操作所處的層 layer 的更高層不能發現其內部實現與結構,那麼這個操作是乙個原子 atomic 操作。原子操作可以是乙個步驟,也可以是多個操作步驟,但是其順序不可以被打亂,也不可以被切割而只執行其中的一部分。將整個操作視作乙個整體是原子性的核心特徵。冪等性 再簡單一點說,在乙個業務...

冪等性學習及介面的冪等性

冪等性學習 一 什麼是冪等性 在這裡需要有以下幾個問題需要注意 2 冪等性不僅僅只是一次或者多次請求的時候對資源沒有 比如根據id對資料庫的查詢操作,此操作對資料庫沒有增刪改,所以多次查詢操作對資料庫結果是沒有任何影響的 3 冪等性還包括了第一次請求資源的時候,對資源產生了 但是在以後多次同樣的請求...

了解冪等性

2 什麼是冪等性 f x f x x被函式f作用一次和作用無限次的結果是一樣的。冪等性應用在軟體系統中,我把它簡單定義為 某個函式或者某個介面使用相同引數呼叫一次或者無限次,其造成的後果是一樣的,在實際應用中一般針對於介面進行冪等性設計。舉個栗子,在系統中,呼叫方a呼叫系統b的介面進行使用者的扣費操...