mysqldump根据通配符批量导出

xtrabackup的主要优点:
1,物理备份,备份速度快
2,热备份、无需停机
3,恢复速度快
4.自动会对备份文件进行验证
1. xtrabackup 工具的安装
1.1 安装依赖包
#No package perl-Digest-MD5 available.
yum install -y rsync perl l perl-Digest-MD5 perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL

#rpm -ich libev-4.15-1.el6.rf.x86_64.rpm 可以不安装
#error: Failed dependencies:libev.so.4()(64bit) is needed,添加 --nodeps
rpm -ivh percona-xtrabackup-24-2.4.21-1.el6.x86_64.rpm --force --nodeps
-------------------------------------
#常见报错
(1) libev.so.4()(64bit) is needed by percona-xtrabackup-24-2.4.4-1..el6.x86_64
解决办法:
rpm -ivh ftp://rpmfind.net/linux/dag/redhat/el6/en/x86_64/dag/RPMS/libev-4.15-1.el6.rf.x86_64.rpm
(2)libnuma.so.1()(64bit) is needed by percona-xtrabackup-24-2.4.4-1.el6.x86_64
解决办法:
rpm -ivh http://mirror.centos.org/centos/6/os/x86_64/Packages/numactl-2.0.9-2.el6.x86_64.rpm

#参考Centos7.4下MySql5.7安装Percona XtraBackup备份
1、安装Percona XtraBackup
--安装yum 源
yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
--安装XtraBackup 2.4版本的
yum install -y percona-xtrabackup-24.x86_64

#1.2下载及安装说明
#当前测试使用的数据库为MySQL5.7 因此下载2.4版本
https://www.percona.com/downloads/Percona-XtraBackup-2.4/LATEST/
#另外,2.4.10及以后版本中,对libgcrypt进行了区分,因此也需要查询自己服务器的libgcrypt版本,然后选择对应的安装包
[root@testdb ~]# yum list installed|grep libgcrypt
libgcrypt.x86_64 1.5.3-14.el7 @anaconda

#去percona官网下载对应版本的安装包 https://www.percona.com/downloads , 需要根据数据库的版本选择对应的xtrabackup的安装包,选择Percona XtraBackup.
--实际找到的包
wget https://www.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.21/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.21-1.el7.x86_64.rpm
/* 二进制包 怎么找到 */
wget https://www.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.18/binary/tarball/percona-xtrabackup-2.4.18-Linux-x86_64.libgcrypt153.tar.gz
/* rpm包 怎么找到*/
wget https://www.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.18/binary/redhat/7/x86_64/Percona-XtraBackup-2.4.18-r29b4ca5-el7-x86_64-bundle.tar
二进制包解压后即可使用,rpm包下载解压后 rpm -ivh 安装即可。操作均很简单,此处略过
xtrabackup通常使用 innobackupex命令, 可以使用 innobackupex --help 命令查看参数及说明。
其中常用参数及说明如下:
--defaults-file 待备份mysql实例的配置文件
--user=USER 备份用户,默认为当前系统用户,建议使用备份专用账号
--password=PASSWD 备份用户密码
--port=PORT 数据库端口,默认3306
--host=HOST 需备份数据库的IP
--apply-log 前滚、回滚日志,恢复前用
--database 指定需要备份的数据库,多个数据库之间以空格分开
--copy-back 将备份数据复制到目标路径
--incremental 增量备份,后面接的参数值为指定的增量备份的路径
--incremental-basedir=DIRECTORY 增量备份时使用指向上一次的增量备份所在的目录
--incremental-dir=DIRECTORY 增量备份还原的时候用来合并增量备份到全量,用来指定全备路径
--redo-only 对增量备份进行合并
--rsync 加快本地文件传输,适用于non-InnoDB数据库引擎。不与--stream共用
--no-timestamp 生成的备份文件不以时间戳为目录

1.3 创建备份账号
备份的账号建议单独创建,并授予相关权限
CREATE USER 'backup'@'localhost' IDENTIFIED BY 'Backup@123.com';
GRANT SUPER,RELOAD, LOCK TABLES, PROCESS, REPLICATION CLIENT ON *.* TO 'backup'@'localhost';
FLUSH PRIVILEGES;

2. 全量备份
2.1 本地全量备份,不压缩
后续会以此为基础进行增量备份
/* 创建备份结果的目录, 此步骤也可以省略 */
mkdir -p /app/all_backup
#/root/xtrabackup/bin/innobackupex目录不存在
/usr/bin/innobackupex --defaults-file=/etc/my.cnf --socket=/var/lib/mysql/mysql.sock --port=3306 --user=backup --password='Backup@123.com' --no-timestamp /app/all_backup

