【MySQL备份】lvm-snapshot篇

目录

1.简介

1.1.如何工作

1.2.应用场景

1.3.注意事项

1.4.优缺点

2.为什么选择lvm快照备份?

3.创建LVM

3.1.操作流程

3.2.正常安装MySQL后进行备份

3.3.MySQL运行一段时间后进行备份

3.3.1.准备lvm及文件系统//先添加一块磁盘

3.3.2.将数据迁移到LVM

3.3.3.LVM快照备份流程

3.3.3.1.加全局锁

3.3.3.2.创建快照

3.3.3.3.释放锁

3.4.从快照中恢复

3.4.1. 停止MySQL服务

3.4.2. 卸载原逻辑卷

3.4.3. 挂载快照卷

3.4.4. 复制数据

3.4.5. 卸载快照卷

3.4.6. 启动MySQL服务

3.4.7. 验证数据

3.4.8. 清理和后续操作

3.6.脚本制作快照

3.7.定时任务管理Cron


1.简介

LVM快照(LVM Snapshot)是Logical Volume Manager(逻辑卷管理器)的一个重要特性,它允许用户在某一时间点创建一个卷的只读副本,这个副本反映了原始卷在创建快照时刻的数据状态。这一功能对于数据备份、系统升级前的即时状态保存、数据迁移等场景非常有用。下面是LVM快照的一些关键点和工作原理:

1.1.如何工作

  1. 创建快照:当创建一个LVM快照时,LVM实际上并不立即复制原始卷的所有数据到新的快照卷上,这样做会非常耗时且占用大量空间。相反,LVM仅记录自快照创建以来发生变化的块。这时,快照卷和原始卷共享未变更的数据块。

  2. 独立变化:随着时间推移,如果原始卷上的数据发生变化,LVM会将变化前的数据块复制到快照卷上,以保持快照数据的一致性。这意味着快照卷会逐渐占用更多的存储空间,因为它需要存储越来越多与原始卷不同的数据块。

  3. 空间管理:LVM快照的大小(即它可以记录多少更改)是在创建时指定的,随着快照使用空间的增长,达到这个限制后,如果还有更多的更改,快照可能会失效或变得不可用,因此需要合理规划快照的大小。

  4. 性能影响:由于LVM快照机制涉及到数据块的复制,尤其是在写密集型的应用中,创建和维护快照可能会对I/O性能产生一定影响。因此,在生产环境中实施快照时,需要评估其对业务运行的潜在影响。

1.2.应用场景

  • 数据备份:在进行物理备份时,先创建LVM快照,然后从快照进行备份,这样可以避免备份过程中数据库的写操作影响数据一致性。
  • 系统测试:可以基于生产环境的快照创建一个测试环境,进行软件升级或配置更改的测试,而不影响生产数据。
  • 数据恢复:在数据损坏或误删的情况下,快照可以作为一种快速恢复手段,恢复到创建快照时的状态。

1.3.注意事项

  • 快照应当视为临时状态的保存,不适合长期存储,因为随着更改量的累积,快照占用的空间会持续增长。
  • 在使用LVM快照进行备份时,应确保快照的生命周期内数据变更量不要超过快照卷的容量,避免数据丢失。

1.4.优缺点

优点缺点
即时快照:能够在几秒钟内创建一个时间点的快照,几乎不影响系统运行。空间消耗:随着数据变化,快照会占用额外的存储空间,且随时间推移可能迅速增长。
一致性备份:在创建快照前后使用适当的锁机制(如在数据库备份前锁定表),可以保证数据的一致性。性能影响:快照创建后,对源卷的写操作需要同时更新源卷和快照,可能导致I/O性能下降。
在线备份:允许在不停机的情况下进行备份,适合生产环境的实时数据保护。快照生存周期:快照卷有最大容量限制,一旦达到,快照将失效,且无法追加新变更。
灵活恢复:可以从快照恢复到任意时间点的数据,提供多种数据恢复方案。管理复杂度:需要合理规划快照大小、监控空间使用,以及适时删除不再需要的快照。
灾难恢复:为灾难恢复提供快速的数据恢复点,减少RTO(恢复时间目标)。硬件依赖:仅限于使用LVM管理的卷,对于非LVM环境不适用。
资源复用:快照可以用于测试、开发环境,无需额外复制大量数据,节省存储资源。潜在风险:若源卷损坏,且快照未被妥善保护或管理,可能会失去所有数据。

