热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

linuxmysql异地备份_Linux下MySQL双主模式下的增量异地备份和定期删除方案

有两个服务器,192.168.0.1和192.168.0.2,采用nginix双主模式互为双机热备,做高可用。现在客户额外给了一台异地的服

有两个服务器,192.168.0.1 和192.168.0.2,采用nginix+双主模式互为双机热备,做高可用。

现在客户额外给了一台异地的服务器192.168.0.3,要求对两台服务器每天自动化的异地备份,要求不能停机,不能影响主业务流程。

思来想去,采用Mysql自身的mysqldump或者mysqlpump都不太可靠,这两种方式即使设置好参数不锁表,也容易造成服务器内存占用高,可能会影响主业务。

两台数据库服务器的数据文件约2T,要想快又稳,不影响用户操作,能找到的好的方案,只有采用xtrabackup了。

xtrabackup可以实现完整备份和增量备份,并且不会影响mysql本身的运行,也不会增加mysql的性能。这方面就不多说了,有兴趣的可以参考percona xtrabackup官网说明。

为了安全便于恢复,整体方案如下,在数据库服务器本机,每周一次完整备份,每天进行一次完整备份,每天都把备份拷到异地服务器。

本地服务器,每天都要滚动删除历史备份,只保留一周。异地备份服务器,每天也定期清除历史备份,保留完整的两周全备份和增量备份文件。

1:数据库服务器备份脚本,在两台双主服务器都添加该脚本

#!/bin/sh

year=`date +%Y`

month=`date +%m`

day=`date +%d`

week=`date +%w`

today=`date +%Y%m%d`

log=$today.log

CODE=$?

backup_dir=/PRODUCT_DB/data/backups

full_backup_dir=/PRODUCT_DB/data/backups/full

inc_backup_dir=/PRODUCT_DB/data/backups/inc

inc_full_backup_dir=$inc_backup_dir/$today

backup_program=/root/xtrabackup/bin/xtrabackup

config_file=/etc/my.cnf

dba_user=root

dba_password=yourDbPassword

backup_server=192.168.0.3

backup_server_user=root

#在主服务器1上是1,2上则是2

backup_server_fullbackupdir=/UNI/data/backups/1/full

backup_server_incbackupdir=/UNI/data/backups/1/inc

execute_full_backup=0

execute_inc_backup=0

echo "today is:$today"

echo "week day is:$week"

echo "full backup dir is:$backup_dir/full"

echo "incremental backup dir is:$backup_dir/inc/$today"

del_date=`date -d '8 days ago' +%Y%m%d`

echo 'del date is:' $del_date

endDate=`date -d "${del_date}" +%s`

echo 'endDate is:' $endDate

make_full_bak_dir(){

#创建完整备份的目录

if [ ! -d $backup_dir/full ];then

echo "full backup dir:$backup_dir/full is not exist,begin create the directory... "

mkdir -p $backup_dir/full

echo "full backup dir created succeed!"

fi

}

make_inc_bak_dir(){

#创建增量备份的目录

if [ ! -d $backup_dir/inc ];then

echo "incremental backup dir:$backup_dir/inc/$today is not exist,begin create the directory... "

mkdir -p $backup_dir/inc/$today

echo "incremental backup dir created succeed!"

fi

}

full_backup(){

#每当week=6时进行完整备份

echo "function full_backup"

if [ "$week" -eq "6" ];then

echo "begin full backup"

echo "full backup dir is:$full_backup_dir"

echo "it will take a lot of times,please wait...."

echo "$backup_program --defaults-file=$config_file --backup --user=$backup_server_user --password=$dba_password --host=127.0.0.1 --target-dir=$backup_dir/full"

$backup_program --defaults-file=$config_file --backup --user=$backup_server_user --password=$dba_password --host=127.0.0.1 --target-dir=$backup_dir/full

[ "$CODE" == "0" ] && echo "full backups succeed"

execute_full_backup=1

fi

}

