一、什么是備份與增量恢復
(一)什么是全量備份與增量備份
1、全量備份
全量備份就是將數據庫中所有數據進行備份。
-- 1、innodb -- 備份所有庫 mysqldump -uroot -p -S /data/3306/mysql.sock -F --single-transaction -A -B|gzip > /temp/allbak_$(date+%F).sql.gz -- 備份單個庫 mysqldump -uroot -p -S /data/3306/mysql.sock -F --single-transaction -B crm|gzip > /temp/crmbak_$(date+%F).sql.gz -- 2、myisam -- 備份所有庫 mysqldump -uroot -p -S /data/3306/mysql.sock -F --lock-all-tables -A -B|gzip > /temp/allbak_$(date+%F).sql.gz -- 備份單個庫 mysqldump -uroot -p -S /data/3306/mysql.sock -F --lock-all-tables -B crm|gzip > /temp/crmbak_$(date+%F).sql.gz
2、增量備份
增量備份是上次全量備份后,更新的新數據。對於MySQL來講,binlog日志就是其增量數據。
(二)增量恢復
1、什么時候需要增量恢復
利用二進制日志以及全備進行恢復的過程就是增量恢復。那么它一般在下面的幾種場景中需要使用:
- 遷移或者升級數據庫
- 增加從庫
- 人為進行DML,DDL語句,比如:drop database db;等,從庫也會執行。
當然,對於主從庫宕機是不需要進行增量恢復的,如果主庫宕機,直接切換到從庫即可。
2、增量恢復的必備條件
- 開啟log-bin日志功能(在my.cnf中配置),主庫和從庫都要開啟該功能
- 全備文件
- 全備之后到出問題時刻的增量binlog日志文件
二、備份與增量恢復實戰
(一)圖解備份與恢復
加入現在有這樣一個場景,主庫正在穩定的提供寫的服務,突然在下午16:00由於員工操作失誤導致寫的庫crm被誤刪,在16:10分發現問題,然后進行恢復:
- 問題過程
(1)夜晚0:00數據庫做定時備份,並且刷新binlog,由之前的mysql-bin000001刷新為mysql-bin000002,之后所有的數據庫更新操作記錄在新的binlog文件中。
(2)第二天16::00出現錯誤操作,刪除了crm庫,導致后續的數據無法寫入。
(3)16:10發現問題,並且進行恢復
- 恢復過程
(1)導入全備sql文件
(2)恢復0:00-16:00的增量數據
16;00之后由於數據庫已經被刪除,所以不需要關注這段時間。
(二)實戰演練
1、數據准備
-- 創建數據庫 mysql> create database crm default character set utf8 collate utf8_general_ci; Query OK, 1 row affected (0.02 sec) -- 創建表 mysql> create table userinfo( -> id int(10) not null primary key auto_increment, -> username varchar(40) not null -> ) engine=InnoDB default charset=utf8; Query OK, 0 rows affected (0.05 sec) -- 插入數據 mysql> insert into userinfo(id,username) value(1,'張三'),(2,'李四'); Query OK, 2 rows affected (0.01 sec) Records: 2 Duplicates: 0 Warnings: 0 -- 查看數據 mysql> select * from userinfo; +----+----------+ | id | username | +----+----------+ | 1 | 張三 | | 2 | 李四 | +----+----------+ 2 rows in set (0.00 sec)
2、數據全備
[root@hadoop-slave1 /]# mysqldump -uroot -p123456 -S /data/3306/mysql.sock -F -B --master-data=2 crm > /temp/crm_bak.sql
- -F刷新binlog此時多生成了一個mysql-bin000007文件,后續的數據庫更新操作記錄於此
- -B指定要備份的數據庫crm
- --master-data備份文件中記錄binlog位置,用於主從同步
3、模擬繼續寫入數據
在0:00-16:00仍舊有用戶寫入數據:
-- 插入數據 [root@hadoop-slave1 /]# mysql -uroot -p123456 -S /data/3306/mysql.sock -e "use crm;insert into userinfo(id,username) value(3,'王五'),(4,'趙六');" -- 查看數據 [root@hadoop-slave1 /]# mysql -uroot -p123456 -S /data/3306/mysql.sock -e "use crm; select * from userinfo;" +----+----------+ | id | username | +----+----------+ | 1 | 張三 | | 2 | 李四 | | 3 | 王五 | | 4 | 趙六 | +----+----------+
4、模擬刪除數據庫操作
在16:10刪除數據庫crm:
-- 刪除數據庫crm,以及查看數據庫是否存在 [root@hadoop-slave1 /]# mysql -uroot -p123456 -S /data/3306/mysql.sock -e "drop database crm;show databases;" +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | reptest | | test | +--------------------+
5、增量恢復
發現問題,然后進行數據庫的恢復,注意的是在恢復之前需要停止數據庫服務,避免數據庫再次被寫入,這會給恢復數據造成很大的難度。當然本案例因為是已經刪除了數據庫,所以不存在再次寫入的問題。
- 檢查全備
-- 檢查全備 [root@hadoop-slave1 /]# ll /temp/ total 672 -rw-r--r--. 1 root root 2197 Sep 14 23:04 crm_bak.sql
- 刷新binlog並且備份出binlog
首先通過全備,查看備份的位置點,位置點后的就是增量備份在/temp/crm_bak.sql文件中:
-- -- Position to start replication or point-in-time recovery from -- -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000007', MASTER_LOG_POS=107; -- -- Current Database: `crm` --
找到如上的位置點,增量備份的數據就是這個位置點之后的數據,所以需要備份的增量數據就是mysql-bin.000007文件中的數據。
現在知道的是增量備份的數據是mysql-bin.000007文件中的數據,但是在備份這個增量數據之前,還需要刷新binlog,因為在你備份時可能還會有數據寫入,這樣就會寫入下一個binlog文件中。
-- 刷新binlog,可以看到多出一個 mysql-bin.000008文件 [root@hadoop-slave1 /]# mysqladmin -uroot -p123456 -S /data/3306/mysql.sock flush-logs [root@hadoop-slave1 /]# ll /data/3306 total 52 ... -rw-rw----. 1 mysql mysql 495 Sep 12 16:41 mysql-bin.000004 -rw-rw----. 1 mysql mysql 311 Sep 12 16:51 mysql-bin.000005 -rw-rw----. 1 mysql mysql 886 Sep 14 23:04 mysql-bin.000006 -rw-rw----. 1 mysql mysql 449 Sep 14 23:31 mysql-bin.000007 -rw-rw----. 1 mysql mysql 107 Sep 14 23:31 mysql-bin.000008 ...
接下來再備份增量數據mysql-bin.000007:
[root@hadoop-slave1 /]# mysqlbinlog -d crm /data/3306/mysql-bin.000007>/temp/bin.sql
重要的是刪除bin.sql中有問題的語句,就是drop crm語句。
- 增量恢復
此時已經有全備和增量的sql文件了。
[root@hadoop-slave1 /]# ll /temp/ total 676 -rw-r--r--. 1 root root 1786 Sep 14 23:36 bin.sql -rw-r--r--. 1 root root 2197 Sep 14 23:04 crm_bak.sql
可進行恢復:
-- 全備恢復 [root@hadoop-slave1 /]# mysql -uroot -p123456 -S /data/3306/mysql.sock < /temp/crm_bak.sql -- 增量恢復 [root@hadoop-slave1 /]# mysql -uroot -p123456 -S /data/3306/mysql.sock < /temp/bin.sql -- 查看 [root@hadoop-slave1 /]# mysql -uroot -p123456 -S /data/3306/mysql.sock -e "show databases;use crm; select * from userinfo;" +--------------------+ | Database | +--------------------+ | information_schema | | crm | | mysql | | performance_schema | | reptest | | test | +--------------------+ +----+----------+ | id | username | +----+----------+ | 1 | 張三 | | 2 | 李四 | | 3 | 王五 | | 4 | 趙六 | +----+----------+