MySQL備份恢復全實戰

一. 簡介

1. 增量備份

增量備份是指在一次全備份或上一次增量備份後,之後每次的備份只需備份與前一次相比增長或者被修改的文件。這就意味着,第一次增量
備份的對象是進行全備後所產生的增長和修改的文件;第二次增量備份的對象是進行第一次增量備份後所產生的增長和修改的文件,如此類推。
  這種備份方式最顯著的優勢就是:沒有重複的備份數據,所以備份的數據量不大,備份所需的時間很短。但增量備份的數據恢復是比較麻煩的。
必須具備上一次全備份和全部增量備份(一旦丟失或損壞其中的一個增量,就會形成恢復的失敗),而且它們必須沿着從全備份到依次增量備份
的時間順序逐個恢復,所以這就極大地延長了恢復時間。
  假如咱們有一個數據庫,有20G的數據,天天會增長10M的數據,數據庫天天都要全量備份一次,這樣的話服務器的壓力比較大,所以咱們只
須要備份增長的這部分數據,這樣減小服務器的負擔。

2. binlog簡介

binlog日誌由配置文件的log-bin參數來啓用,MySQL服務器將在指定目錄下建立兩個文件XXX-bin.001和xxx-bin.index,若配置選項
沒有給出文件名,Mysql將使用主機名稱命名這兩個文件,其中.index文件包含一份全體日誌文件的清單。
  Mysql會把用戶對全部數據庫的內容和結構的修改狀況記入XXX-bin.n文件,而不會記錄 SELECT和沒有實際更新的UPDATE語句。
  當MySQL數據庫中止或重啓時,服務器會把日誌文件記入下一個日誌文件,Mysql會在重啓時生成一個新的binlog日誌文件,文件序號遞
增,此外,若是日誌文件超過max_binlog_size系統變量配置的上限時,也會生成新的日誌文件。

二 binlog操做總結

2.1 開啓binlog日誌

修改 MySQL 的配置文件my.cnf 以下:
[mysqld] 
log-bin=/MySQL/my3306/log/binlog/binlog  
binlog_format = row 

#其中 log_bin若不顯示指定存儲目錄,則默認存儲在mysql的datadir參數指定的目錄下
#binlog_format的幾種格式:(STATEMENT,ROW和MIXED):
STATEMENT:基於SQL語句的複製(statement-based replication, SBR)    
ROW:基於行的複製(row-based replication, RBR)    
MIXED:混合模式複製(mixed-based replication, MBR)

#啓動後會產生mysql-bin.*這樣的文件,每啓動一次,就會增長一個或者多個.


[root@localhost binlog]# cd /MySQL/my3306/log/binlog
[root@localhost binlog]# ll
total 28
-rw-r-----. 1 mysql mysql 177 Jun  6 00:03 binlog.000001
-rw-r-----. 1 mysql mysql 177 Jun  6 00:03 binlog.000002
-rw-r-----. 1 mysql mysql 981 Jun  6 00:07 binlog.000003
-rw-r-----. 1 mysql mysql 177 Jun  6 00:07 binlog.000004
-rw-r-----. 1 mysql mysql 177 Jun  7 01:39 binlog.000005
-rw-r-----. 1 mysql mysql 154 Jun  7 02:47 binlog.000006
-rw-r-----. 1 mysql mysql 234 Jun  7 02:47 binlog.index

2.2查看binlog相關參數

mysql> show variables like 'log_bin%';
+---------------------------------+---------------------------------------+
| Variable_name                   | Value                                 |
+---------------------------------+---------------------------------------+
| log_bin                         | ON                                    |
| log_bin_basename                | /MySQL/my3306/log/binlog/binlog       |
| log_bin_index                   | /MySQL/my3306/log/binlog/binlog.index |
| log_bin_trust_function_creators | OFF                                   |
| log_bin_use_v1_row_events       | OFF                                   |
+---------------------------------+---------------------------------------+

能夠看到MySQL5.7中,log_bin參數若是指定了目錄和名稱,則被拆分爲三個參數:log_bin,log_bin_basename,log_bin_index
分別對應 binlog是否開啓,binlog名.index名

2.3 查看binlog日誌內容