2.为什么选择lvm快照备份?

原因:因为锁表的时间不一致,在锁表的瞬间是不能写入的,对其进行快照备份,备份完成后立即解锁,然后服务可以正常使用(写入等操作)比如数据量大的时候,做快照一下子就拍了,然后立即解锁,就不影响写入等操作。如果用mysqldump备份,那么数据量大的时候,锁表时间长,就会影响效率

3.创建LVM

 

图片来源:

http://Linux下的磁盘管理之LVM详解及lvm的常用磁盘操作命令_yg@hunter的博客-CSDN博客_lvm命令

3.1.操作流程

  • flush table with read local;//全局加锁
  • create snapshot;//快照
  • show master status; show slave status;[可选]
  • unlock tables;//释放锁
  • Copy files from the snapshot//从快照卷中复制数据cp tar[40 m]
  • Unmount the snapshot//挂载快照卷
  • Remove snapshot//卸载并删除快照卷

3.2.正常安装MySQL后进行备份

1.安装系统
2.准备LVM
3.安装mysql,默认datadir=/var/lib/mysql

3.3.MySQL运行一段时间后进行备份


3.3.1.准备lvm及文件系统//先添加一块磁盘

[root@localhost centos]# vgcreate datavg /dev/sdb

[root@localhost centos]# lvcreate -L 2G -n mysql datavg //创建2G的VG
[root@localhost centos]# mkfs.xfs /dev/datavg/mysql //格式化磁盘分区

3.3.2.将数据迁移到LVM

[root@localhost centos]# systemctl stop mysqld //停止MySQL服务
[root@localhost centos]# mount /dev/datavg/mysql /mnt/ //将快照挂载到临时目录
[root@localhost centos]# cp -a /var/lib/mysql/* /mnt/ //拷贝MySQL数据到挂载的临时目录[root@localhost centos]# umount /mnt/ //卸载快照
[root@localhost centos]# vim /etc/fstab //更改配置文件设置自动挂载
/dev/datavg/mysql /var/lib/mysql xfs defaults 0 0[root@localhost centos]# mount -a //自动挂载/etc/fstab文件没有挂载的设备,不管已挂载过的设备
[root@localhost centos]# chown -R mysql.mysql /var/lib/mysql //递归更改/var/lib/mysql主组和属组
[root@localhost centos]# systemctl restart mysqld //重启MySQL

3.3.3.LVM快照备份流程

3.3.3.1.加全局锁
mysql>flush table with read local;
3.3.3.2.创建快照
lvcreate -L 500M -s -n mysql-snap /dev/datavg/mysql;
mysql -p'123456' -e ‘show master status’> /backup/`data +%F`_position.txt
3.3.3.3.释放锁
create snapshot;

注意事项:

加全局锁和创建快照必须在同一会话中完成 

[root@localhost centos]# echo "FLUSH TABLES WITH READ LOCK;SYSTEM lvcreate -L 500M -s -n mysql-snap /dev/datavg/mysql;"
| mysql -uroot -p'123456'

3.4.从快照中恢复

3.4.1. 停止MySQL服务

首先,优雅地停止MySQL服务,以避免数据损坏:

systemctl stop mysqld

或在较旧的系统中可能是:

service mysql stop

3.4.2. 卸载原逻辑卷

如果原逻辑卷仍然挂载,需要先卸载它。比如,如果MySQL数据目录挂载在/var/lib/mysql,则执行:

