MySQL數據備份企業實戰。制作shell腳本
功能1:使用xtrabackup以每周為一個備份周期做備份(數據庫+二進制日志,備份至本地/data/backup)。提示: 周一某個時間點做一次完全備份,周二、三、四、五、六、日增量,備份存儲目錄"/data/backup/2018/52/1/備份數據" 目錄解釋"/data/backup/年/本年度的第幾周/本周的第幾天/數據" 一年52周一周7天。可以在新的服務器上進行還原測試。
功能2:通過xtrabackup手動備份,全備份將數據備份到/data/backup/base。可根據base目錄進行增量備份到inc1,再根據inc1目錄進行增量備份到inc2。並在新的服務器上進行還原測試
shell腳本
#!/bin/bash # #******************************************************************** #Author: qiangshu #Tel: 18610586896 #Date: 2019-11-14 #FileName: mysql_backup.sh #URL: http://xxxxxx #Description: 使用xtrabackup備份和恢復mysql數據庫 #測試環境為CentOS7,yum安裝的mariadb-server5.5,MySQL5.7.27二進制安裝成功 #Copyright (C): 2019 All rights reserved #******************************************************************** # xtrabackup 備份后數據的存儲目錄 base_dir=/data/backup # mysql的數據目錄,恢復的時候用 data_dir=/data/mysql sql_user='root' sql_host='localhost' sql_pass='123456' sql_login="--user=$sql_user --host=$sql_host --password=$sql_pass" #安裝epel源,然后安裝percona-xtrabackup,yum安裝的xtrabackup版本為percona-xtrabackup-2.3.6 #不支持mysql5.7的備份,需要再percona官網下載percona-xtrabackup-24-2.4.12版本或以上版本 #判斷腳本參數 case $1 in --all|-a) #--all 手動執行全備份 [ -d $base_dir ] || mkdir -p $base_dir xtrabackup $sql_login --backup --target-dir=$base_dir/base ;; --increment|-i) #--incrementd 手動執行增量備份 end_dir=`ls $base_dir | tail -1` #如果數據目錄中只有base,那么就針對base目錄進行增量備份 if [ "$end_dir" == "base" ];then xtrabackup $sql_login --backup --target-dir=$base_dir/inc1 --incremental-basedir=$base_dir/base #如果數據目錄中已經含有inc的目錄,那么根據inc數字最大的目錄進行增量備份 elif [[ "$end_dir" =~ "inc" ]];then num=`echo $end_dir | grep -o [0-9]*` let num_add=num+1 xtrabackup $sql_login --backup --target-dir=$base_dir/inc$num_add --incremental-basedir=$base_dir/inc$num fi ;; --manualrecovery|-m) #手動恢復數據,判斷數據庫的目錄是否是空,不為空退出 [ "`ls $data_dir`" == "" ] || { echo MySQL data dir is not null !!!;exit 2; } inc_num=`ls -d $base_dir/inc* 2> /dev/null | wc -l` #如果沒有增量數據直接還原 if [ "$inc_num" -eq 0 ];then xtrabackup --prepare --target-dir=$base_dir/base #有增量數據的時候,根據增量數據的文件夾個數,循環恢復 elif [ "$inc_num" -ge 1 ];then xtrabackup --prepare --apply-log-only --target-dir=$base_dir/base for i in `seq 1 $inc_num`;do if [ $i -eq $inc_num ];then xtrabackup --prepare --target-dir=$base_dir/base --incremental-dir=$base_dir/inc$i break fi xtrabackup --prepare --apply-log-only --target-dir=$base_dir/base --incremental-dir=$base_dir/inc$i done fi xtrabackup --copy-back --target-dir=$base_dir/base # 修改數據目錄所有文件的用戶名為mysql chown -R mysql:mysql $data_dir ;; --autobackup|b) # 可以放在cron計划任務里,每天執行自動備份任務,周一生成全量數據,周二至周日生成增量數據 # 數據目錄格式/data/backup/2019/45/1 表示2019年第45周,周一 year=`date +%Y` week_number=`date +%U` date_of_week=`date +%u` full_dir=$base_dir/$year/$week_number mkdir -p $base_dir/$year/$week_number if [ $date_of_week -eq 1 ];then # 周1進行全備份 xtrabackup $sql_login --backup --target-dir=$full_dir/$date_of_week else # 周2-7,針對前一天的數據做增量備份 let yesterday=$date_of_week-1 # 前一天的目錄如果不存在,證明沒有備份數據 [ -d $base_dir/$year/$week_number/$yesterday ] || { echo Not exist yesterday backup data !!!;exit 1; } xtrabackup $sql_login --backup --target-dir=$full_dir/$date_of_week --incremental-basedir=$full_dir/$yesterday fi ;; --autorecovery|-r) #自動備份恢復方法,使用格式如: ./backup --autorecovery 2019 45 3 恢復到2019年45周第3天的數據 year=$2 week_number=$3 date_of_week=$4 full_dir=$base_dir/$year/$week_number # 如果日期的目錄不存在,報錯退出 [ -d $full_dir/$date_of_week ] || { echo Wrong input date !!!;exit 3; } # 如果日期目錄為空,報錯退出 [ "`ls $full_dir/$date_of_week`" == "" ] && { echo Dir no data !!!;exit 4; } # num表示恢復到的周幾 num=$date_of_week # 如果數量為1,則只有周1的全備份,按全備份恢復 if [ $num -eq 1 ];then xtrabackup --prepare --target-dir=$full_dir/1 fi # 如果數量>=2,則有周1的全備份,還有多個備份,每個增量分別還原 if [ $num -ge 2 ];then xtrabackup --prepare --apply-log-only --target-dir=$full_dir/1 for i in `seq 2 $num`;do if [ $i -eq $num ];then xtrabackup --prepare --target-dir=$full_dir/1 --incremental-dir=$full_dir/$i break fi xtrabackup --prepare --apply-log-only --target-dir=$full_dir/1 --incremental-dir=$full_dir/$i done fi xtrabackup --copy-back --target-dir=$full_dir/1 chown -R mysql:mysql $data_dir ;; --help|-h) cat << EOF 本腳本通過xtrabackup程序進行mysqld的備份,需要安裝percona-xtrabackup-24-2.4.12或更高版本 參數選項: --all或 -a:全備份,全備份默認路徑是/data/backup/base --increment 或 -i:增量備份,必須有全備份的情況下在進行增量備份,第一次的增量備份為/data/backup/inc1,第二次為/data/backup/inc2,以此類推 --manualrecovery 或 -m:恢復全備份和增量備份的數據,需要提前把全量備份置於/data/backup/base目錄,增量1/data/backup/inc1,以此類推 --autobackup 或 -b:按照年,第幾周,周幾的格式備份數據。存儲路徑如/data/backup/2019/45/{1,2,3},判斷如果是周一進行全備份,周二至周日針對前一天的備份進行增量備份。可以把腳本放到crontab任務中每天執行一次。例如:0 30 * * * /bin/bash 腳本名。 --autorecoveryh 或 -r:把--autobackup備份的數據進行還原,還原的時候需要輸入年,第幾周,周幾。例如:script.sh --autorecovery 2019 45 2,意思是恢復到2019年第45周周2的數據 --help 或 -h:查看幫助 EOF ;; *) echo "use --help" esac
腳本使用方法
1、手動備份還原
備份
1、安裝percona-xtrabackup-24-2.4.12
2、拷貝腳本到服務器A上,腳本名為mysql_backup.sh
3、修改腳本中的數據庫登錄用戶參數,要有所有權限
sql_user='root'
sql_host='192.168.1.33'
sql_pass='123456'
4、手動對當前數據庫進行全備份
./mysql_backup.sh -a
數據默認存儲到/data/backup/base中
5、手動對當前數據庫進行第一次增量備份
./mysql_backup.sh -i
數據默認存儲到/data/backup/inc1中
6、手動對當前數據庫進行第二次增量備份
./mysql_backup.sh -i
數據默認存儲到/data/backup/inc2中
還原
1、將A服務器的/data/backup/*所有文件拷貝到B服務器(192.168.1.100)/data/backup目錄中
scp -r /data/backup/* 192.168.1.100:/data/backup
2、拷貝腳本到服務器A上,腳本名為mysql_backup.sh
3、修改腳本中的mysql實際路徑名
data_dir=/var/lib/mysql
4、清空mysql目錄中的數據(請確認是否有用)
rm -rf /var/lib/mysql
5、執行腳本進行恢復
./mysql_backup.sh -m
2、自動備份還原
備份
1、安裝percona-xtrabackup-24-2.4.12 2、拷貝腳本到服務器A上,腳本名為mysql_backup.sh 將腳本放於/scrpit/mysql_backup.sh 3、修改腳本中的數據庫登錄用戶參數,要有所有權限
sql_user='root'
sql_host='192.168.1.33'
sql_pass='123456'
4、編輯定時任務,每天凌晨1:00備份
crontab -e
0 1 * * * /bin/bash /scrpit/mysql_backup.sh -b
還原
1、將A服務器的/data/backup/*所有文件拷貝到B服務器(192.168.1.100)/data/backup目錄中
scp -r /data/backup/* 192.168.1.100:/data/backup
2、拷貝腳本到服務器A上,腳本名為mysql_backup.sh
3、修改腳本中的mysql實際路徑名
data_dir=/var/lib/mysql
4、清空mysql目錄中的數據(請確認是否有用)
rm -rf /var/lib/mysql
5、執行腳本進行恢復
./mysql_backup.sh -r 2019 45 3
注意:./mysql_backup.sh -r 2019 45 3 含義是恢復到2019年第45周的周3。需要提前確認本周1,周2的目錄中是否有數據
后話:本腳本已測試過CentOS7,yum安裝的mariadb-server5.5.64 以及 二進制安裝的MySQL 5.7.27。其他版本未測試。依賴於xtrabackup的版本
本次使用的版本是percona-xtrabackup-24-2.4.12。如有問題請聯系微信18610586896