[root@localhost binlog]# mysqlbinlog /MySQL/my3306/log/binlog/binlog.000001
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#180606  0:03:38 server id 101  end_log_pos 123 CRC32 0xe534323e        Start: binlog v 4, server v 5.7.22-log created 180606  0:03:38 at startup
ROLLBACK/*!*/;
BINLOG '
Gl0XWw9lAAAAdwAAAHsAAAAAAAQANS43LjIyLWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAaXRdbEzgNAAgAEgAEBAQEEgAAXwAEGggAAAAICAgCAAAACgoKKioAEjQA
AT4yNOU=
'/*!*/;
# at 123
#180606  0:03:38 server id 101  end_log_pos 154 CRC32 0x9c28789d        Previous-GTIDs
# [empty]
# at 154
#180606  0:03:39 server id 101  end_log_pos 177 CRC32 0xac9e5d49        Stop
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

2.4 一些經常使用操做

mysql> show master logs;  #查看數據庫全部日誌文件。 
mysql> show binlog events \g;  #查看當前使用的binlog文件信息。 
mysql> show binlog events in 'binlog.000001';  #查看指定的binlog文件信息。 
mysql> flush logs;  #將內存中log日誌寫磁盤,保存在當前binlog文件中,併產生一個新的binlog日誌文件。 
mysql> flush logs; reset master;  #刪除全部二進制日誌,並從新(binlog.000001)開始記錄。

三 MySQL備份實例(全備 + 基於 binlog的增備)

本環境基於CentOS7.2+MySQL5.7mysql

3.1 查看當前數據庫binlog文件

mysql> show master logs;
+---------------+-----------+
| Log_name      | File_size |
+---------------+-----------+
| binlog.000001 |       177 |
| binlog.000002 |       177 |
| binlog.000003 |       981 |
| binlog.000004 |       177 |
| binlog.000005 |       177 |
| binlog.000006 |       154 |
+---------------+-----------+


[root@localhost binlog]# cd /MySQL/my3306/log/binlog/
[root@localhost binlog]# ll -h
total 28K
-rw-r-----. 1 mysql mysql 177 Jun  6 00:03 binlog.000001
-rw-r-----. 1 mysql mysql 177 Jun  6 00:03 binlog.000002
-rw-r-----. 1 mysql mysql 981 Jun  6 00:07 binlog.000003
-rw-r-----. 1 mysql mysql 177 Jun  6 00:07 binlog.000004
-rw-r-----. 1 mysql mysql 177 Jun  7 01:39 binlog.000005
-rw-r-----. 1 mysql mysql 154 Jun  7 02:47 binlog.000006
-rw-r-----. 1 mysql mysql 234 Jun  7 02:47 binlog.index

3.2模擬數據

mysql> create database test_backup;  
mysql> use test_backup 
mysql> create table t_test (c1 int(10), c2 varchar(20)) engine=innodb; 
mysql>  insert into t_test values (1, 'test1'),(2, 'test2'),(3, 'test3'),(4, 'test4'), 
        (5, 'test5'),(6, 'test6'),(7, 'test7'),(8, 'test8'),(9, 'test9'),(10, 'test10');

3.3 將全量數據進行備份

[root@localhost binlog]# mysqldump -uroot -proot  --socket=/MySQL/my3306/run/mysql.sock --port=3306 --single-transaction --master-data=2 test_backup >/tmp/test_backup20180611.sql 
 
#記錄備份的日誌位置,未來做爲增量還原的起點
[root@localhost binlog]# cat /tmp/test_backup20180611.sql|grep "CHANGE MASTER" 
-- CHANGE MASTER TO MASTER_LOG_FILE='binlog.000006', MASTER_LOG_POS=996;

3.4 準備第一份增量數據

mysql> use test_backup; 
mysql> create table increment (c1 int(10), c2 varchar(20)) engine=innodb; 
mysql> insert into increment values (11, 'increment1'),(12, 'increment2'),(13, 'increment3'),(14, 'increment4'),(15, 'increment5');

3.5 將第一份增量數據進行備份

#將日誌刷到當前的binlog文件中,也就是binlog.000006,數據庫再有新的數據更新會記錄在新的binlog(binlog.000007)裏面.
mysql> flush logs;  