umount /var/lib/mysql

3.4.3. 挂载快照卷

创建一个临时目录,并将快照卷挂载到这个目录:

mkdir /mnt/mysql_snapshot_recovery
mount /dev/datavg/mysql-snap /mnt/mysql_snapshot_recovery

这里/dev/datavg/mysql-snap是之前创建的快照逻辑卷的路径。

3.4.4. 复制数据

将快照中的数据复制回原逻辑卷的位置。首先,确保原逻辑卷(例如/dev/datavg/mysql)未挂载。然后,使用rsynccp命令将数据复制回去。rsync是一个较好的选择,因为它可以更高效地处理大文件和大量小文件:

rsync -avHAXS --delete /mnt/mysql_snapshot_recovery/ /var/lib/mysql/

这会将快照中的所有内容同步到MySQL的原始数据目录中,并保持权限、时间戳等元数据的一致性。

3.4.5. 卸载快照卷

完成数据复制后,卸载快照卷:

umount /mnt/mysql_snapshot_recovery

3.4.6. 启动MySQL服务

启动MySQL服务,检查数据是否恢复成功:

systemctl start mysqld

service mysql start

3.4.7. 验证数据

登录MySQL并验证数据是否正确无误。可以检查表结构、数据记录等,确保一切符合预期。

3.4.8. 清理和后续操作

如果一切正常,你可以考虑删除快照(如果不再需要),以释放存储空间:

lvremove /dev/datavg/mysql-snap

3.6.脚本制作快照

#!/bin/bash
# 定义备份目录,使用日期作为目录名以保持备份的有序性
back_dir="/backup/mysql_$(date +%F)"# 检查备份目录是否存在,不存在则创建
[ ! -d "$back_dir" ] && mkdir -p "$back_dir"# 锁定MySQL表并创建LVM快照。注意,这里直接在命令中使用了MySQL的root密码,这在安全性上是个问题。
# 使用-e参数将多行命令传递给mysql,同时建议通过配置文件或环境变量安全地传递密码。
echo "FLUSH TABLES WITH READ LOCK; SYSTEM lvcreate -L 500M -s -n mysql-snap /dev/datavg/mysql;" | mysql -u root -p'123456'# 挂载LVM快照为只读模式,避免对快照造成意外修改
mount -o ro,nouuid /dev/datavg/mysql-snap /mnt/# 使用rsync进行数据同步,从快照目录到备份目录
rsync -a /mnt/ "$back_dir"# 检查rsync命令执行状态,如果成功(返回值为0)则进行以下操作
if [ $? -eq 0 ]; then# 解除MySQL锁echo "UNLOCK TABLES;" | mysql -u root -p'123456'# 卸载快照卷umount /mnt/# 删除快照,释放空间lvremove -f /dev/datavg/mysql-snap
elseecho "备份过程中发生错误,未执行卸载和删除快照操作。"
fi

3.7.定时任务管理Cron

要将上述LVM快照备份脚本设置为定时任务,可以使用Linux的Cron服务。以下是设置定时任务的步骤,假设脚本保存为/usr/local/bin/lvm_mysql_backup.sh,并且希望每天凌晨2点执行一次备份:

  1. 编辑Crontab配置

    打开终端,运行以下命令来编辑Crontab配置(如果希望以root用户执行脚本,请使用sudo crontab -e,否则,直接使用crontab -e以当前用户身份编辑):

    crontab -e
  2. 添加定时任务

    在打开的Crontab文件中,移动光标到文件末尾,添加以下行来设置定时任务:

    0 2 * * * /usr/local/bin/lvm_mysql_backup.sh
  3. 这行配置的意思是每天凌晨2点整执行/usr/local/bin/lvm_mysql_backup.sh脚本。

  4. 保存并退出

    编辑完成后,保存文件。如果使用的是Nano编辑器,可以按Ctrl+O然后回车保存,接着按Ctrl+X退出编辑器。

  5. 权限设置

    确保脚本具有执行权限。如果尚未设置,可以通过以下命令给予脚本执行权限:

    sudo chmod +x /usr/local/bin/lvm_mysql_backup.sh
  6. 测试与验证

    可以通过查看Cron的日志(通常是/var/log/syslog/var/log/cron.log)来确认任务是否按时执行。此外,可以在计划执行时间之前手动执行一次脚本,以确保脚本没有错误,并能正确完成备份任务。

