innobackupex远程备份脚本

#!/bin/sh
#备份主机
remote_ip=10.2.142.161
Master_ip=10.2.142.148
VIP=103.2.132.136
#备份用户
user='root'
#密码
password='123456'
# 返回年月日
backup_date=`date +%F`
# 返回时分秒
backup_time=`date +%H-%M-%S`
# 返回今天是这周的第几天
backup_week_day=`date +%u`
backup_ok=0
#备份目录
socket=/data/mysql/mysql.sock
# 备份路径
backup_dir=/data/xtrabackup
backup_dir_local=/data/xtrabackup_local
# 数据目录
datadir=/data/mysql
# percona-xtrabackup 备份软件路径
xtrabackup_dir=/usr/bin
# 全备是在一周的第几天
full_backup_week_day=6
#周期性全量增量开始日期

# 全量备信息名称前缀
full_backup_prefix=full
# 增量备信息名称前缀
increment_prefix=incr
# mysql配置文件
mysql_conf_file=/etc/my.cnf


cycle=$backup_date
cycle_record=$backup_dir/cycle_record.txt

if [ ! -f $backup_dir/cycle_record.txt ];then
     index=$backup_date
else
    if [ "$full_backup_week_day" -eq `date +%u` ]; then
     index=$backup_date
     else
     index=`cat $backup_dir/cycle_record.txt`
     fi
fi
index_file=$backup_dir/backup_$index.index
index_file_local=$backup_dir_local/backup_$index.index

log_dir=$backup_dir/log
if [ ! -d "$backup_dir" ];then
    mkdir -p $backup_dir
fi
if [ ! -d "$backup_dir_local" ];then
    mkdir -p $backup_dir_local
fi
if [ ! -d "$log_dir" ];then
    mkdir -p $log_dir
fi

function append_index_to_file() {
  echo "{week_day:$backup_week_day, \
         dir:${1}_${backup_date}_${backup_time}_${backup_week_day}, \
         type:${1}, \
         date:${backup_date}}" >> $index_file
}
function append_index_to_file_local() {
  echo "{week_day:$backup_week_day, \
         dir:${1}_${backup_date}_${backup_time}_${backup_week_day}, \
         type:${1}, \
         date:${backup_date}}" >> $index_file_local
}
# 判断是应该全备还是增量备份
# 0:full, 1:incr
function get_backup_type() {
  full_backup_week_day=$full_backup_week_day
  backup_type=0
  if [ ! -f "$index_file" ]; then
    touch "$index_file"
  fi
  if [ "$full_backup_week_day" -eq `date +%u` ]; then
    backup_type=0
  else
    backup_type=1
  fi
  if [ ! -n "`cat $index_file`" ]; then
    backup_type=0
  fi
  return $backup_type
}
#推送远程全量备份
function full_backup (){
    backup_folder=${full_backup_prefix}_${backup_date}_${backup_time}_${backup_week_day}
    if [ ! -d $backup_dir_local/$cycle/ ]; then
      mkdir $backup_dir/$cycle/
    fi
    echo $cycle>$backup_dir/cycle_record.txt
    ssh $user@$remote_ip  "if [ ! -d $backup_dir/$cycle/ ];then mkdir -p $backup_dir/$cycle; fi "
    innobackupex --defaults-file=$mysql_conf_file --no-timestamp --user=$user \
   --password=$password --host=${VIP} --port=3306 --extra-lsndir=$backup_dir/$cycle/$backup_folder  --compress \
   --stream=xbstream $backup_dir  | ssh $user@$remote_ip  "gzip ->$backup_dir/$cycle/$backup_folder.tar.gz" 
   if [ $? -eq 0 ];then
   append_index_to_file  $full_backup_prefix
    log_info 0 full
   else
    log_info 1 full
    fi
}

