mysql恢復數據庫方法binlog日誌來恢復數據庫

在使用binlog日誌來恢復數據庫以前,咱們有一些前提工做須要作。步驟以下:mysql

一、建立新的數據庫ailannisql

二、建立新的表ilannitable數據庫

三、向表ilannitable插入數據服務器

四、刷新mysqlbin日誌測試

五、完整備份ailanni數據庫spa

六、刪除表ilannitable插入的部分數據日誌

七、刪除數據庫ailanniblog

八、各個binlog日誌的內容解析ip

九、恢復ailanni所有數據get

十、恢復ailanni數據庫指定的部分

1、 建立新的數據庫ailanni

使用如下命令建立數據庫,以下:

mysql --h 192.168.1.213 -uroot -p123456

create database ailanni;

show databases;

clip_image001

2、 建立新的表ilannitable

使用如下命令建立表,以下:

use ailanni;

create table ilannitable(id int(4));

show tables;

clip_image002

3、 向表ilannitable插入數據

使用如下命令向表ilannitable中插入數據一、2,以下:

insert into ilannitable values(1);

insert into ilannitable values(2);

select id from ilannitable;

clip_image003

4、 刷新mysqlbin日誌

此時mysql的binlog日誌文件只有一個mysql-bin.000001,以下:

show master logs;

clip_image004

注意:此時mysql的binlog文件爲mysql-bin.000001,而且數據庫ailanni中只有一、2兩條數據。以下:

select id from ilannitable;

clip_image005

如今咱們來刷新binlog日誌,生成新的binlog日誌文件mysql-bin.000002,以下:

flush logs;

show master logs;

clip_image006

如今咱們再次向ailanni數據庫中插入新的數據三、4,以下:

insert into ilannitable values(3);

insert into ilannitable values(4);

clip_image007

數據三、4插入完畢後,咱們再次刷新binlog日誌,生成新的binlog日誌文件爲mysql-bin.000003,以下:

clip_image008

如今咱們總共有三個binlog日誌文件:mysql-bin.00000一、mysql-bin.00000二、mysql-bin.000003。其中在mysql-bin.000001中,咱們向ilannitable表中插入兩個數據一、2。在mysql-bin.000002中咱們向ilannitable表中插入兩個數據三、4。

咱們能夠查看binlog中的內容以下:

/usr/local/mysql/bin/mysqlbinlog /usr/local/mysql/data/mysql-bin.000001

/usr/local/mysql/bin/mysqlbinlog /usr/local/mysql/data/mysql-bin.000002

clip_image009

clip_image010

5、 完整備份ailanni數據庫

如今咱們來完整的備份ailanni數據庫,使用mysqldump命令,以下:

/usr/local/mysql/bin/mysqldump -uroot -p123456 ailanni >/root/ailanni.sql

clip_image011

查看備份文件是否與ailanni數據庫的內容一致,以下:

cat ailanni.sql

clip_image012

經過上圖可知,備份的數據庫文件與ailanni數據庫的內容是一致的。

6、 刪除表ilannitable插入的部分數據

在第3、四步中,咱們向表ilannitable中插入了一、二、三、4四個數據。爲了模擬在ailanni數據庫被破壞後的實際情形,咱們如今把ailanni數據庫中的3這條數據給刪除,以下:

delete from ilannitable where id=3;

clip_image013

此時咱們再次刷新binlog日誌,生成新的binlog日誌文件爲mysql-bin.000004,以下:

flush logs;

show master logs;

clip_image014

7、 刪除數據庫ailanni

在第六步中,咱們刪除了數據記錄3,如今咱們來刪除ailanni數據庫。以下:

drop database ailanni;

show databases;

clip_image015

刪除完畢後,咱們再次刷新binlog日誌,生成新的binlog日誌文件爲mysql-bin.000005,以下:

flush logs;

show master logs;

clip_image016

8、 各個binlog日誌的內容解析

如今mysql的binlog日誌文件有5個,從mysql-bin.000001到mysql-bin.000005,其中在mysql-bin.000001中咱們向ilannitable表中插入了一、2兩條數據。

