MySQL備份與恢復實戰


一、什么是備份與增量恢復

(一)什么是全量備份與增量備份

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 | 趙六     |
+----+----------+

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM