MySQL全量备份和增量备份

article/2025/9/17 7:12:34

MySQL目前是市面上比较流程的关系型数据库,很多人使用MySQL里的数据真的安全吗?如果发生以下问题的话:

  • MySQL数据目录所在磁盘损坏
  • MySQL服务器发生故障
  • 人为操作失误导致删除了一些数据
  • 黑客入侵导致数据被攻陷等问题

这个时候如果没有备份数据库中的数据,造成的影响将是非常严重的,但是我们备份数据不能每天手动的去全量导出,如果放假忘记了或者啥啥啥的,咋整?所以还是要让备份交给服务器去做调度。

这里推荐的备份工具是innobackupex,首先要安装它,步骤如下(centos):

官网:https://www.percona.com/downloads/Percona-XtraBackup-2.4/

yum -y install percona-xtrabackup

如果安装失败,那么就更改一下yum源,然后再执行安装命令

# 备份源
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup# 更新阿里云源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

在安装的过程中,如果出现依赖报错,那么就安装一下:

yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL

完整的命令过程如下:

# 备份源
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup# 更新阿里云源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo# 安装依赖
yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL# 安装备份工具
yum -y install percona-xtrabackup

测试是否安装成功,执行一下命令innobackupex --help,出现以下内容即为安装成功

在这里插入图片描述


备份工具已经准备好了,那么我们就开始编写备份脚本(因为我们备份是一个逻辑流程,不是一条命令能解决的,这里就不特地讲解备份命令了,在下方的脚本中进行相关的解释)

  1. 全量备份

首先看一下全量备份,也就是将整个数据库的所有数据(包括库、表、视图、表数据等),脚本的主要逻辑是这样的:

  • 声明数据库账号信息和数据留存时间等基础信息
  • 动态创建备份文件临时存储目录
  • 执行备份命令开始数据备份
  • 校验备份结果是否超过,如果成功则将最新备份的文件目录写入到指定文件中(用于动态增量备份)
  • 如果失败,则给备份管理人员发送告警提醒邮件
  • 筛选数据备份存储目录中指定日期之前的备份记录,然后删除已经过期的目录
#!/bin/bash
# set -e# 1. 声明数据库账号信息和数据留存时间等基础信息
user=root # 数据库用户名
password=rXH?py2 # 数据库密码
LEAVE_DAY_AGO=$(date -d "-30 day" +'%s')# 2. 动态创建备份文件临时存储目录
[ -d /app/backupdb ]|| mkdir -p /app/backupdb &>>/app/backupdb/backupdb_log.log
[ -d /data/backup/db ]|| mkdir -p /data/backup/db &>>/app/backupdb/backupdb_log.log
echo "start copying ..." &>>/app/backupdb/backupdb_log.log# 3. 执行备份命令开始数据备份
/usr/bin/innobackupex --user="$user" --password="$password" /data/backup/db/ > /app/backupdb/backupdb_log.log 2>&1
# 4. 校验备份结果是否超过
if [ "$?" != "0" ]; then# 4.1 备份失败,则给备份管理人员发送告警提醒邮件# <from_email>:发送邮件# <receiver_email>:多个邮箱以,分隔# <smtp_server>:邮箱服务器# <send_account>:邮件发送账户名# <send_password>:邮件发送账户密码/usr/local/bin/sendEmail -f <from_email> -t <receiver_email> -s <smtp_server> -u "数据库备份失败" -o message-charset=utf-8 -xu <send_account> -xp <send_password> -m "数据库备份失败,详情请查看日志文件 /app/backupdb/backupdb_log.log" -o tls=no &>>/app/backupdb/backupdb_log.logexit 1;
else# 4.2 备份成功,则将最新备份的文件目录写入到指定文件中(用于动态增量备份)echo "end copied! ..." &>>/app/backupdb/backupdb_log.logecho `ls -lt /data/backup/db/ | grep - | head -n 1 |awk '{print $9}'` > /data/backup/last_backup_dir_name
fi;# 5. 删除${LEAVE_DAY_AGO}天前的备份目录及子目录、文件
path="/data/backup/db"
files=$(ls $path)
for filename in $files
dofile=(${filename:0:10})if echo $file | grep -Eq "[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}" && date -d $file +%Y%m%d > /dev/null 2>&1;thenecho $filename 'format is right date' &>>/app/backupdb/backupdb_log.logfile_time=$(date -d $file +'%s')# 校验备份记录是否已过期if [ $file_time -lt $LEAVE_DAY_AGO ];thenrm -rf $path/$filename*echo "删除$filename 备份目录" &>>/app/backupdb/backupdb_log.logelseecho "$filename 为有效期内数据库备份" &>>/app/backupdb/backupdb_log.logfi;elseecho "日期格式不正确:" $filename &>>/app/backupdb/backupdb_log.logfi;
done
  1. 增量备份

