1. 程式人生 > >MySQL增量備份恢復和基於時間點與位置的恢復

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

local 間接 恢復 efault posit 創建 val etc 節點

為什麽使用增量備份?

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

增量備份的特點:

增量備份的優點是沒有重復數據,備份量不大,時間短。缺點也很明顯,需要上次完全備份及完全備份之後所有的增量備份才能恢復,而且對所有增量備份進行逐個反推恢復,操作較為繁瑣。
MySQL沒有提供直接的增量備份方法,但是可以通過MySQL的二進制日誌(binary logs)簡介間接實現增量備份。二進制日誌對備份的意義如下:

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

實驗環境:

CentOS7.3上的MySQL-5.7.17

一、 增量備份恢復

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.模擬誤操作刪除test01、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已恢復

##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已經恢復。

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