【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.5.移除快照

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;

3.3.3.4.必须同一会话中完成 

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

3.4.从快照中恢复

[root@localhost centos]# mount -o ro,nouuid /dev/datavg/mysql-snap /mnt/ //xfs -o ro,nouuid
[root@localhost centos]# mkdir -p /backup
[root@localhost centos]# tar -czf /backup/mysql_`date +%F`.tar.gz /var/lib/mysql/*

3.5.移除快照


[root@localhost centos]# umount /dev/datavg/mysql-snap
[root@localhost centos]# lvremove /dev/datavg/mysql-snap -f

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
else
    echo "备份过程中发生错误,未执行卸载和删除快照操作。"
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)来确认任务是否按时执行。此外,可以在计划执行时间之前手动执行一次脚本,以确保脚本没有错误,并能正确完成备份任务。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

jmeter之接口数据与数据库数据检验!

前言 本文讲解使用jmeter测试接口,然后与数据库里面的数据进行校验对比。本节使用一个新增数据的接口,新增一条数据,然后在数据库里面进行查询,是否能够查询到此条数据。 一、接口环境搭建 1.1 新建一个http请求,写…

ARM32开发-fat_fs文件系统

FAT_FS 文件系统 FAT (File Allocation Table) 文件系统是一种广泛使用的基于磁盘的文件系统,尤其适用于小型嵌入式系统和存储卡。FAT_FS 就是一个专门针对 FAT 文件系统的开源实现。 FAT_FS 的主要特点 轻量级和高度可移植: FAT_FS 是一个非常轻量级的文件系统实现,占用资源少…

html5 video去除边框

video的属性: autoplay 视频在就绪后自动播放。 controls 显示控件,比如播放按钮。 height 设置视频播放器的高度。 width 设置视频播放器的宽度。 loop 循环播放 muted 视频的音频输出静音。 poster 视频加载时显示的图像,或者在用户点击播…

虚拟机的NAT模式连不上互联网

标题 虚拟机的NAT模式连不上互联网相关设备情况。我遇到了啥问题解决办法最后说一句 虚拟机的NAT模式连不上互联网 今天遇到了一个网络连接问题,是关于虚拟机的NAT模式上网的。 相关设备情况。 虚拟机上用到操作系统是centos7。宿主机的操作系统是windows10。虚拟…

mac14.1.2 M1芯片终端使用brew命令提示“zsh- command not found- brew ”解决方案

