说明:此脚本经测试可用于数据清理,对单表进行清理,清理出问题,可以回退进行单表的恢复。
脚本特点:
脚本1用于单表备份
脚本2用于对单表进行数据恢复
并增加完善的日志记录功能。
支持脚本传参,对指定的表进行备份和恢复。
通用性好,只需改下用户密码和想要备份的库,即可用。
1.mysql_bak_table.sh #mysql单表备份脚本
使用方法:sh mysql_bak_table.sh table_name
#!/bin/bash
#author laocao
#time:20180412
back_dir="/tmp/backup" #备份的压缩包存放路径
mysql_user="root"
mysql_passwd="passwd"
db="test_dcp" #备份的库名
db_table="$1" #备份库中的某表
filename="${db_table}.tar.gz"
log="/opt/xtrabackup_scripts/bak_singleTable.log"
databak="/tmp/databak" #数据备份解压导出表的数据
[ ! -d $back_dir ] && mkdir -p $back_dir
[ ! -d $databak ] && mkdir -p $databak
#如果有备份则删除
[ -f $back_dir/$filename ] && rm -rf $back_dir/$filename
#备份单表
echo "###开始备份单表${filename}###" >>$log
innobackupex --defaults-file=/etc/my.cnf --user=$mysql_user --password=$mysql_passwd --include=$db.$db_table --slave-info --safe-slave-backup --stream=tar $back_dir >$
back_dir/$filename
#检查备份是否成功
[ $? -eq 0 ] && echo "###备份成功### $filename表###"date +%Y%m%d-%H%M%S
>>$log
#表结构数据存在则删除
[ -f $back_dir/${db_table}_jiegou.sql ] && echo rm -rf $back_dir/${db_table}_jiegou.sql
#备份线上表结构
mysqldump -u$mysql_user -p$mysql_passwd --set-gtid-purged=OFF -d $db $db_table > $back_dir/${db_table}_jiegou.sql
[ $? -eq 0 ] && echo "###导出表结构${db_table}成功###" >>$log
2.mysql恢复单表脚本:
sh mysql_recover_table.sh table_name
#project:mysql_recover_table.sh
#!/bin/bash
#author laocao
#time:20180412
back_dir="/tmp/backup" #备份的压缩包存放路径
mysql_user="root"
mysql_passwd="passwd"
db="test_dcp"
db_table="$1"
filename="${db_table}.tar.gz"
log="/opt/xtrabackup_scripts/recover_table.log"
databak="/tmp/databak" #数据备份解压导出表的数据
dbdata="/data1/docker_data/debug-mysql/mysql/data/$db" #原数据库路径
#备份目录存在则删除
if [ ! -d $databak/$db_table ];then
mkdir -p $databak/$db_table >>$log
else
rm -rf $databak/$db_table/* >>$log
fi
#解压表
tar -xf $back_dir/$filename -C $databak/$db_table >>$log
[ $? -eq 0 ] && echo "###解压备份${db_table}表成功###" >>$log
#导出备份表数据
echo "##开始导出备份表数据###" >>$log
innobackupex --apply-log --export $databak/$db_table
[ $? -eq 0 ] && echo "###导出备份表${db_table}成功###" >>$log
#数据库连接
mysql_conn="mysql -u$mysql_user -p$mysql_passwd"
#恢复表结构
$mysql_conn -D $db <$back_dir/${db_table}_jiegou.sql >>$log
[ $? -eq 0 ] && echo "###恢复表结构成功###" || (echo "##恢复表结构失败###"; exit 1) >>$log
#卸载表空间
sql_discard_tablespace="ALTER TABLE ${db}.${db_table} DISCARD TABLESPACE"
$mysql_conn -e "$sql_discard_tablespace" >>$log
[ $? -eq 0 ] && echo "###卸载表空间成功###" || (echo "##卸载表空间失败###"; exit 1) >$log
#从备份里恢复表数据
cp $databak/$db_table/$db/{${db_table}.ibd,${db_table}.cfg} $dbdata
[ $? -eq 0 ] && echo "copy备份数据到线上成功" || (echo "copy备份数据到线上失败"; exit 1) >>$log
#改表权限
chown -R mysql.mysql $dbdata >>$log
#装载表空间
sql_import_tablespace="ALTER TABLE ${db}.${db_table} import TABLESPACE"
$mysql_conn -e "$sql_import_tablespace" >>$log
[ $? -eq 0 ] && echo "#恢复表${db_table}数据成功##" >>$log
#查看数据是否恢复
mysql -u$mysql_user -p$mysql_passwd -e "select count(*) from ${db}.${db_table}" >>$log