1. 程式人生 > >MySQL增量備份與還原詳解

MySQL增量備份與還原詳解

-s time 除了 defaults term ase sta dmi cal

增量備份與恢復的特點
  • 增量備份的優點是沒有重復數據,備份量不大,時間短。但缺點也很明顯,需要建立在上次完全備份及完全備份之後所有的增量才能恢復。
  • MySQL沒有提供直接的增量備份方法,但是可以通過mysql二進制日誌間接實現增量備份。二進制日誌對備份的意義如下:
  • (1)二進制日誌保存了所有更新或者可能更新數據庫的操作。
  • (2)二進制日誌在啟動MySQL服務器後開始記錄,並在文件達到所設大小或者收到flush logs 命令後重新創建新的日誌文件。
  • (3)只需定時執行flush logs方法重新創建新的日誌,生成二進制文件序列,並及時把這些文件保存到一個安全的地方即完成了一個時間段的增量備份。

增量備份及恢復

創建基本數據庫

create databse school
use school
create table info (name varchar(10),score decimal(5,2));
insert into info (name,score) values (‘zhangsan‘,80);
insert into info (name,score) values (‘lisi‘,80);
//數據庫建立以及表數據添加完成
  • 編輯配置文件,打開二進制日誌功能

#vim /etc/my.cnf

log-bin=mysql-bin   //添加二進制日誌文件

#systemctl restart mysqld.service

#msyqldump -u root -p school > /opt/school.sql //備份數據庫文件

  • 首先生成創建test01數據的二進制日誌:

#mysql -u root -p

>use school;
>insert into info (name,score) values (test01,88);
>quit
//完成數據插入

#mysqladmin -u root -p flush-logs //刷新生成mysql增量備份文件
#cd /usr/local/mysql/data/
#ls //二進制日誌已經生成

  • 查看二進制日誌文件:(確定增加test01操作是在mysql-bin.000002日誌中)

    #mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000002 //使用64位解碼方式

  • 其次生成創建test02數據的二進制日誌:

#mysql -u root -p

>use school;
>insert into info (name,score) values (test02,90);
>quit
//完成數據插入

#mysqladmin -u root -p flush-logs //刷新生成mysql增量備份日誌文件
#cd /usr/local/mysql/data/
#ls //二進制日誌已經生成

  • 當工作人員不慎操作,刪除了test01與test02用戶,導致數據庫不可用,而備份的完整數據中只有zhangsan和lisi賬戶,
    此時需要根據二進制日誌文件按需恢復test01或者test02;

模擬誤操作:

#mysql -u root -p

>use school
>delete from info where name=‘test01‘;    //執行誤操作
>select * from info;    

>delete from info where name=‘test02‘;    //執行誤操作
>select * from info;

首先恢復完整數據庫:

#mysql -u root -p school < /opt/school.sql

  • 當test01用戶添加數據在二進制日誌msyql-bin.0000002中時:
  • 恢復test01:

#msyqlbinlog --no-defaults /usr/local/mysql/data/msyql-bin.0000002 | msyql -u root -p
#msyql -u root -p

>use school
>select * from info;     //發現test01已經恢復
  • 當test02用戶添加數據在二進制日誌msyql-bin.0000003中時:
  • 恢復test02:

#mysqlbinlog --no-defaults /usr/local/mysql/data/msyql-bin.0000003 | msyql -u root -p
#mysql -u root -p

>use school
>select * from info;     //發現test02已經恢復

基於時間與位置恢復

  • 創建默認數據庫:
    create databse school
    use school
    create table info (name varchar(10),score decimal(5,2));
    insert into info (name,score) values (‘tom‘,80);
    insert into info (name,score) values (‘jerry‘,90);
    //數據庫建立以及表數據添加完成

技術分享圖片

  • 打開二進制日誌功能

#vim /etc/my.cnf

log-bin=mysql-bin   //添加二進制日誌文件

#systemctl restart mysqld.service

#mysqldump -u root -p school > /opt/school.sql //備份數據庫文件,只含tom和jerry的默認用戶

#mysqladmin -u root -p flush-logs //刷新生成mysql增量備份日誌文件
#cd /usr/local/mysql/data/
#ls //二進制日誌已經生成

模擬故障:

  • 當某一工作人員在添加test01與test02賬戶時,中間不小心刪除數據庫中默認賬戶tom,導致數據庫完整性被破壞。
    下面需要針對在二進制日誌文件按位置與時間恢復test01和test02數據以及tom數據;
mysql> insert into info (name,score) values (‘test01‘,88);
Query OK, 1 row affected (0.00 sec)

mysql> delete from info where name=‘tom‘;   //故障操作為誤刪除默認用戶tom
Query OK, 1 row affected (0.00 sec)

mysql> insert into info (name,score) values (‘test02‘,70);
Query OK, 1 row affected (0.00 sec)

技術分享圖片

#mysqladmin -u root -p flush-logs //此時在誤操作的基礎上已經完成了增量備份

  • 由於完成數據庫備份文件只有默認tom和jerry用戶,並沒有test01和test02,若還原增量備份文件,則會刪除tom用戶,下面將利用二進制日誌增量備份文件斷點還原test01與test02且不刪除tom用戶;

  • 首先還原完整數據庫:
    drop table info;  //刪除原有損壞的數據庫

#mysql -u root -p school < /opt/school.sql //還原備份數據庫

  • 查看二進制日誌增量備份文件:
  • 查找需要還原的斷點位置:

  • 由於在斷點增量備份文件還原時,還原順序從文件開頭執行,到--stop-datetime錯誤操作時間點結束;

  • 由於在斷點增量備份文件還原時,還原順序從文件開頭執行,到--stop-datetime錯誤操作時間點結束;當跳過錯誤時間點,從下一次正確操作時間點--start-datetime開始執行到備份文件結尾。

  • 還原到test01:

#mysqlbinlog --no-defaults --stop-datetime=‘2018-07-03 19:05:42‘ /usr/local/mysql/data/msyql-bin.0000001 | mysql -u root -p //註意修改日期格式xxx-xx-xx

技術分享圖片

  • 跳過錯誤時間:從下一個正確操作時間開始:

#mysqlbinlog --no-defaults --start-datetime=‘2018-07-03 19:06:03‘ /usr/local/mysql/data/msyql-bin.0000001 | mysql -u root -p //註意修改日期格式xxx-xx-xx

技術分享圖片

  • 這樣就跳過了錯誤操作步驟,直接選擇正確操作還原。
  • 註:斷點還原只能跳過一次錯誤,若中間有多個錯誤操作不可連續還原。

節點還原

  • 註意錯誤操作前面的at節點號:如圖

技術分享圖片

#mysqlbinlog --no-defaults --stop-position=‘563‘ /usr/local/mysql/data/msyql-bin.0000001 | mysql -u root -p

  • 跳過錯誤時間:從下一個正確操作節點開始:

#mysqlbinlog --no-defaults --stop-position=‘660‘ /usr/local/mysql/data/msyql-bin.0000001 | mysql -u root -p

如上,關於節點恢復實驗已經完成。

MySQL增量備份與還原詳解