mac14.1.2 M1芯片终端使用brew命令提示“zsh- command not found- brew ” 原因:brew默认安装目录在/opt/homebrew/bin,zshrc文件中找不到对应的PATH路径导致。(可通过右键finder的图标选择「前往文件”-输入/opt/homebrew/bin」来查看brew是…

防火墙双双机热备

设备直路部署,上下行连接交换机 如 图所示,DeviceA和DeviceB的业务接口都工作在三层,上下行分别连接二层交换机。上行交换机连接运营商的接入点,运营商为企业分配的IP地址为1.1.1.3和1.1.1.4。现在希望DeviceA和DeviceB以负载分担…

nodejs安装(2024最最最最新版)

node官网 Index of /dist/https://nodejs.org/dist/ 选择版本 我比较喜欢16.20.1或者是14.16.1,这两个版本简直天下无敌了 下一步 选择这个,下载下来一个文件 一直点击下一步,就安装成功了 可能遇见的问题 1.安装了node,为什么不生效还是以前自己电脑安装的版本? 答: 可…

vue2中的组件自定义事件

1.绑定事件: <组件 :自定义名称"方法" /> 2.调用 this.$emit(方法,参数) 3.关闭 this.$off(方法) 案例: 1.提前准备好组件 Student组件 <template><div class"student"><h1>学校名称:{{ st…

Golang 百题(实战快速掌握语法)_2

返回集合中满足指定条件的最后一个元素 本实验将实现判断给定集合中的元素是否符合&#xff0c;并返回符合的最后一个元素。 知识点 forfmt.Error 适合人群 本课程属于基础课程。需要用户掌握 Go 语言编程基础知识、计算机基础知识和 Linux 环境的基本用法。 许可证 内容…

windows安装nvm

文章目录 前言一、NVM下载方式一&#xff1a;官网下载方式二&#xff1a;GitHub 下载 二、NVM安装三、Node安装四、配置 NVM 和 NodeJS4.1. 环境变量配置4.2 配置node_global和node_cache 前言 NVM&#xff08;Node Version Manager&#xff09;是一个命令行工具&#xff0c;用…

Redis队列自研组件

背景 年初的时候设计实践过一个课题&#xff1a;SpringBootRedis实现不重复消费的队列&#xff0c;并用它开发了一个年夜饭下单和制作的服务。不知道大家还有没有印象。完成这个课题后&#xff0c;我兴致勃勃的把它运用到了项目里面&#xff0c;可谁曾想&#xff0c;运行不久后…

phpMyAdmin 4.0.10 文件包含 -> getshell

phpMyAdmin 4.0.10 文件包含 -> getshell 前言&#xff1a;这里这个漏洞相对来说审计起来不是特别难&#xff0c;但是对于初学者还是有点挑战性的&#xff0c;从zkaq web课过来的小伙伴想挑战一下自己代码审计能力的话&#xff0c;可以直接跳到最后下载源码&#xff0c;聂风…

【总结】在SpringBoot项目中如何动态切换数据源、数据库?(可直接CV)

注意&#xff1a;文章若有错误的地方&#xff0c;欢迎评论区里面指正 &#x1f36d; 前言 本文参考若依源码&#xff0c;介绍了如何在SpringBoot项目中使用AOP和自定义注解实现MySQL主从数据库的动态切换&#xff0c;当从库故障时&#xff0c;能自动切换到主库&#xff0c;确…

手写SpringMVC之ApplicationContextListener

什么是Spring MVC&#xff1f; Spring Web MVC是基于Servlet API构建的原始Web框架&#xff0c;从一开始就包含在Spring Framework中。正式名称“Spring Web MVC”来自其源模块的名称&#xff08; spring-webmvc &#xff09;&#xff0c;但它通常被称为“Spring MVC”。 手写…

SD-WAN解决多云环境的挑战

随着SD-WAN成为远程用户访问基于云的应用程序的主要途径&#xff0c;促使越来越多的部署多云环境以优化性能的企业、IT专业人员选择支持安全、低延迟且易于管理的SD-WAN技术。与此同时&#xff0c;SD-WAN供应商和云服务供应商之间的合作&#xff0c;有助于跨多个云供应商轻松管…

分别使用netty和apache.plc4x测试读取modbus协议的设备信号

记录一下常见的工业协议数据读取方法 目录 前言Modbus协议说明Netty 读取测试使用plc4x 读取测试结束语 前言 Modbus 是一种通讯协议&#xff0c;用于在工业控制系统中进行数据通信和控制。Modbus 协议主要分为两种常用的变体&#xff1a;Modbus RTU 和 Modbus TCP/IP Modbus …

基于51单片机太阳能风能风光互补路灯控制器

一.硬件方案 本设计由STC89C52单片机电路太阳能电池板电路风机发电电路锂电池充电保护电路升压电路稳压电路光敏电阻电路4位高亮LED灯电路2档拨动开关电路电源电路设计而成。 二.设计功能 &#xff08;1&#xff09;采用风机和太阳能电池板给锂电池充电&#xff0c;具有充电…

微服务开发 —— 项目环境搭建篇

环境搭建 Linux 环境搭建 Linux 环境搭建大家可以使用虚拟机 VMware、VirtualBox 等应用创建虚拟机&#xff0c;使用Vagrant也可以快捷搭建虚拟环境&#xff1b;Windows 中有 WSL2&#xff0c;Windows 中的 Docker 也对 WSL 进行了支持&#xff0c;也是一个不错的选择。或者可…

麒麟系统安装Redis

一、背景 如前文&#xff08;《麒麟系统安装MySQL》&#xff09;所述。 二、下载Redis源码 官方未提供麒麟系统的Redis软件&#xff0c;须下载源码编译。 下载地址&#xff1a;https://redis.io/downloads 6.2.14版本源码下载地址&#xff1a;https://download.redis.io/re…

构建LangChain应用程序的示例代码:46、使用 Meta-Prompt 构建自我改进代理的 LangChain 实现

Meta-Prompt 实现 摘要&#xff1a; 本文介绍了 Noah Goodman 提出的 Meta-Prompt 方法的 LangChain 实现&#xff0c;该方法用于构建能够自我反思和改进的智能代理。 核心思想&#xff1a; Meta-Prompt 的核心思想是促使代理反思自己的性能&#xff0c;并修改自己的指令。…