Linux 第72天 percona xtrabackup

Linux 第72天 percona xtrabackup

时间: 20181014

个人小站: www.winthcloud.top 欢迎大家来评论留言

目录

xtrabackup工具备份数据库原理、特点、提供商、

xtrabackup备份选项

xtrabackup prepare

xtrabackup还原选项

xtrabackup还原注意理项

备份生成的相关文件

示例:旧版Xtrabackup完全备份及还原

示例:新版Xtrabackup完全备份及还原

示例:旧版Xtrabackup完全,增量备份及还原

示例:新版Xtrabackup完全,增量备份及还原

示例: Xtrabackup单表导出和导入

总结


xtrabackup工具备份数据库

此工具备份原理是基于硬盘块的备份mysql数据库启动或非启动状态不影响备份,可以直接热

备份,此工具的增量备份原理是每次备份所依赖的原备份文件会将每个块文件做一个数值当

新的增量备份数值如果大于原来的数据块时,则会将其再次复制备份,如果没有则不会去备份


提供商

Percona 官网:www.percona.com

percona-server

InnoDB --> XtraDB

percona提供的mysql数据库备份工具,惟一开源的能够对innodb和xtradb数据库

进行热备的工具

手册:https://www.percona.com/doc/percona-xtrabackup/LATEST/index.html


特点:

备份还原过程快速、可靠

备份过程不会打断正在执行的事务

能够基于压缩等功能节约磁盘空间和流量

自动实现备份检验

开源,免费


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

innobackupex: Perl 脚本

xtrabackup: C/C++ 编译的二进制

xbcrypt: 加解密

xbstream: 支持并发写的流文件格式

xtrabackup 是用来备份 InnoDB 表的,不能备份非 InnoDB 表,和 MySQL Server 没有交互

innobackupex 脚本用来备份非 InnoDB 表,同时会调用 xtrabackup 命令来备份 

InnoDB 表,还会和 MySQL Server 发送命令进行交互,如加全局读锁(FTWRL)、

获取位点(SHOW SLAVE STATUS)等。即innobackupex是在 xtrabackup 

之上做了一层封装实现的

虽然目前一般不用 MyISAM 表,只是 MySQL 库下的系统表是 MyISAM 的,

因此备份基本都通过 innobackupex 命令进行



xtrabackup版本升级到2.4后,相比之前的2.1有了比较大的变化:innobackupex

功能全部集成到 xtrabackup 里面,只有一个 binary程序,另外为了兼容考虑,

innobackupex作为 xtrabackup 的软链接,即xtrabackup现在支持非Innodb表备份,

并且Innobackupex在下一版本中移除,建议通过xtrabackup替换innobackupex


xtrabackup安装:yum install percona-xtrabackup 在EPEL源中

最新版本下载安装:https://www.percona.com/downloads/XtraBackup/LATEST/


备份:innobackupex [option] BACKUP-ROOT-DIR

选项说明:www.percona.com/doc/percona-xtrabackup/LATEST/genindex.html

--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


Prepare:innobackupex --apply-log [option] BACKUP-DIR

选项说明:

--apply-log:一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份

的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事

务。因此,此时数据文件仍处于不一致状态。此选项作用是通过回滚未提交的事

务及同步已经提交的事务至数据文件使数据文件处于一致性状态

--use-memory:和--apply-log选项一起使用,当prepare 备份时,做crash 

recovery分配的内存大小,单位字节,也可1MB,1M,1G,1GB等,推荐1G

--export:表示开启可导出单独的表之后再导入其他Mysql中

--redo-only:此选项在prepare base full backup,

往其中合并增量备份时候使用,但不包括对最后一个增量备份的合并


还原:innobackupex --copy-back [选项] BACKUP-DIR

innobackupex --move-back [选项] [--defaults-group=GROUP-NAME] BACKUP-DIR

选项说明:

--copy-back:做数据恢复时将备份数据文件拷贝到MySQL服务器的datadir

--move-back:这个选项与--copy-back相似,唯一的区别是它不拷贝文件,而是移

动文件到目的地。这个选项移除backup文件,用时候必须小心。使用场景:没有

足够的磁盘空间同事保留数据文件和Backup副本



还原注意事项:

1.datadir目录必须为空。除非指定innobackupex --force-non-empty-directorires

选项指定,否则--copy-backup选项不会覆盖

2.在restore之前,必须shutdown MySQL实例,不能将一个运行中的实例restore

到datadir目录中。

3.由于文件属性会被保留,大部分情况下需要在启动实例之前将文件的属主改为mysql,

这些文件将属于创建备份的用户

chown -R mysql:mysql /data/mysql

以上需要在用户调用innobackupex之前完成

--force-non-empty-directories:指定该参数时候,使得

innobackupex --copy-back或--move-back选项转移文件到非空目录,已存在的

文件不会被覆盖。如果--copy-back和--move-back文件需要从备份目录拷贝一个

在datadir已经存在的文件,会报错失败



备份生成的相关文件

使用innobakupex备份时,其会调用xtrabackup备份所有的InnoDB表,复制所有关于表结构

定义的相关文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相关文件,同时还会备

份触发器和数据库配置信息相关的文件。这些文件会被保存至一个以时间命名的目录中,

在备份时,innobackupex还会在备份目录中创建如下文件:

(1)xtrabackup_info:innobackupex工具执行时的相关信息,包括版本,备份选项,

备份时长,备份LSN(log sequence number日志序列号),BINLOG的位置

(2)xtrabackup_checkpoints:备份类型(如完全或增量)、备份状态(如是否已经为

prepared状态)和LSN范围信息,每个InnoDB页(通常为16k大小)都会包含一个日志

序列号,即LSN。LSN是整个数据库系统的系统版本号,每个页面相关的LSN能够表明