#推送远程增量备份{week_day:1,dir:full/incr_2015-12-29_00-00-00_7,type:full/incr}
incremental (){
  backup_folder=${increment_prefix}_${backup_date}_${backup_time}_${backup_week_day}
  incr_record=`cat $backup_dir/cycle_record.txt`
  echo $backup_dir/$incr_record
  
  #cd $backup_dir/$incr_record
  incr_base_folder=`sed -n '$p' $index_file | \
                   awk -F '[, {}]*' '{print $3}' | \
                   awk -F ':' '{print $2}'`
  echo $backup_dir/$incr_record/${incr_base_folder}
   innobackupex --defaults-file=$mysql_conf_file \
   --no-timestamp --user=$user --password=$password --host=${VIP} --port=3306  \
   --stream=xbstream --compress --extra-lsndir=$backup_dir/$incr_record/$backup_folder \
   --incremental backup_folder --incremental-basedir=$backup_dir/$incr_record/${incr_base_folder} \
    |ssh $user@$remote_ip  "gzip ->$backup_dir/$incr_record/$backup_folder.tar.gz" \
   
 if [ $? -eq 0 ];then
    log_info 0 incr
    append_index_to_file  $increment_prefix
   else
    log_info 1 incr
    fi
}

function full_backup_local (){
    backup_folder=${full_backup_prefix}_${backup_date}_${backup_time}_${backup_week_day}
    if [ ! -d $backup_dir_local/$cycle/ ]; then
    mkdir $backup_dir_local/$cycle/
    fi
    echo $cycle>$backup_dir_local/cycle_record.txt
    innobackupex --defaults-file=$mysql_conf_file --no-timestamp --user=$user \
    --password=$password --host=${VIP} --port=3306 $backup_dir_local/$cycle/$backup_folder
   
   if [ $? -eq 0 ];then
     echo "全量备份成功"
    append_index_to_file_local  $full_backup_prefix
    log_info_local 0 full
   else
    log_info_local 1 full
    fi
}

#本地增量备份{week_day:1,dir:full/incr_2015-12-29_00-00-00_7,type:full/incr}
incremental_local (){
  backup_folder=${increment_prefix}_${backup_date}_${backup_time}_${backup_week_day}
  incr_record=`cat $backup_dir_local/cycle_record.txt`
  echo $backup_dir_local/$incr_record
  
  #cd $backup_dir/$incr_record
  incr_base_folder=`sed -n '$p' $index_file_local | \
                   awk -F '[, {}]*' '{print $3}' | \
                   awk -F ':' '{print $2}'`
  echo  $incr_base_folder
  echo $backup_dir_local/$incr_record/${incr_base_folder}
   innobackupex --defaults-file=$mysql_conf_file \
   --no-timestamp --user=$user --password=$password --host=${VIP} --port=3306  \
   --incremental $backup_dir_local/$incr_record/$backup_folder --incremental-basedir=$backup_dir_local/$incr_record/$incr_base_folder   
  if [ $? -eq 0 ];then
    log_info_local 0 incr
    append_index_to_file_local  $increment_prefix
   else
    log_info_local 1 incr
    fi
}
function log_info (){
if [[ "$1" = "0" ]];then
	 if [ "$2" = "full" ];then
	  echo "全量备份成功" >$backup_dir/success
	 else
	  echo "增量备份成功" >$backup_dir/fail
	 fi
else
	 if [ "$2" = "full" ];then
	 
	 echo "全量备份失败" >$backup_dir/success
	 else
	 echo "增量备份失败" >$backup_dir/fail
	 fi
fi
}
function log_info_local ()
{
echo "全量备份成功"
if [[ "$1" = "0" ]];then
	 if [ "$2" = "full" ];then
	  echo "全量备份成功" >$backup_dir/success
	 else
	  echo "增量备份成功" >$backup_dir/fail
	 fi
else
	 if [ "$2" = "full" ];then
	 
	 echo "全量备份失败" >$backup_dir/success
	 else
	 echo "增量备份失败" >$backup_dir/fail
	 fi
fi
}
function run_auto() {
       get_backup_type
       backup_type=$?
       echo $backup_type
       case $backup_type in
	    0)
			     full_backup			   
			     ;;
	    1)
			     incremental			     
			     ;;
	    *)
			    echo "Please  use it this way. Usage:$0 {0|1}"
			;;
        esac  
}
function run_manual() {
           
		case $1 in
			 full)
			   full_backup
			     ;;
		  incremental)
			    incremental
			     ;;
			 *)
			    echo "Please  use it this way. Usage:$0 {Full|incremental}"
			;;
		  esac 
}
function run_auto_local() {
       get_backup_type
       backup_type=$?
       case backup_type in
	    0)
			     full_backup_local
			

			     ;;
	   1)
			     incremental_local
			     
			     ;;
	    *)
			    echo "Please  use it this way. Usage:$0 {Full|incremental}"
			;;
        esac  
}
function run_manual_local() {
               #echo $1
		case $1 in
			 full)
			     full_backup_local
			    
			     ;;
		  incremental)
			     incremental_local
			    
			     ;;
			 *)
			    echo "Please  use it this way. Usage:$0 {full|incremental}"
			;;
		  esac 
}
run_auto
#run_auto_local
#run_manual_local $1
#run_manual $1

