基于xtrabackup实现mysql备份还原

简介

Xtrabackup2.2版以前包括4个可执行文件:

innobackupex: Perl 脚本 xtrabackup: C/C++ 编译的二进制 xbstream: 支持并发写的流文件格式 xbcrypt: 加解密 xtrabackup 是用来备份 InnoDB 表的,不能备份非 InnoDB 表,和 MySQLServer 没有交互;innobackupex 脚本用来备份非 InnoDB 表,同时会调用xtrabackup 命令来备份 InnoDB 表,还会和 MySQL Server 发送命令进行交互,如加全局读锁(FTWRL)、获取位点(SHOW SLAVE STATUS)等。即innobackupex是在xtrabackup 之上作了一层封装实现的;mysqldump默认是不支持增量备份的(mysqldump实现增量备份靠的是二进制日志),xtrabackup支持增量备份 innobackupex: Perl 脚本 xtrabackup: C/C++ 编译的二进制 xbstream: 支持并发写的流文件格式 xbcrypt: 加解密 xtrabackup 是用来备份 InnoDB 表的,不能备份非 InnoDB 表,和 MySQLServer 没有交互;innobackupex 脚本用来备份非 InnoDB 表,同时会调用xtrabackup 命令来备份 InnoDB 表,还会和 MySQL Server 发送命令进行交互,如加全局读锁(FTWRL)、获取位点(SHOW SLAVE STATUS)等。即innobackupex是在xtrabackup 之上作了一层封装实现的;mysqldump默认是不支持增量备份的(mysqldump实现增量备份靠的是二进制日志),xtrabackup支持增量备份

xtrabackup下载地址

https://www.percona.com/downloads/Percona-XtraBackup-2.4/
https://www.percona.com/downloads/Percona-XtraBackup-LATEST/          #最新版本下载mysql

xtrabackup备份过程

棕色线条是备份MyISAM存储引擎的表,绿色线条是备份InnoDB存储引擎的表; innobackupex启动后先调用xtrabackup,xtrabackup启动两个线程,一个线程先备份redo(事务日志); 拷贝上事务日志以后,开启另外一个线程备份ibd文件(ibd是存放数据库以及索引的文件),备份完ibd文件以后通知innobackupex; 备份完ibd文件后,innobackupex脚本会加全局读锁备份MyISAM相关的表; MyISAM表备份完以后通知备份redo的线程,中止备份事务日志,线程收到通知后会中止备份而且告知innobackupex; innobackupex进行解锁,通知xtrabackup中止备份,xtrabackup回复完以后备份结束; 新版本的xtrabackup中xtrabackup和innobackupex已经合二为一,innobackupex做为xtrabackup的软连接 棕色线条是备份MyISAM存储引擎的表,绿色线条是备份InnoDB存储引擎的表; innobackupex启动后先调用xtrabackup,xtrabackup启动两个线程,一个线程先备份redo(事务日志); 拷贝上事务日志以后,开启另外一个线程备份ibd文件(ibd是存放数据库以及索引的文件),备份完ibd文件以后通知innobackupex; 备份完ibd文件后,innobackupex脚本会加全局读锁备份MyISAM相关的表; MyISAM表备份完以后通知备份redo的线程,中止备份事务日志,线程收到通知后会中止备份而且告知innobackupex; innobackupex进行解锁,通知xtrabackup中止备份,xtrabackup回复完以后备份结束; 新版本的xtrabackup中xtrabackup和innobackupex已经合二为一,innobackupex做为xtrabackup的软连接

xtrabackup选项用法

