首页 > 其他 > 详细

Xtrabackup异机远程备份

时间:2020-06-04 16:10:51      阅读:388      评论:0      收藏:0      [点我收藏+]

       随着公司业务的不断扩大,数据量也日益渐涨。往往人们总是觉得一般不会出什么大问题,从而容易忽略数据备份的重要性。以下是我所在环境的数据备份方案场景。大多数公司还是比较喜欢用云服务器节省资源,当然愿意花钱的可以用云厂商提供的备份工具。拥有独立IDC的可以使用专业备份设备本地+异地通过光纤备份,效率和安全都是极致的。我现在的环境就是比较尴尬的一种,首先数据库等业务环境都在云服务器上,但是云服务器没有较大的空间去存储备份,也不愿去采用厂商的备份工具。这就需要我们将备份拉取的本地进行存储。在此之前他们原有的备份方式是采用破解的MySQL客户端工具Navicat Premium在本地进行远程备份,这种方法可以备份,但是存在各种问题。首先你是用的非正版,出了问题你除了百度别无他法,再者这种工具拿来备份的人是极少的,你在百度上搜素也找不到多少相关的文章,所以是一个较大的坑。另一方面根据实际观察,这玩意在本地进行备份走的是MySQL的公网,且不说备份速度极慢,备份期间长时间占满MySQL服务器的出网带宽,这是我们不愿看到的现象。

数据备份我们要遵守以下几点:

1.备份时不能影响业务正常运行,则需要热备

2.备份效率要高(数据量不大却要备份四五个小时,这种方式肯定不能要)

3.备份的完整性(我们备份的数据不是仍在存储里就可以了,它要在出现意外故障的时候能用得上)

4.备份的最小化(存储也是要花钱的,我们当然需要,备份保留的时间最长,占用的空间越小越好)

1.1拓扑图

技术分享图片

 

 

1.2 Xtrabackup介绍

PerconaXtraBackup[A1] 是一个免费的、在线的、开放源码的、针对MySQL和MySQL的Percona Server所有版本的完整数据库备份解决方案。PerconaXtraBackup在事务性系统上执行在线非阻塞、严格压缩、高度安全的完全备份,以便应用程序在计划的维护窗口中仍然完全可用。

官网:https://www.percona.com

1.3 备份方式

l  热备份:读写不受影响(mysqldump-->innodb)

l  温备份:仅可以执行读操作(mysqldump-->myisam)

l  冷备份:离线备份,读写都不可用

l  逻辑备份:将数据导出文本文件中(mysqldump)

l  物理备份:将数据文件拷贝(xtrabackup、mysqlhotcopy)

l  完整备份:备份所有数据

l  增量备份:仅备份上次完整备份或增量备份以来变化的数据

l  差异备份:仅备份上次完整备份以来变化的数据

xtrabackup是一种物理备份工具,通过协议连接到mysql服务端,然后读取并复制innodb底层的"数据块",完成所谓的"物理备份"。

1.4 xtrabackup 特点

1、备份过程快速、可靠;

2、备份过程不会打断正在执行的事务;

3、能够基于压缩等功能节约磁盘空间和流量;

4、自动实现备份检验;

5、还原速度快;

* 热备

* 增量

* 差量

Xtrabackup有两个主要的工具:

l  xtrabackup

l  innobackupex

1.xtrabackup 是用来备份 InnoDB 表的,不能备份非 InnoDB 表,和 mysqld server 没有交互;

2.innobackupex 脚本用来备份非 InnoDB 表,同时会调用 xtrabackup 命令来备份 InnoDB 表,还会和 mysqld server 发送命令进行交互,如加读锁(FTWRL)、获取位点(SHOW SLAVE STATUS)等

简单来说,innobackupex 在 xtrabackup 之上做了一层封装。

一般情况下,我们是希望能备份 MyISAM 表的,虽然我们可能自己不用 MyISAM 表,但是 mysql 库下的系统表是 MyISAM 的,因此备份基本都通过 innobackupex 命令进行。


 [A1]Facebook是PerconaXtraBackup中增量备份的早期采用者

