MySQL数据库使用xtrabackup备份实现小例子

  关于MySQL数据库的备份的工具和方式也比较多,本文只简单介绍一些我司一个平台的备份方案。Xtrabackup是由percona开源的免费数据库热备份软件,但是只能对InnoDB数据库和XtraDB存储引擎的数据库进行非阻塞的备份,但是对于MyISAM(比如MySQL)的备份同样在备份过程中会锁表。更多的关于Xtrabackup介绍请度娘之。

1,安装Xtrabackup

  到官网https://www.percona.com下载tar进行安装,由于我司服务器部分可连公网,直接在服务商下载并传到目标主机即可

  

[root@host1 tmp]#wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.9/binary/redhat/6/x86_64/Percona-XtraBackup-2.4.9-ra467167cdd4-el6-x86_64-bundle.tar
[root@host1 tmp]#tar -xvf Percona-XtraBackup-2.4.9-ra467167cdd4-el6-x86_64-bundle.tar
[root@host1 tmp]#rpm -ivh percona-xtrabackup-24-debuginfo-2.4.9-1.el6.x86_64.rpm

  安装后会生成几个工具,其中innobackupex就可以用来对MySQL进行备份的。

2,我司平台数据库备份策略

  平台MySQL数据当前部署在A和B两台服务器上,两台互为主备实时同步数据,目前主用库是A。备份脚本和定时任务在两台服务上都有部署,定时任务在两台服务商每天都会执行,但是脚本策略只会对主用库进行备份,判断的主要依据是MySQL数据的浮动IP在那个主机上。

  全量备份

#全量备份脚本
#!/bin/bash
HOMEDIR=/opt/DB_backup

#判断全量备份的保存目录,日志目录是否存在,不存在的话新建
[ -d /opt/DB_backup/full_bakcup ] || mkdir -p /opt/DB_backup/full_bakcup
[ -d /opt/DB_backup/logs ] || mkdir -p /opt/DB_backup/logs

#设置备份日志
logfile=`date "+%Y%m%d"`_fullbackup.log
touch $HOMEDIR/logs/$logfile

#判断浮动IP是否启动在此主机上
/sbin/ip addr | grep 192.168.1.10
if [ $? -ne 0 ];then
        echo "This is not the master DB, no need to backup." >> $HOMEDIR/logs/$logfile
        exit 3
fi

#检查mysql是否运行正常
/usr/sbin/lsof -i:3306 | grep LISTEN
if [ $? -ne 0 ];then
        echo "MySQL may not working correctly, can not find LISTEN for mysql." >> $HOMEDIR/logs/$logfile
        exit 5
fi

ps -ef | grep /home/mysql/bin/mysqld
if [ $? -ne 0 ];then
        echo "MySQL may not working correctly, can not find pid for mysql." >> $HOMEDIR/logs/$logfile
        exit 7
fi

#执行全量备份
/usr/bin/innobackupex --defaults-file=/etc/my.cnf --user=root --password="[email protected]" /opt/DB_backup/full_bakcup/  &>> $HOMEDIR/logs/$logfile
[ $? -eq 0 ] && echo "Full backup successful." >> $HOMEDIR/logs/$logfile

