Mysql 數據庫異地備份腳本
實驗環境:關閉防火牆不然不能授權登錄
Mysql-server:192.168.30.25
Mysql-client: 192.168.30.24
實驗要求:對mysql-server 的auth和client庫實現異地備份,每天凌晨2:00進行備份
並寫一個數據恢復腳本(庫里有數據)
mysql服務端授權,給予select和lock tables 權限,已備份
[root@localhost ~]# mysql -uroot -p123456
mysql> grant select,lock tables on auth.* to 'admin'@'192.168.30.24'identified by '123456';
mysql> grant select,lock tables on client.* to 'admin'@'192.168.30.24' identified by '123456';
mysql> flush privileges;
連接測試
這個需要安裝好后的mysql,連接測試
[root@client ~]# mysql -uadmin -p -h192.168.30.25
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| auth |
| client |
+--------------------+
3 rows in set (0.09 sec)
寫客戶端腳本
vim /opt/bakmysql.sh
#!/bin/bash
#mysql數據庫備份腳本
#設置登錄變量
MY_USER="admin"
MY_PASS="123456"
MY_HOST="192.168.30.25"
MY_CONN="-u$MY_USER -p$MY_PASS -h$MY_HOST"
#設置備份的數據庫
MY_DB1="auth"
MY_DB2="client"
#定義備份路徑,工具,時間,文件名
BF_DIR="backup"
BF_CMD="/usr/bin/mysqldump" 這里是mariadb的mysqldump路徑
BF_TIME=$(date +%Y%m%d-%H%M)
NAME_1="$MY_DB1-$BF_TIME"
NAME_2="$MY_DB2-$BF_TIME"
#備份為.sql腳本,然后打包壓縮(打包后刪除原文件)
[ -d $BF_DIR ] || mkdir -p $BF_DIR
cd $BF_DIR
$BF_CMD $MY_CONN --databases $MY_DB1 > $NAME_1.sql
$BF_CMD $MY_CONN --databases $MY_DB2 > $NAME_2.sql
tar zcf $NAME_1.tar.gz $NAME_1.sql --remove &> /dev/null
tar zcf $NAME_2.tar.gz $NAME_2.sql --remove &> /dev/null
[root@client backup]#chmod +x /opt/bakmysql.sh
[root@client backup]#/opt/bakmsyql.sh
[root@client backup]#ls backup
[root@client backup]#crontab -e
0 2 * * * /opt/bakmsyql.sh
systemctl restart crond
[root@client backup]#date 040601592019.59 //MMDDhhmmYY.SS 月日小時分鍾年.秒
可以用這個命令也可以主要修改系統時間,讓備份多做幾天的,然后我們讓后面的腳本選擇性恢復date -s “2019-05-26 01:59:55”
2019年 04月06日 星期日 01:59:59 CST
[root@client backup]# date 040701592019.59
2019年 04月 07日 星期日 01:59:59 CST
[root@client backup]# date 040801592019.59
2019年 04月 08日 星期一 01:59:59 CST
撰寫數據恢復腳本
vim /opt/restore_mysql.sh
#!/bin/bash
#恢復mysql數據庫數據腳本
#設置變量
MY_USER="admin"
MY_PASS="123456"
MY_HOST="192.168.30.23"
BF_DIR="backup"
mkdir .aaa &> /dev/null
ls $BF_DIR |column -t > .aaa/db_list
awk -F'-' '{print $2}' .aaa/db_list > .aaa/dt.txt
read -p "請指定要恢復數據庫的日期(YYYYMMDD):" dt
if [ $dt -ge 20190501 ] && [ $dt -le 20190601 ]
then
grep "$dt" .aaa/dt.txt &> /dev/null
if [ $? -ne 0 ]
then
echo "很抱歉,您恢復的數據庫備份日期不在備份日期范圍內"
else
echo "搜索到的可恢復數據庫如下:"
awk -F'-' /$dt/'{print NR,$1}' .aaa/db_list
read -p "請選擇您要恢復數據庫的編號:" nb
nm=$(awk -F'-' /$dt/'{print NR,$1}' .aaa/db_list |awk /$nb/'{print $2}')
echo "現在開始恢復數據庫:$nm 到$dt"
cd $BF_DIR
onm=$(ls |grep "$nm-$dt")
mkdir .bbb
tar xf $onm -C .bbb
mysql -u$MY_USER -p$MY_PASS -h$MY_host $nm < .bbb/*
echo "$nm 已經恢復到$dt"
rm -rf .bbb
cd - &> /dev/null
rm -rf .aaa
fi
else
echo "很抱歉,您恢復數據庫的備份日期不在備份日期范圍內"
fi
server端授權
chmod +x /opt/restore_mysql.sh
Mysql >grant all on auth.* to ‘admin’@’192.168.30.24’;
Mysql >grant all on client.* to ‘admin’@’192.168.30.24’;
Mysql > flush privileges;
恢復測試
執行腳本
/opt/restore_mysql.sh