**摘要:**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)
、以及MyISAM
、MERGE
、CSV
和ARCHIVE
表的相关文件,同时还会备份触发器和数据库配置信息相关的文件。这些文件会被保存至一个以时间命名的目录中,在备份时,innobackupex
还会在备份目录中创建如下文件:
xtrabackup_checkpoints
:备份类型(如完全或增量)、备份状态(如是否已经为prepared
状态)和LSN(日志序列号)范围信息,每个InnoDB
页(通常为16k大小)都会包含一个日志序列号,即LSN。LSN是整个数据库系统的系统版本号,每个页面相关的LSN能够表明此页面最近是如何发生改变的xtrabackup_binlog_info
:MySQL服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置xtrabackup_info
:innobackupex
工具执行时的相关信息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
做crashrecovery
分配的内存大小,单位字节。也可(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
备份还原
- 整理备份文件,修改表结构
$ 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
- 删除表空间,将备份好的数据复制到数据库中
$ 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/
- 将备份好的数据改变所有者,所属组,导入新的表空间,还原成功。
$ chown mysql.mysql /data/mysqldb/hellodb/*
$ ll /data/mysqldb/hellodb/*
$ mysql hellodb -e 'alter table students import tablespace'
$ mysql hellodb -e 'select * from students'
总结:
- 增量备份是基于全备份的基础上进行备份的,备份和还原的时候注意路径的区别;
xtrabackup
备份的数据所有者和所属组需要改为mysql
;- 备份一定要开启二进制日志文件,才能完备的进行还原。