full_backup_no_judge(){

#不做任何判断,直接进行完整备份

echo "function full_backup_no_judge"

echo "begin full backup "

echo "full backup dir is:$full_backup_dir"

echo "it will take a lot of times,please wait...."

echo "$backup_program --defaults-file=$config_file --backup --user=$dba_user --password=$dba_password --host=127.0.0.1 --target-dir=$backup_dir/full"

$backup_program --defaults-file=$config_file --backup --user=$dba_user --password=$dba_password --host=127.0.0.1 --target-dir=$backup_dir/full

[ "$CODE" == "0" ] && echo "full backups succeed"

execute_full_backup=1

}

inc_backup(){

#每当week != 6 时进行增量备份

echo "function inc_backup"

if [ "$week" -ne "6" ];then

echo "begin incremental backup"

if [ -d $backup_dir/full ];then

echo "full bakup dir:$backup_dir/full is exist..."

if [ ! -f "$backup_dir/full/xtrabackup_info" ];then

echo "full backup not exist,begin full bakcup first"

full_backup_no_judge;

fi

fi

echo "incremental backup dir is:$inc_full_backup_dir"

echo "it will take a lot of times,please wait...."

echo "$backup_program --defaults-file=$config_file --backup --user=$dba_user --password=$dba_password --host=127.0.0.1 --target-dir=$inc_backup_dir/$today --incremental-basedir=$backup_dir/full"

$backup_program --defaults-file=$config_file --backup --user=$dba_user --password=$dba_password --host=127.0.0.1 --target-dir=$inc_backup_dir/$today --incremental-basedir=$backup_dir/full

[ "$CODE" == "0" ] && echo "incremental backups succeed"

execute_inc_backup=1

fi

}

