上周五去乙個公司面試,聊到乙個問題,面試官說基於某個備份+binlog來恢復,如果沒有備份的postion或者時間點
恢復資料的時候,可以往前多應用一些binlog,資料也是一樣的。因為binlog是冪等的。
第一感覺是這樣不行,看示例:
create tablet
(
a
int(11) not null auto_increment,
b
varchar(20) default null,
c
int,
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的介面進行使用者的扣費操...