【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算法的安全帽佩戴检测技术,该技术旨在实现…

Kotlin/Android中执行HTTP请求

如何在Kotlin/Android中执行简单的HTTP请求

Spring Boot 使用 Mail 实现登录邮箱验证

Spring Boot 使用 Mail 实现登录邮箱验证 引言 在现代的 Web 应用中,用户验证是一个至关重要的功能。电子邮件验证可以有效地防止虚假注册,并确保用户提供的是有效的邮箱地址。在这篇文章中,我们将详细介绍如何使用 Spring Boot 实现用户注…

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主机通过改…

AI技术在现代社会中的广泛应用及其影响

目录 前言: 一、AI技术在医疗领域的应用 二、AI技术在教育领域的应用 三、AI技术在工业领域的应用 四、AI技术在金融领域的应用 五、AI技术在生活领域的应用 前言: 随着科技的不断发展,人工智能(AI)技术逐渐成为人…

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

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

iOS Swift5 视频播放 能播放各种编码格式的视频的第三方库

1.VLC for ios: MobileVLCKit VLC for ios - github 2.IJKPlayer: IJKMediaFramework 基于 FFmpeg IJKPlayer - github

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

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

vue3 el-table手动选中某一行、设置默认选中某一行

选中某一行用的是el-table的toggleRowSelection方法&#xff0c;用来切换某一行的选中状态 <template><el-table :data"tableData" ref"myTable" selection-change"handleSelectionChange"><el-table-column type"selectio…

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

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

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

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

YAML文件格式详解及应用

YAML文件格式详解及应用 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 什么是YAML&#xff1f; YAML&#xff08;YAML Ain’t Markup Language&#xff09;…

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

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

悲观锁、乐观锁与分布式锁详解及Redisson应用

目录 1. 悲观锁&#xff08;Pessimistic Lock&#xff09;2. 乐观锁&#xff08;Optimistic Lock&#xff09;3. Redis分布式锁4. Redisson锁 在多线程或多进程环境下&#xff0c;为了保证数据的一致性&#xff0c;锁机制扮演着至关重要的角色。本文将深入探讨悲观锁、乐观锁的…

使用Python进行数据分析

哈喽,大家好,我是木头左! 14.1 Python在数据分析中的优势 Python作为一种简单易学、功能强大的编程语言,已经成为了数据分析领域的首选工具。它的优势主要体现在以下几个方面: 简洁高效:Python语法简洁明了,易于阅读和编写,能够快速实现复杂的数据分析任务。丰富的库支…

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

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

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

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