標籤:mysql備份 shell mysql 單表備份
說明:此指令碼經測試可用於資料清理,對單表進行清理,清理出問題,可以回退進行單表的恢複。
指令碼特點:
指令碼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
mysql單表備份和恢複