请注意,为了安全和管理方便,确保脚本中不包含敏感信息(如数据库密码),而是通过安全的方式传递这些信息(例如通过环境变量或配置文件)。此外,定期检查备份目录的空间使用情况,确保有足够的空间进行备份,避免因空间不足导致备份失败。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/36865.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL学习(5):SQL语句之数据查询语言:DQL

1.DQL语法 select 字段列表 from 表名列表 #DQL是可以进行多表查询的 where 条件列表 group by 分组字段列表 having 分组后条件列表 order by 排序字段列表 limit 分页参数 2.基本查询(select) 2.1查询多字段 select 字段1,字段2,字段3,......fro…

基于Volov7的安全帽检测系统

1 项目介绍 1.1 摘要 随着工业化和城市化的迅猛推进,工作场所的安全管理愈发受到重视。安全帽作为保护工人头部安全的关键装备,其实时监测和检测的重要性不言而喻。本文提出并深入研究了基于YOLOv7算法的安全帽佩戴检测技术,该技术旨在实现…

Day.js

Day.js 是什么? Day.js是一个极简的JavaScript库,可以为现代浏览器解析、验证、操作和显示日期和时间。 Day.js中文网 为什么要使用Day.js ? 因为Day.js文件只有2KB左右,下载、解析和执行的JavaScript更少,为代码留下更…

作物检测:YOLOv8+SwanLab

1. 项目介绍 基于深度学习的作物检测通过精准管理和数据驱动决策,能够提高作物产量和质量,优化农业资源利用,推动农业自动化进程,从而保障粮食安全。目前,作物检测领域大多针对单类作物进行检测。因此,本项…

SDIO学习(2)--SD卡 2.0协议

本文参考文档: 《SD Specifications Part 1 Physical Layer Simplified Specification Version 2.00》 1 SD卡简介 1.1 SD卡概念 1.2 SD卡外形和接口 Clk:时钟线,由SDIO主机产生 CMD:命令控制线,SDIO主机通过改…

基于C++标准库实现定时器类

基于C标准库实现定时器类 定时器类是多线程编程中经常设计到的工具类 简单的定时器原理其实很简单(是不是有点GNU is not unix的味道;): 创建一个新线程在那个线程里等待等待指定时长后做任务 python标准库中就有这么一个定时器类&#xf…

升级!升级!升级!MobPush基础标签推送全新升级,助力开发者精细化运营

“广播推送点击率不高,会员转化差” “新用户拉新后留存不高,次留、3日留存不达标” “用户的复购较低,黏性不高,导致GMV未达预期” 我们总是会听到运营人员关于目标达成过程中遇到这样或者那样的问题。这些问题汇总起来就回到…

STM32 HAL库 外部中断 实现按键控制LED亮灭

目录 1、为什么使用GPIO外部中断控制LED亮灭? 2、NVIC嵌套向量中断控制器 3、EXTI外部中断 4、项目的硬件排线 5、STM32CUBE_MX配置 6、HAL库代码 7、实际效果 1、为什么使用GPIO外部中断控制LED亮灭? 实现LED亮灭控制有很多方式,其中…

公文出错事非小,这些公文写作的常见错误,你中过招吗?

公文是企事业单位、相关部门内外沟通交流的重要工具,不少“笔杆子”经常需要与公文打交道,每天会接触大量的公文。然而在公文撰写的细微之处,稍有不慎,便可能犯下一些常见的错误。这些错误如同蚁穴,虽小却足以破坏公文…