#将前一周的增量备份转移到/home的临时保存目录
tmp_back_name="`date -d "-7 days" +"%Y%m%d"`-`date -d "-1 days" +"%Y%m%d"`"
tar -zcvf /home/old_DB_backup/$tmp_back_name.tar.gz /opt/DB_backup/incremental_backup/201* &>> $HOMEDIR/logs/$logfile && rm -rf /opt/DB_backup/incremental_backup/* &>> $HOMEDIR/logs/$logfile && echo "$tmp_back_name 的增量备份转移到/home的临时保存目录成功." >> $HOMEDIR/logs/$logfile

  增量备份

  增量备份同样通过MySQL浮动IP判断该主机是不是主用库,然后再判定MySQL的运行状态是否正常。上述判定通过会再对依赖的全量备份目录进行判定,如果该主机没有进行过全量备份,或者最近的一次全量备份是7天前的,则不会进行增量备份,转而进行全量备份。每天增量备份均使用周一的全量备份为base, 这样虽然会多占用一些磁盘空间,但是恢复时则只需要执行两次恢复动作即可。

#增量备份脚本
#!/bin/bash
#本脚本目的用于每天一次MySQL增量备份

HOMEDIR=/opt/DB_backup

#判断增量备份的保存目录,日志目录是否存在,不存在的话新建
[ -d /opt/DB_backup/incremental_backup ] || mkdir -p /opt/DB_backup/incremental_backup
[ -d /opt/DB_backup/logs ] || mkdir -p /opt/DB_backup/logs

#设置备份日志
logfile=`date "+%Y%m%d"`_incremental_backup.log

touch $HOMEDIR/logs/$logfile

#判断主机是不是mysql的主用库,如果不是主库则退出脚本的运行.
/sbin/ip addr | grep 192.168.1.10
if [ $? -ne 0 ];then
        echo "This is not the master DB, no need to backup." >> $HOMEDIR/logs/$logfile
        exit 3
fi

#检查mysql是否运行正常
/usr/sbin/lsof -i:3306 | grep LISTEN
if [ $? -ne 0 ];then
        echo "MySQL may not working correctly, can not find LISTEN for mysql." >> $HOMEDIR/logs/$logfile
        exit 5
fi

ps -ef | grep /home/mysql/bin/mysqld
if [ $? -ne 0 ];then
        echo "MySQL may not working correctly, can not find pid for mysql." >>$HOMEDIR/logs/$logfile
        exit 7
fi

#确认增量备份所依赖的全量备份最新的目录
basedir=`ls -lrt /opt/DB_backup/full_bakcup | tail -1 | awk ‘{print $9}‘`
#判定如果该主机未执行过全灵备份,则执行全量备份,取消增量备份
if [ "$basedir" == "" ];then
    echo "This DB dosen‘t has a full backup before, cannot execute incremental backup." >>$HOMEDIR/logs/$logfile
    echo "Begin to execute full backup." >>$HOMEDIR/logs/$logfile
    sh /opt/DB_backup/shell/full_backup.sh
    if [ $? -eq 0 ];then
        echo "The first full backup on this server is successful, the incremental backup will begin at tomorrow.">>$HOMEDIR/logs/$logfile
        exit
    fi
    exit 77
fi

#确认该主机已存在的全量备份是否早于7天,如果不是7天内的全量备份,则执行全量备份.
T1=`date +"%Y-%m-%d"`
T2=`echo "$basedir" |awk -F_ ‘{print $1}‘`
Day1=`date +%s -d "$T1"`
Day2=`date +%s -d "$T2"`
Day3=$((($Day1-$Day2)/86400))
if [ $Day3 -gt 7 ];then
    echo "The lastest full backup is 7 days ago, begin to execute full backup." >>$HOMEDIR/logs/$logfile
    sh /opt/DB_backup/shell/full_backup.sh
    if [ $? -eq 0 ];then
        echo "exec full backup successful, pls check full backup logs.">>$HOMEDIR/logs/$logfile
        exit
    fi
    exit 99
fi

#将全量备份的目录打印到日志
echo "The basedir is $basedir" >> $HOMEDIR/logs/$logfile

#执行增量备份
/usr/bin/innobackupex --defaults-file=/etc/my.cnf --user=root --password="[email protected]" --incremental --incremental-basedir=/opt/DB_backup/full_bakcup/$basedir /opt/DB_backup/incremental_backup >> $HOMEDIR/logs/$logfile

[ $? -eq 0 ] && echo "Incremental backup successful." >> $HOMEDIR/logs/$logfile

3,恢复方案

  数据的恢复操作是比较简单的

  全量恢复

#先prepare,利用--apply-log的作用是通过回滚未提交的事务及同步已经提交的事务至数据文件使数据文件处于一致性状态
innobackupex --apply-log /opt/DB_backup/full_bakcup/2019-05-09_10-45-32

#还原操作需要清空源库的所有数据,并删除原始数据目录下的数据文件
mysql> drop database xxx;

rm -rf ib_logfile0 ib_logfile1 ibdata1

#恢复命令
innobackupex --defaults-file=/etc/mysql/my.cnf --copy-back /opt/DB_backup/full_bakcup/2019-05-09_10-45-32

  增量恢复

 

#如果是数据只是部分数据有损,在确定有损数据范围后,可直接还原增量即可
innobackupex --apply-log /opt/DB_backup/full_bakcup/2019-05-09_10-45-32 --incremental-dir=/home/DB_backup/incremental_backup/2019-05-11_03-00-00

#如果是数据全部损毁,执行如下操作
#1,先还原全量
innobackupex --defaults-file=/etc/mysql/my.cnf --copy-back /opt/DB_backup/full_bakcup/2019-05-09_10-45-32
#2,在还原增量
innobackupex --apply-log /opt/DB_backup/full_bakcup/2019-05-09_10-45-32 --incremental-dir=/home/DB_backup/incremental_backup/2019-05-11_03-00-00

原文地址:https://www.cnblogs.com/Clonglegs/p/11320311.html

时间: 2024-08-08 08:57:01

MySQL数据库使用xtrabackup备份实现小例子的相关文章

MySQL数据库的自动备份与数据库被破坏后的恢复(2)

测试自动备份正常运转与否(备份恢复的方法) 这里,以通过实际操作的过程来介绍问题出现后的恢复方法. [1] 当数据库被删除后的恢复方法 首先建立一个测试用的数据库. [[email protected] ~]# mysql -u root -p ← 用root登录到MySQL服务器 Enter password: ← 输入MySQL的root用户密码 Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL conne

MySQL数据库的自动备份与数据库被破坏后的恢复(3)

[2] 当数据库被修改后的恢复方法 数据库被修改,可能存在着多方面的原因,被入侵.以及相应程序存在Bug等等,这里不作详细介绍.这里将只介绍在数据库被修改后,如果恢复到被修改前状态的方法. 具体和上面所述的“数据库被删除后的恢复方法”相类似.这里,测试用数据库接着使用刚刚在前面用过的test.这里为了使刚刚接触数据库的朋友不至于理解混乱,我们再次登录到MySQL服务器上确认一下刚刚建立的测试用的数据库test的相关信息. [[email protected] ~]# mysql -u root

mysql数据库自动化完整备份和增量备份

mysql数据库自动化完整备份和增量备份     增量备份,为了增强mysql数据库的安全性和完整性,需要对数据进行备份.这里我们采用的策略是每周五下午5:30进行一次完整备份:每天的6:00.12:10.17:00进行增量备份. 1.完整备份脚本如下:(备份之后并打包存储) 2.增量备份脚本如下:(将生成的二进制文件内容读取出来并导入一个新的sql文件中) 增量备份的前提时,要在mysql的配置文件里打开二进制功能: log-bin=mysql 3.将这两个加进计划任务里 4.执行结果: 数据

MySQL数据库的自动备份与数据库被破坏后的恢复1

一.前言: 当数据库服务器建立好以后,我们首先要做的不是考虑要在这个支持数据库的服务器运行哪些受MySQL提携的程序,而是当数据库遭到破坏后,怎样安然恢复到最后一次正常的状态,使得数据的损失达到最小. 或者说,仅仅是数据库服务器的建立,只能说明它能做些什么,并不代表它能稳定的做些什么.灾难恢复的效率及全面性,也是系统的稳定性的一个准因素,尤其对于一个服务器系统. 这一节,介绍数据库自动备份以及数据库被破坏后的恢复的方法.在这里,我们使用mysqlhotcopy,并且定义一段Shell脚本来实现数

MySQL数据库之xtrabackup物理备份(一)

前言:说到数据库备份,我们知道可以用来对数据库进行备份的工具有mysqldump.mydumer.mysqlpump等等,实际工作中,机器上的数据库不大的话,都是用mysqldump工具来备份,这些备份工具各有优缺点,这里不详细介绍,今天分享另一个数据库备份工具,叫XtraBackup. 一.Xtrabackup介绍 1.官网说明 Percona XtraBackup可以在不阻止用户查询的情况下实现MySQL备份,因此非常适合拥有大数据集和无法承受长时间停机的关键任务应用程序的公司.作为开源解决

学会4种备份MySQL数据库(基本备份方面没问题了)

前言 我们试着想一想, 在生产环境中什么最重要?如果我们服务器的硬件坏了可以维修或者换新, 软件问题可以修复或重新安装, 但是如果数据没了呢?这可能是最恐怖的事情了吧, 我感觉在生产环境中应该没有什么比数据跟更为重要. 那么我们该如何保证数据不丢失.或者丢失后可以快速恢复呢?只要看完这篇, 大家应该就能对MySQL中实现数据备份和恢复能有一定的了解. 为什么需要备份数据? 其实在前言中也大概说明了为什么要备份数据, 但是我们还是应该具体了解一下为什么要备份数据 在生产环境中我们数据库可能会遭遇各

mysql扩展:xtrabackup备份和做主从

使用xtrabackup链接:http://pan.baidu.com/s/1miFpS9M 密码:86dx 链接:http://pan.baidu.com/s/1o7GXBBW 密码:ue2f xtrabackup 只能备份引擎为innodb的数据 后来innobackeupex 则可以备份mysiam (使用mysqldump 备份大量数据时会很慢,使用xtrabackup则很快,且把所有数据文件都会备份ls /data/mysql) 备份前保证mysql服务开启 mysql 的数据目录我的

使用宝塔面板进行mysql数据库的创建备份恢复管理

MySQL的管理维护工具非常多,除了系统自带的命令行管理工具之外,还有许多其他的图形化管理工具,MySQL是一个非常流行的小型关系型数据库管理系统,2008年1月16号被Sun公司收购.目前MySQL被广泛地应用在Internet上的中小型 网站中.由于其体积小.速度快.总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库. 在我的三 丰 免 费 云主 机上 安装了CentOS系统,并默认安装了宝塔管理面板,为了安全起见,在服务器在正常服

备份一个约250G的mysql实例【xtrabackup备份方案对比】

备份一个约250G的mysql实例 A. 使用xtrabackup备份加gzip单线程压缩 time innobackupex --user=test --password=test  --socket=/home/mysqld.sock  --slave-info --defaults-file=/etc/mysql/my.cnf  --stream=tar /home/backup | gzip > mysql-backup.tgz real    271m15.984suser    27