上面讲了全量备份,增量备份是依据于上一次全量备份的记录去做的增量,这里最重要的就是要获取到上一次备份生成的目录,也就是全量备份中4.2中保存的,具体步骤为:

  • 声明数据库账号信息和数据留存时间等基础信息
  • 动态创建备份文件临时存储目录
  • 搜索并获取上一次全量备份的目录地址
  • 执行备份命令开始数据备份
  • 校验备份结果是否超过,如果成功则将最新备份的文件目录写入到指定文件中(用于动态增量备份)
  • 如果失败,则给备份管理人员发送告警提醒邮件
  • 筛选数据备份存储目录中指定日期之前的备份记录,然后删除已经过期的目录
#!/bin/bash
# set -e# 1. 声明数据库账号信息和数据留存时间等基础信息
user=root # 数据库用户名
password=rXH?py2 # 数据库密码
LEAVE_DAY_AGO=$(date -d "-30 day" +'%s')# 2. 动态创建备份文件临时存储目录
[ -d /app/backupdb ]|| mkdir -p /app/backupdb &>>/app/backupdb/backupdb_increment_log.log
[ -d /data/backup/db/increment ]|| mkdir -p /data/backup/db/increment &>>/app/backupdb/backupdb_increment_log.log
echo "increment start copying ..." &>>/app/backupdb/backupdb_increment_log.log# 3. 搜索并获取上一次全量备份的目录地址,这里也就是上一次全量备份输出的文件中的内容
last_backup_dir_name=`echo /data/backup/last_backup_dir_name`# 4. 执行备份命令开始数据备份
/usr/bin/innobackupex --user="$user" --password="$password" --incremental /data/backup/db/increment/ --incremental-basedir /data/backup/db/"$last_backup_dir_name" > /app/backupdb/backupdb_increment_log.log 2>&1# 5. 校验备份结果是否超过
if [ "$?" != "0" ]; then# 4.1 备份失败,则给备份管理人员发送告警提醒邮件# <from_email>:发送邮件# <receiver_email>:多个邮箱以,分隔# <smtp_server>:邮箱服务器# <send_account>:邮件发送账户名# <send_password>:邮件发送账户密码/usr/local/bin/sendEmail -f <from_email> -t <receiver_email> -s <smtp_server> -u "数据库增量备份失败" -o message-charset=utf-8 -xu <send_account> -xp <send_password> -m "数据库增量备份失败,详情请查看日志文件 /app/backupdb/backupdb_increment_log.log" -o tls=no &>>/app/backupdb/backupdb_increment_log.logexit 1;
else# 4.2 备份成功,则将最新备份的文件目录写入到指定文件中(用于动态增量备份)echo "increment end copied! ..." &>>/app/backupdb/backupdb_increment_log.log
fi;# 5. 删除30天前的备份目录及子目录、文件
path="/data/backup/db/increment"
files=$(ls $path)
for filename in $files
dofile=(${filename:0:10})if echo $file | grep -Eq "[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}" && date -d $file +%Y%m%d > /dev/null 2>&1;thenecho $filename 'format is right date' &>>/app/backupdb/backupdb_increment_log.logfile_time=$(date -d $file +'%s')# 校验备份记录是否已过期if [ $file_time -lt $LEAVE_DAY_AGO ];thenrm -rf $path/$filename*echo "删除$filename 备份目录" &>>/app/backupdb/backupdb_increment_log.logelseecho "$filename 为有效期内数据库备份" &>>/app/backupdb/backupdb_increment_log.logfi;elseecho "日期格式不正确:" $filename &>>/app/backupdb/backupdb_increment_log.logfi;
done

到目前,MySQL全量和增量备份脚本都已经编写完成了,接下来就是将脚本的执行设置为系统调度corntab中,由crontab进行调度,设置crontab的命令为:crontab -e