--user:该选项表示备份帐号 --password:该选项表示备份的密码 --host:该选项表示备份数据库的地址 --databases:该选项接受的参数为数据库名,若是要指定多个数据库,彼此间须要空格隔开;如:"xtra_test dba_test",同时,在指定某数据库时,也能够只指 定其中的某张表。如:"mydatabase.mytable"。该选项对innodb引擎表无效,仍是会备份全部innodb表 --defaults-file:该选项指定从哪一个文件读取MySQL配置,必须放在命令行第一个选项位置 --incremental:该选项表示建立一个增量备份,须要指定--incremental-basedir --incremental-basedir:该选项指定为前一次全备份或增量备份的目录,与--incremental同时使用 --incremental-dir:该选项表示还原时增量备份的目录 --include=name:指定表名,格式:databasename.tablename --backup:备份 --prepare:预处理 --apply-log-only:阻止回滚未完成的事务 --target-dir:指定目标位置 --apply-log:通常状况下,在备份完成后,数据尚且不能用于恢复操做,由于备份的数据中可能会包含还没有提交的事务或已经提交但还没有同步至数据文件中的事务。因 此,此时数据文件仍处理不一致状态。此选项做用是经过回滚未提交的事务及同步已经提交的事务至数据文件使数据文件处于一致性状态 --use-memory:和--apply-log选项一块儿使用,当prepare 备份时,作crash recovery分配的内存大小,单位字节,也可1MB,1M,1G,1GB等,推荐1G(快速还原) --export:表示开启可导出单独的表以后再导入其余Mysql中 --redo-only:此选项在prepare base full backup,往其中合并增量备份时候使用,但不包括对最后一个增量备份的合并 --copy-back:作数据恢复时将备份数据文件拷贝到MySQL服务器的datadir --move-back:这个选项与--copy-back类似,惟一的区别是它不拷贝文件,而是移动文件到目的地。这个选项移除backup文件,用时候必须当心。使用场景:没有 足够的磁盘空间同时保留数据文件和Backup副本 --force-non-empty-directories:指定该参数时候,使得innobackupex --copy-back或--move-back选项转移文件到非空目录,已存在的文件不会被覆盖。若是 --copy-back和--move-back文件须要从备份目录拷贝一个在datadir已经存在的文件,会报错失败 --user:该选项表示备份帐号 --password:该选项表示备份的密码 --host:该选项表示备份数据库的地址 --databases:该选项接受的参数为数据库名,若是要指定多个数据库,彼此间须要空格隔开;如:"xtra_test dba_test",同时,在指定某数据库时,也能够只指 定其中的某张表。如:"mydatabase.mytable"。该选项对innodb引擎表无效,仍是会备份全部innodb表 --defaults-file:该选项指定从哪一个文件读取MySQL配置,必须放在命令行第一个选项位置 --incremental:该选项表示建立一个增量备份,须要指定--incremental-basedir --incremental-basedir:该选项指定为前一次全备份或增量备份的目录,与--incremental同时使用 --incremental-dir:该选项表示还原时增量备份的目录 --include=name:指定表名,格式:databasename.tablename --backup:备份 --prepare:预处理 --apply-log-only:阻止回滚未完成的事务 --target-dir:指定目标位置 --apply-log:通常状况下,在备份完成后,数据尚且不能用于恢复操做,由于备份的数据中可能会包含还没有提交的事务或已经提交但还没有同步至数据文件中的事务。因 此,此时数据文件仍处理不一致状态。此选项做用是经过回滚未提交的事务及同步已经提交的事务至数据文件使数据文件处于一致性状态 --use-memory:和--apply-log选项一块儿使用,当prepare 备份时,作crash recovery分配的内存大小,单位字节,也可1MB,1M,1G,1GB等,推荐1G(快速还原) --export:表示开启可导出单独的表以后再导入其余Mysql中 --redo-only:此选项在prepare base full backup,往其中合并增量备份时候使用,但不包括对最后一个增量备份的合并 --copy-back:作数据恢复时将备份数据文件拷贝到MySQL服务器的datadir --move-back:这个选项与--copy-back类似,惟一的区别是它不拷贝文件,而是移动文件到目的地。这个选项移除backup文件,用时候必须当心。使用场景:没有 足够的磁盘空间同时保留数据文件和Backup副本 --force-non-empty-directories:指定该参数时候,使得innobackupex --copy-back或--move-back选项转移文件到非空目录,已存在的文件不会被覆盖。若是 --copy-back和--move-back文件须要从备份目录拷贝一个在datadir已经存在的文件,会报错失败

还原注意事项:

