MYSQL之xtrabackup

post thumb
Mysql
作者 Louis 发表于 2018年6月13日

**摘要:**mysql数据库的备份应用软件,xtrabackup的下载,安装,简要用法说明,小实验。

xtrabackup

mariadb的版本:5.5.56-MariaDB

下载最新的percondn-xtrabackup,官网最新资源centos7下载如下

$ wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.11/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.11-1.el7.x86_64.rpm

下载完毕后,安装xtrabackup,需要启用epel源,进行依赖安装

$ yum install -y percona-xtrabackup-24.x86_64 0:2.4.11-1.el7

相关说明

备份原理及备份的文件代表意思

​ 使用innobakupex备份时,其会调用xtrabackup备份所有的InnoDB表,复制所有关于表结构定义的相关文件(.frm)、以及MyISAMMERGECSVARCHIVE表的相关文件,同时还会备份触发器和数据库配置信息相关的文件。这些文件会被保存至一个以时间命名的目录中,在备份时,innobackupex还会在备份目录中创建如下文件:

xtrabackup_checkpoints:备份类型(如完全或增量)、备份状态(如是否已经为prepared状态)和LSN(日志序列号)范围信息,每个InnoDB页(通常为16k大小)都会包含一个日志序列号,即LSN。LSN是整个数据库系统的系统版本号,每个页面相关的LSN能够表明此页面最近是如何发生改变的 xtrabackup_binlog_info:MySQL服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置 xtrabackup_infoinnobackupex工具执行时的相关信息 backup-my.cnf:备份命令用到的配置选项信息 xtrabackup_logfile:备份生成的日志文件

用法说明

详细请参考官方说明

备份

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

option:

--user:该选项表示备份账号 --password:该选项表示备份的密码 --host:该选项表示备份数据库的地址 --databases:该选项接受的参数为数据名,如果要指定多个数据库,彼此间需要以空格隔开; --defaults-file:该选项指定从哪个文件读取MySQL配置,必须放在命令行第一个选项位置 --incremental:该选项表示创建一个增量备份,需要指定--incremental-basedir --incremental-basedir:该选项指定为前一次全备份或增量备份的目录,与--incremental同 用 --incremental-dir:该选项表示还原时增量备份的目录 --include=name:指定表名,格式:databasename.tablenam

还原前准备

prepare还原:innobackupex --apply-log [option] BACKUP-DIR

option:

--apply-log:一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态.此选项作用是通过回滚未提交的事务及同步已经提交的事务至数据文件使数据文件处于一致性状态; --use-memory:该选项表示和–apply-log选项一起使用,prepare 备份的时候,xtrabackup做crash recovery分配的内存大小,单位字节。也可(1MB,1M,1G,1GB),推荐1G; --export:表示开启可导出单独的表之后再导入其他Mysql中; --redo-only:此选项在prepare base full backup,往其中merge增量备份时候使用.

还原

还原:

innobackupex --copy-back [选项] BACKUP-DIR

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

选项说明:

–copy-back:做数据恢复时将备份数据文件拷贝到MySQL服务器的datadir; –move-back:这个选项与–copy-back相似,唯一的区别是它不拷贝文件,而是移动文件到目的地。这个选项移除backup文件,用时候必须小心。使用场景:没有足够的磁盘空间同事保留数据文件和Backup副本.

实验

前提:

最好启用二进制日志,并于数据文件分开存放。实验的配置文件如下:/etc/my.cnf

[mysqld]
datadir=/data/mysql
log_bin=/data/binlog/mysql-bin
socket=/var/lib/mysql/mysql.sock

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd

[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid

#
# include all files from the config directory
#
!includedir /etc/my.cnf.d

全备份

​ 在全备份的基础上,每天做增量备份,最后一次的未提交的事务是不能备份,只能rollback。

#开始的全备份,并新建增量备份文件夹
$ innobackupex /backups
$ mkdir /backups/inc{1,2} -pv

模拟插入数据

-- 模拟第一天的插入数据,然后进行第一次增量备份
insert into students values('30','hong',26,'M',1,2);
insert into students values('27','feng',28,'M',3,2);
-- 模拟第二天的插入数据及开启事务,然后进行第二次增量备份
insert into students values('28','li',18,'M',1,2);
-- 开启事务,未commit,会导致这个事务备份不了。
start transaction;
update students set name='dongfei' where stuid=25;

增量备份

# 第一次增量备份
$ innobackupex --incremental /backups/inc1/ --incremental-basedir=/backups/2018-06-14_12-51-10
# 第二次增加备份
$ innobackupex --incremental /backups/inc2 --incremental-basedir=/backups/inc1/2018-06-14_12-53-25/
$ scp -a /backup/*  192.168.1.10:/backups/

目标主机恢复数据

#模拟数据损坏
$ systemctl  stop mariadb
$ rm -rf /data/mysql/*
#整理innobackupex的备份文件
$ innobackupex --apply-log --redo-only /backups/2018-06-14_12-51-10/
$ innobackupex --apply-log --redo-only /backups/2018-06-14_12-51-10/ --incremental-dir=/backups/inc1/2018-06-14_12-53-25/
$ innobackupex --apply-log --redo-only /backups/2018-06-14_12-51-10/ --incremental-dir=/backups/inc2/2018-06-14_12-57-41/
$ ls /var/lib/mysql/
$ innobackupex --copy-back /backups/2018-06-14_12-51-10/
$ chown -R mysql.mysql /data/mysql/
$ systemctl start mariadb
$ mysql hellodb -e 'select * from students'
+-------+---------------+-----+--------+---------+-----------+
| StuID | Name          | Age | Gender | ClassID | TeacherID |
+-------+---------------+-----+--------+---------+-----------+
···
#未commit的数据会回滚,并不会更新。
|    25 | Sun Dasheng   | 100 | M      |    NULL |      NULL | 
|    26 | dongfei       |  25 | M      |       2 |         3 |
|    27 | feng          |  28 | M      |       3 |         2 |
|    28 | li            |  18 | M      |       1 |         2 |
|    30 | hong          |  26 | M      |       1 |         2 |
+-------+---------------+-----+--------+---------+-----------+

单表操作

生产中,数据量很大,实现全备份的时间,可能会很长,对于某些重要的大型表,我们可以实现xtrabackup的单表导入导出。

单表备份

对比较重要的大型表,比如students表进行备份,包含数据及表结构

$ innobackupex --include="hellodb.students" /backup/
$ ls /backup/2018-06-13_15-57-49/hellodb/ -l
$ mysql -e 'show create table hellodb.students'
$ mysql -e 'show create table hellodb.students' > students.sql

模拟表损坏及丢失

$ mysql -e 'drop table hellodb.students'
$ ll /data/mysqldb/hellodb/ -l

备份还原

  1. 整理备份文件,修改表结构
$ innobackupex  --apply-log --export /backup/2018-06-13_15-57-49/
$ ls /backup/2018-06-13_15-57-49/hellodb/  -l
$ mysql hellodb  -e 'select * from students'
$ vim students.sql #修改表结构如下
CREATE TABLE `students` (\n  `StuID` int(10) unsigned NOT NULL AUTO_INCREMENT,\n  `Name` varchar(50) NOT NULL,\n  `Age` tinyint(3) unsigned NOT NULL,\n  `Gender` enum('F','M') NOT NULL,\n  `ClassID` tinyint(3) unsigned DEFAULT NULL,\n  `TeacherID` int(10) unsigned DEFAULT NULL,\n  PRIMARY KEY (`StuID`)\n) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8
$ mysql hellodb < students.sql 
$ ls /data/mysqldb/hellodb/ -l
  1. 删除表空间,将备份好的数据复制到数据库中
$ mysql -e  'alter table hellodb.students discard tablespace'
$ ls /data/mysqldb/hellodb/ -l
$ cd /backup/2018-06-13_15-57-49/hellodb/
$ cp /backup/2018-06-13_15-57-49/hellodb/students.{cfg,exp,ibd} /data/mysqldb/hellodb/
  1. 将备份好的数据改变所有者,所属组,导入新的表空间,还原成功。
$ chown mysql.mysql /data/mysqldb/hellodb/*
$ ll /data/mysqldb/hellodb/*
$ mysql hellodb -e 'alter table students import tablespace'
$ mysql hellodb -e 'select * from students'

总结:

  1. 增量备份是基于全备份的基础上进行备份的,备份和还原的时候注意路径的区别;
  2. xtrabackup备份的数据所有者和所属组需要改为mysql
  3. 备份一定要开启二进制日志文件,才能完备的进行还原。
上一篇
MYSQL备份