1.5 备份脚本

1.5.1 数据库端

[root@ ~]# cd /data/scripts/
[root@ scripts]# ll
total 8
-rwxr-xr-x 1 root root 3543 May 26 09:12 db_back.sh #备份脚本
-rwxr-xr-x 1 root root  202 May 26 09:12 manage.sh #总控制脚本

[root@ scripts]# cat manage.sh 
#!/bin/sh
#
#descriptiom: mysql databack
#date: 2020-05-25

week=`date +%w`

if [ $week -eq 1 ]
then 
    /bin/sh /data/scripts/db_back.sh full
else
    /bin/sh /data/scripts/db_back.sh incremental
fi
[root@ scripts]# cat db_back.sh 
#!/bin/sh
#
#descriptiom: mysql data_back
#date: 2020-04-23

#备份主机
db_host=123.456.789.101
#生产:
#预发布:

#备份用户
db_user=root

#密码
db_pwd=*********
#生产:**********
#预发布:*********

#时间
dates=`date "+%Y-%m-%d-%H:%M"`
dates1=`date  "+%Y-%m-%d"`

#备份目录
db_full=/home/mysql/back/full
db_incremental=/home/mysql/back/incremental
db_local1=/home/mysql/back/full/chkpoint
db_local2=/home/mysql/back/incremental/chkpoint
#数据库
db_name=‘test
#生产:
#预发布:

#日志路径
db_log=/home/mysql/log

############################
if [ ! -d $db_local1 ]
then
    mkdir -p $db_local1
fi

if [ ! -d $db_local2 ]
then
   mkdir -p $db_local2
fi

if [ ! -d $db_log ]
then
   mkdir -p $db_log
fi
############################
#日志
function log_info ()
{
if [  -d $db_log/dbback  ]
then
    touch $db_log/dbback
fi
DATE_N=`date "+%Y-%m-%d %H:%M:%S"`
USER_N=`whoami`
echo "${DATE_N} ${USER_N} execute $0 [INFO] $@" >>$db_log/dbback
}

function log_error (){
  DATE_N=`date "+%Y-%m-%d %H:%M:%S"`
  USER_N=`whoami`
  echo -e "\033[41;37m ${DATE_N} ${USER_N} execute $0 [ERROR] $@ \033[0m"  >>$db_log/dbback
}

function fn_log ()  {
if [  $? -eq 0  ]
then
    log_info "$@ sucessed."
    echo -e "\033[32m $@ sucessed. \033[0m"
else
    log_error "$@ failed."
    echo -e "\033[41;37m $@ failed. \033[0m"
    exit 1
fi
}
trap fn_log "do not send CTR + C when excute script !!!! "  2

}

#全量备份
Full (){
  innobackupex --defaults-file=/etc/my.cnf --user=$db_user --password=$db_pwd  --databases=$db_name --stream=xbstream   --compress --extra-lsndir=$db_local1  $db_full |ssh root@10.31.233.247 "gzip - >/worker/db_back/full/$dates1.gz"
  B_tat=`echo $?`
  if [ $B_tat -eq 0 ]
  then
      B_size=`ssh root@中转站内网IP "ls -lh /worker/db_back/full"|awk -F "[ ]" {print $5,$9}`
      fn_log "全量备份成功   $B_size"
      ssh root@中转站内网IP "ls -lh /worker/db_back/full"|awk -F "[ ]"  NR>1{for (i=4;i<=NF;i++)printf("%s ", $i);print ""}>>/home/mysql/log/mail.txt
      mail -s "MySQL data backup"  yunwei@163.com </home/mysql/log/mail.txt
      >/home/mysql/log/mail.txt
  else
      fn_log "全量备份失败"
      echo "全量备份失败"|mail -s "MySQL data backup"  yunwei@163.com
  fi
}
#增量备份
incremental (){
  innobackupex --defaults-file=/etc/my.cnf --host=127.0.0.1 --user=$db_user  --password=$db_pwd --databases=$db_name --stream=xbstream  --compress --incremental --extra-lsndir=$db_local2 $db_incremental --incremental-basedir=$db_full |ssh root@10.31.233.247  "gzip - >/worker/db_back/incremental/$dates1.gz"
  B_tat1=`echo $?`
  if [ $B_tat1 -eq 0 ]
  then 
      B_size1=`ssh root@中转站内网IP "ls -lh /worker/db_back/incremental"|awk -F "[ ]" {print $5,$9}`
      fn_log "增量备份成功 $Bsize1"
      ssh root@中转站内网IP "ls -lh /worker/db_back/incremental"|awk -F "[ ]"  NR>1{for (i=4;i<=NF;i++)printf("%s ", $i);print ""}>>/home/mysql/log/mail.txt
      mail -s "MySQL data backup"  yunwei@163.com </home/mysql/log/mail.txt
      >/home/mysql/log/mail.txt
  else
      fn_log "增量备份失败"
      echo "增量备份失败"|mail -s "MySQL data backup" yunwei@163.com   
  fi
}

