7、使用Xtrabackup对数据库进行部分备份
Xtrabackup也可以实现部分备份,即只备份某个或某些指定的数据库或某数据库中的某个或某些表。但要使用此功能,必须启用innodb_file_per_table选项,即每张表保存为一个独立的文件。同时,其也不支持–stream选项,即不支持将数据通过管道传输给其它程序进行处理。
此外,还原部分备份跟还原全部数据的备份也有所不同,即你不能通过简单地将prepared的部分备份使用–copy-back选项直接复制回数据目录,而是要通过导入表的方向来实现还原。当然,有些情况下,部分备份也可以直接通过–copy-back进行还原,但这种方式还原而来的数据多数会产生数据不一致的问题,因此,无论如何不推荐使用这种方式。
(1)创建部分备份
创建部分备份的方式有三种:正则表达式(–include), 枚举表文件(–tables-file)和列出要备份的数据库(–databases)。
(a)使用–include使用–include时,要求为其指定要备份的表的完整名称,即形如databasename.tablename,如:
# innobackupex --include='^feiyu[.]tb1' /path/to/backup
(b)使用–tables-file此选项的参数需要是一个文件名,此文件中每行包含一个要备份的表的完整名称;如:
# echo -e 'feiyu.tb1\nmageedu.tb2' > /tmp/tables.txt
# innobackupex --tables-file=/tmp/tables.txt /path/to/backup
(c)使用–databases此选项接受的参数为数据名,如果要指定多个数据库,彼此间需要以空格隔开;同时,在指定某数据库时,也可以只指定其中的某张表。此外,此选项也可以接受一个文件为参数,文件中每一行为一个要备份的对象。如:
# innobackupex --databases="feiyu testdb" /path/to/backup
(2)整理(preparing)部分备份prepare部分备份的过程类似于导出表的过程,要使用–export选项进行:
# innobackupex --apply-log --export /pat/to/partial/backup
此命令执行过程中,innobackupex会调用xtrabackup命令从数据字典中移除缺失的表,因此,会显示出许多关于“表不存在”类的警告信息。同时,也会显示出为备份文件中存在的表创建.exp文件的相关信息。
(3)还原部分备份还原部分备份的过程跟导入表的过程相同。当然,也可以通过直接复制prepared状态的备份直接至数据目录中实现还原,不要此时要求数据目录处于一致状态。
下面实际演示其完整的备份流程:
←#14#root@localhost /tmp/full-backup →innobackupex --user=root /tmp/full-backup/ #完全备份
InnoDB Backup Utility v1.5.1-xtrabackup; Copyright 2003, 2009 Innobase Oy
and Percona LLC and/or its affiliates 2009-2013. All Rights Reserved.
。。。。。。。。。。
xtrabackup: The latest check point (for incremental): '2987626'
xtrabackup: Stopping log copying thread.
.>> log scanned up to (2987626)
xtrabackup: Creating suspend file '/tmp/full-backup/2015-06-25_05-58-26/xtrabackup_log_copied' with pid '7858'
xtrabackup: Transaction log of lsn (2987626) to (2987626) was copied.
150625 05:58:30 innobackupex: All tables unlocked
innobackupex: Backup created in directory '/tmp/full-backup/2015-06-25_05-58-26'
innobackupex: MySQL binlog position: filename 'mysql-bin.000001', position 2383
150625 05:58:30 innobackupex: Connection to database server closed
150625 05:58:30 innobackupex: completed OK!mysql> insert into tutors(tname) values('stu00011');#在数据库中插入数据
Query OK, 1 row affected (0.03 sec)
mysql> insert into tutors(tname) values('stu00012');
Query OK, 1 row affected (0.00 sec)←#246#root@localhost /tmp →innobackupex --incremental /tmp/full-backup/ --incremental-basedir=/tmp/full-backup/2015-06-25_05-58-26/ #做增量备份
InnoDB Backup Utility v1.5.1-xtrabackup; Copyright 2003, 2009 Innobase Oy
and Percona LLC and/or its affiliates 2009-2013. All Rights Reserved.
。。。。。。。。。。。
xtrabackup: Creating suspend file '/tmp/full-backup/2015-06-25_06-00-48/xtrabackup_log_copied' with pid '8663'
xtrabackup: Transaction log of lsn (2988209) to (2988209) was copied.
150625 06:00:53 innobackupex: All tables unlocked
innobackupex: Backup created in directory '/tmp/full-backup/2015-06-25_06-00-48'
innobackupex: MySQL binlog position: filename 'mysql-bin.000001', position 2924
150625 06:00:53 innobackupex: Connection to database server closed
150625 06:00:53 innobackupex: completed OK!mysql> insert into tutors(tname) values('stu00014'); #再次插入数据
Query OK, 1 row affected (0.02 sec)
mysql> insert into tutors(tname) values('stu00015');
Query OK, 1 row affected (0.00 sec)←#247#root@localhost /tmp →innobackupex --incremental /tmp/full-backup/ --incremental-basedir=/tmp/full-backup/2015-06-25_06-00-48 #再次做增量备份
InnoDB Backup Utility v1.5.1-xtrabackup; Copyright 2003, 2009 Innobase Oy
and Percona LLC and/or its affiliates 2009-2013. All Rights Reserved
。。。。。。。。。
xtrabackup: Creating suspend file '/tmp/full-backup/2015-06-25_06-02-41/xtrabackup_log_copied' with pid '9259'
xtrabackup: Transaction log of lsn (2988781) to (2988781) was copied.
150625 06:02:45 innobackupex: All tables unlocked
innobackupex: Backup created in directory '/tmp/full-backup/2015-06-25_06-02-41'
innobackupex: MySQL binlog position: filename 'mysql-bin.000001', position 3465
150625 06:02:46 innobackupex: Connection to database server closed
150625 06:02:46 innobackupex: completed OK!←#266#root@localhost /tmp/full-backup/2015-06-25_05-58-26 →cat xtrabackup_checkpoints #查看日志序列号是否一致
backup_type = log-applied
from_lsn = 0
to_lsn = 2987626
last_lsn = 2987626
compact = 0
←#267#root@localhost /tmp/full-backup/2015-06-25_05-58-26 →cd ../2015-06-25_06-00-48/
←#268#root@localhost /tmp/full-backup/2015-06-25_06-00-48 →cat xtrabackup_checkpoints
backup_type = incremental
from_lsn = 2987626
to_lsn = 2988209
last_lsn = 2988209
compact = 0
←#269#root@localhost /tmp/full-backup/2015-06-25_06-00-48 →cd ../2015-06-25_06-02-41/
←#270#root@localhost /tmp/full-backup/2015-06-25_06-02-41 →cat xtrabackup_checkpoints
backup_type = incremental
from_lsn = 2988209
to_lsn = 2988781
last_lsn = 2988781
compact = 0←#248#root@localhost /tmp →innobackupex --apply-log --redo-only /tmp/full-backu2015-06-25_05-58-26/ #做准备
InnoDB Backup Utility v1.5.1-xtrabackup; Copyright 2003, 2009 Innobase Oy
and Percona LLC and/or its affiliates 2009-2013. All Rights Reserved.
[notice (again)]
If you use binary log and don't use any hack of group commit,
the binary log position seems to be:
InnoDB: Last MySQL binlog file position 0 2241, file name ./mysql-bin.000001
xtrabackup: starting shutdown with innodb_fast_shutdown = 1
InnoDB: Starting shutdown...
InnoDB: Shutdown completed; log sequence number 2987626
150625 06:04:03 innobackupex: completed OK!
←#249#root@localhost /tmp →innobackupex --apply-log --redo-only /tmp/full-backu2015-06-25_05-58-26/ --incremental-dir=/tmp/full-backup/2015-06-25_06-00-48/ #合并第一次增量备份文件
。。。。。。。。。。
innobackupex: Copying '/tmp/full-backup/2015-06-25_06-00-48/management/admin.frm' to '/tmp/full-backup/2015-06-25_05-58-26/management/admin.frm'
150625 06:05:28 innobackupex: completed OK!
←#251#root@localhost /tmp →innobackupex --apply-log --redo-only /tmp/full-backu2015-06-25_05-58-26/ --incremental-dir=/tmp/full-backup/2015-06-25_06-02-41/ #合并第二次增量备份文件
。。。。。。。。。。。。。。。。
innobackupex: Copying '/tmp/full-backup/2015-06-25_06-02-41/management/classinfo.frm' to '/tmp/full-backup/2015-06-25_05-58-26/management/classinfo.frm'
innobackupex: Copying '/tmp/full-backup/2015-06-25_06-02-41/management/admin.frm' to '/tmp/full-backup/2015-06-25_05-58-26/management/admin.frm'
150625 06:07:10 innobackupex: completed OK!
←#258#root@localhost ~ →rm -rf /mydata/data1/* #删除数据文件目录
←#259#root@localhost ~ →innobackupex --copy-back /tmp/full-backup/2015-06-25_05-58-26/ #恢复
。。。。。。。。。。。。。。。。
innobackupex: Starting to copy InnoDB log files
innobackupex: in '/tmp/full-backup/2015-06-25_05-58-26'
innobackupex: back to original InnoDB log directory '/mydata/data1'
innobackupex: Finished copying back files.
150625 06:12:29 innobackupex: completed OK!
←#276#root@localhost /mydata/data1 →chown -R mysql.mysql ./* #修改属主和属组