备份的结果存放在指定的目录 all_backup里,内容如下:
注: 如果没有添加阻塞DDL操作的参数,备份过程中如有DDL操作,备份将终止。因此建议日常备份放在从库中进行。
2.2 本地tar方式压缩备份
/usr/bin/innobackupex --defaults-file=/etc/my.cnf --socket=/var/lib/mysql/mysql.sock --port=3306 --user=backup --password='Backup@123.com' --stream=tar /tmp |gzip >/app/all_backup.tar.gz

备份后的结果是一个压缩文件,经过对比,压缩后数据约为非压缩情况下的20%,压缩比还是比较高的。
不过,压缩备份的方式速度相对较慢,且消耗CPU,该影响因素需要大家考虑到,视情况选择是否压缩。
注意: 如果有单表过大 而/tmp路径空间不足的情况备份过程中可能会报错,因此可以指定其他空间较大的目录
2.3 本地xbstream方式压缩备份
gzip的压缩方式备份可能会有bug(案例可以自行寻找),出现如下错误:
xtrabackup: error: The transaction log file is corrupted.
xtrabackup: error: The log was not applied to the intended LSN!
#因此可以采用xbstream方式进行备份,备份命令如下:
/usr/bin/innobackupex --defaults-file=/etc/my.cnf --socket=/var/lib/mysql/mysql.sock --port=3306 --user=backup --password='Backup@123.com' /app/backup --tmpdir=/app/backup --stream=xbstream|gzip - > /app/all_backup.xbstream.gz

2.4 远程备份到其他机器
远程备份与本地备份的相比 需要额外的配置远程主机的免密登录权限
/* 在备份所在用户的主机下配置连接目标主机的免密 */
#如果存在keygen,可跳过
ssh-keygen
ssh-copy-id -i user@'target_ip'
#远程机器创建目录
mkdir -p /app/backup/
#之后就可以将类似于本地备份的模式 将备份结果发送到远程机器
#如果存在大表或超大事务运行时不建议使用/tmp目录
/usr/bin/innobackupex --defaults-file=/etc/my.cnf --socket=/var/lib/mysql/mysql.sock --port=3306 --user=backup --password='Backup@123.com' --stream=tar /tmp --no-timestamp | ssh root@'192.168.92.18' "cat - > /app/backup/remote_backup.tar"

---------------------------------------------------------------------
--备份文件中删除已表空间加密的表t1,tab_type或删除加密表所在的库,仍然无法恢复
#查看所有加密表(表空间):t1,tab_type
select engine,TABLE_SCHEMA, TABLE_NAME, CREATE_OPTIONS from information_schema.tables where create_options like '%ENCRYPTION%="Y"%';
cd /home/backup
cp -R 2020-05-29_12-37-02 2020-05-29_12-37-02-bak
cd /home/backup/2020-05-29_12-37-02
rm -rf test
--cd /home/backup/2020-05-29_12-37-02/test
--rm -rf t1.frm t1.ibd tab_type.frm tab_type.ibd
systemctl stop mysqld
--先应用日志
innobackupex --defaults-file=/etc/my.cnf --user=root --apply-log /home/backup/2020-05-29_12-37-02/
--再拷贝数据
innobackupex --defaults-file=/etc/my.cnf --user=root --copy-back /home/backup/2020-05-29_12-37-02/
---------------------------------------------------------------------

3. 增量备份
mysql -uroot -pmysql
use test;
create table test.t1(id int,name varchar(200));
insert into test.t1 select 1,'n1';

3.1 第一次增量备份
#可以先根据2.1的本地全备的基础上进行增量备份,首次增量备份脚本:

#此时,备份的结果放在/app/backup目录下,由于没指定no-timestamp参数,备份的结果存在在以三期时间命名的目录下:
/usr/bin/innobackupex --defaults-file=/etc/my.cnf --socket=/var/lib/mysql/mysql.sock --port=3306 --user=backup --password='Backup@123.com' --incremental /app/backup/ --incremental-basedir=/app/all_backup

