万物皆可备-异机备份方案

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 万物皆可备-异机备份方案

一、项目概况

因XX项目未建设备份一体机,存在数据丢失风险,本方案采用NFS服务将数据库服务器上挂载网络存储直接备份到网络存储上,保障生产数据在异机有备份,降低数据丢失风险。

NFS通常指的是 "Network File System"(网络文件系统)。这是一个允许在网络上共享文件系统的协议,最初由Sun Microsystems开发。NFS使得不同计算机之间可以通过网络共享文件和资源,使文件在网络上的访问变得更加方便。

以下是 NFS 的一些基本特点和工作原理:

网络共享:NFS 允许在网络上的计算机之间共享文件和目录。这使得用户可以在不同计算机之间访问和共享文件,就像它们是本地文件一样。

客户端-服务器模型:NFS 采用客户端-服务器模型。文件服务器上的文件系统通过 NFS 协议对客户端系统可见,客户端通过 NFS 客户端软件连接到文件服务器,并像本地文件一样访问远程文件系统。

透明性: 对用户来说,使用 NFS 访问远程文件系统就像访问本地文件一样,这就是透明性的概念。用户不需要了解文件存储在哪里或如何通过网络传输。

挂载(Mounting): 在 NFS 中,客户端通过挂载(mount)文件系统来访问远程服务器上的文件。一旦挂载完成,远程文件系统就会在本地文件系统层次结构中可用。

安全性: 随着 NFS 的发展,安全性成为越来越重要的关注点。较新的版本(如NFSv4)包括更强大的安全性特性,如Kerberos认证和加密传输。

二、安装依赖环境

本方案只需要1台机器,作为备份服务器,是NFS的服务端。

1、在备份服务器安装NFS服务端

(1)安装服务端

yum -y install nfs-utils rpcbind

(2)exports配置

vim /etc/exports

# 允许将 /data/beifen文件系统以读写方式(rw)和同步模式(sync)挂载

/data/beifen  *(rw,sync)

(3)启动服务

systemctl start rpcbind

systemctl start nfs

systemctl enable rpcbind

systemctl enable nfs

2、在生产数据库服务器上安装NFS客户端

(1)nfs客户端安装

yum -y install nfs-utils

(2)启动服务

systemctl start nfs

systemctl enable nfs

三、编写脚本

1、编写NFS挂载和卸载脚本

此方案仅涉及mysql和文件备份脚本,其他数据库的原理一样,只需要更换备份脚本即可。

(1)挂载(mount_backup.sh)

#!/bin/bash

mount -t nfs 192.168.59.171:/data/fuhui /backup

(2)卸载(umount_backup.sh)

#!/bin/bash

umount /backup/

两个脚本均放在/root/backup_scripts/目录下

2、备份脚本(全量+增量)

此脚本也放在/root/backup_scripts/目录下,数据量小于100G,建议使用逻辑备份,具体脚本在附件。

vi /home/mysql/scripts/backup.sh

#!/bin/bash

# 挂载存储

sh /root/backup_scripts/mount_backup.sh

echo ""

START_TIME=`date`

echo "############## backup start at $START_TIME ##############"

echo ""

###you need install xtrabackup!###

# Set env

source /home/mysql/.bash_profile

which xtrabackup

# Database Info

DB_USER="数据库账号"

DB_PASS="R00t@123"

#HOST="数据库密码"

#PORT="24801"

CONF="/data/mysqldb/conf/mysql.conf"

SOCKET="/data/mysqldb/socket/mysql.sock"

# Databases to backup

# DB_NAME=("db1" "db2" "db3")

# Others

BAK_BASE="/backup/mysql_bak/mysql"

DATE=`date +%F`

YESTERDAY=`date +%F -d "-1 days"`

WEEK_DAY=`date +%w`

BAK_DIR=$BAK_BASE/$DATE-$WEEK_DAY

# Create Directory and backup

if [ "$WEEK_DAY" == "6"  ]; then

 xtrabackup --defaults-file=$CONF --socket=$SOCKET --backup --user=$DB_USER --password=$DB_PASS --target-dir=$BAK_DIR --compress

elif [ "$WEEK_DAY" == "0"  ]; then

 INCRE_BASE=$BAK_BASE/$YESTERDAY-6

 xtrabackup --defaults-file=$CONF --socket=$SOCKET --backup --user=$DB_USER --password=$DB_PASS --target-dir=$BAK_DIR --incremental-basedir=$INCRE_BASE --compress

