增量備份是指在一次全備份或上一次增量備份後,之後每次的備份只需備份與前一次相比增長或者被修改的文件。這就意味着,第一次增量 備份的對象是進行全備後所產生的增長和修改的文件;第二次增量備份的對象是進行第一次增量備份後所產生的增長和修改的文件,如此類推。 這種備份方式最顯著的優勢就是:沒有重複的備份數據,所以備份的數據量不大,備份所需的時間很短。但增量備份的數據恢復是比較麻煩的。 必須具備上一次全備份和全部增量備份(一旦丟失或損壞其中的一個增量,就會形成恢復的失敗),而且它們必須沿着從全備份到依次增量備份 的時間順序逐個恢復,所以這就極大地延長了恢復時間。 假如咱們有一個數據庫,有20G的數據,天天會增長10M的數據,數據庫天天都要全量備份一次,這樣的話服務器的壓力比較大,所以咱們只 須要備份增長的這部分數據,這樣減小服務器的負擔。
binlog日誌由配置文件的log-bin參數來啓用,MySQL服務器將在指定目錄下建立兩個文件XXX-bin.001和xxx-bin.index,若配置選項 沒有給出文件名,Mysql將使用主機名稱命名這兩個文件,其中.index文件包含一份全體日誌文件的清單。 Mysql會把用戶對全部數據庫的內容和結構的修改狀況記入XXX-bin.n文件,而不會記錄 SELECT和沒有實際更新的UPDATE語句。 當MySQL數據庫中止或重啓時,服務器會把日誌文件記入下一個日誌文件,Mysql會在重啓時生成一個新的binlog日誌文件,文件序號遞 增,此外,若是日誌文件超過max_binlog_size系統變量配置的上限時,也會生成新的日誌文件。
修改 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
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名
[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*/;
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)開始記錄。
本環境基於CentOS7.2+MySQL5.7mysql
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
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');
[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;
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');
#將日誌刷到當前的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/
mysql> use test_backup; mysql> insert into increment values (16, 'increment16'),(17, 'increment17'),(18, 'increment18'),(19, 'increment19'),(20, 'increment20');
#將日誌刷到當前的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> drop database test_backup; Query OK, 2 rows affected (0.06 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+
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 | +------+--------+
從全備文件裏的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 | +------+------------+
第一份增量數據還原成功!數據庫
[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 | +------+-------------+
所有數據還原成功!服務器