What’s the problem with FTWRL anyway?
A lot has been written on what FLUSH TABLES WITH READ LOCK really does. Here’s yet another walk-through in a bit more detail than described elsewhere:

It first invalidates the Query Cache.
It then waits for all in-flight updates to complete and at the same time it blocks all incoming updates. This is one problem for busy servers.
It then closes all open tables (the FLUSH part) and expels them from the table cache. This is also whenFTWRL has to wait for all SELECT queries to complete. And this is another, even bigger problem for busy servers, because that wait happens to occur with all updates blocked. What’s even worse, the server at this stage is essentially offline, because even incoming SELECT queries will get blocked.
Finally, it blocks COMMITs.
1.它首先使查询缓存无效。
2.然后,等待所有更新完成,并在同一时间,它阻止所有的更新。这对于繁忙的服务器是一个问题。
3.然后,它关闭所有打开的表(冲洗表)并且从表中的高速缓存刷出。这也是当FTWRL必须等待所有的SELECT查询完成。这是另一个更大的问题为繁忙的服务器,因为等待恰好发生这将堵塞所有的更新。更糟的是,服务器在这个阶段基本上是离线状态,因为即使进入的SELECT查询将被封锁。
4.最后,它会阻止事务提交。

 

Percona已经提供了解决方案(2.1版本开始):

设置一个超时时间,避免无限期的等待。Xtrabackup提供了以下参数实现该功能:

--lock-wait-timeout=SECONDS, ,一旦Flush table with read lock被阻塞超过预定时间,则XtraBackup出错返回退出,该值默认为0,也就是说一旦阻塞,立即返回失败。
--lock-wait-query-type=all|update,该参数允许用户指定,哪类的SQL语句是需要Flush table with read lock等待的,同时用户可以通过--lock-wait-threshold=SECONDS设置等待的时间,如果不在query-type指定的类型范围内或者超过了wait-threshold指定的时间,XtraBackup均返回错误。如果指定update类型,则UPDATE/ALTER/REPLACE/INSERT 均会等待,ALL表示所有的SQL语句。

kill 其他阻塞线程
Kill掉所有阻塞Flush table with read lock的线程:
--kill-long-queries-timeout=SECONDS参数允许用户指定了超过该阈值时间的查询会被Kill,同时也允许用户指定Kill

SQL语句的类型。
--kill-long-query-type=all|select
默认值为ALL,如果选择Select,只有Select语句会被Kill,如果Flush table with read lock是被Update语句阻塞,则XtraBackup不会处理。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凤舞飘伶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值