else

       INCRE_BASE=$BAK_BASE/$YESTERDAY-$[WEEK_DAY-1]

 xtrabackup --defaults-file=$CONF --socket=$SOCKET --backup --user=$DB_USER --password=$DB_PASS --target-dir=$BAK_DIR --incremental-basedir=$INCRE_BASE --compress

fi

# TODO

#for var in ${DB_NAME[@]};

#do

#  xtrabackup --defaults-file=$CONF --socket=$SOCKET --backup --databases $var --user=$DB_USER --password=$DB_PASS --target-dir=$BAK_DIR --compress

#done

echo ""

END_TIME=`date`

echo "############## backup end at $END_TIME ##############"

echo ""

# 卸载存储

sh /root/backup_scripts/umount_backup.sh

vim  /home/mysql/scripts/cleanup.sh

#!/bin/bash

echo ""

START_TIME=`date`

echo "############## clean up start at $START_TIME ##############"

echo ""

find /backup/mysql_bak/mysql -maxdepth 1 -type d -mtime +30

find /backup/mysql_bak/mysql -maxdepth 1 -type d -mtime +30 -exec rm -rf {} \;

echo ""

END_TIME=`date`

echo "############## clean up end at $END_TIME ##############"

echo ""

3、设置定时任务运行脚本

每天凌晨 0:10 分清理 30 天之前的备份,每天 0:30 分使用 xtrabackup 进行备份,注意只有周六是全备,其他时间均是增备。

crontab -e

10 0 * * * /root/backup_scripts/cleanup.sh >> /root/backup_scripts/cleanup.log 2>&1

30 0 * * * /root/backup_scripts/backup.sh >> /root/backup_scripts/backup.log 2>&1

4、附件

mysql逻辑备份脚本,数据量小于100G,建议使用逻辑备份。

#!/bin/bash

# 挂载存储

sh /opt/mount_backup.sh

#mybackup.sh

#备份保留天数,建议保留三天

days=1

#备份时间

time=`date +%Y%m%d%H%M%S`

# 设定日志名称

mkdir -p /backup/logs/

mkdir -p /backup/full/

logname="/backup/logs/full_`date +%Y%m%d`.log"

#logname="/backup/logs/`date +%Y%m%d`.log"

#备份保存路径

backup_dir=/backup/full

#备份工具

tool=mysqldump

#用户名

username=root

#密码

password=123456

#端口

port="3306"

#是否采用--all-databases备份所有数据库,是填写Y,否填其他

bak_all=Y

#将要备份的数据库,填写将要备份的数据库名

database_arr=(sqlroad information_schema mysql performance_schema sys)

#备份命令可根据实际情况自行添加参数

#如果文件夹不存在则创建

if [ ! -d $backup_dir/mysqlbak_$time ];

then  

   mkdir -p $backup_dir/mysqlbak_$time;

fi

if [ $bak_all == "Y" ];

then

$tool -u$username -p$password -P$port --master-data --single-transaction --all-databases |gzip > $backup_dir/mysqlbak_$time/mysqlbak_all_$time.sql.gz

else

i=0

while [ $i -lt "${#database_arr[*]}" ]

do

database=${database_arr[$i]}

$tool -u$username -p$password -P$port --master-data --single-transaction $database |gzip > $backup_dir/mysqlbak_$time/mysqlbak_${database}_${time}.sql.gz

let i+=1

done

fi

if [ -f "$backup_dir/mysqlbak_$time/mysqlbak_all_$time.sql.gz" ]; then

   echo "文件存在,执行成功"

else

   echo "文件不存在"

fi

#删除三天前的备份

find $backup_dir -maxdepth 1 -type d -mtime +$days -name 'mysqlbak*' -exec rm -rf {} \;

# 卸载存储

sh /opt/umount_backup.sh

文件备份脚本

#!/bin/bash

#备份路径信息

File_HOME=需要备份的文件或目录路径(根据实际修改)

Back_HOME="/data/huifu/file_back"

#时间格式化

DATE="`date +%Y%m%d`"

#文件保留天数

DAY=7

#选择备份类型,文件(F)或目录(D)

types=F

test -d $Back_HOME/file || mkdir -p $Back_HOME/file

#判断目录或文件是否为空

num=$(ls $File_HOME|wc -l )

if [ $num == 0 ]

then echo “备份文件或目录为空,已退出”

exit

fi

#执行备份

if [ $types == F ]

then

cp  $File_HOME $Back_HOME/file

cd $Back_HOME/file

