MySQL數據庫全量備份與增量備份

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章