注: 增量备份仅能应用于InnoDB或XtraDB表等事务表,对于MyISAM表而言,执行增量备份时依旧进行全量备份
3.2 第二次增量备份
#第二次增量备份是在第一次增量备份的基础上进行,因此incremental-basedir参数内容指定为上一次增量备份的目录即可
#完成后生成一个新的目录
/usr/bin/innobackupex --defaults-file=/etc/my.cnf --socket=/var/lib/mysql/mysql.sock --port=3306 --user=backup --password='Backup@123.com' --incremental /app/backup/ --incremental-basedir=/app/backup/2020-11-25_08-38-21

3.3 第二次增量备份
/usr/bin/innobackupex --defaults-file=/etc/my.cnf --socket=/var/lib/mysql/mysql.sock --port=3306 --user=backup --password='Backup@123.com' --incremental /app/backup/ --incremental-basedir=/app/backup/2020-11-25_08-41-19

4. 恢复
4.1 基于全量备份的恢复
4.1.1 回放日志
备份后的文件不能直接用作恢复,还需要先使用apply-log 做前滚和回滚
/usr/bin/innobackupex --defaults-file=/app/all_backup/my.cnf --apply-log /app/all_backup > /opt/apply-log.log
注: 回放日志的时候 defaults-file 选择备份目录里的即可
4.2.2 恢复至目标实例
本次恢复至一个新实例中(如果恢复至现有的实例需要先关闭目标实例,删除数据目录及相关日志存储的目录。不建议直接恢复至现有实例 ,除非实际需要)
/* 创建新实例的相关目录 */
mkdir -p /app/data/mysql3307/{data,logs,tmp,etc}

/* 生产配置文件 ,本次直接拷贝其他实例的配置文件 修改对应端口等*/
cp /app/data/mysql3306/etc/my.cnf /app/data/mysql3307/etc/

sed -i "s#3306#3307#g" my.cnf

/* 创建错误日志 */
touch /app/data/mysql3307/logs/mysqld.log

#然后拷贝至新实例中
/usr/bin/innobackupex --defaults-file=/etc/my.cnf --copy-back /app/all_backup
#修改目标实例相关目录的权限
chown -R mysql:mysql /var/lib/mysql
#启动新实例即可
mysqld_safe --defaults-file=/etc/my.cnf > /dev/null 2>&1 &
ps -ef | grep mysql
#/usr/local/mysql5.7/bin/mysqld_safe --defaults-file=/app/data/mysql3307/etc/my.cnf &

#启动mysql报错
[ERROR] InnoDB: Unable to open undo tablespace './/undo001'.
vi /etc/my.cnf
innodb_undo_tablespaces=3

--重新应用日志和拷贝备份数据
/usr/bin/innobackupex --defaults-file=/app/all_backup/my.cnf --apply-log /app/all_backup > /opt/apply-log.log
#先应用日志,不支持恢复加密表空间的库************************************************
#error:InnoDB: Encryption information in datafile: ./test/t1.ibd can't be decrypted, please check if a keyring plugin is loaded and initialized successfully.
/usr/bin/innobackupex --defaults-file=/etc/my.cnf --copy-back /app/all_backup
chown -R mysql:mysql /var/lib/mysql
mysql -uroot -pmysql
show databases;
use test;
show tables;

4.2 基于增量备份的恢复
ps -ef | grep mysql
kill -9
rm -rf /var/lib/mysql/*
如果是基于第一次增量备份的恢复,操作如下
/* 使用合并增量备份的方式进行回放日志,先进行全量备份的合并 */
/usr/bin/innobackupex --apply-log --redo-only /app/all_backup
/* 再合并第一次增量备份 */
/usr/bin/innobackupex --apply-log --redo-only /app/all_backup --incremental-dir=/app/backup/2020-11-25_08-38-21
如果基于多次增量备份的恢复,则在全量备份及第一次增量备份的基础上继续合并后续的备份即可
/* 基于第二次增量备份的合并 */
/usr/bin/innobackupex --apply-log --redo-only /app/all_backup --incremental-dir=/app/backup/2020-11-25_08-41-19
/* 基于第三次增量备份的合并 */
/usr/bin/innobackupex --apply-log --redo-only /app/all_backup --incremental-dir=/app/backup/2020-11-25_09-47-12

/usr/bin/innobackupex --defaults-file=/etc/my.cnf --copy-back /app/all_backup
chown -R mysql:mysql /var/lib/mysql
mysqld_safe --defaults-file=/etc/my.cnf > /dev/null 2>&1 &
ps -ef | grep mysql
mysql -uroot -pmysql
show databases;
use test;
show tables;
------------------------------------------------------------------------------------
#全量备份mysql shell脚本1
mkdir -p /opt/script
sh /opt/script/fullbak.sh
vi /opt/script/fullbak.sh

