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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 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

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
21天前
|
存储 关系型数据库 数据库
数据备份和恢复的常见技术
【10月更文挑战第28天】数据备份和恢复的常见技术
|
3月前
|
安全 API 数据库
OceanBase数据库clog日志,删前请三思!一不小心可能引发数据灾难,快来了解正确的日志管理之道!
【8月更文挑战第7天】ModelScope(魔搭)作为开放的模型即服务平台,提供丰富的预训练模型。访问令牌在此类平台中至关重要,用于验证用户身份并授权访问特定模型或服务。本文介绍访问令牌的概念、获取方法及使用示例,强调安全性与有效期内的使用,并简述刷新令牌机制。掌握这些知识可帮助用户安全高效地利用ModelScope的资源。
52 0
|
存储 Oracle 算法
数据库数据恢复-ORACLE数据库常见故障的数据恢复可能性分析
ORACLE数据库常见故障: 1、ORACLE数据库无法启动或无法正常工作。 2、ORACLE数据库ASM存储破坏。 3、ORACLE数据库数据文件丢失。 4、ORACLE数据库数据文件部分损坏。 5、ORACLE数据库DUMP文件损坏。
|
数据库
数据库恢复技术
数据库恢复技术
149 0
|
存储 SQL 运维
企业运维训练营之数据库原理与实践—云数据库备份与恢复—数据库备份恢复原理(下)
企业运维训练营之数据库原理与实践—云数据库备份与恢复—数据库备份恢复原理(下)
165 0
|
SQL 存储 运维
企业运维训练营之数据库原理与实践—云数据库备份与恢复—数据库备份恢复原理(上)
企业运维训练营之数据库原理与实践—云数据库备份与恢复—数据库备份恢复原理(上)
197 0
|
弹性计算 容灾 关系型数据库
一文教你学会数据库异地备份
数据库备份DBS提供数据库异地备份能力,满足PolarDB、RDS、ECS上自建库异地容灾需求。本文介绍ECS上自建数据库的异地备份。
1422 0
|
安全 容灾 数据库
备份容灾相关概念总结
物理备份:是将实际组成数据库的操作系统文件从一处拷贝到另一处的备份过程,通常是从磁盘到磁带。物理备份又分为冷备份、热备份。 逻辑备份:是指使用软件技术从数据库中导出数据并写入一个输出文件,该文件的格式一般与原数据库的文件格式不同,只是原数据库中数据内容的一个映像。
2095 0
|
数据库 数据挖掘 关系型数据库
下一篇
无影云桌面