#每周一凌晨4点执行全量备份
0 4 * * 1 sh /app/backupdb/db_backup.sh >> /app/backupdb/backupdb_log.log#每天凌晨2点执行增量备份
0 2 * * * sh /app/backupdb/db_backup_increment.sh >> /app/backupdb/backupdb_increment_log.log

既然讲了备份,那么就需要讲一下恢复,如何使用备份的数据进行全量恢复呢?下次再说


http://chatgpt.dhexx.cn/article/XU9kJDxW.shtml

相关文章

mysql备份test数据库_mysql和test数据库

安装mysql yum -y install mysql mysql-server mysql-devel service mysqld startmysqladmin -uroot -p password "123456"mysql -uroot -pshow databases; use mysql; sho... 文章 weibinwps 2017-12-25 983浏览量 mysql导入和导出数据 Linux下如何单个库进行导入和…

app服务器 数据库文件,app访问服务器mysql数据库文件

app访问服务器mysql数据库文件 内容精选 换一换 云数据库RDS服务上的MySQL在使用上有一些固定限制&#xff0c;用来提高实例的稳定性和安全性&#xff0c;具体详见表1。 对于mysqlpump工具&#xff0c;由于在并行备份场景有coredump问题&#xff0c;不建议您使用&#xff0c;推…

定时备份MYSQL数据库

首先查看磁盘情况&#xff0c;选择空间充足的磁盘空间&#xff0c;避免出现因空间不足导致备份失败 df -h 这里选择磁盘较大的&#xff0c;app 创建备份目录 cd /app mkdir bkdatabase cd bkdatabase 创建备份的shell脚本 vim backmysql.sh 添加内容&#xff1a; #!/bi…

MYSQL数据库(八)数据库备份和恢复

成功不易&#xff0c;加倍努力&#xff01; 5 备份和恢复5.1 备份恢复概述5.1.1 为什么要备份5.1.2 备份类型5.1.3 备份什么5.1.4 备份注意要点5.1.5 还原要点5.1.6 备份工具5.1.6 基于 LVM 的快照备份5.1.7 实战案例&#xff1a;数据库冷备份和还原 5.2 mysqldump备份工具5.2.…

【脚本分享】- Windows下利用Powershell进行MySQL数据库备份

关注「WeiyiGeek」公众号 将我设为「特别关注」&#xff0c;每天带你玩转网络安全运维、应用开发、物联网IOT学习&#xff01; 测试环境: Server 2008 R2 所需软件: - MySQLdump.exe - msvcp120.dll x64/x86- msvcr120.dll x64/x86- powershell- 7z 设置PowerShell策略: PS…

数据库备份脚本大全

备份脚本六个注意点 在写脚本前我这里按照个人习惯大概总结了以下六点&#xff0c;感兴趣的可以继续看看&#xff0c;不感兴趣的直接跳过就好。 1、首先要注意的一点就是 shell 环境是 bash 还是 sh ,需要在你的脚本开头中注明。 #!/bin/bash 2、其次就是数据库环境变量需要申明…

C#实现MySQL数据库数据的备份与恢复

这几天一直在做学校的C#期末项目&#xff0c;其中有一个功能就是数据的备份与恢复&#xff0c;在百度了一番之后&#xff0c;只找到了适用于SQL Server的备份SQL语句 BACKUP DATABASE database_name TO DISK physical_device_name [ WITH { DIFFERENTIAL | COPY_ONLY | {…

Linux Mysql自动备份

1.配置自动备份环境 1.1 创建文件见放脚本文件和备份数据 # 创建/data/backup/mysqlmkdir -p /data/backup/mysqlcd /data/backup# 创建mysql_backup.sh的脚本并且填充数据vi mysql_backup.sh# vi mysql_backup.sh进行编辑和修改 1.2 创建 备份数据的语句 mysql_backup.sh…

wamp 备份 mysql数据库_wamp:MySql数据库备份还原(mysqldump)

mysql数据库备份和恢复命令在mysql安装目录中的bin目录下&#xff0c;例如wamp安装在e:\wamp目录下&#xff0c;备份目录就在e:\wamp\mysql\mysql5.0.51b\bin目录中&#xff0c;备份和恢复操作在DOS命令符状态下完成&#xff1a; 1、备份数据库&#xff1a; mysqldump -u 用户名…

MySQL 20 MySQL 数据库备份