此页面最近是如何发生改变的

(3)xtrabackup_binlog_info:MySQL服务器当前正在使用的二进制日志文件及至备份

这一刻为止二进制日志事件的位置,可利用实现基于binlog的恢复

(4)backup-my.cnf:备份命令用到的配置选项信息

(5)xtrabackup_logfile:备份生成的日志文件


示例:旧版Xtrabackup完全备份及还原


1 在原主机

innobackupex --user=root /backups

scp -r /backups/2018-02-23_11-55-57/ 目标主机:/data/

2 在目标主机

innobackupex --apply-log /data/2018-02-23_11-55-57/

systemctl stop mariadb

rm -rf /var/lib/mysql/*

innobackupex --copy-back /data/2018-02-23_11-55-57/

chown -R mysql.mysql /var/lib/mysql/

systemctl start mariadb


示例:新版Xtrabackup完全备份及还原

1 在原主机做完全备份到/data/backups

xtrabackup --backup --target-dir=/backups/

scp -r /backups/* 目标主机:/backups

2 在目标主机上

1)预准备:确保数据一致,提交完成的事务,回滚未完成的事务

xtrabackup --prepare --target-dir=/backups/

2)复制到数据库目录

注意:数据库目录必须为空,MySQL服务不能启动

xtrabackup --copy-back --target-dir=/backups/

3)还原属性

chown -R mysql:mysql /var/lib/mysql

4)启动服务

systemctl start mariadb



示例:旧版Xtrabackup完全,增量备份及还原


1 在原主机

innobackupex /backups

mkdir /backups/inc{1,2}

修改数据库内容

(下边为一条命令)

innobackupex --incremental /backups/inc1

--incremental-basedir=/backups/2018-02-23_14-21-42(完全备份生成的路径)


再次修改数据库内容

(下边为一条命令)

innobackupex --incremental /backups/inc2 

--incremental-basedir=/backups/inc1/2018-02-23_14-26-17 

(上次增量备份生成的路径)


复制备份内容至要还原的机器上

scp -r /backups/* 目标主机:/data/


2 在目标主机

不启动mariadb

删除原数据库

rm -rf /var/lib/mysql/*

合并增量备份到完全备份

innobackupex --apply-log --redo-only /data/2018-02-23_14-21-42/

innobackupex --apply-log --redo-only /data/2018-02-23_14-21-42/ 

--incremental-dir=/data/inc1/2018-02-23_14-26-17 (与上一行为一条命令)


innobackupex --apply-log /data/2018-02-23_14-21-42/ 

--incremental-dir=/data/inc2/2018-02-23_14-28-29/ (与上一行为一条命令)

恢复至备份数据至目标目录

ls /var/lib/mysql/

innobackupex --copy-back /data/2018-02-23_14-21-42/

chown -R mysql.mysql /var/lib/mysql/

systemctl start mariadb



示例:新版Xtrabackup完全,增量备份及还原

1 备份过程

1)完全备份:xtrabackup --backup --target-dir=/backups/base

2)第一次修改数据

3)第一次增量备份

xtrabackup --backup --target-dir=/backups/inc1 

--incremental-basedir=/backups/base  (与上一行为一条命令)

4)第二次修改数据


5)第二次增量

xtrabackup --backup --target-dir=/backups/inc2 

--incremental-basedir=/backups/inc1   (与上一行为一条命令)

6)scp -r /backups/* 目标主机:/backups/

备份过程生成三个备份目录

/backups/{base,inc1,inc2}



2还原过程

1)预准备完成备份,此选项--apply-log-only阻止回滚未提完成的事务

xtrabackup --prepare --apply-log-only --target-dir=/backups/base

2)合并第1次增量备份到完全备份,

xtrabackup --prepare --apply-log-only --target-dir=/backups/base 

--incremental-dir=/backups/inc1  (与上一行为一条命令)


3)合并第2次增量备份到完全备份:最后一次还原不需要加选项--apply-log-only

xtrabackup --prepare --target-dir=/backups/base 

--incremental-dir=/backups/inc2  (与上一行为一条命令)

4)复制到数据库目录,注意数据库目录必须为空,MySQL服务不能启动

xtrabackup --copy-back --target-dir=/data/backups/base


5)还原属性:chown -R mysql:mysql /var/lib/mysql

6)启动服务:systemctl start mariadb



示例: Xtrabackup单表导出和导入


1 单表备份

innobackupex --include='hellodb.students' /backups

2备份表结构

mysql -e 'show create table hellodb.students' > student.sql

3删除表

mysql -e 'drop table hellodb.students‘

4 整理所导出的表格

innobackupex --apply-log --export /backups/2018-02-23_15-03-23/


5 创建表(这步所用的正是刚刚备份的student.sql)

mysql>CREATE TABLE `students` (

`StuID` int(10) unsigned NOT NULL AUTO_INCREMENT,

`Name` varchar(50) NOT NULL,

`Age` tinyint(3) unsigned NOT NULL,

`Gender` enum('F','M') NOT NULL,

`ClassID` tinyint(3) unsigned DEFAULT NULL,

`TeacherID` int(10) unsigned DEFAULT NULL,

PRIMARY KEY (`StuID`)

) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8


6 删除表空间

alter table students discard tablespace;

cp /backups/2018-02-23_15-03-23/hellodb/students.{cfg,exp,ibd}

/var/lib/mysql/hellodb/   (与上一行为一条命令)

8 chown -R mysql.mysql /var/lib/mysql/hellodb/

9 mysql>alter table students import tablespace;


总结

使用xtrabackpu还原文件--apply-log-only必须要加不然会将事务日志里的内容丢失


猜你喜欢

转载自blog.51cto.com/winthcloud/2301464