#!/bin/bash
# mysql full back
#date 2020.11.25
#author:zh

time=`date +%F`
logfile="/data/bakup/mysql_full_bak_time.log"
fullbakup_logfile="/data/bakup/fullbakup_logfile.log"
mysql_bakdir="/data/bakup"
user=backup
password='Backup@123.com'

[ ! -d $mysql_bakdir ] && mkdir -p $mysql_bakdir
[ ! -e $logfile ] && touch $logfile
[ ! -e $fullbakup_logfile ] && touch $fullbakup_logfile

innobackupex --defaults-file=/etc/my.cnf --user=$user --password=$password --compress ${mysql_bakdir} 2>&1 >> $fullbakup_logfile
ret=$?
finishtime=`date +%Y%m%d_%H%M%S`
[ $ret -eq 0 ] && echo "Mysql fullbakup finished, time: $finishtime" >> $logfile || echo "Mysql fullbakup failed,please check time:$finishtime" >> $logfile

------------------------------------------------------------------------------------
#全量备份mysql shell脚本2
vi backup_auto.sh

#!/bin/bash
#function:xtrabackup database
#version:1.0
#author:zh

v_mysql_user="root"
v_mysql_password="mysql"
v_mysql_host="localhost"
v_mysql_port="3306"
v_mysql_charset="utf8"
#v_mysql_socket=/data/my13306
v_backup_location=/data/xtrabackup
v_expire_backup_delete="ON" #是否开启过期备份删除 ON为开启 OFF为关闭
v_expire_days=3 #过期时间天数 默认为三天,此项只有在 v_expire_backup_delete 开启时有效

v_backup_time=`date +%Y%m%d%H%M` #定义备份详细时间
v_backup_Ymd=`date +%Y-%m-%d` #定义备份目录中的年月日时间
v_backup_3ago=`date -d '3 days ago' +%Y-%m-%d` #3天之前的日期
v_backup_dir=$v_backup_location/$v_backup_Ymd
v_backup_log=$v_backup_location/$v_backup_Ymd/backup.log
v_welcome_msg="Welcome to use MySQL backup tools!"

#判断MYSQL是否启动,mysql没有启动则备份退出
v_mysql_ps=`ps -ef |grep mysql |wc -l`
v_mysql_listen=`netstat -an |grep LISTEN |grep $v_mysql_port|wc -l`
if [ $v_mysql_ps == "0" -o $v_mysql_listen == "0" ]; then
echo "ERROR:MySQL is not running! backup stop!"
exit
else
echo $v_welcome_msg

#连接到mysql数据库,无法连接则备份退出
mysql -h$v_mysql_host -P$v_mysql_port -u$v_mysql_user -p$v_mysql_password <<end
use mysql;
select host,user from user where user='root' and host='localhost';
exit
end

flag=$?
if [ $flag != "0" ]; then
echo "ERROR:Can’t connect mysql server! xtrabackup stop!"
exit
else
echo "MySQL connect ok! Please wait…"

#判断有没有定义备份的数据库,如果定义则开始备份,否则退出备份
v_dbname=""
echo "database $v_dbname backup start…"
mkdir -p $v_backup_dir
innobackupex --host=$v_mysql_host --user=$v_mysql_user --port=$v_mysql_port --password=$v_mysql_password $v_backup_dir --parallel=2 --no-timestamp >>$v_backup_log 2>&1
flag=$?
if [ $flag == "0" ];then
echo "database $v_dbname success backup to $v_backup_dir"
else
echo "database $v_dbname backup fail!"
fi
fi

#如果开启了删除过期备份,则进行删除操作
if [ $v_expire_backup_delete == "ON" -a $v_backup_location != "" ];then
#find $v_backup_location/ -type d -o -type f -ctime +$v_expire_days -exec rm -rf {} ;
find $v_backup_location/ -type d -mtime +$v_expire_days | xargs rm -rf
echo "Expired backup data delete complete!"
fi
echo "All database backup success!"
exit
fi

------------------------------------------------------------------------------------
#全量增量自动备份mysql shell脚本3
#创建备份用户
mysql -uroot -pmysql
grant reload,lock tables,replication client,create tablespace,process,super on *.* to backupuser@'localhost' identified by 'backup@che123';

#加入自动执行任务计划
crontab -e
12 3 * * * sh /opt/script/xtrabackup.sh

