mysql單表備份和恢復

說明:此腳本經測試可用於數據清理,對單表進行清理,清理出問題,能夠回退進行單表的恢復。
腳本特色:
腳本1用於單表備份
腳本2用於對單表進行數據恢復
並增長完善的日誌記錄功能。
支持腳本傳參,對指定的表進行備份和恢復。
通用性好,只需改下用戶密碼和想要備份的庫,便可用。mysql

1.mysql_bak_table.sh #mysql單表備份腳本
使用方法:sh mysql_bak_table.sh table_namesql

#!/bin/bash
#author laocao
#time:20180412docker

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" #數據備份解壓導出表的數據bash

[ ! -d $back_dir ] && mkdir -p $back_dir
[ ! -d $databak ] && mkdir -p $databakapp

#若是有備份則刪除
[ -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/$filenameide

#檢查備份是否成功
[ $? -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}成功###" >>$logspa


2.mysql恢復單表腳本:
sh mysql_recover_table.sh table_namedebug

#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

相關文章
相關標籤/搜索