case $1 in
         Full)
             Full
             ;;
  incremental)
             incremental
             ;;
         *)
            echo "Please  use it this way. Usage:$0 {Full|incremental}"
        ;;
esac

1.5.2 中转站脚本

[root@ ~]# cd /data/scripts/
[root@ scripts]# ll
total 4
-rwxr-xr-x 1 root root 406 May 25 14:31 backup.sh

[root@ scripts]# cat backup.sh 
#!/bin/sh
#
#descriptiom: mysql databack
#date: 2020-05-22

#备份清理
#时间
dates=`date "+%Y-%m-%d-%H:%M"`
dates1=`date  "+%Y-%m-%d"`

#备份保留时间(天)
Rtime=1

#备份目录
db_full=/worker/db_back/full
db_incremental=/worker/db_back/incremental

find $db_full -mtime +$Rtime -name  "*.gz" -exec rm -rf {} \;
find $db_incremental -mtime +$Rtime -nmae  "*.gz" -exec rm -rf {} \;

1.5.3 本地存储端

[root@db-back ~]# cd /data/scripts/
[root@db-back scripts]# ll
总用量 4
-rwxr-xr-x 1 root root 1279 5月  26 09:15 db_back.sh

[root@db-back scripts]# cat db_back.sh 
#!/bin/sh
#
#descriptiom: mysql databack
#date: 2020-05-22

#备份清理
#时间
dates=`date "+%Y-%m-%d-%H:%M"`
dates1=`date  "+%Y-%m-%d"`

#备份保留时间(天)
Rtime=90
#备份目录
db_full=/home/mysql/back/full
db_incremental=/home/mysql/back/incremental

if [ ! -d $db_full ]
then
    mkdir -p $db_full
fi

if [ ! -d $db_incremental ]
then
   mkdir -p $db_incremental
fi

week=`date +%w`
if [ $week -eq 1 ]
then
   sshpass -p 中转站服务器密码 scp -rp root@中转站外网IP:/worker/db_back/full/$dates1.gz $db_full #采用sshpass跳过验证
   B_stat=`echo $?`
   if [ $B_stat -eq 0 ]
   then
       echo "全量备份拉取完成"|mail -s "MySQL data backup" yunwei@163.com
   else
       echo "全量备份拉取失败"|mail -s "MySQL data backup" yunwei@163.com
   fi
else
   sshpass -p 中转站服务器密码 scp -rp root@中转站外网IP:/worker/db_back/incremental/$dates1.gz $db_incremental
   B_stat1=`echo $?`
   if [ $B_stat1 -eq 0 ]
   then
       echo "增量备份拉取完成"|mail -s "MySQL data backup" yunwei@163.com
   else
       echo "增量备份拉取失败"|mail -s "MySQL data backup" yunwei@163.com
   fi

fi

find $db_full -mtime +$Rtime -name  "*.gz" -exec rm -rf {} \;

find $db_incremental -mtime +$Rtime -name "*.gz" -exec rm -rf {} \;

 

Xtrabackup异机远程备份

原文:https://www.cnblogs.com/FireLL/p/13042287.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!