阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

MySQL数据库使用XtraBackup备份实现示例

435次阅读
没有评论

共计 5047 个字符,预计需要花费 13 分钟才能阅读完成。

关于 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=”abc@123″ /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=”abc@123″ –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

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计5047字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19348
评论数
4
阅读量
7801178
文章搜索
热门文章
开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南 大家好,我是星哥。之前介绍了腾讯云的 Code...
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板 1Panel:小白轻松构建 Web 服务与面板加固指南 哈喽,我是星哥,经常有人问我不...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
飞牛NAS玩转Frpc并且配置,随时随地直连你的私有云

飞牛NAS玩转Frpc并且配置,随时随地直连你的私有云

飞牛 NAS 玩转 Frpc 并且配置,随时随地直连你的私有云 大家好,我是星哥,最近在玩飞牛 NAS。 在数...
开发者福利:免费 .frii.site 子域名,一分钟申请即用

开发者福利:免费 .frii.site 子域名,一分钟申请即用

  开发者福利:免费 .frii.site 子域名,一分钟申请即用 前言 在学习 Web 开发、部署...
再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见 zabbix!轻量级自建服务器监控神器在 Linux 的完整部署指南 在日常运维中,服务器监控是绕不开的...
星哥带你玩飞牛NAS-1:安装飞牛NAS

星哥带你玩飞牛NAS-1:安装飞牛NAS

星哥带你玩飞牛 NAS-1:安装飞牛 NAS 前言 在家庭和小型工作室场景中,NAS(Network Atta...
星哥带你玩飞牛NAS硬件 01:捡垃圾的最爱双盘,暴风二期矿渣为何成不老神话?

星哥带你玩飞牛NAS硬件 01:捡垃圾的最爱双盘,暴风二期矿渣为何成不老神话?

星哥带你玩飞牛 NAS 硬件 01:捡垃圾的最爱双盘,暴风二期矿渣为何成不老神话? 前言 在选择 NAS 用预...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
星哥带你玩飞牛NAS-5:飞牛NAS中的Docker功能介绍

星哥带你玩飞牛NAS-5:飞牛NAS中的Docker功能介绍

星哥带你玩飞牛 NAS-5:飞牛 NAS 中的 Docker 功能介绍 大家好,我是星哥,今天给大家带来如何在...
4盘位、4K输出、J3455、遥控,NAS硬件入门性价比之王

4盘位、4K输出、J3455、遥控,NAS硬件入门性价比之王

  4 盘位、4K 输出、J3455、遥控,NAS 硬件入门性价比之王 开篇 在 NAS 市场中,威...
每年0.99刀,拿下你的第一个顶级域名,详细注册使用

每年0.99刀,拿下你的第一个顶级域名,详细注册使用

每年 0.99 刀,拿下你的第一个顶级域名,详细注册使用 前言 作为长期折腾云服务、域名建站的老玩家,星哥一直...
每天一个好玩的网站-手机博物馆-CHAZ 3D Experience

每天一个好玩的网站-手机博物馆-CHAZ 3D Experience

每天一个好玩的网站 - 手机博物馆 -CHAZ 3D Experience 一句话介绍:一个用 3D 方式重温...
星哥带你玩飞牛NAS-11:咪咕视频订阅部署全攻略

星哥带你玩飞牛NAS-11:咪咕视频订阅部署全攻略

星哥带你玩飞牛 NAS-11:咪咕视频订阅部署全攻略 前言 在家庭影音系统里,NAS 不仅是存储中心,更是内容...