centos mysql 增量备份脚本_MySQL使用xtrabackup增量备份脚本

作为运维工程师来讲,安全应当放在首位,而数据安装更是安全中的安全。数据安装有很多,最常见的就是数据库安全。现在企业应用中大多都在使用MySQL作为后端数据库,那么对于MySQL的数据安全性问题不可小视。保障数据安全不仅需要从应用层,网络层来进行防护,对于数据的物理备份也是必不可少。

MySQL数据库自带mysqldump备份工具,此工具个人认为适合于数据量小,且业务受短时间影响没有太关系的业务。但如果数据量大,业务的连续性要求较高的业力就不太适合使用。这时候就推荐使用xtrabackup备份,xtrabackup工具具有增量备份,备份数据快,备份时不琐表等特点。那么下面将介绍一个基于xtrabackup的备份脚本,经测试要适用于目前最新版本MySQL 8.0。

脚本目录结构如下:

backup_scripts

├── backcron

├── bin

│   └── backup.sh

├── conf

│   └── backup.conf

├── log

└── var

backcron此文件是一个计划任务案例文件,执行任务的时候与脚本的路径需要根据自己的需求更改,示例内容如下。

0 4 * * * /usr/local/backup_scripts/bin/backup.sh >/dev/null 2>&1

conf/backup.conf是配置文件,用于配置连接MySQL与备份的一些相关信息。主要就需要修改些配置文件内的信息,一般只需要修改连接数据库的用户名密码,其它的根据需求修改即可。

# mysql 用户名

user=root

# mysql 密码

password=123456

# 备份路径

backup_dir=/data/backups

# 备份压缩打包目录

gzip_dir=/data/backups/backup_gzip

# innobackupex 命令路径

xtrabackup_bin=/usr/bin/xtrabackup

# 全备是在一周的第几天

full_backup_week_day=2

# 全量备信息名称 前缀

full_backup_prefix=full

# 增量备信息名称 前缀

increment_prefix=incr

# 错误日志文件(根据此文件知道备份是否成功)

# format:

# {week_day:1,dir:full/incr_2015-12-29_00-00-00_7,type:full/incr,date:2015-12-30}

error_log=mysql_increment_hot_backup.err

# 索引文件

# format:

# {week_day:1,dir:full/incr_2015-12-29_00-00-00_7,type:full/incr,date:2015-12-30}

index_file=mysql_increment_hot_backup.index

bin/backup.sh执行备份的脚本,没有特殊需求不需要修改此脚本。默认调用xtrabackup进行备份,所以需要提前安装好xtrabackup工具。xtrabackup备份工具对于MySQL的版本有一定的要求,不同版本的MySQL需要安装不同版本的xtrabackup工具。

MySQL 5.7对应xtrabackup 2.4,MySQL 8.0对应 xtrabackup 8.0。关于其它的版本对应关系从官方文件中查看获取。

#!/bin/bash

# 获得程序路径名

program_dir=`dirname $0`/..

# 读取配置文件中的所有变量值, 设置为全局变量

# 配置文件

conf_file="$program_dir/conf/backup.conf"

# mysql 用户

user=`sed '/^user=/!d;s/.*=//' $conf_file`

# mysql 密码

password=`sed '/^password=/!d;s/.*=//' $conf_file`

# mysql 备份目录

backup_dir=`sed '/^backup_dir=/!d;s/.*=//' $conf_file`

# mysql 备份压缩打包目录

gzip_dir=`sed '/^gzip_dir=/!d;s/.*=//' $conf_file`

# percona-xtrabackup命令xtrabackup路径

xtrabackup_bin=`sed '/^xtrabackup_bin=/!d;s/.*=//' $conf_file`

# 全备是在一周的第几天

full_backup_week_day=`sed '/^full_backup_week_day=/!d;s/.*=//' $conf_file`

# mysql 全备前缀标识

full_backup_prefix=`sed '/^full_backup_prefix=/!d;s/.*=//' $conf_file`

# mysql 增量备前缀标识

increment_prefix=`sed '/^increment_prefix=/!d;s/.*=//' $conf_file`

# 备份错误日志文件

error_log=$program_dir/var/`sed '/^error_log=/!d;s/.*=//' $conf_file`

# 备份索引文件

index_file=$program_dir/var/`sed '/^index_file=/!d;s/.*=//' $conf_file`

# 备份日期

backup_date=`date +%F`

# 备份时间

backup_time=`date +%H-%M-%S`

# 备份时的周几

backup_week_day=`date +%u`

# 创建相关目录

log_dir=$program_dir/log/backup

var_dir=$program_dir/var

mkdir -p $backup_dir

mkdir -p $log_dir

mkdir -p $var_dir

mkdir -p $gzip_dir

# 全量备份

function full_backup() {

backup_folder=${full_backup_prefix}_${backup_date}_${backup_time}_${backup_week_day}

mkdir -p $backup_dir/$backup_folder

$xtrabackup_bin \

--user=$user \

--password=$password \

--backup \

--target-dir=$backup_dir/$backup_folder > $log_dir/${backup_folder}.log 2>&1

return $?

}

# 增量备份

function increment_backup() {

backup_folder=${increment_prefix}_${backup_date}_${backup_time}_${backup_week_day}

incr_base_folder=`sed -n '$p' $index_file | \

awk -F '[, {}]*' '{print $3}' | \

awk -F ':' '{print $2}'`

mkdir -p $backup_dir/$backup_folder

$xtrabackup_bin \

--user=$user \

--password=$password \

--backup \

--target-dir=$backup_dir/$backup_folder \

--incremental-basedir=$backup_dir/$incr_base_folder > $log_dir/${backup_folder}.log 2>&1

return $?

}