一、datadir 目录必须为空。除非指定innobackupex --force-non-emptydirectorires选项指定,不然--copy-back选项不会覆盖 二、在restore以前,必须shutdown MySQL实例,不能将一个运行中的实例restore到datadir目录中 三、.因为文件属性会被保留,大部分状况下须要在启动实例以前将文件的属主改成mysql,这些文件将属于建立备份的用户chown -R mysql:mysql /data/mysql 以上须要在用户调用innobackupex以前完成 一、datadir 目录必须为空。除非指定innobackupex --force-non-emptydirectorires选项指定,不然--copy-back选项不会覆盖 二、在restore以前,必须shutdown MySQL实例,不能将一个运行中的实例restore到datadir目录中 三、.因为文件属性会被保留,大部分状况下须要在启动实例以前将文件的属主改成mysql,这些文件将属于建立备份的用户chown -R mysql:mysql /data/mysql 以上须要在用户调用innobackupex以前完成

xtrabackup还原过程

t0点作彻底备份,t一、t2点都作增量备份(第一次增量备份前都须要一个彻底备份);上图中,有可能会出现t1点作增量备份以前有一个事务正在执行,t1点作完增量备份以后事务还没完成,这样会形成事务跨备份点了,至关于t1点增量备份中有一半事务的备份,另外一半的事务没有作备份;同理,t2点也会出现这种状况; xtrabackup还原的两个步骤: 一、预处理:当须要还原数据库到t2点时,须要t0的彻底备份和t一、2的增量备份;xtrabackup把备份复制到一个第三方目录中,用彻底备份加上t1点的增量备份,再 加上t2点的增量备份,但t2点的增量备份中有可能出现一半的事务备份,因此会把t2点的备份进行事务回滚(撤销不完整的事务);备份还原时,前面的 备份都不作事务回滚,只有须要还原的最后一次增量备份才作事务滚动 二、还原:把预处理完的备份文件复制到数据库所在目录 彻底备份也会出现备份一半事务的状况,当数据库启动会发现不完整事务,系统会自动回滚 t0点作彻底备份,t一、t2点都作增量备份(第一次增量备份前都须要一个彻底备份);上图中,有可能会出现t1点作增量备份以前有一个事务正在执行,t1点作完增量备份以后事务还没完成,这样会形成事务跨备份点了,至关于t1点增量备份中有一半事务的备份,另外一半的事务没有作备份;同理,t2点也会出现这种状况; xtrabackup还原的两个步骤: 一、预处理:当须要还原数据库到t2点时,须要t0的彻底备份和t一、2的增量备份;xtrabackup把备份复制到一个第三方目录中,用彻底备份加上t1点的增量备份,再 加上t2点的增量备份,但t2点的增量备份中有可能出现一半的事务备份,因此会把t2点的备份进行事务回滚(撤销不完整的事务);备份还原时,前面的 备份都不作事务回滚,只有须要还原的最后一次增量备份才作事务滚动 二、还原:把预处理完的备份文件复制到数据库所在目录 彻底备份也会出现备份一半事务的状况,当数据库启动会发现不完整事务,系统会自动回滚

备份生成的相关文件

