增量备份是指在一次全备份或上一次增量备份后,之后每次的备份只需备份与前一次相比增长或者被修改的文件。这就意味着,第一次增量 备份的对象是进行全备后所产生的增长和修改的文件;第二次增量备份的对象是进行第一次增量备份后所产生的增长和修改的文件,如此类推。 这种备份方式最显著的优势就是:没有重复的备份数据,所以备份的数据量不大,备份所需的时间很短。但增量备份的数据恢复是比较麻烦的。 必须具备上一次全备份和全部增量备份(一旦丢失或损坏其中的一个增量,就会形成恢复的失败),而且它们必须沿着从全备份到依次增量备份 的时间顺序逐个恢复,所以这就极大地延长了恢复时间。 假如咱们有一个数据库,有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 | +------+-------------+
所有数据还原成功!服务器