8.2 数据库备份 不用我多说&#xff0c;都知道 为什么需要数据库备份。因为 你在增删改查的时候&#xff0c;肯定会 出现 误操。&#xff08;导致一些数据修改错误&#xff0c;或者一些数据被不小心干掉&#xff01;&#xff09; 保证重要的数据不丢失为了让我们 对数据操作的…

MySQL数据库的定时备份实践

1.背景介绍 也许你会发现本站建站时间久远&#xff0c;但是本站的各类访问量总是很低&#xff0c;这大概是有两个方面的原因&#xff0c;其一是因为本站升级2.0后&#xff0c;所有的文章访问数据并未同步&#xff08;不仅仅是文章&#xff0c;所有的数据均为同步&#xff0c;比…

Python NumPy计算欧氏距离(Euclidean Distance)

欧氏距离定义&#xff1a; 欧氏距离&#xff08; Euclidean distance&#xff09;是一个通常采用的距离定义&#xff0c;它是在m维空间中两个点之间的真实距离。 在二维和三维空间中的欧式距离的就是两点之间的距离&#xff0c;二维的公式是&#xff1a; begin{equation} d sq…

Euclidean division

In arithmetic, Euclidean division – or division with remainder – is the process of dividing one integer (the dividend) by another (the divisor), in a way that produces an integer quotient and a natural number remainder strictly smaller than the absolute …

PRN(20201012):Improved updating of Euclidean distance maps and Voronoi diagrams

[*] Lau B , Sprunk C , Burgard W . Improved updating of Euclidean distance maps and Voronoi diagrams[C]// IEEE/RSJ International Conference on Intelligent Robots & Systems. IEEE, 2010. 本文对[*]中的Occupancy Map to Euclidean Distance Maps算法进行python…

java余弦距离_使用TensorFlow实现余弦距离/欧氏距离(Euclideandistance)以及Attention矩阵的计算...

最近在使用tensorflow完成句子相似度建模等任务时常常会用到各种距离的计算&#xff0c;而且有很多论文提出了Attention机制&#xff0c;所以这里就介绍一下如何使用tensorflow实现上述各种功能。 这里首先假定我们的输入是两个四维的Tensor&#xff0c;然后我们需要计算的是其…

点云检测--欧式聚类Euclidean Cluster

1.版本要求 版本: >PCL1.3 2.简介 欧式聚类是点云聚类的一种重要方法&#xff0c;利用点云中点与点之间的欧式距离进行聚类&#xff0c;当点与点之间的欧式距离小于设定的阈值则视为一类。欧式聚类是车辆前方障碍物检测的重要方法。 3.数据 本例中使用的点云数据&#…

Voxblox: Incremental 3D Euclidean Signed Distance Fields for On-Board MAV Planning

作者&#xff1a; 19届 lz 日期&#xff1a;2022-3-2 论文&#xff1a;《Voxblox: Incremental 3D Euclidean Signed Distance Fields for On-Board MA V Planning》 整个系统功能分为两部分&#xff1a; 将传入的传感器数据合并到 TSDF 中&#xff08;第 IV 节&#xff09;&…

3D点云处理:点云聚类--FEC: Fast Euclidean Clustering for Point Cloud Segmentation

文章目录 聚类结果一、论文内容1.1 Ground Surface Removal1.2 Fast Euclidean Clustering题外&#xff1a;欧几里得聚类Fast Euclidean ClusteringFEC利用具有点索引顺序的逐点方案的浅显理解 1.3 源码中问题说明 二、参考 聚类结果 原始代码中采用的是pcl中的搜索方式&#…

euclidean loss

个人感觉相当于L2范式开平方,也相当于针对两个向量的欧氏距离开平方 说的更直白点就是两个向量对应位置相减得到每个位置的差,然后把每个位置的差开平方再相加 前向传播cpp代码: template <typename Dtype> void EuclideanLossLayer<Dtype>::Forward_cpu(const vec…

Euclidean, Manhattan, hop-count distance 区别

欧式距离&#xff08;Euclidean Distance&#xff09; 二维空间的公式 其中&#xff0c; 为点 与点 之间的欧氏距离&#xff1b; 为点 到原点的欧氏距离。 曼哈顿距离&#xff08;Manhattan Distance &#xff09; 两点在南北方向上的距离加上在东西方向上的距离&#xff0c;…