使用innobackupex备份时,其会调用xtrabackup备份全部的InnoDB表,复制全部关于表结构定义的相关文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相关文件,同时还会备份触发器和数据库配置信息相关的文件。这些文件会被保存至一个以时间命名的目录中,在备份时,innobackupex还会在备份目录中建立以下文件: (1)xtrabackup_info:innobackupex工具执行时的相关信息,包括版本,备份选项,备份时长,备份LSN(log sequence number日志序列号),BINLOG的位置;数 据库的数据存放在一个个16K的数据块中,每当修改一个数据块的数据,则这个数据块的事务id号就会更改;当作备份时,假如备份完成后最 大的事务id为1000,则1000id以前的都作过备份,1000以后的id则都未作备份,LSN即事务id (2)xtrabackup_checkpoints:备份类型(如彻底或增量)、备份状态(如是否已经为prepared状态)和LSN范围信息,每一个InnoDB页(一般为16k大小)都会包含一个 日志序列号LSN。LSN是整个数据库系统的系统版本号,每一个页面相关的LSN可以代表此页面最近是如何发生改变的 (3)xtrabackup_binlog_info:MySQL服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置,可利用实现基于binlog的恢复 (4)backup-my.cnf:备份命令用到的配置选项信息 (5)xtrabackup_logfile:备份生成的日志文件 使用innobackupex备份时,其会调用xtrabackup备份全部的InnoDB表,复制全部关于表结构定义的相关文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相关文件,同时还会备份触发器和数据库配置信息相关的文件。这些文件会被保存至一个以时间命名的目录中,在备份时,innobackupex还会在备份目录中建立以下文件: (1)xtrabackup_info:innobackupex工具执行时的相关信息,包括版本,备份选项,备份时长,备份LSN(log sequence number日志序列号),BINLOG的位置;数 据库的数据存放在一个个16K的数据块中,每当修改一个数据块的数据,则这个数据块的事务id号就会更改;当作备份时,假如备份完成后最 大的事务id为1000,则1000id以前的都作过备份,1000以后的id则都未作备份,LSN即事务id (2)xtrabackup_checkpoints:备份类型(如彻底或增量)、备份状态(如是否已经为prepared状态)和LSN范围信息,每一个InnoDB页(一般为16k大小)都会包含一个 日志序列号LSN。LSN是整个数据库系统的系统版本号,每一个页面相关的LSN可以代表此页面最近是如何发生改变的 (3)xtrabackup_binlog_info:MySQL服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置,可利用实现基于binlog的恢复 (4)backup-my.cnf:备份命令用到的配置选项信息 (5)xtrabackup_logfile:备份生成的日志文件

xtrabackup彻底备份还原

备份

准备两台机器

[root@centos7 ~]# yum install percona-*.rpm #安装xtrabackup [root@centos7 ~]# rpm -ql percona-xtrabackup-24 #查看包都包含了哪些文件 [root@centos7 ~]# mkdir /backup #建立备份目录 [root@centos7 ~]# mysql -e 'show databases;' #提早准备好数据库 +--------------------+ | Database | +--------------------+ | information_schema | | db1 | | db2 | | db3 | | mysql | | performance_schema | +--------------------+ [root@centos7 ~]# xtrabackup --backup --target-dir=/backup/ #作彻底备份到指定目录 [root@centos7 ~]# scr -r /backup/ 192.168.38.37:/ #把备份目录拷贝到远程主机的根下;备份尽可能不要放在本机上 [root@centos7 ~]# yum install percona-*.rpm #安装xtrabackup [root@centos7 ~]# rpm -ql percona-xtrabackup-24 #查看包都包含了哪些文件 [root@centos7 ~]# mkdir /backup #建立备份目录 [root@centos7 ~]# mysql -e 'show databases;' #提早准备好数据库 +--------------------+ | Database | +--------------------+ | information_schema | | db1 | | db2 | | db3 | | mysql | | performance_schema | +--------------------+ [root@centos7 ~]# xtrabackup --backup --target-dir=/backup/ #作彻底备份到指定目录 [root@centos7 ~]# scr -r /backup/ 192.168.38.37:/ #把备份目录拷贝到远程主机的根下;备份尽可能不要放在本机上

还原