tar -cf $Back_HOME/file-${DATE}.tar.gz * --remove-files

rm -rf $Back_HOME/file

elif [ $types == D ]

then

cp -r $File_HOME/* $Back_HOME/file

cd $Back_HOME

tar -cf file-${DATE}.tar.gz file --remove-files

else echo "未知备份类型,退出"

exit

fi

if [ $? == 0 ]

then

echo “备份成功”

else

echo “备份失败,请检查磁盘空间”

exit

fi

echo -e "已创建备份文件:\e[32m file-${DATE}.tar.gz\e[0m"

#查找 * 天前的文件

OLD_BACKUP="`find ${Back_HOME} -type f -mtime +${DAY} -iname file-${DATE}\*.gz`"

#遍历旧备份文件

for bak in "${OLD_BACKUP[@]}"; do

   rm -f ${bak}

done

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
打赏
0
0
0
0
28
分享
相关文章
XSAN数据恢复-昆腾存储XSAN数据恢复案例
XSAN数据恢复环境: 昆腾存储,MAC OS操作系统,存放视频类数据(MXF、MOV等格式文件)。 XSAN故障&检测: 将存储空间从XSAN架构迁移到STORNEXT架构后,存储空间中数据全部丢失。 故障存储中一共有9个数据卷:1个META信息卷+8个DATA信息卷。北亚企安数据恢复工程师分析META信息卷&读取其中的元信息,初步判断数据丢失的原因是在迁移存储空间的时候,工作人员误将整个存储系统格式化,导致全部数据丢失。
XSAN数据恢复-昆腾存储XSAN数据恢复案例
数据安全的守护者:备份工具和恢复方法详解
数据安全的守护者:备份工具和恢复方法详解
169 6
服务器数据恢复—EMC UNITY 400存储卷被误删除的数据恢复案例
EMC Unity 400存储连接了2台硬盘柜。2台硬盘柜上一共有21块硬盘(520字节)。21块盘组建了2组RAID6:一组有11块硬盘,一组有10块硬盘。 在存储运行过程中,管理员误操作删除了 2组POOL上的部分数据卷。
数据备份和恢复的常见技术
【10月更文挑战第28天】数据备份和恢复的常见技术
服务器数据恢复—华为S5300存储Oracle数据库恢复案例
服务器存储数据恢复环境: 华为S5300存储中有12块FC硬盘,其中11块硬盘作为数据盘组建了一组RAID5阵列,剩下的1块硬盘作为热备盘使用。基于RAID的LUN分配给linux操作系统使用,存放的数据主要是Oracle数据库。 服务器存储故障: RAID5阵列中1块硬盘出现故障离线,热备盘自动激活开始同步数据,在同步数据的过程中又一块硬盘离线,RAID5阵列瘫痪,上层LUN无法使用。
NetApp数据恢复—NetApp存储误删除数据的数据恢复案例
某公司NetApp存储设备,人为误操作导致NetApp存储内部分重要数据被删除,该NetApp存储采用WAFL文件系统,底层是由多块硬盘组成的raid阵列。
NetApp数据恢复—NetApp存储误删除数据的数据恢复案例
【数据库原理 • 六】数据库备份与恢复
数据库技术是计算机科学技术中发展最快,应用最广的技术之一,它是专门研究如何科学的组织和存储数据,如何高效地获取和处理数据的技术。它已成为各行各业存储数据、管理信息、共享资源和决策支持的最先进,最常用的技术。 当前互联网+与大数据,一切都建立在数据库之上,以数据说话,首先需要聚集数据、分析数据和管理数据,数据库技术已成为各种计算机系统的核心技术。数据库相关知识也已成为每个人必须掌握的知识。
278 1
史上最简单的 MySQL 教程(二十六)「数据备份与还原」
史上最简单的 MySQL 教程(二十六)「数据备份与还原」
267 0
阿里云Isilon (PowerScale)备份服务上线了
Isilon (PowerScale)是Dell EMC提供的可横向扩展NAS平台,用于大容量存储、归档非结构化数据。Isilon (PowerScale) 提供了大容量存储的能力,用户会存放大量数据在Isilon中,数据损坏、数据被误删除、恶意病毒攻击都会给用户带来严重的影响,即使能修复往往需要耗费大量的时间和精力,因此持续的数据保护尤为重要,鉴于此,阿里云推出了Isilon (PowerScale)备份服务。
1390 0
阿里云Isilon (PowerScale)备份服务上线了
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等