Docs/数据库/mysql/Xtrabackup备份mysql
2022-10-18 16:59:37 +08:00

186 lines
12 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

使用Xtrabackup进行MySQL备份
一、安装
1、简介
Xtrabackup是由percona提供的mysql数据库备份工具据官方介绍这也是世界上惟一一款开源的能够对innodb和xtradb数据库进行热备的工具。特点
(1)备份过程快速、可靠;
(2)备份过程不会打断正在执行的事务;
(3)能够基于压缩等功能节约磁盘空间和流量;
(4)自动实现备份检验;
(5)还原速度快;
2、安装
其最新版的软件可从 http://www.percona.com/software/percona-xtrabackup/ 获得。本文基于RHEL5.8的系统因此直接下载相应版本的rpm包安装即可这里不再演示其过程。
二、备份的实现
1、完全备份
# innobackupex --user=DBUSER --password=DBUSERPASS /path/to/BACKUP-DIR/
如果要使用一个最小权限的用户进行备份,则可基于如下命令创建此类用户:
mysql> CREATE USER bkpuser@localhost IDENTIFIED BY s3cret;
mysql> REVOKE ALL PRIVILEGES, GRANT OPTION FROM bkpuser;
mysql> GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO bkpuser@localhost;
mysql> FLUSH PRIVILEGES;
使用innobakupex备份时其会调用xtrabackup备份所有的InnoDB表复制所有关于表结构定义的相关文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相关文件同时还会备份触发器和数据库配置信息相关的文件。这些文件会被保存至一个以时间命令的目录中。
在备份的同时innobackupex还会在备份目录中创建如下文件
(1)xtrabackup_checkpoints —— 备份类型如完全或增量、备份状态如是否已经为prepared状态和LSN(日志序列号)范围信息;
每个InnoDB页(通常为16k大小)都会包含一个日志序列号即LSN。LSN是整个数据库系统的系统版本号每个页面相关的LSN能够表明此页面最近是如何发生改变的。
(2)xtrabackup_binlog_info —— mysql服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置。
(3)xtrabackup_binlog_pos_innodb —— 二进制日志文件及用于InnoDB或XtraDB表的二进制日志文件的当前position。
(4)xtrabackup_binary —— 备份中用到的xtrabackup的可执行文件
(5)backup-my.cnf —— 备份命令用到的配置选项信息;
在使用innobackupex进行备份时还可以使用--no-timestamp选项来阻止命令自动创建一个以时间命名的目录如此一来innobackupex命令将会创建一个BACKUP-DIR目录来存储备份数据。
2、准备(prepare)一个完全备份
一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。“准备”的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态。
innobakupex命令的--apply-log选项可用于实现上述功能。如下面的命令
# innobackupex --apply-log /path/to/BACKUP-DIR
如果执行正确,其最后输出的几行信息通常如下:
xtrabackup: starting shutdown with innodb_fast_shutdown = 1
120407 9:01:36 InnoDB: Starting shutdown...
120407 9:01:40 InnoDB: Shutdown completed; log sequence number 92036620
120407 09:01:40 innobackupex: completed OK!
在实现“准备”的过程中innobackupex通常还可以使用--use-memory选项来指定其可以使用的内存的大小默认通常为100M。如果有足够的内存可用可以多划分一些内存给prepare的过程以提高其完成速度。
3、从一个完全备份中恢复数据
注意恢复不用启动MySQL
innobackupex命令的--copy-back选项用于执行恢复操作其通过复制所有数据相关的文件至mysql服务器DATADIR目录中来执行恢复过程。innobackupex通过backup-my.cnf来获取DATADIR目录的相关信息。
# innobackupex --copy-back /path/to/BACKUP-DIR
如果执行正确,其输出信息的最后几行通常如下:
innobackupex: Starting to copy InnoDB log files
innobackupex: in '/backup/2012-04-07_08-17-03'
innobackupex: back to original InnoDB log directory '/mydata/data'
innobackupex: Finished copying back files.
120407 09:36:10 innobackupex: completed OK!
请确保如上信息的最行一行出现“innobackupex: completed OK!”。
当数据恢复至DATADIR目录以后还需要确保所有数据文件的属主和属组均为正确的用户如mysql否则在启动mysqld之前还需要事先修改数据文件的属主和属组。如
# chown -R mysql:mysql /mydata/data/
4、使用innobackupex进行增量备份
每个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
其中BASE-DIR指的是完全备份所在的目录而INCREMENTAL-DIR-1指的是第一次增量备份的目录INCREMENTAL-DIR-2指的是第二次增量备份的目录其它依次类推即如果有多次增量备份每一次都要执行如上操作
5、Xtrabackup的“流”及“备份压缩”功能
Xtrabackup对备份的数据文件支持“流”功能即可以将备份的数据通过STDOUT传输给tar程序进行归档而不是默认的直接保存至某备份目录中。要使用此功能仅需要使用--stream选项即可。如
# innobackupex --stream=tar /backup | gzip > /backup/`date +%F_%H-%M-%S`.tar.gz
甚至也可以使用类似如下命令将数据备份至其它服务器:
# innobackupex --stream=tar /backup | ssh user@www.magedu.com "cat - > /backups/`date +%F_%H-%M-%S`.tar"
此外,在执行本地备份时,还可以使用--parallel选项对多个文件进行并行复制。此选项用于指定在复制时启动的线程数目。当然在实际进行备份时要利用此功能的便利性也需要启用innodb_file_per_table选项或共享的表空间通过innodb_data_file_path选项存储在多个ibdata文件中。对某一数据库的多个文件的复制无法利用到此功能。其简单使用方法如下
# innobackupex --parallel /path/to/backup
同时innobackupex备份的数据文件也可以存储至远程主机这可以使用--remote-host选项来实现
# innobackupex --remote-host=root@www.magedu.com /path/IN/REMOTE/HOST/to/backup
6、导入或导出单张表
默认情况下InnoDB表不能通过直接复制表文件的方式在mysql服务器之间进行移植即便使用了innodb_file_per_table选项。而使用Xtrabackup工具可以实现此种功能不过此时需要“导出”表的mysql服务器启用了innodb_file_per_table选项严格来说是要“导出”的表在其创建之前mysql服务器就启用了innodb_file_per_table选项并且“导入”表的服务器同时启用了innodb_file_per_table和innodb_expand_import选项。
(1)“导出”表
导出表是在备份的prepare阶段进行的因此一旦完全备份完成就可以在prepare过程中通过--export选项将某表导出了
# innobackupex --apply-log --export /path/to/backup
此命令会为每个innodb表的表空间创建一个以.exp结尾的文件这些以.exp结尾的文件则可以用于导入至其它服务器。
(2)“导入”表
要在mysql服务器上导入来自于其它服务器的某innodb表需要先在当前服务器上创建一个跟原表表结构一致的表而后才能实现将表导入
mysql> CREATE TABLE mytable (...) ENGINE=InnoDB;
然后将此表的表空间删除:
mysql> ALTER TABLE mydatabase.mytable DISCARD TABLESPACE;
接下来将来自于“导出”表的服务器的mytable表的mytable.ibd和mytable.exp文件复制到当前服务器的数据目录然后使用如下命令将其“导入”
mysql> ALTER TABLE mydatabase.mytable IMPORT TABLESPACE;
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='^mageedu[.]tb1' /path/to/backup
(b)使用--tables-file
此选项的参数需要是一个文件名,此文件中每行包含一个要备份的表的完整名称;如:
# echo -e 'mageedu.tb1\nmageedu.tb2' > /tmp/tables.txt
# innobackupex --tables-file=/tmp/tables.txt /path/to/backup
(c)使用--databases
此选项接受的参数为数据名,如果要指定多个数据库,彼此间需要以空格隔开;同时,在指定某数据库时,也可以只指定其中的某张表。此外,此选项也可以接受一个文件为参数,文件中每一行为一个要备份的对象。如:
# innobackupex --databases="mageedu testdb" /path/to/backup
(2)整理(preparing)部分备份
prepare部分备份的过程类似于导出表的过程要使用--export选项进行
# innobackupex --apply-log --export /pat/to/partial/backup
此命令执行过程中innobackupex会调用xtrabackup命令从数据字典中移除缺失的表因此会显示出许多关于“表不存在”类的警告信息。同时也会显示出为备份文件中存在的表创建.exp文件的相关信息。
(3)还原部分备份
还原部分备份的过程跟导入表的过程相同。当然也可以通过直接复制prepared状态的备份直接至数据目录中实现还原不要此时要求数据目录处于一致状态。