[root@localhost ~]# yum install percona*.rpm [root@localhost ~]# systemctl stop mariadb #还原数据库期间须要中止用户访问 [root@localhost ~]# rm -rf /var/lib/mysql/* #还原时要清除数据库目录下的全部文件 [root@localhost ~]# mkdir /restore #准备一个预处理用的第三方目录 [root@localhost ~]# cp -ra /backup/* /restore/ #把备份的数据拷贝到预处理用的目录下 [root@localhost ~]# xtrabackup --prepare --target-dir=/restore/ #指定目录进行预处理;彻底备份还原,不须要阻止日志回滚,系统会自动回滚日志 [root@localhost ~]# xtrabackup --copy-back --target-dir=/restore/ #把处理过的备份还原(拷贝)到数据库目录;xtrabackup会自动检查mysql的配置文件,从而找到数据库的目录 [root@localhost ~]# ll /var/lib/mysql/ #会发现文件的全部者和所属组都是当前系统默认用户 [root@localhost ~]# chown -R mysql:mysql /var/lib/mysql/ #更改数据库目录的全部文件的全部者和所属组为Mysql [root@localhost ~]# systemctl start mariadb #恢复服务 [root@localhost ~]# mysql -e 'show databases;' +--------------------+ | Database | +--------------------+ | information_schema | | db1 | | db2 | | db3 | | mysql | | performance_schema | +--------------------+ [root@localhost ~]# yum install percona*.rpm [root@localhost ~]# systemctl stop mariadb #还原数据库期间须要中止用户访问 [root@localhost ~]# rm -rf /var/lib/mysql/* #还原时要清除数据库目录下的全部文件 [root@localhost ~]# mkdir /restore #准备一个预处理用的第三方目录 [root@localhost ~]# cp -ra /backup/* /restore/ #把备份的数据拷贝到预处理用的目录下 [root@localhost ~]# xtrabackup --prepare --target-dir=/restore/ #指定目录进行预处理;彻底备份还原,不须要阻止日志回滚,系统会自动回滚日志 [root@localhost ~]# xtrabackup --copy-back --target-dir=/restore/ #把处理过的备份还原(拷贝)到数据库目录;xtrabackup会自动检查mysql的配置文件,从而找到数据库的目录 [root@localhost ~]# ll /var/lib/mysql/ #会发现文件的全部者和所属组都是当前系统默认用户 [root@localhost ~]# chown -R mysql:mysql /var/lib/mysql/ #更改数据库目录的全部文件的全部者和所属组为Mysql [root@localhost ~]# systemctl start mariadb #恢复服务 [root@localhost ~]# mysql -e 'show databases;' +--------------------+ | Database | +--------------------+ | information_schema | | db1 | | db2 | | db3 | | mysql | | performance_schema | +--------------------+

xtrabackup增量备份还原

备份

[root@centos7 ~]# yum install mariadb-server percon*.rpm #须要开启epel源,有的包依赖于epel源 [root@centos7 ~]# systemctl start mariadb [root@centos7 ~]# mkdir /backup #建立备份目录 [root@centos7 ~]# mysql MariaDB [(none)]> create database db1; MariaDB [(none)]> use db1; MariaDB [(none)]> create table t1(id int); #建立个空表 MariaDB [db1]> quit [root@centos7 ~]# xtrabackup --backup --target-dir=/backup/base #建立彻底备份,base目录自动生成 [root@centos7 ~]# mysql db1 MariaDB [db1]> insert t1 value(1),(2); MariaDB [db1]> quit [root@centos7 ~]# xtrabackup --backup --target-dir=/backup/inc1 --incremental-basedir=/backup/base #建立基于base彻底备份的增量备份inc1 [root@centos7 ~]# mysql db1; MariaDB [db1]> insert t1 value(3),(4); MariaDB [db1]> select * from t1; >+------+ | id | +------+ | 1 | | 2 | | 3 | | 4 | +------+ MariaDB [db1]> quit [root@centos7 ~]# xtrabackup --backup --target-dir=/backup/inc2 --incremental-basedir=/backup/inc1 #建立基于inc1备份的增量备份inc2 [root@centos7 ~]# scp -r /backup/ 192.168.38.37:/ #把全部备份拷贝到远程主机 [root@centos7 ~]# yum install mariadb-server percon*.rpm #须要开启epel源,有的包依赖于epel源 [root@centos7 ~]# systemctl start mariadb [root@centos7 ~]# mkdir /backup #建立备份目录 [root@centos7 ~]# mysql MariaDB [(none)]> create database db1; MariaDB [(none)]> use db1; MariaDB [(none)]> create table t1(id int); #建立个空表 MariaDB [db1]> quit [root@centos7 ~]# xtrabackup --backup --target-dir=/backup/base #建立彻底备份,base目录自动生成 [root@centos7 ~]# mysql db1 MariaDB [db1]> insert t1 value(1),(2); MariaDB [db1]> quit [root@centos7 ~]# xtrabackup --backup --target-dir=/backup/inc1 --incremental-basedir=/backup/base #建立基于base彻底备份的增量备份inc1 [root@centos7 ~]# mysql db1; MariaDB [db1]> insert t1 value(3),(4); MariaDB [db1]> select * from t1; >+------+ | id | +------+ | 1 | | 2 | | 3 | | 4 | +------+ MariaDB [db1]> quit [root@centos7 ~]# xtrabackup --backup --target-dir=/backup/inc2 --incremental-basedir=/backup/inc1 #建立基于inc1备份的增量备份inc2 [root@centos7 ~]# scp -r /backup/ 192.168.38.37:/ #把全部备份拷贝到远程主机

