MySQL xtrabackup增量备份的实施

问题描述:

由于随着生产环境的运行,MySQL中存储的数据越来越多,备份的时间也是越来越长,极大的影响了客户的体验,在客户以及同事的要求下,决定更改MySQL的备份方式,从之前的每天全量备份改为周末进行一次全量备份,工作日为增量备份。

问题的解决:

数据库中主流的增量备份工具有mysqldump和xtrabackup,与mysqldumop相比较,xtrabackup属于物理备份,备份数据快,备份过程不会打断正在执行的事物,能够实现自动备份校验,而且备份的时候不会增加服务器的负载。综合考虑采用xtrabackup来实现增量备份

一)xtrabackup的安装

1)执行

yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm

安装yum仓库

2)执行

yum list | grep percona

查看仓库是否成功安装

3)执行

percona-release enable-only tools release

使仓库中的工具生效

4)执行

yum install percona-xtrabackup-24

安装percona xtrabackup

5)创建备份的Mysql用户,并完成授权

mysql> CREATE USER 'xtraback'@'%' IDENTIFIED BY '<YOUR PASSWD>';
mysql> GRANT RELOAD, LOCK TABLES, PROCESS, REPLICATION CLIENT ON *.* TO 'xtraback'@'%';
mysql> FLUSH PRIVILEGES;

二)xtrabackup备份的相关命令

innobackupex --user=<User> --password=<Password> --port <Port> /data/apps_data/mysql-backup/

全量备份

innobackupex --user=<User> --password=<Password> --incremental <Incremental Dir> --incremental-basedir=<Full Backup Dir>

增量备份

innobackupex --apply-log --redo-only <Full Backup Dir>

在恢复增量备份时,需要先对主库执行该操作,然后再将增量备份的拷贝到主库里面去

innobackupex --apply-log --redo-only <Full Back Dic> --incremental-dir=<Incremental Dic>

增量备份加入到全量备份中(不能对最后一个增量备份使用)

innobackupex --apply-log <Full Backup Dir> --incremental-dir=<Incremental Dir>

增量备份加入到全量备份中(只能够对最后一个增量备份使用)

xtrabackup --copy-back --target-dir=<Full Backup Dir>

备份恢复(数据库需要停止,且数据目录需要清空)

三)脚本实现

#!/bin/bash

weekday=`date +%w`  # 0 is sunday, 1-6 mon-sat
backup_day=`date +%m-%d`
backup_time=`date +%m-%d-%H-%M-%S`
backup_month=`date +%Y-%m`
backup_dir=/data/apps_data/mysql-backups
user=<Your user>
password=<Your password>
port=3307
log_dir=/data/apps_data/mysql-backups/logs
log_file=`date +%F`.log
index_dic=/data/apps_data/mysql-backups/.index
index_file=/data/apps_data/mysql-backups/.index/index.txt


test ! -d $backup_dir && mkdir -p $backup_dir;
test ! -d $index_dic && mkdir -p $index_dic;
test ! -d $log_dir && mkdir -p $log_dir;

function full_backup()
{
    test ! -d $backup_dir/$backup_month/${backup_day}_full && mkdir -p $backup_dir/$backup_month/${backup_day}_full;
    echo "start full backup"
#    echo "$backup_dir/$backup_month/$backup_day_full" > $index_file
    innobackupex --user=$user --password=$password --port $port --no-timestamp $backup_dir/$backup_month/${backup_day}_full >> $log_dir/$log_file 2>&1
    if [ $? == 0 ];
    then
        grep "innodb_to_lsn" $backup_dir/$backup_month/${backup_day}_full/xtrabackup_info|awk -F "=" {'print $2'}|cut -d " " -f 2 > $index_file
        cd /data/apps_data/mysql-backups/$backup_month && gzip ${backup_day}_full
    else
        echo "full backup fail" >> $log_dir/$log_file 2>&1
        rm -rf $backup_dir/$backup_month/${backup_day}_full
        exit
    fi
}

function incremental_backup()
{
#    test ! -r $index_file && echo "Cant't Scan Full Backup, Now Start Full Backup" > $log_dir/$log_file 2>&1 && full_backup && exit;
    if [ ! -r $index_file ];
    then
        echo "Cant't Scan Full Backup, Now Start Full Backup"
        echo "Cant't Scan Full Backup, Now Start Full Backup" >> $log_dir/$log_file 2>&1
        full_backup
        exit
    fi
#    incremental_lsn=`cat $index_file`
    if [ -s "$index_file" ]
    then
        incremental_lsn=`cat $index_file`
    else
        echo "index file is none, now start full backup"
        full_backup
        exit
    fi
    test ! -d $backup_dir/$backup_month/$backup_day/inc_$backup_time && mkdir -p $backup_dir/$backup_month/$backup_day/inc_$backup_time
    innobackupex --user=$user --password=$password --port $port --incremental $backup_dir/$backup_month/$backup_day/inc_$backup_time --no-timestamp --incremental-lsn=$incremental_lsn >> $log_dir/$log_file 2>&1
    if [ $? == 0 ];
    then
        grep "innodb_to_lsn" $backup_dir/$backup_month/$backup_day/inc_$backup_time/xtrabackup_info|awk -F "=" {'print $2'}|cut -d " " -f 2 > $index_file
        cd $backup_dir/$backup_month/$backup_day && gzip inc_$backup_time
#        echo "$backup_dir/$backup_month/$backup_day_full" > $index_file
    else
        echo "incremental backup fail" >> $log_dir/$log_file 2>&1
        rm -rf $backup_dir/$backup_month/$backup_day/inc_$backup_time
        exit
    fi
#    echo "$backup_dir/$backup_month/$backup_day/inc_$backup_time" > $index_file
}

function get_backup_type()
{
    if [ "$weekday" == 0 ];
    then
        full_backup
    else
        echo "start incremental backup"
        incremental_backup
    fi
}

function main()
{
    get_backup_type
}

main

注意:

1)在上线的时候可以加上--host来指定备份某一台主机的数据库
2)如果调用该脚本的用户是普通用户,例如centos,会导致不能备份,因为centos用户没有访问mysql文件的权限,执行usermod -a -G mysql centos将centos用户加入到mysql组中,即可解决
3)当该脚本以增量备份模式运行的时候,需要加载上一次备份的index文件,所以不支持集群部署,在需要集群部署时,需要在另外两台编写格外的脚本去增量备份的主机执行增量备份的脚本

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容