MySQL增量備份恢復和基於時間點與位置的恢復

爲何使用增量備份?

徹底備份有兩種方式,一種是使用tar打包數據文件,另外一種是使用mysqldump進行徹底備份。徹底備份存在的問題很容易看到,每次都是把全部的數據內容進行備份,備份數據中有大量的重複數據,而且徹底備份的時間和恢復的時間很長。解決徹底備份存在的問題就是使用增量備份的方式,增量備份就是備份自上一次備份以後增長或改變的文件或者內容。mysql

增量備份的特色:

增量備份的優勢是沒有重複數據,備分量不大,時間短。缺點也很明顯,須要上次徹底備份及徹底備份以後全部的增量備份才能恢復,並且對全部增量備份進行逐個反推恢復,操做較爲繁瑣。
MySQL沒有提供直接的增量備份方法,可是能夠經過MySQL的二進制日誌(binary logs)簡介間接實現增量備份。二進制日誌對備份的意義以下:sql

  • (1) 二進制日誌保存了全部更新或者可能更新數據庫的操做。
  • (2) 二進制日誌在啓動MySQL服務器後開始記錄,並在文件達到max_binlog_size所設置的大小或者接收到flush-logs命令後從新建立新的日誌文件。
  • (3) 只須要定時執行flush-logs方法從新建立新的日誌,生成二進制文件序列,並及時把這些日誌保存到安全的地方就完成了一個時間段的增量備份。

實驗環境:

CentOS7.3上的MySQL-5.7.17數據庫

1、 增量備份恢復

1. 建立數據庫、數據表並添加數據

#systemctl stop firewalld.service           //關閉防火牆
#setenforce 0                           //關閉加強安全功能
#systemctl restart mysqld.service       //重啓mysql
#mysql –u root –p                   //登陸進入mysql
>create database school;                //建立數據庫school
>use school;                            //進入school
>create table info (name varchar(10),score decimal(5,2));   //建立數據表info
>insert into info (name,score) values (‘zhangsan’,88);      //向info中插入數據
>insert into info (name,score) values (‘lisi’,88);          
>select * from info;                                    //查看數據表info中數據
>exit

2.修改mysql配置文件,開啓二進制日誌功能,並重啓mysql服務

#vim /etc/my.cnf
[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
character_set_server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket = /usr/local/mysql/mysql.sock
server-id = 1
log-bin=mysql-bin                       //添加二進制日誌功能
#systemctl restart mysql.service            //重啓mysql服務

3.使用mysqldump備份school數據庫

#mysqldump –u root –p school > /opt/school.sql

4.執行flush-logs生成新的二進制文件

#mysqladmin –u root –p flush-logs
#ls /usr/local/mysql/data               //生成了新的二進制文件mysql-bin.000002

5.添加test01數據並執行flush-logs生成新的二進制文件

#mysql –u root –p
>use school;
>insert into info (name,score) values (‘test01’,60);
>exit
#mysqladmin –u root –p flush-logs
#ls

6.添加test02數據並執行flush-logs生成新的二進制文件

#mysql –u root –p
>use school;
>insert into info (name,score) values (‘test02’,60);
>exit
#mysqladmin –u root –p flush-logs
#ls

7.模擬誤操做刪除test0一、test02

#mysql –u root –p
>use school;
>delete from info where name=’test01’;
>delete from info where name=’test02’;
>exit

8.使用二進制文件進行恢復操做,須要注意的是恢復的順序,要先恢復最早生成的二進制文件,而後依次執行。

#mysqlbinlog --no-defaults mysql-bin.000002 | mysql –u root –p
#mysql –u root –p
>use school;
>select * from info;                //test01已經恢復,可知test01刪除記錄保存在mysql-bin.000002中
>exit
#mysqlbinlog –no-defaults mysql-bin.000003 | mysql –u root –p
#mysql  -u root –p
>use school;
>select * from info;                //test02已恢復,test02的刪除記錄保存在mysql-bin.000003中
>exit

9.查看二進制變動文件內容所用命令爲

#mysqlbinlog --no-defaults --base64-output=decode-rows –v mysql-bin.000002

二.mysql基於時間點的恢復

1.先建立好school數據庫,info表,在表中增長數據name=’tom’,score=88;name=’jerry’,score=88

2.修改mysql配置文件,開啓二進制日誌功能,並重啓mysql服務

#vim /etc/my.cnf
[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
character_set_server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket = /usr/local/mysql/mysql.sock
server-id = 1
log-bin=mysql-bin
#systemctl restart mysql.service

3.進行徹底備份及增量備份

#mysqldump –u root –p school > /opt/school.sql              //進行徹底備份
#mysqladmin –u root –p flush-logs                           //進行增量備份生成mysql-bin.000002

4.模擬誤操做,添加test01,刪除tom,添加test02

>insert into info(name,score) values (‘test01’,88);
>delete from info where name=’tom’;
>insert into info(name,score) values (‘test02’,88);

5.添加增量備份

#mysqladmin –u root –p flush-logs                           //生成增量備份mysql-bin.000003

6.利用二進制變動文件查看具體操做,並導入新建文本文檔方便管理

#mysqlbinlog --no-defaults --base64-output=decode-rows –v mysql-bin.000002 > /opt/info.txt
#vim /opt/info.txt

7.找到對應操做的時間標記和位置標記

  • 180705 9:55:42 錯誤操做時間 --stop-datetime
  • 180705 9:55:49 正確操做時間 --start-datetime
  • at 563 上一次正確操做節點 --stop-position
  • at 660 下一次正確操做節點 --start-position

8.先利用徹底備份恢復tom和jerry的數據

>drop table info;
#mysql –u root –p school < /opt/school.sql
>mysql –u root –p
>use school;
>show tables;
>select * from info;
>exit

9.基於時間點的恢復

#mysqlbinlog –no-defaults –stop-datetime=’2018-07-05 9:55:42’ /usr/local/mysql/data/mysql-bin.000002 | mysql –u root –p             //注意時間格式須要用-鏈接

進入info後能夠發現test01已恢復vim

##mysqlbinlog –no-defaults –start-datetime=’2018-07-05 9:55:49’ /usr/local/mysql/data/mysql-bin.000002 | mysql –u root –p

進入info可發現test02已恢復,從而基於時間點的恢復完成安全

三.基於位置的恢復

1.先準備好誤操做環境,將test01,test02環境

>delete from info where name=’test01’;
>delete from info where name=’test02’;

2.基於位置的恢復

#mysqlbinlog –no-defaults –stop-position =’563’ /usr/local/mysql/data/mysql-bin.000002 | mysql –u root –p                   //上一次正確操做節點
#mysqlbinlog –no-defaults –start-position=’660’ /usr/local/mysql/data/mysql-bin.000002 | mysql –u root –p                   //下一次正確操做節點

進入school的info中再次查看,能夠發現test01和test02已經恢復。服務器

相關文章
相關標籤/搜索