MySQLデータベース全量バックアップとインクリメンタルバックアップ

4438 ワード

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
  num+=1
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> $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