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.cnfcycle=$backup_date
cycle_record=$backup_dir/cycle_record.txtif [ ! -f $backup_dir/cycle_record.txt ];thenindex=$backup_date
elseif [ "$full_backup_week_day" -eq `date +%u` ]; thenindex=$backup_dateelseindex=`cat $backup_dir/cycle_record.txt`fi
fi
index_file=$backup_dir/backup_$index.index
index_file_local=$backup_dir_local/backup_$index.indexlog_dir=$backup_dir/log
if [ ! -d "$backup_dir" ];thenmkdir -p $backup_dir
fi
if [ ! -d "$backup_dir_local" ];thenmkdir -p $backup_dir_local
fi
if [ ! -d "$log_dir" ];thenmkdir -p $log_dir
fifunction 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_daybackup_type=0if [ ! -f "$index_file" ]; thentouch "$index_file"fiif [ "$full_backup_week_day" -eq `date +%u` ]; thenbackup_type=0elsebackup_type=1fiif [ ! -n "`cat $index_file`" ]; thenbackup_type=0fireturn $backup_type
}
#推送远程全量备份
function full_backup (){backup_folder=${full_backup_prefix}_${backup_date}_${backup_time}_${backup_week_day}if [ ! -d $backup_dir_local/$cycle/ ]; thenmkdir $backup_dir/$cycle/fiecho $cycle>$backup_dir/cycle_record.txtssh $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 ];thenappend_index_to_file  $full_backup_prefixlog_info 0 fullelselog_info 1 fullfi
}#推送远程增量备份{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_recordincr_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 ];thenlog_info 0 incrappend_index_to_file  $increment_prefixelselog_info 1 incrfi
}function full_backup_local (){backup_folder=${full_backup_prefix}_${backup_date}_${backup_time}_${backup_week_day}if [ ! -d $backup_dir_local/$cycle/ ]; thenmkdir $backup_dir_local/$cycle/fiecho $cycle>$backup_dir_local/cycle_record.txtinnobackupex --defaults-file=$mysql_conf_file --no-timestamp --user=$user \--password=$password --host=${VIP} --port=3306 $backup_dir_local/$cycle/$backup_folderif [ $? -eq 0 ];thenecho "全量备份成功"append_index_to_file_local  $full_backup_prefixlog_info_local 0 fullelselog_info_local 1 fullfi
}#本地增量备份{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_recordincr_base_folder=`sed -n '$p' $index_file_local | \awk -F '[, {}]*' '{print $3}' | \awk -F ':' '{print $2}'`echo  $incr_base_folderecho $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 ];thenlog_info_local 0 incrappend_index_to_file_local  $increment_prefixelselog_info_local 1 incrfi
}
function log_info (){
if [[ "$1" = "0" ]];thenif [ "$2" = "full" ];thenecho "全量备份成功" >$backup_dir/successelseecho "增量备份成功" >$backup_dir/failfi
elseif [ "$2" = "full" ];thenecho "全量备份失败" >$backup_dir/successelseecho "增量备份失败" >$backup_dir/failfi
fi
}
function log_info_local ()
{
echo "全量备份成功"
if [[ "$1" = "0" ]];thenif [ "$2" = "full" ];thenecho "全量备份成功" >$backup_dir/successelseecho "增量备份成功" >$backup_dir/failfi
elseif [ "$2" = "full" ];thenecho "全量备份失败" >$backup_dir/successelseecho "增量备份失败" >$backup_dir/failfi
fi
}
function run_auto() {get_backup_typebackup_type=$?echo $backup_typecase $backup_type in0)full_backup			   ;;1)incremental			     ;;*)echo "Please  use it this way. Usage:$0 {0|1}";;esac  
}
function run_manual() {case $1 infull)full_backup;;incremental)incremental;;*)echo "Please  use it this way. Usage:$0 {Full|incremental}";;esac 
}
function run_auto_local() {get_backup_typebackup_type=$?case backup_type in0)full_backup_local;;1)incremental_local;;*)echo "Please  use it this way. Usage:$0 {Full|incremental}";;esac  
}
function run_manual_local() {#echo $1case $1 infull)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,同时也允许用户指定KillSQL语句的类型。
--kill-long-query-type=all|select
默认值为ALL,如果选择Select,只有Select语句会被Kill,如果Flush table with read lock是被Update语句阻塞,则XtraBackup不会处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/535328.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL管理利器 MySQL Utilities---mysqlreplicate

mysqlreplicate 工具是在两台服务器间设置和启动复制。用户提供登录从服务器信息和连接到主的信息。也可以指定一个数据库用于测试复制。 该工具报告条件是当主和从的存储引擎不一样时。如果主和从的存储引擎不同将产生告警信息。对于Innodb存储引擎而言,必需完全…

MySQL管理工具MySQL Utilities — 如何连接MySQL服务器

连接参数 连接到一个服务器,必须指定连接参数,如用户名,主机名称,密码,端口号,socket。MySQL Utilities提供了三种提供这些参数的方法,这些方法都需要通过命令行指定。 使用.mylogin.cnf文件&…

MHA高可用

manager 组件 masterha_manger # 启动MHA masterha_check_ssh # 检查MHA的SSH配置状况 masterha_check_repl # 检查MySQL复制状况,配置信息 masterha_master_monitor # 检测master是否宕机 masterha_check_status # 检测当…

MySQL Replication需要注意的问题

主库意外宕机 如果没有设置主库的sync_binlog选项,就可能在奔溃前没有将最后的几个二进制日志事件刷新到磁盘中。备库I/O线程因此也可一直处于读不到尚未写入磁盘的事件的状态中。当主库从新启动时,备库将重连到主库并再次尝试去读该事件,但…

update和delete操作忘加where条件导致全表更新的处理方法

在数据库日常维护中,开发人员是最让人头痛的,很多时候都会由于SQL语句写的有问题导致服务器出问题,导致资源耗尽。最危险的操作就是在做DML操作的时候忘加where条件,导致全表更新,这是作为运维或者DBA的我们改如何处理…

Innodb结构

从MySQL5.5版本开始默认使用InnoDB作为引擎,它擅长处理事务,具有自动崩满恢复的特性,在日常开发中使用非常广泛,下面是言方的InnoDB引擎美构图,主要分为内存结构和磁盘结构两大部分。 内存结构主要包括Buffer Pool、C…

ES备份工具elasticdump

安装 下载node下载 | Node.js 中文网 tar xvf node-v16.5.0-linux-x64.tar.xz ln -s /app/temp/node-v16.5.0-linux-x64/bin/node /usr/bin/node ln -s /app/temp/node-v16.5.0-linux-x64/bin/npm /usr/bin/npm npm install elasticdump -g npm config get cache npm in…

innodb_flush_method理解【转】

innodb_flush_method这个参数控制着innodb数据文件及redo log的打开、刷写模式,对于这个参数,文档上是这样描述的: 有三个值:fdatasync(默认),O_DSYNC,O_DIRECT 默认是fdatasync,调用fsync()去…

linux下的/dev/shm/

首先可以看出来/dev/shm是一个设备文件, 可以把/dev/shm看作是系统内存的入口, 可以把它看做是一块物理存储设备,一个tmp filesystem, 你可以通过这个设备向内存中读写文件, 以加快某些I/O高的操作,比如对一个大型文件频繁的open, write, read&#xff0…

2021-07-30

1.服务器级别的锁等待 可以通过show processlist看到等待锁的线程id,但是无法知道究竟哪个线程持有锁 可以通过mysqladmin debug 相关等待锁的线程以及谁持有锁可以在错误日志中找到 2.存储引擎层的锁等待则比较麻烦,以下是innodb存储引擎中锁等待以及…

getopt设计shell脚本选项

写shell脚本的时候,通过while、case、shift来设计脚本的命令行选项是一件比较麻烦的事,因为Unix命令行的选项和参数自由度很高,支持短选项和长选项,参数可能是可选的,选项顺序可能是无所谓的,等等。 bash下…

percona-toolkit---pt-heartbeat

对于MySQL数据库主从复制延迟的监控,可以借助percona的有力武器pt-heartbeat来实现。 pt-heartbeat的工作原理通过使用时间戳方式在主库上更新特定表,然后在从库上读取被更新的时间戳然后与本地系统时间对比来得出其延迟。具体流程: 1&…

定时删除脚本

#!/bin/sh backup_dir/data/xtrabackup DATEdate %Y-%m-%d #DATE_NOWdate %Y-%m-%d.%H%M DATE_NOWdate %Y-%m-%d PATH/usr/local/mysql/bin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin export PATHbinog保留7天 binlog/data/binlogserver binlog_Rtime7#备…

percona-toolkit--pt-table-checksum

pt-table-checksum 是 Percona-Toolkit的组件之一,用于检测MySQL主、从库的数据是否一致。其原理是在主库执行基于statement的sql语句来生成主库数据块的checksum,把相同的sql语句传递到从库执行,并在从库上计算相同数据块的checksum&#xf…

Docker容器间网络通信

自从Docker容器出现以来,容器网络通信就一直是被关注的焦点,也是生产环境的迫切需求。容器网络通信又分为两大方面:单主机容器上的相互通信,和跨主机的容器相互通信。 一、Docker单主机容器通信 基于对net namespace的控制&#…

Docker容器的重启策略

1. Docker容器的重启策略 Docker容器的重启策略是面向生产环境的一个启动策略,在开发过程中可以忽略该策略。 Docker容器的重启都是由Docker守护进程完成的,因此与守护进程息息相关。 Docker容器的重启策略如下: no,默认策略&…

innobackupex实现导出和导入单张表

默认情况下,InnoDB表不能通过直接复制表文件的方式在mysql服务器之间进行移植,即便使用了innodb_file_per_table选项。而使用Xtrabackup工具可以实现此种功能,不过只能"导出"具有.ibd文件的表,也就是说导出表的mysql服务…

xtrabackup工具

(1).备份过程 和innobackupex备份过程不同的是,xtrabackup的备份路径是由"--target-dir"选项严格指定的,如果指定的目录不存在,它备份的时候不会在target-dir目录中再创建时间戳子目录。 [rootxuexi data]# xtrabackup --backup …

mysql数据库参数

注意:在配置binlog相关变量的时候,相关变量名总是搞混,因为有的是binlog,有的是log_bin,当他们分开的时候,log在前,当它们一起的时候,bin在前。在配置文件中也同样如此。 log_bin …

oracle命令行安装

cd /home/oracle/databases/runInstaller -silent -force -showprogress -responseFile /home/oracle/database/db_install.rsp -ignoreSysPrereqs -ignorePrereqdbca -silent -responseFile pwd/dbca.rspnetca -silent -responseFile /home/oracle/databases/netca.rsp