# 删除之前的备份(一般在全备完成后使用)

function delete_before_backup() {

cat $index_file | awk -F '[, {}]*' '{print $3}' | \

awk -v backup_dir=$backup_dir -F ':' '{if($2!=""){printf("rm -rf %s/%s\n", backup_dir, $2)}}' | \

/bin/bash

cat $index_file | awk -F '[, {}]*' '{print $3}' | \

awk -v gzip_dir=$gzip_dir -F ':' '{if($2!=""){printf("rm -rf %s/%s\n", gzip_dir, $2)}}' | \

/bin/bash

cat $index_file | awk -F '[, {}]*' '{print $3}' | \

awk -v log_dir=$log_dir -F ':' '{if($2!=""){printf("rm -rf %s/%s.log\n", log_dir, $2)}}' | \

/bin/bash

}

# 备份索引文件

function backup_index_file() {

cp $index_file ${index_file}_$(date -d "1 day ago" +%F)

}

# 备份索引文件

function send_index_file_to_remote() {

echo 'send index file ok'

}

# 添加索引, 索引记录了当前最新的备份

function append_index_to_file() {

echo "{week_day:$backup_week_day, \

dir:${1}_${backup_date}_${backup_time}_${backup_week_day}, \

type:${1}, \

date:${backup_date}}" >> $index_file

}

# 记录错误消息到文件

function logging_backup_err() {

echo "{week_day:$backup_week_day, \

dir:${1}_${backup_date}_${backup_time}_${backup_week_day}, \

type:${1}, \

date:${backup_date}}" >> $error_log

}

# 清空索引

function purge_index_from_file() {

> $index_file

}

# 清空错误日志信息

function purge_err_log() {

> $error_log

}

# 打包备份

function tar_backup_file() {

cd $backup_dir

tar -jcf ${gzip_dir}/${1}_${backup_date}_${backup_time}_${backup_week_day}.tar.bz2 \

${1}_${backup_date}_${backup_time}_${backup_week_day}

cd - > /dev/null

}

# 发送备份到远程

function send_backup_to_remote() {

echo "send $1 remote ok"

}

# 判断是应该全备还是增量备份

# 0:full, 1:incr

function get_backup_type() {

full_backup_week_day=`sed '/^full_backup_week_day=/!d;s/.*=//' $conf_file`

backup_type=0

if [ "$full_backup_week_day" -eq `date +%u` ]; then

backup_type=0

else

backup_type=1

fi

touch $index_file

if [ ! -n "`cat $index_file`" ]; then

backup_type=0

fi

return $backup_type

}

# 测试配置文件正确性

function test_conf_file() {

# 判断每个变量是否在配置文件中有配置,没有则退出程序

if [ ! -n "$user" ]; then echo 'fail: configure file user not set'; exit 2; fi

if [ ! -n "$password" ]; then echo 'fail: configure file password not set'; exit 2; fi

if [ ! -n "$backup_dir" ]; then echo 'fail: configure file backup_dir not set'; exit 2; fi

if [ ! -n "$gzip_dir" ]; then echo 'fail: configure file backup_dir not set'; exit 2; fi

if [ ! -n "$full_backup_week_day" ]; then echo 'fail: configure file full_backup_week_day not set'; exit 2; fi

if [ ! -n "$full_backup_prefix" ]; then echo 'fail: configure file full_backup_prefix not set'; exit 2; fi

if [ ! -n "$increment_prefix" ]; then echo 'fail: configure file increment_prefix not set'; exit 2; fi

if [ ! -n "$error_log" ]; then echo 'fail: configure file error_log not set'; exit 2; fi

if [ ! -n "$index_file" ]; then echo 'fail: configure file index_file not set'; exit 2; fi

}

# 执行

function main() {

# 检测配置文件值

test_conf_file

# 判断是执行全备还是增量备份

get_backup_type

backup_type=$?

case $backup_type in

0 )

# 全量备份

full_backup

backup_ok=$?

if [ 0 -eq "$backup_ok" ]; then

# 全备成功

# 打包最新备份

tar_backup_file $full_backup_prefix

# # 将tar备份发送到远程

# send_backup_to_remote $full_backup_prefix

# 备份索引文件

backup_index_file

# # 发送索引文件到远程

# send_index_file_to_remote

# 清除之前的备份

delete_before_backup

# 清除索引文件

purge_index_from_file

# 添加索引, 索引记录了当前最新的备份

append_index_to_file $full_backup_prefix

else

# 全备失败

# 删除备份目录

rm -rf ${backup_dir}/${full_backup_prefix}_${backup_date}_${backup_time}_${backup_week_day}

# 记录错误日志

logging_backup_err $full_backup_prefix

fi

;;

1 )

# 增量备份

increment_backup

backup_ok=$?

if [ "$backup_ok" -eq 0 ]; then

# 增量备份成功

# 打包最新备份

tar_backup_file $increment_prefix

# # 将tar备份发送到远程

# send_backup_to_remote $increment_prefix

# 添加索引, 索引记录了当前最新的备份

append_index_to_file $increment_prefix

else

# 增量备份失败

# 删除备份目录

rm -rf ${backup_dir}/${increment_prefix}_${backup_date}_${backup_time}_${backup_week_day}

# 记录错误日志

logging_backup_err $increment_prefix

fi

;;

esac

}

main

完成上面的配置后可以手动执行脚本进行测试,如果有错误,可以查看log目录下面的日志信息。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值