在mysql-bin.000002中咱們向ilannitable表中插入了三、4兩條數據,在mysql-bin.000003中咱們從表ilannitable刪除了3這條數據。在mysql-bin.000004中咱們把ailanni數據庫給刪除了。

各個binlog日誌的SQL操做語句,以下:

/usr/local/mysql/bin/mysqlbinlog /usr/local/mysql/data/mysql-bin.000001

clip_image017

/usr/local/mysql/bin/mysqlbinlog /usr/local/mysql/data/mysql-bin.000002

clip_image010[1]

/usr/local/mysql/bin/mysqlbinlog /usr/local/mysql/data/mysql-bin.000003

clip_image018

/usr/local/mysql/bin/mysqlbinlog /usr/local/mysql/data/mysql-bin.000004

clip_image019

9、 恢復ailanni所有數據

如今咱們要恢復ailanni數據庫,在此首先有關ailanni數據庫是否存在的狀況要說明下。

若是目前mysql數據庫服務器上有ailanni這個數據庫,那麼咱們在恢復數據時,就不須要從新建立ailanni數據庫。若是目前mysql數據庫服務器上沒有ailanni這個數據庫,那麼咱們就須要從新建立一個空的ailanni數據庫。即該數據庫只是一個空的庫,裏面沒有任何表或者其餘的元素。

若是不建立ailanni數據庫的話,咱們在經過mysql命令恢復數據庫時,系統就會報錯,以下:

clip_image020

在第五步時,咱們備份的數據庫是ailanni數據庫所有的數據。若是要恢復ailanni數據庫所有數據的話,咱們只須要執行mysql命令導入備份的sql文件便可。以下:

create database ailanni;

/usr/local/mysql/bin/mysql -uroot -p123456 ailanni</root/ailanni.sql

clip_image021

查看恢復後的ailanni數據庫是否和被刪除以前的數據同樣,以下:

mysql -uroot -p123456

use ailanni;

select id from ilannitable;

clip_image022

經過上圖,咱們能夠很明顯的看到目前ailanni數據庫已經被所有恢復,並且數據一個也沒有丟失。

10、 恢復ailanni數據庫指定的部分

在經過mysql的binlog日誌恢復數據庫時,咱們能夠指定數據庫恢復的位置、恢復的時間,同時也能夠不指定數據庫恢復的位置和時間。

有關mysqlbinlog命令的使用方法,咱們能夠經過mysqlbinlog的幫助命令進行查看,以下:

/usr/local/mysql/bin/mysqlbinlog --help

clip_image023

注意圖中標記出來的數字,其中1和2是表示經過binlog恢復數據的開始和結束時間,3和4表示的binlog恢復數據的開始和結束位置。

其中時間咱們都知道,看下binlog的日誌文件內容就知道了。而位置就是咱們在前面查看各個binlog日誌內容時標記出來的數字部分。以下:

clip_image024

圖中被標出來的黃色部分數字5表示時間,6表示位置的節點,位置節點咱們也稱爲binlog的pos點。

10.1不指定位置和時間來恢復數據庫

咱們先來測試不指定時間和位置來恢復數據庫。

在第九步中咱們恢復了ailanni所有的數據庫,如今咱們要求把數據庫恢復到刪除數據記錄3時的狀態。即ailanni數據庫中只有一、二、4,這三條數據。這個時候咱們就要根據mysql的binlog日誌進行恢復,要否則達不到這個要求。

在第八步中咱們已經分析了各個binlog日誌中執行的SQL語句。根據分析,咱們須要使用mysql-bin.000003這個binlog日誌來恢復數據庫。如今咱們再次查看該binlog日誌,以下:

/usr/local/mysql/bin/mysqlbinlog /usr/local/mysql/data/mysql-bin.000003

clip_image018[1]

刪除3這條數據後,ailanni數據庫中的數據記錄狀況也就是咱們恢復數據庫後所要的狀態。以下:

clip_image025

如今咱們來經過mysqlbin來恢復刪除3這條數據時的數據庫,使用以下命令:

/usr/local/mysql/bin/mysqlbinlog /usr/local/mysql/data/mysql-bin.000003 |mysql -uroot -p123456

clip_image026

經過上圖咱們能夠看到此時數據庫ailanni已經恢復到刪除數據3時的狀態了,ailanni數據庫中確實只有一、二、4,這三條數據。這樣也達到咱們的要求了。

重要說明:

經過上面的文章,咱們知道如今ailanni數據庫的狀況是,已經恢復所有數據。

爲了作下面的實驗,咱們就要把ailanni數據庫恢復到尚未進行徹底備份以前的狀態,即ailanni數據庫尚未數據的狀態。咱們須要作的是清空如今的ailanni數據庫,保持ailanni是一個空的數據庫。可是ailanni數據庫的表結構、主鍵、外鍵等等信息都是完整的。

同時還要說明下:若是在同一個時間點,binlog日誌中有執行過多條sql語句的話,那麼咱們在恢復數據庫時,必定要根據pos點的位置來恢復數據,切記切記。由於此時在binlog日誌中,時間節點是同樣的,可是pos位置節點是惟一的。

所以在經過binlog恢復數據庫時,強烈建議使用pos位置節點的方法來恢復數據。

清空ailanni數據庫使用如下命令,以下:

delete from ilannitable;

select id from ilannitable;

clip_image027

有關這個狀況,我會再寫一篇文章。

如今咱們獲得的是一個沒有數據的ailanni數據庫,這樣咱們下面的實驗就能夠繼續進行。

10.2指定時間來恢復數據庫

要求恢復到刪除數據記錄3時的數據庫。即數據庫中只有一、二、4,這三條數據。

仍是和10.1要求是同樣的,可是此次咱們根據時間點來恢復數據。咱們也須要一個空的ailanni數據庫,這個咱們能夠經過前面的說明能夠獲得。

如今咱們再次查看mysql-bin.000003文件,以下:

/usr/local/mysql/bin/mysqlbinlog /usr/local/mysql/data/mysql-bin.000003

clip_image028

注意圖中黃色部分標記出來的時間點,咱們能夠看到在這個時間點以後,數據3就被刪除了。咱們恢復數據,就恢復到這個時間點便可達到要求。使用如下命令進行恢復,以下:

/usr/local/mysql/bin/mysqlbinlog --stop-datetime='2014-11-17 11:30:43' /usr/local/mysql/data/mysql-bin.000003 |mysql -uroot -p123456

mysql -uroot -p123456

use ailanni;

select id from ilannitable;

clip_image029

經過上圖,咱們能夠看到經過時間點來恢復數據庫也達到咱們的要求,而且ailanni數據庫中確實只有一、二、4,這三條數據。

10.3指定位置來恢復數據庫

要求把數據庫ailanni恢復到插入數據3後,未插入數據4時的狀態。即數據庫ailanni中只有數據一、二、3,這三條數據。

分析要達到此要求,咱們只能經過binlog日誌的方式來恢復數據。根據第八步的binlog日誌能夠得知,要想恢復到此時的數據庫,那麼咱們就要使用mysql-bin.000002這個日誌文件。

要到達上述的目的,咱們須要先來恢復數據一、2,使用mysql-bin.000001文件,以下:

/usr/local/mysql/bin/mysqlbinlog /usr/local/mysql/data/mysql-bin.000001 |mysql -uroot -p123456

clip_image030

數據一、2恢復後,咱們如今正式開始恢復插入數據3後,未插入數據4時的數據庫。

再次查看mysql-bin.000002日誌文件,以下:

/usr/local/mysql/bin/mysqlbinlog /usr/local/mysql/data/mysql-bin.000002

clip_image031

注意圖中標記出來的數字304,這個就是binlog的pos節點位置。咱們能夠看到在該pos節點後mysql才執行插入數據4的SQL語句。那麼咱們只須要把數據恢復這個節點便可。

使用以下命令進行恢復數據,以下:

/usr/local/mysql/bin/mysqlbinlog --stop-position=304 /usr/local/mysql/data/mysql-bin.000002 |mysql -uroot -p123456

clip_image032

經過上圖,咱們如今能夠看到ailanni數據庫已經恢復到插入數據3以後,未插入4的狀態。如今ailanni數據庫中確實只有一、二、3,這三條數據,已經達到咱們的要求。

到此咱們有關經過binlog日誌恢復mysql數據庫告一段落。