xtrabackup2.4备份mysql5.7使用总结&使用innobackupex进行增量备份
Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写),是商业备份工具InnoDB Hotbackup的一个很好的替代品。
Xtrabackup有两个主要的工具:xtrabackup、innobackupex
(1)xtrabackup只能备份InnoDB和XtraDB两种数据表,而不能备份MyISAM数据表
(2)innobackupex-1.5.1则封装了xtrabackup,是一个脚本封装,所以能同时备份处理innodb和myisam,但在处理myisam时需要加一个读锁
软件安装:
安装依赖:
yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL
wget ftp://rpmfind.net/linux/atrpms/el6-x86_64/atrpms/stable/libev-4.04-2.el6.x86_64.rpm
rpm -ivh libev-4.04-2.el6.x86_64.rpm
下载地址: https://www.percona.com/software/mysql-database/percona-xtrabackup
yum 安装xtrabackup:
yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm yum install percona-xtrabackup-24.x86_64
说明:
1. 备份mysql5.1 请使用 Percona XtraBackup 2.0, 2.0+的版本不支持备份mysql5.1 参考: https://www.updateweb.cn/zwfec/item-246.html
2. 备份mysql5.7 请使用 Percona XtraBackup 2.4
另如果需要主从数据同步:
用过 xtrabackup 工具的 innobackupex 脚本备份数据的人可能会注意到, –apply-log 处理过的备份数据里有两个文件说明该备份数据对应的 binlog 的文件名和位置。但有时这俩文件说明的位置可能会不同。 经过实验和询问 Percona 公司,结论如下: 1 对于纯 InnoDB 操作,备份出来的数据中上述两个文件的内容是一致的 2 对于 InnoDB 和非事务存储引擎混合操作,xtrabackup_binlog_info 中所示的 position 应该会比 xtrabackup_pos_innodb 所示的数值大。此时应以 xtrabackup_binlog_info 为准;而后者和 apply-log 时 InnoDB recovery log 中显示的内容是一致的, 只针对 InnoDB 这部分数据
主从命令:
change master to master_host='10.0.x.x',master_user='xxx',master_password='xxx',master_log_file='mysql-bin.000001',master_log_pos=99;
shell :
执行:
mkdir /srv/backup
以下文件放入 /srv/backup/
定时任务进行备份或还原
crontab_backup_full.sh : 每天凌晨进行全量备份
#!/bin/bash backup_dir=/srv/backup current_date_dir=$(date +%F) cd $backup_dir if [ ! -d $current_date_dir ];then mkdir $current_date_dir fi echo "正在备份中..." data_dir=$backup_dir/$current_date_dir ./shell/backup_full.sh $data_dir/full 2>$data_dir/${current_date_dir}.log 1>$data_dir/${current_date_dir}.err.log echo "备份结果:" cat $data_dir/${current_date_dir}.log history_del=$(date -d"6 days ago" +%Y-%m-%d) rm -rf $backup_dir/$history_del
crontab_backup_incremental_1.sh : 每天12:30 进行增量备份
#!/bin/bash backup_dir=/srv/backup current_date_dir=$(date +%F) cd $backup_dir echo "正在备份中..." data_dir=$backup_dir/$current_date_dir ./shell/backup_cremental.sh $data_dir/1230 $data_dir/full 2>$data_dir/${current_date_dir}1230.log 1>$data_dir/${current_date_dir}1230.err.log echo "备份结果:" cat $data_dir/${current_date_dir}1230.log
crontab_backup_incremental_2.sh : 每天19:30 进行增量备份
#!/bin/bash backup_dir=/srv/backup current_date_dir=$(date +%F) cd $backup_dir echo "正在备份中..." data_dir=$backup_dir/$current_date_dir ./shell/backup_cremental.sh $data_dir/1930 $data_dir/1230 2>$data_dir/${current_date_dir}1930.log 1>$data_dir/${current_date_dir}1930.err.log echo "备份结果:" cat $data_dir/${current_date_dir}1930.log
restore_incremental.sh : 完整增量还原时的处理方式
#!/bin/bash backup_dir=/srv/backup full_dir=$backup_dir/$1/full full_first=$backup_dir/$1/$2 full_second=$backup_dir/$1/$3 if [ -z $1 ];then echo '请输入全量文件夹的名称: 如:2018-01-01' exit fi if [ -z $2 ];then echo '请输入第一个增量还原文件夹, 如:1230' exit fi if [ -z $3 ];then echo '请输入第二个增量还原文件夹, 如:1930' exit fi echo $full_dir ./shell/preparing_incremental_full.sh $full_dir ./shell/preparing_incremental.sh $full_dir $full_first ./shell/preparing_incremental.sh $full_dir $full_second echo '数据已准备完成,请使restore.sh 进行还原' echo '例: ./shell/restore.sh /srv/backup/2019-04-26/full /srv/db/mysql/data'
------------------------------------------------------------------ 全量 -----------------------------------------------------------------------------------------------
mkdir /srv/backup/shell
以下文件放入 /srv/backup/shell
backup_full.sh # 全量备份时
#!/bin/bash #basedir="/srv/backup_db" if [ -z $1 ];then echo '请输备份文件的存放路径' exit fi innobackupex --defaults-file=/etc/my.cnf --socket=/tmp/mysql.sock --slave-info --user=root --no-timestamp $1
preparing_full.sh # 全量还原时准备工作
#!/bin/bash #basedir="/srv/backup_db" if [ -z $1 ]; then echo '请输入全量文件夹' exit fi innobackupex --apply-log $1
-------------------------------------------------------------------- 增量 ----------------------------------------------------------------------------------------------------------------------
backup_incremental.sh # 增量备份
#!/bin/bash #basedir="/srv/backup_db" if [ -z $1 ]; then echo '第一个参数,请输入增量文件存放的文件夹' exit fi if [ -z $2 ]; then echo '第二个参数,请输入基于哪个备份为起始进行增量备份' exit fi innobackupex --defaults-file=/etc/my.cnf --socket=/tmp/mysql.sock --slave-info --user=root --no-timestamp --incremental $1 --incremental-basedir=$2
preparing_incremental_full.sh # 增量备份还原: 对全量的基础数据的准备工作
#!/bin/bash #basedir="/srv/backup_db" if [ -z $1 ]; then echo '请输入全量文件夹' exit fi innobackupex --apply-log --redo-only $1
preparing_incremental.sh # 增量备份还原: 对增量备份还原的准备工作
#!/bin/bash #basedir="/srv/backup_db" if [ -z $1 ]; then echo '第一个参数,基于哪个全量备份的文件夹' exit fi if [ -z $2 ]; then echo '第二个参数,请输入对哪个文件夹进行增量还原准备' exit fi innobackupex --defaults-file=/etc/my.cnf --socket=/tmp/mysql.sock --user=root --apply-log --redo-only $1 --incremental-dir=$2
-------------------------------------------------------------------- 还原 ----------------------------------------------------------------------------------------------------------------------
rstore.sh # 数据还原, 适用于全量和增量
#!/bin/bash #basedir="/srv/backup_db" if [ -z $1 ];then echo '第一个参数,请输还原文件的存放路径' exit fi if [ -z $2 ];then echo '第二个参数,请输入原mysql的数据存放路径' exit fi innobackupex --copy-back $1 chmod 755 $2 -R chown mysql.mysql $2 -R pgrep mysql|xargs kill -9 service mysqld start
--------------------------------------------------------------------
在使用innobackupex进行备份时,还可以使用--no-timestamp选项来阻止命令自动创建一个以时间命名的目录;如此一来,innobackupex命令将会创建一个BACKUP-DIR目录来存储备份数据。
补充: innobackup 常用参数说明(转载)
--defaults-file
同xtrabackup的--defaults-file参数
--apply-log
对xtrabackup的--prepare参数的封装
--copy-back
做数据恢复时将备份数据文件拷贝到MySQL服务器的datadir ;
--remote-host=HOSTNAME
通过ssh将备份数据存储到远程服务器上;
--stream=[tar]
备份文件输出格式, tar时使用tar4ibd , 该文件可在XtarBackup binary文件中获得.如果备份时有指定--stream=tar, 则tar4ibd文件所处目录一定要在$PATH中(因为使用的是tar4ibd去压缩, 在XtraBackup的binary包中可获得该文件)。
在 使用参数stream=tar备份的时候,你的xtrabackup_logfile可能会临时放在/tmp目录下,如果你备份的时候并发写入较大的话 xtrabackup_logfile可能会很大(5G+),很可能会撑满你的/tmp目录,可以通过参数--tmpdir指定目录来解决这个问题。
--tmpdir=DIRECTORY
当有指定--remote-host or --stream时, 事务日志临时存储的目录, 默认采用MySQL配置文件中所指定的临时目录tmpdir
--redo-only --apply-log组,
强制备份日志时只redo ,跳过rollback。这在做增量备份时非常必要。
--use-memory=#
该参数在prepare的时候使用,控制prepare时innodb实例使用的内存量
--throttle=IOS
同xtrabackup的--throttle参数
--sleep=是给ibbackup使用的,指定每备份1M数据,过程停止拷贝多少毫秒,也是为了在备份时尽量减小对正常业务的影响,具体可以查看ibbackup的手册 ;
--compress[=LEVEL]
对备份数据迚行压缩,仅支持ibbackup,xtrabackup还没有实现;
--include=REGEXP
对 xtrabackup参数--tables的封装,也支持ibbackup。备份包含的库表,例如:--include="test.",意思是要备份 test库中所有的表。如果需要全备份,则省略这个参数;如果需要备份test库下的2个表:test1和test2,则写 成:--include="test.test1|test.test2"。也可以使用通配符,如:--include="test.test"。
--databases=LIST
列出需要备份的databases,如果没有指定该参数,所有包含MyISAM和InnoDB表的database都会被备份;
--uncompress
解压备份的数据文件,支持ibbackup,xtrabackup还没有实现该功能;
--slave-info,
备 份从库, 加上--slave-info备份目录下会多生成一个xtrabackup_slave_info 文件, 这里会保存主日志文件以及偏移, 文件内容类似于:CHANGE MASTER TO MASTER_LOG_FILE='', MASTER_LOG_POS=0
--socket=SOCKET
指定mysql.sock所在位置,以便备份进程登录mysql.
20190426记:
当你使用的是mysql5.7时,请不要使用xtrabackup2.0.0 进行备份, xtrabackup2.0.0不支持mysql5.7的, 但只是报错会误导人:
innobackupex: fatal error: no 'mysqld' group in MySQL options innobackupex: fatal error: OR no 'datadir' option in group 'mysqld' in MySQL options
解决办法下载更新版本: https://www.percona.com/software/mysql-database/percona-xtrabackup
貌似mysql5.7 只有 xtrabackup2.4才支持: https://www.percona.com/doc/percona-xtrabackup/2.4/index.html
下载: https://www.percona.com/doc/percona-xtrabackup/2.4/installation/yum_repo.html
安装:
yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm yum install percona-xtrabackup-24.x86_64