热门标签 | 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



推荐阅读
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除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社区 版权所有