每个InnoDB的页面都会包含一个LSN信息,每当相关的数据发生改变,相关的页面的LSN就会自动增长。这正是InnoDB表可以进行增量备份的基础,即innobackupex通过备份上次完全备份之后发生改变的页面来实现。
要实现第一次增量备份,可以使用下面的命令进行:
# innobackupex --incremental /backup --incremental-basedir=BASEDIR
其中,BASEDIR指的是完全备份所在的目录,此命令执行结束后,innobackupex命令会在/backup目录中创建一个新的以时间命名的目录以存放所有的增量备份数据。另外,在执行过增量备份之后再一次进行增量备份时,其--incremental-basedir应该指向上一次的增量备份所在的目录。
需要注意的是,增量备份仅能应用于InnoDB或XtraDB表,对于MyISAM表而言,执行增量备份时其实进行的是完全备份。
“准备”(prepare)增量备份与整理完全备份有着一些不同,尤其要注意的是:
(1)需要在每个备份(包括完全和各个增量备份)上,将已经提交的事务进行“重放”。“重放”之后,所有的备份数据将合并到完全备份上。
(2)基于所有的备份将未提交的事务进行“回滚”。
于是,操作就变成了:
# innobackupex --apply-log --redo-only BASE-DIR
接着执行:
# innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1
而后是第二个增量:
# innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-2
innobackupex --copy-back /path/to/BACKUP-DIR #最起始的数据
其中BASE-DIR指的是完全备份所在的目录,而INCREMENTAL-DIR-1指的是第一次增量备份的目录,INCREMENTAL-DIR-2指的是第二次增量备份的目录,其它依次类推,即如果有多次增量备份,每一次都要执行如上操作
实例说明:本次实战练习增量数据的备份和恢复,在实验过程中经历过两次增量,并对相应的数据库做出了修改,增量完成后,停止mysql数据库,删除数据目录,进行数据恢复操作。
实现代码如下:
innobackupex --user=root /mybackups/ #第一次完全备份
innobackupex --incremental /mybackups/ --incremental-basedir=/mybackups/2016-11-22_19-24-37/ #第一次增量备份,向hellodb数据库中插入了表及其删除了表t1
innobackupex --incremental /mybackups/ --incremental-basedir=/mybackups/2016-11-22_19-27-55/ #第二次增量备份,此时修改了数据库mydbs,创建了表和插入了数据
innobackupex --apply-log --redo-only /mybackups/2016-11-22_19-24-37/ #将已近提交的事务重放
innobackupex --apply-log --redo-only /mybackups/2016-11-22_19-24-37/ --incremental-dir=/mybackups/2016-11-22_19-27-55/ #重放之后,所有的备份数据合并到完全备份中
innobackupex --apply-log --redo-only /mybackups/2016-11-22_19-24-37/ --incremental-dir=/mybackups/2016-11-22_19-29-57/ #重放之后,所有的备份数据合并到完全备份中
innobackupex --copy-back /mybackups/2016-11-22_19-24-37/ #此时数据已经和最后一次增量同步,使用此数据进行恢复
[root@centos6 data]# cd /mybackups/2016-11-22_19-24-37/
[root@centos6 2016-11-22_19-24-37]# cat xtrabackup_checkpoints
backup_type = full-prepared #第一次完全备份,重放后将和最后一次增量备份中的序列号信息一致
from_lsn = 0
to_lsn = 1708653
last_lsn = 1708653
compact = 0
[root@centos6 2016-11-22_19-24-37]# cat ../2016-11-22_19-29-57/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 1703868
to_lsn = 1708653
last_lsn = 1708653
compact = 0
[root@centos6 2016-11-22_19-24-37]# cat xtrabackup_binlog_info
master-bin.000006 8434
[root@centos6 2016-11-22_19-24-37]# cat ../2016-11-22_19-29-57/xtrabackup_binlog_info
master-bin.000006 8434
[root@centos6 2016-11-22_19-24-37]#
[root@centos6 data]# ll
总用量 18456
drwxr-xr-x. 2 root root 4096 11月 22 19:37 hellodb
-rw-r--r--. 1 root root 18874368 11月 22 19:37 ibdata1
drwxr-xr-x. 2 root root 4096 11月 22 19:37 mydb
drwxr-xr-x. 2 root root 4096 11月 22 19:37 mydbs
drwxr-xr-x. 2 root root 4096 11月 22 19:37 mysql
drwxr-xr-x. 2 root root 4096 11月 22 19:37 performance_schema
drwxr-xr-x. 2 root root 4096 11月 22 19:37 test
[root@centos6 data]# chown -R mysql.mysql ./*
[root@centos6 data]# cd ../binlogs/
[root@centos6 binlogs]# mysqlbinlog --start-position=245 master-bin.000007
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#161122 19:31:08 server id 1 end_log_pos 245 Start: binlog v 4, server v 5.5.32-MariaDB-log created 161122 19:31:08
# Warning: this binlog is either in use or was not closed properly.
BINLOG '
fCw0WA8BAAAA8QAAAPUAAAABAAQANS41LjMyLU1hcmlhREItbG9nAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAA2QAEGggAAAAICAgCAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAA+1uD6g==
'/*!*/;
# at 245
#161122 19:31:49 server id 1 end_log_pos 355 Querythread_id=9exec_time=0error_code=0
use `mydbs`/*!*/;
SET TIMESTAMP=1479814309/*!*/;
SET @@session.pseudo_thread_id=9/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=0/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=8/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
create table students(id int,name varchar(20))
/*!*/;
# at 355
#161122 19:32:26 server id 1 end_log_pos 424 Querythread_id=9exec_time=0error_code=0
SET TIMESTAMP=1479814346/*!*/;
BEGIN
/*!*/;
# at 424
#161122 19:32:26 server id 1 end_log_pos 537 Querythread_id=9exec_time=0error_code=0
SET TIMESTAMP=1479814346/*!*/;
insert into students values (1,'tom'),(2,'jerry')
/*!*/;
# at 537
#161122 19:32:26 server id 1 end_log_pos 564 Xid = 155
COMMIT/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
[root@centos6 binlogs]# mysqlbinlog --start-position=245 master-bin.000007>/root/incr.sql
[root@centos6 ~]# mysql
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 3
Server version: 5.5.32-MariaDB-log MariaDB Server
Copyright (c) 2000, 2013, Oracle, Monty Program Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]>set sql_log_bin=0;
MariaDB [hellodb]>source /root/incr.sql
MariaDB [hellodb]>set sql_log_bin=1;
MariaDB [hellodb]>use mydbs;
MariaDB [mydbs]> show tables;
+-----------------+
| Tables_in_mydbs |
+-----------------+
| students |
| t1 |
+-----------------+
2 rows in set (0.00 sec)
MariaDB [mydbs]> select * from studnets;
ERROR 1146 (42S02): Table 'mydbs.studnets' doesn't exist
MariaDB [mydbs]> select * from students;
+------+-------+
| id | name |
+------+-------+
| 1 | tom |
| 2 | jerry |
+------+-------+
2 rows in set (0.00 sec)
MariaDB [mydbs]> use hellodb;
Database changed
MariaDB [hellodb]> show tables;
+-------------------+
| Tables_in_hellodb |
+-------------------+
| classes |
| coc |
| courses |
| scores |
| students |
| tbl |
| teachers |
| toc |
+-------------------+
8 rows in set (0.00 sec)
MariaDB [hellodb]>