还原

[root@localhost ~]# yum install percona*.rpm -y [root@localhost ~]# systemctl stop mariadb #还原过程须要先暂停服务,中止用户访问 [root@localhost ~]# mkdir /restore #建立预处理备份的第三方目录 [root@localhost ~]# cp -r /backup/* /restore/ #把备份拷贝到预处理目录 [root@localhost ~]# xtrabackup --prepare --apply-log-only --target-dir=/restore/base #预处理彻底备份,禁止事务回滚 [root@localhost ~]# xtrabackup --prepare --apply-log-only --target-dir=/restore/base --incremental-dir=/restore/inc1 #把增量备份inc1预处理,而且和彻底备份合并 [root@localhost ~]# xtrabackup --prepare --target-dir=/restore/base --incremental-dir=/restore/inc2 #预处理增量备份inc2,inc2是最后一个增量备份,因此须要进行事务回滚,而且与彻底备份合并 [root@localhost ~]# rm -rf /var/lib/mysql/* #还原前,删除数据库目录下的全部文件目录 [root@localhost ~]# xtrabackup --copy-back --target-dir=/restore/base #把预处理的备份还原(拷贝)到数据库的目录下 [root@localhost ~]# chown -R mysql:mysql /var/lib/mysql/ #修改数据库的全部文件的全部者所属组为Mysql;若是不修改,默认数据库文件的全部者所属组是备份时的当前用户,启动mysql服务时会形成数据库服务没法启动 [root@localhost ~]# systemctl start mariadb [root@localhost ~]# mysql db1 MariaDB [db1]> select * from t1; +------+ | id | +------+ | 1 | | 2 | | 3 | | 4 | +------+[root@localhost ~]# yum install percona*.rpm -y [root@localhost ~]# systemctl stop mariadb #还原过程须要先暂停服务,中止用户访问 [root@localhost ~]# mkdir /restore #建立预处理备份的第三方目录 [root@localhost ~]# cp -r /backup/* /restore/ #把备份拷贝到预处理目录 [root@localhost ~]# xtrabackup --prepare --apply-log-only --target-dir=/restore/base #预处理彻底备份,禁止事务回滚 [root@localhost ~]# xtrabackup --prepare --apply-log-only --target-dir=/restore/base --incremental-dir=/restore/inc1 #把增量备份inc1预处理,而且和彻底备份合并 [root@localhost ~]# xtrabackup --prepare --target-dir=/restore/base --incremental-dir=/restore/inc2 #预处理增量备份inc2,inc2是最后一个增量备份,因此须要进行事务回滚,而且与彻底备份合并 [root@localhost ~]# rm -rf /var/lib/mysql/* #还原前,删除数据库目录下的全部文件目录 [root@localhost ~]# xtrabackup --copy-back --target-dir=/restore/base #把预处理的备份还原(拷贝)到数据库的目录下 [root@localhost ~]# chown -R mysql:mysql /var/lib/mysql/ #修改数据库的全部文件的全部者所属组为Mysql;若是不修改,默认数据库文件的全部者所属组是备份时的当前用户,启动mysql服务时会形成数据库服务没法启动 [root@localhost ~]# systemctl start mariadb [root@localhost ~]# mysql db1 MariaDB [db1]> select * from t1; +------+ | id | +------+ | 1 | | 2 | | 3 | | 4 | +------+
相关文章
相关标签/搜索