copy_files(){

#拷贝文件到异地备份服务器

echo "funciton copy_files"

if [ $execute_full_backup == 1 ];then

sleep 5

echo "begin copy full backup files to backup server:$backup_server"

if [ -d $backup_dir/full ];then

ssh $backup_server_user@$backup_server "mkdir -p $backup_server_fullbackupdir/$today"

scp -r $backup_dir/full/* $backup_server_user@$backup_server:$backup_server_fullbackupdir/$today

[ "$CODE" == "0" ] && echo "copy full backup files succeed"

fi

fi

if [ $execute_inc_backup == 1 ];then

sleep 5

echo "begin copy incremental backup files to backup server:$backup_server"

if [ -d $backup_dir/inc/$today ];then

scp -r $backup_dir/inc/$today $backup_server_user@$backup_server:$backup_server_incbackupdir/

[ "$CODE" == "0" ] && echo "copy incremental backup files succeed"

fi

fi

}

del_expire_files(){

#每天删除7天之前的过期备份,本地服务器始终只保留了最近一周的完整备份和增量备份

echo "function del_expire_files"

#del_date=`date -d '7 days ago' +%Y%m%d`

echo "begin execute del_expire_files"

#下面删除完整备份目录中的过期文件

if [ -d $backup_dir/full ];then

if [ -f "$backup_dir/full/xtrabackup_info" ];then

echo "begin del $backup_dir/full"

filesCnt=`find $backup_dir/full -mtime +7 -type f -name "*"`

find $backup_dir/full -mtime +7 -type f -name "*"|xargs rm -rf

dirCnt=`find $backup_dir/full -mtime +7 -type d -name "*"`

find $backup_dir/full -mtime +7 -type d -name "*"|xargs rm -rf

fi

fi

#下面删除增量备份目录中的过期文件

if [ -d $backup_dir/inc ];then

echo "begin del $backup_dir/inc"

find $backup_dir/inc/ -mtime +7 -type f -name "*"|xargs rm -rf

find $backup_dir/inc/ -mtime +7 -type d -name "*"|xargs rm -rf

path=/UNI/data/backups/195/inc/

cd $path

files=$(ls $path)

for filename in $files

do

echo 'find finename:' $filename

thisDate=`date -d "${filename}" +"%Y%m%d"`

echo 'thisdate:'

echo $thisDate

startDate=`date -d "${thisDate}" +%s`

echo "startDate:"

echo $startDate

stampDiff=`expr $endDate - $startDate`

dayDiff=`expr $stampDiff / 86400`

echo 'dayDiff is:' $dayDiff

if [ "$dayDiff" -gt 1 ]

then

echo "begin del dir files"

#ls -al $path/$filename

if [ -d "$path/$filename" ]

then

rm -rf $path/$filename

fi

fi

done

fi

}

#下面是依次调用脚本

del_expire_files;

make_full_bak_dir;

make_inc_bak_dir;

full_backup;

inc_backup;

copy_files;

当然具体的细节,打通linux主服务器与备份服务器之间的SCP权限,那些就不多说了,各位可以在网上查资料自行搞定。

2:在两台数据库服务器都添加crontab

cat /etc/crontab

#主数据库服务器1:

0 23 * * * root /root/xtrabackup/bin/backup.sh>/root/xtrabackup/bin/backup.log

#主数据库服务器2:

30 23 * * * root /root/xtrabackup/bin/backup.sh>/root/xtrabackup/bin/backup.log

3:在备份服务器添加定期删除备份脚本,以及添加crontab任务

cat delete_expire_files.sh

#!/bin/sh

del_expire_files(){

#del_date=`date -d '16 days ago' +%Y%m%d`

del_date=`date -d '8 days ago' +%Y%m%d`

echo 'del date is:' $del_date

endDate=`date -d "${del_date}" +%s`

echo 'endDate is:' $endDate

echo "begin execute del_expiret_files"

#删除服务器1拷过来的过期备份

if [ -d /UNI/data/backups/1/full ];then

if [ -f "/UNI/data/backups/1/full/xtrabackup_info" ];then

echo "begin del /UNI/data/backups/1/full"

filesCnt=`find /UNI/data/backups/1/full/ -mtime +8 -type f -name "*"`

find /UNI/data/backups/1/full/ -mtime +8 -type f -name "*"|xargs rm -rf

echo "$filesCnt total file delete "

dirCnt=`find /UNI/data/backups/1/full/ -mtime +8 -type d -name "*"`

find /UNI/data/backups/1/full/ -mtime +8 -type d -name "*"|xargs rm -rf

echo "$dirCnt total directories delete "

fi

echo "begin del /UNI/data/backups/1/full"

filesCnt=`find /UNI/data/backups/1/full/ -mtime +8 -type f -name "*"`

find /UNI/data/backups/1/full/ -mtime +8 -type f -name "*"|xargs rm -rf

echo "$filesCnt total file delete "

dirCnt=`find /UNI/data/backups/1/full/ -mtime +8 -type d -name "*"`

find /UNI/data/backups/1/full/ -mtime +8 -type d -name "*"|xargs rm -rf

echo "$dirCnt total directories delete "

path=/UNI/data/backups/1/full/

cd $path

files=$(ls $path)

for filename in $files

do

echo 'find finename:' $filename

thisDate=`date -d "${filename}" +"%Y%m%d"`

echo 'thisdate:'

echo $thisDate

startDate=`date -d "${thisDate}" +%s`

echo "startDate:"

echo $startDate

stampDiff=`expr $endDate - $startDate`

dayDiff=`expr $stampDiff / 86400`

echo 'dayDiff is:' $dayDiff

if [ "$dayDiff" -gt 1 ]

then

echo "begin del dir files"

#ls -al $path/$filename

if [ -d "$path/$filename" ]

then

rm -rf $path/$filename

fi

fi

done

fi

if [ -d /UNI/data/backups/1/inc ];then

echo "begin del /UNI/data/backups/1/inc"

dirCnt=`find /UNI/data/backups/1/inc/ -mtime +8 -type d -name "*"`

find /UNI/data/backups/1/inc/ -mtime +8 -type d -name "*"|xargs rm -rf

echo "$dirCnt total directories delete "

fi

#删除服务器2拷过来的过期备份

if [ -d /UNI/data/backups/2/full ];then

if [ -f "/UNI/data/backups/2/full/xtrabackup_info" ];then

echo "begin del /UNI/data/backups/2/full"

filesCnt=`find /UNI/data/backups/2/full/ -mtime +8 -type f -name "*"`

find /UNI/data/backups/2/full/ -mtime +8 -type f -name "*"|xargs rm -rf

echo "$filesCnt total file delete "

dirCnt=`find /UNI/data/backups/2/full/ -mtime +8 -type d -name "*"`

find /UNI/data/backups/2/full/ -mtime +8 -type d -name "*"|xargs rm -rf

echo "$dirCnt total directories delete "

fi

echo "begin del /UNI/data/backups/2/full"

filesCnt=`find /UNI/data/backups/2/full/ -mtime +8 -type f -name "*"`

find /UNI/data/backups/2/full/ -mtime +8 -type f -name "*"|xargs rm -rf

echo "$filesCnt total file delete "

dirCnt=`find /UNI/data/backups/2/full/ -mtime +8 -type d -name "*"`

find /UNI/data/backups/2/full/ -mtime +8 -type d -name "*"|xargs rm -rf

echo "$dirCnt total directories delete "

path=/UNI/data/backups/2/full/

cd $path

files=$(ls $path)

for filename in $files

do

echo 'find finename:' $filename

thisDate=`date -d "${filename}" +"%Y%m%d"`

echo 'thisdate:'

echo $thisDate

startDate=`date -d "${thisDate}" +%s`

echo "startDate:"

echo $startDate

stampDiff=`expr $endDate - $startDate`

dayDiff=`expr $stampDiff / 86400`

echo 'dayDiff is:' $dayDiff

if [ "$dayDiff" -gt 1 ]

then

echo "begin del dir files"

#ls -al $path/$filename

if [ -d "$path/$filename" ]

then

rm -rf $path/$filename

fi

fi

done

fi

if [ -d /UNI/data/backups/2/inc ];then

echo "begin del /UNI/data/backups/2/inc"

dirCnt=`find /UNI/data/backups/2/inc/ -mtime +8 -type d -name "*"`

find /UNI/data/backups/2/inc/ -mtime +8 -type d -name "*"|xargs rm -rf

echo "$dirCnt total directories delete "

fi

}

del_expire_files;

cat /etc/crontab  #异地备份服务器的crontab

0 23 * * * root /root/xtrabackup/bin/delete_expire_files.sh>/root/xtrabackup/bin/delete_expire_files.log



推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了在Hibernate配置lazy=false时无法加载数据的问题,通过采用OpenSessionInView模式和修改数据库服务器版本解决了该问题。详细描述了问题的出现和解决过程,包括运行环境和数据库的配置信息。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • CentOS7.8下编译muduo库找不到Boost库报错的解决方法
    本文介绍了在CentOS7.8下编译muduo库时出现找不到Boost库报错的问题,并提供了解决方法。文章详细介绍了从Github上下载muduo和muduo-tutorial源代码的步骤,并指导如何编译muduo库。最后,作者提供了陈硕老师的Github链接和muduo库的简介。 ... [详细]
  • Jboss的EJB部署描述符standardjaws.xml配置步骤详解
    本文详细介绍了Jboss的EJB部署描述符standardjaws.xml的配置步骤,包括映射CMP实体EJB、数据源连接池的获取以及数据库配置等内容。 ... [详细]
  • 本文介绍了在Ubuntu 11.10 x64环境下安装Android开发环境的步骤,并提供了解决常见问题的方法。其中包括安装Eclipse的ADT插件、解决缺少GEF插件的问题以及解决无法找到'userdata.img'文件的问题。此外,还提供了相关插件和系统镜像的下载链接。 ... [详细]
  • TiDB | TiDB在5A级物流企业核心系统的应用与实践
    TiDB在5A级物流企业核心系统的应用与实践前言一、业务背景科捷物流概况神州金库简介二、现状与挑战神州金库现有技术体系业务挑战应对方案三、TiDB解决方案测试迁移收益问题四、说在最 ... [详细]
  • 用户视图(查看运行状态或其他参数)系统视图(配置设备的系统参数)system-viewEntersystemview,returnuservi ... [详细]
  • 之前项目在windows2003服务器上设置定时任务,每天执行。现在把项目移植到linux系统。也要在linux系统上设置计划任务。但是之前我从来没有做过。所以多得不 ... [详细]
author-avatar
sdfsfsd
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有