MySQL數據庫備份腳本
一、增量備份
1、增量備份需要開啓MySQL的binlog日誌功能(僅限於非集羣數據庫及主從數據庫,用於單個數據庫),同時配置binlog二進制爲混合模式或ROW模式。
cat /etc/my.cnf
log-bin=/var/lib/mysql/mysql-bin
binlog_format=mixed #binlog_format=ROW
2、增量備份腳本
cat /opt/scripts/backup-mysql-incre.sh
#!/bin/bash
# 增量備份方式,在從機上執行,適用於中大型mysql數據庫
# 同時數據庫配置文件必須開啓binlog二進制文件
source /etc/profile # 加載系統環境變量
source ~/.bash_profile # 加載用戶環境變量
# 定義全局變量
backup_path="/data/backup/mysqlbak"
mysqlbin_path="/var/lib/mysql"
backup_log="/data/backup/mysqlbak/backup.log"
mysqlbinfile="/var/lib/mysql/mysql-bin.index"
date=$(date +%Y%m%d_%H:%M:%S)
day=30
# 刷新新的mysql-bin.0000*文件
mysqladmin -uroot -pHuawei@123 flush-logs
statistics=`cat $mysqlbinfile|wc -l`
num=0
# 判斷是否存在目錄,不存在則創建目錄
if [ ! -e $backup_path ];then
mkdir -p $backup_path
fi
# 刪除30天以前備份
find $backup_path -type f -mtime +$day -exec rm -rf {} \; > /dev/null 2>&1
# for循環對比是否存在或是否爲最新的文件
echo "開始備份數據庫: ..."
for file in `cat $mysqlbinfile`
do
# basename用於截取mysql-bin.0000*文件名,去掉./mysql-bin.0000*前面的./
dbname=`basename $file`
backup_name=`basename $file`_$date
statistics=`expr $num + 1`
cd $backup_path
# 判斷是否刷新二進制文件
if [ $num != $statistics ];then
dest=$backup_path/$dbname*
# 判斷文件是否存在,不存在則備份
if [ ! -e $dest ];then
cp $mysqlbin_path/$dbname $backup_path/
# --force-local,壓縮文件中帶有冒號需要加上--force-local參數
tar czvf $backup_name.tar.gz $dbname --force-local
size=$(du $dbname.tar.gz -sh | awk '{print $1}')
rm -rf $dbname
echo "$dbname 備份 $dbname($size) 成功" >> $backup_log
du $backup_path/* -sh | grep mysql-bin | awk '{print "文件:" $2 ",大小:" $1}'
else
echo "$dbname 備份 $dbname 已存在" >> $backup_log
continue
fi
fi
done
echo "備份結束,結果查看 $backup_log"
du $backup_path/* -sh | grep mysql-bin | awk '{print "文件:" $2 ",大小:" $1}'
3、保存退出加上可執行權限
chmod +x /opt/scripts/backup-mysql-incre.sh
二、全量備份
1、全量備份是直接對數據庫進行備份(可用於集羣以及主從數據庫),備份參數說明:
--single-transaction數據一致性
--lock-all-tables爲所有表加讀鎖(於--single-transaction互斥)
--routinge存儲過程與函數、--all-databases備份所有庫
--triggers觸發器、--events記錄事件
--master-data=2在備份文件中記錄當前二進制日誌的位置,並且爲註釋的,1是不註釋掉在主從複製中才有意義
#--flush-logs日誌滾動一次
2、全量備份腳本
cat /opt/scripts/backup-mysql-all.sh
#!/bin/bash
# 全備方式,一般在從機上執行,適用於小中型mysql數據庫
source /etc/profile # 加載系統環境變量
source ~/.bash_profile # 加載用戶環境變量
# 定義全局變量
user="root"
password="123"
host="localhost"
port="3306"
db=("zabbix")
local="--single-transaction"
mysql_path="/usr/share/mysql"
backup_path="/data/backup/mysqlbak"
date=$(date +%Y%m%d_%H:%M:%S)
day=30
backup_log="/data/backup/mysqlbak/backup.log"
# 判斷是否存在目錄,不存在則創建目錄
if [ ! -e $backup_path ];then
mkdir -p $backup_path
fi
# 刪除30天以前備份
find $backup_path -type f -mtime +$day -exec rm -rf {} \; > /dev/null 2>&1
echo "開始備份數據庫: ${db[*]}"
# 備份數據庫後壓縮
backup_sql(){
dbname=$1
backup_name="${dbname}_${date}.sql"
mysqldump -h $host -P $port -u $user -p$password $lock --default-character-set=utf8 --flush-logs -R $dbname > $backup_path/$backup_name
if [[ $? == 0 ]];then
cd $backup_path
# tar --force-local參數壓縮帶有冒號的壓縮包
tar czvf $backup_name.tar.gz $backup_name --force-local
size=$(du $backup_name.tar.gz -sh | awk '{print $1}')
rm -rf $backup_name
echo "$date 備份 $dbname($size) 成功"
else
cd $backup_path
rm -rf $backup_name
echo "$date 備份 $dbname 失敗"
fi
}
# 多個庫循環備份
length=${#db[@]}
for ((i=0;i<$length;i++));do
backup_sql ${db[i]} >> $backup_log 2>&1
done
echo "備份結束,結果查看 $backup_log"
du $backup_path/*$date* -sh | awk '{print "文件:" $2 ",大小:" $1}'
3、保存退出加上可執行權限
chmod +x /opt/scripts/backup-mysql-all.sh
三、開啓定時任務
crontab -e
# 每個週日凌晨一點執行數據庫全量備份腳本
00 01 * * 0 /opt/scripts/backup-mysql-all.sh > /dev/null 2>&1
# 週一到週六凌晨一點執行數據庫增量備份腳本
00 01 * * 1-6 /opt/scripts/backup-mysql-incre.sh > /dev/null 2>&1
查看定時任務
crontab -l