[root@localhost binlog]# ll
total 32
-rw-r-----. 1 mysql mysql  177 Jun  6 00:03 binlog.000001
-rw-r-----. 1 mysql mysql  177 Jun  6 00:03 binlog.000002
-rw-r-----. 1 mysql mysql  981 Jun  6 00:07 binlog.000003
-rw-r-----. 1 mysql mysql  177 Jun  6 00:07 binlog.000004
-rw-r-----. 1 mysql mysql  177 Jun  7 01:39 binlog.000005
-rw-r-----. 1 mysql mysql 1658 Jun 10 21:22 binlog.000006
-rw-r-----. 1 mysql mysql  154 Jun 10 21:22 binlog.000007
-rw-r-----. 1 mysql mysql  273 Jun 10 21:22 binlog.index

#拷貝binlog文件
[root@localhost binlog]# cp binlog.000006 /tmp/

3.6 準備第二份增量數據

mysql> use test_backup; 
mysql> insert into increment values (16, 'increment16'),(17, 'increment17'),(18, 'increment18'),(19, 'increment19'),(20, 'increment20');

3.7 將第二份增量數據進行備份

#將日誌刷到當前的binlog文件中,也就是binlog.000007,數據庫再有新的數據更新會記錄在新的binlog(binlog.000008)裏面.
mysql> flush logs;  

[root@localhost binlog]# ll
total 36
-rw-r-----. 1 mysql mysql  177 Jun  6 00:03 binlog.000001
-rw-r-----. 1 mysql mysql  177 Jun  6 00:03 binlog.000002
-rw-r-----. 1 mysql mysql  981 Jun  6 00:07 binlog.000003
-rw-r-----. 1 mysql mysql  177 Jun  6 00:07 binlog.000004
-rw-r-----. 1 mysql mysql  177 Jun  7 01:39 binlog.000005
-rw-r-----. 1 mysql mysql 1658 Jun 10 21:22 binlog.000006
-rw-r-----. 1 mysql mysql  603 Jun 10 22:04 binlog.000007
-rw-r-----. 1 mysql mysql  154 Jun 10 22:04 binlog.000008
-rw-r-----. 1 mysql mysql  312 Jun 10 22:04 binlog.index

#拷貝binlog文件
[root@localhost binlog]# cp binlog.000007 /tmp/

四. mysql還原實例分析(全備還原+基於binlog的增備還原)

#模擬數據庫故障,即刪除全備數據及增備數據庫。
mysql> drop database test_backup;
Query OK, 2 rows affected (0.06 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

4.1 還原全備數據

mysql>create database test_backup;

[root@localhost binlog]# mysql -uroot   -proot  test_backup  </tmp/test_backup20180611.sql

mysql> use test_backup;
Database changed
mysql> show tables;
+-----------------------+
| Tables_in_test_backup |
+-----------------------+
| t_test                |
+-----------------------+

mysql> select * from t_test;
+------+--------+
| c1   | c2     |
+------+--------+
|    1 | test1  |
|    2 | test2  |
|    3 | test3  |
|    4 | test4  |
|    5 | test5  |
|    6 | test6  |
|    7 | test7  |
|    8 | test8  |
|    9 | test9  |
|   10 | test10 |
+------+--------+

4.2 還原第一個增備文件

從全備文件裏的position值:LOG_FILE='binlog.000006', MASTER_LOG_POS=996 開始還原sql

[root@localhost tmp]# mysqlbinlog --start-position=996   binlog.000006 | mysql -uroot -proot

#查看數據:
mysql> select * from test_backup.increment; 
+------+------------+
| c1   | c2         |
+------+------------+
|   11 | increment1 |
|   12 | increment2 |
|   13 | increment3 |
|   14 | increment4 |
|   15 | increment5 |
+------+------------+

第一份增量數據還原成功!數據庫

4.3 還原第二個增備文件(方法同上)

[root]mysqlbinlog  mysqlbinlog    binlog.000007 | mysql -uroot -proot

查看數據:

mysql> select * from test_backup.increment;
+------+-------------+
| c1   | c2          |
+------+-------------+
|   11 | increment1  |
|   12 | increment2  |
|   13 | increment3  |
|   14 | increment4  |
|   15 | increment5  |
|   16 | increment16 |
|   17 | increment17 |
|   18 | increment18 |
|   19 | increment19 |
|   20 | increment20 |
+------+-------------+

所有數據還原成功!服務器

相關文章
相關標籤/搜索