stm32cubemx,adc采样的几种方总结,触发获取adc值的方法dma timer trigger中断

stm32cubemx adc采样的几种方总结,触发获取adc值的方法 timer trigger中断 方法1,软件触发方法2:,Timer触发ADC采集通过DMA搬运 触发获取adc值的方法 Regular Conversion launched by software 软件触发 调用函数即可触发ADC转换 Timer X Cap…

Python基于逻辑回归分类模型、决策树分类模型、LightGBM分类模型和XGBoost分类模型实现车辆贷款违约预测项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 随着经济的发展和人民生活水平的提高,汽车消费在居民消费中所占比例逐渐增加,汽…

克服指标管理痛点,实现数据价值最大化

在当下的企业管理中,由于数据量的激增,管理方式逐渐从基于经验转向基于数据。在此过程中,我们能够通过数据探查业务情况、分析数据,从而获取更优的决策支持数据。这通常通过数据报表或分析平台来实现,对于临时性场景&a…

护眼大路灯哪个牌子好用?五款好用的护眼灯分享

护眼大路灯哪个牌子好用?现在的孩子从幼儿园开始就开始学习,面临的用眼压力就很大,但想要孩子视力不受影响,大路灯是得好好安排起来,但动辄大几千的护眼灯真是让我们这些普通家庭的家长望而却步,有没有好用…

控制系统稳定性常见策略

提升控制系统稳定性是确保系统可靠运行的关键,以下是一些常见策略: 1. 控制算法优化 优化控制算法是提升系统稳定性的核心方法之一。常见的控制算法包括PID控制、模糊控制、自适应控制等。通过调整和优化这些算法的参数,可以显著提高系统的…

填报高考志愿时,学校、专业和城市怎么选择呢?

我的观点是: 专业>城市>学校 专业是兴趣导向,符合自己的价值观,失去了这种驱动力的专业学习,会变得非常艰难的,而且没有竞争力,所以我的排序第一位是专业。 其次是城市,最好是一线城市&…

划重点!炒伦敦金看k线图的要点

对于刚刚开始参与伦敦金交易,还在学习如何看K线的投资者来说,掌握一些看k线图的要点,对于更好地分析市场的行情走势,找到有利的入场机很有帮助,以下是一些关键的建议,希望能够供大家参考。 K线有阳线和阴线…

Coze搭建《测测你的本命宠物》

前言 本文讲解如何从零开始,使用扣子平台去搭建《测测你的本命宠物》 《测测你的本命宠物》:测测你的本命宠物 - 扣子 AI Bot (coze.cn) 欢迎大家去体验一下!!! 正文 接下来我们开始讲解制作这个bot的流程吧&#…

rclone 上传资料到 onedrive 遇到限速问题解决

原因分析 可能和脚本参数设置有关系,我的参数是: rclone copy "F:\阿里云盘\6666\局域网" "od:影视" --ignore-existing -u -v -P --transfers20 --ignore-errors --buffer-size128M --check-first --checkers10 --drive-acknowledge-abuse差不多8G大小的…

如何使得Macos的剪切板感知fileURL并当fileURL被执行paste 动作时 回调到某个监听的函数 从而来填充file content

问题及尝试: 我在做一个跨平台文件拷贝的功能,文件可能是从其他操作系统比如Linux 或者Windows 拷贝到Macos上, 但是我试过所有可以hook NSPasteboard的方法,确实没有找到可以监听macos 剪切板的方法,因为fileURL 确实…

邮件接口代码案例中的SMTP服务器配置详解!

邮件接口代码案例的编写技巧?如何集成邮件服务API? 对于开发者来说,邮件接口代码案例提供了丰富的参考和实践机会,其中SMTP服务器配置是不可或缺的一环。AoKSend将详细讲解如何配置SMTP服务器,并解析其中的重要参数和…