#创建冗余目录和创建备份用户:
mkdir -p /database/detect/backup/
ll /database/detect/backup/
ll /database/detect/redundency/

#配置备份脚本
vi /opt/script/xtrabackup.sh

#!/bin/bash
BEGINTIME=`date +"%Y-%m-%d %H:%M:%S"`
format_time=`date +"%Y-%m-%d_%H:%M:%S"`
week=`date +%Y-%m-%d`
backupbin=/usr/bin
backdir=/database/detect/backup/
redun=/database/detect/redundency/
file_cnf=/etc/my.cnf
user_name=backupuser
password="backup@che123"
socket="/var/lib/mysql/mysql.sock"
out_log=$backdir/xtrabackup_log_$format_time
time_cost=$backdir/xtrabackup_time.txt

if [ ! -d "/database/detect/redundency" ];
then
mkdir -p /database/detect/redundency
fi

if [ -d "$backdir/incr5" ];then
tar -czvf ${redun}/redundency_${week}.tar.gz $backdir >/dev/null 2>&1

rm -rf $backdir/*
mkdir -p $backdir
chown -R mysql.mysql $backdir
# del backup
DEL_UNTIL_DATE=`date --date='7 day ago' +%Y-%m-%d`

sleep 30
/bin/rm -f /${redun}/*${DEL_UNTIL_DATE}.tar.gz >/dev/null 2>&1

fi

#full
if [ ! -d "$backdir/full" ];then
echo "#####start full backup at $BEGINTIME to directory full" >>$time_cost
$backupbin/innobackupex --defaults-file=$file_cnf --no-timestamp --user=$user_name --password=$password --socket=$socket $backdir/full 1> $out_log 2>&1
break;
elif [ ! -d "$backdir/incr0" ];then
echo "#####start 0 incremental backup at $BEGINTIME to directory incr0" >>$time_cost
$backupbin/innobackupex --defaults-file=$file_cnf --no-timestamp --user=$user_name --password=$password --socket=$socket --incremental --incremental-basedir=$backdir/full $backdir/incr0 1> $out_log 2>&1
break;
elif [ ! -d "$backdir/incr1" ];then
echo "#####start 1 incremental backup at $BEGINTIME to directory incr1" >>$time_cost
$backupbin/innobackupex --defaults-file=$file_cnf --no-timestamp --user=$user_name --password=$password --socket=$socket --incremental --incremental-basedir=$backdir/incr0 $backdir/incr1 1> $out_log 2>&1
break;
elif [ ! -d "$backdir/incr2" ];then
echo "#####start 2 incremental backup at $BEGINTIME to directory incr2" >>$time_cost
$backupbin/innobackupex --defaults-file=$file_cnf --no-timestamp --user=$user_name --password=$password --socket=$socket --incremental --incremental-basedir=$backdir/incr1 $backdir/incr2 1> $out_log 2>&1
break;
elif [ ! -d "$backdir/incr3" ];then
echo "#####start 3 incremental backup at $BEGINTIME to directory incr3" >>$time_cost
$backupbin/innobackupex --defaults-file=$file_cnf --no-timestamp --user=$user_name --password=$password --socket=$socket --incremental --incremental-basedir=$backdir/incr2 $backdir/incr3 1> $out_log 2>&1
break;
elif [ ! -d "$backdir/incr4" ];then
echo "#####start 4 incremental backup at $BEGINTIME to directory incr4" >>$time_cost
$backupbin/innobackupex --defaults-file=$file_cnf --no-timestamp --user=$user_name --password=$password --socket=$socket --incremental --incremental-basedir=$backdir/incr3 $backdir/incr4 1> $out_log 2>&1
break;
elif [ ! -d "$backdir/incr5" ];then
echo "#####start 5 incremental backup at $BEGINTIME to directory incr5" >>$time_cost
$backupbin/innobackupex --defaults-file=$file_cnf --no-timestamp --user=$user_name --password=$password --socket=$socket --incremental --incremental-basedir=$backdir/incr4 $backdir/incr5 1> $out_log 2>&1
break;
fi
ENDTIME=`date +"%Y-%m-%d %H:%M:%S"`
begin_data=`date -d "$BEGINTIME" +%s`
end_data=`date -d "$ENDTIME" +%s`
spendtime=`expr $end_data - $begin_data`
echo "it takes $spendtime sec for packing the data directory" >>$time_cost

原文地址:https://www.cnblogs.com/buffercache/p/14038248.html