ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Xtrabackup异机远程备份

2022-07-14 18:02:07  阅读:177  来源: 互联网

标签:-% log -- 备份 db Xtrabackup 异机 incremental


随着公司业务的不断扩大,数据量也日益渐涨。往往人们总是觉得一般不会出什么大问题,从而容易忽略数据备份的重要性。以下是我所在环境的数据备份方案场景。大多数公司还是比较喜欢用云服务器节省资源,当然愿意花钱的可以用云厂商提供的备份工具。拥有独立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 数据库端

   
#!/bin/sh
#
#descriptiom: mysql data_back
#date: 2020-04-23

#备份主机
db_host='10.0.0.1'
#生产:10.0.0.1
#预发布:10.0.0.2

#备份用户
db_user='root'

#密码
db_pwd='123456789'
#生产:123456789
#预发布:123456789

#时间
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'
#生产:test
#预发布: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 --host=$127.0.0.1  --user=$db_user --password=$db_pwd  --databases=$db_name --stream=xbstream   --compress --extra-lsndir=$db_local1  $db_full|gzip|ssh root@10.31.233.247 "cat >/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==2{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_local1  --incremental-basedir=$db_local1  $db_incremental |gzip|ssh root@10.31.233.247  "cat >/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 "增量备份成功 $B_size1"
      ssh root@中转服务器IP "ls -lh /worker/db_back/incremental"|awk -F "[ ]"  'NR==2{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 -name  "*.gz" -exec rm -rf {} \;
 

1.5.3 本地存储端

   
#!/bin/sh
#
#descriptiom: mysql databack
#date: 2020-05-22

#备份清理
#时间
dates=`date "+%Y-%m-%d-%H:%M"`
dates1=`date -d '-1 day' '+%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 2 ]
then
   sshpass -p 中转服务器密码 scp -rp root@中转服务器外网IP:/worker/db_back/full/$dates1.gz $db_full
   B_stat=`echo $?`
   if [ $B_stat -eq 0 ]
   then
       B_size=`ls -lh $db_full/$dates1.gz|awk -F "[ ]"  'NR==1{for (i=4;i<=NF;i++)printf("%s ", $i);print ""}'`
       echo "全量备份拉取完成 $B_size"|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
       B_size1=`ls -lh $db_incremental/$dates1.gz|awk -F "[ ]"  'NR==1{for (i=4;i<=NF;i++)printf("%s ", $i);print ""}'`
       echo "增量备份拉取完成 $B_size1"|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 {} \;

标签:-%,log,--,备份,db,Xtrabackup,异机,incremental
来源: https://www.cnblogs.com/cheyunhua/p/16478764.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有