MySQL之备份与恢复(六)

备份与恢复

文件系统快照

先决条件和配置

创建一个快照的消耗几乎微不足道,但还是需要确保系统配置可以让你获取在备份瞬间的所有需要的文件的一致性副本。首先,确保系统满足下面这些条件。

  • 1.所有的InnoDB文件(InnoDB的表空间文件和InnoDB的事务日志)必须时在单个逻辑卷(分区)。你需要绝对的时间点一致性,LVM不能为多于一个卷做某个时间点一致的快照。(这是LVM的一个限制;其他一些系统没有这个问题)
  • 2.如果需要备份表定义,MySQL数据目录必须在相同的逻辑卷中。如果使用另外一种方法来备份表的帝国一,例如只备份Schema到版本控制系统中,就不需要担心这个问题
  • 3.必须在卷组中有足够的空闲空间来创建快照。需要多少取决于负载。当配置系统时,应该留一些未分配的空间以便后面做快照。

LVM有卷组的概念,它包含一个或多个逻辑卷。可以按照如下的方式查看系统中的卷组:

vgs
VG:vg
#PV:1
#LV:4
#SN:0
Attr:wz--n-
VSize:534.18G
VFree:249.18G

输出显示了一个分布在一个物理卷上的卷组,它有四个逻辑卷,大概有250GB空间空闲。入股哦需要,可用vgdisplay命令产生更详细的输出。现在让我们看下系统上的逻辑卷

lvs
LV:home
VG:vg
Attr:-wi-ao
LSize:40.00G
Origin Snap%:
Move Log Copy%:LV:mysql
VG:vg
Attr:-wi-ao
LSize:225.00G
Origin Snap%:
Move Log Copy%:LV:tmp
VG:vg
Attr:-wi-ao
LSize:10.00G
Origin Snap%:
Move Log Copy%:LV:var
VG:vg
Attr:-wi-ao
LSize:10.00G
Origin Snap%:
Move Log Copy%:

创建、挂载和删除LVM快照

一条命令就能创建快照。只需要决定快照存放的未知和分配给写时复制的空间大小即可。不要纠结于是否适用比想象中的需求更多的空间。LVM不会马上使用完所有指定的空格键,只是为后续适用预留而已。因此多预留一点空间并没有坏处,除非你必须同时为其他快照预留空间。让我们来练习创建一个快照。我们给它16GB的写时复制空间,名字为backup_mysql.

lvcreate --size 16G --snapshot --name backup_mysql /dev/vg/mysq

这里特意命名为backup_mysql卷而不是mysql_backup,是为了避免Tab键自动补全造成误会。这有助于避免因为Tab键自动补全导致突然误删除mysql卷组的可能。我们可以适用lvs看看新创建的卷的状态。快照的属性与原设备不同,而且该输出还显示了一点额外的信息:原始卷组和分配了16GB的写时复制空间目前已经使用了多少。备份对此进行监控是个非常好的主意,可以知道是否会因为设备写满而备份失败。可以交互地监控设备的状态,或使用诸如Nagios这样的监控系统。

wathc 'lvs | grep backup'

从前面mount的输出可以看到,mysql卷包含一个文件系统。这意味着快照也同样如此,可以像其他文件系统一样挂载。

mkdir /tmp/backup
mount /dev/mapper/vg-backup_mysql /tmp/backup
ls -l /tmp/backup/mysql

这里只是为了联系,因此我们卸载这个快照并用lvremove命令将其删除

umount /tmp/backup
rmdir /tmp/backup
lvremove --force /dev/vg/backup_mysql

用于在线备份的LVM快照

在这里插入图片描述

现在已经知道如何创建、加载和删除快照,可以使用它们来进行备份了。首先看一下如何在不停止MySQL服务的情况下备份InnoDB数据库,这里需要使用一个全局的读锁。连接MySQL服务器并使用一个全局读锁将表刷到磁盘上,然后获取二进制日志的位置:

mysql>FLUSH TABLES WITH READ LOCK; SHOW MASTER STATUS;

记录SHOW MASTER STATUS的输出,确保到MySQL的连接处于打开状态,以使读锁不被释放。然后获取LVM的快照并立刻释放该读锁,可以使用UNLOCK TABLES或直接关闭连接来释放锁。最后,加载快照并赋值文件到备份位置。这种方法最主要的问题是,获取读锁可能需要一点时间,特别时当有许多长时间运行的查询时。当连接等待全局读锁时,所有的查询都将被阻塞,并且不可预测这会持续多久。

文件系统快照和InnoDB

即使锁住所有的表,InnoDB的后台线程仍会继续工作,因此,即使在创建快照时,仍然可以往文件中写入。并且,由于InnoDB没有执行关闭操作。如果服务器意外断电,快照中InnoDB的文件会和服务器意外掉电后文件的遭遇一样。这不是什么问题,因为InnoDB是个ACID系统。任何时刻(例如快照时),每隔提交的事务要么在InnoDB数据文件中要么在日志文件中。在还原快照后启动MySQL时,InnoDB将运行恢复进程,就像服务器断过电一样。它会查找事务日志中任何提交但没有应用到数据文件中的事务然后应用,因此不会丢失任何事务。这正是要强制InnoDB数据文件和日志文件在一起快照的原因。这也是在备份后需要测试的原因。启动一个MySQL实例,把它指向一个新备份,让InnoDB执行崩溃恢复过程,然后检测所有的表。通过这种方法,就不会备份损坏了却还不知道(文件可能由于任何原因损坏)。这么做的另外一个好处是,维拉i需要从备份中还原时会更快,因为已经在备份上运行过一遍恢复程序了。甚至还可以在将快照复制到备份目的地之前,直接在快照上做上面的操作,但增加一点点额外开销。所以需要确保这是计划内的操作

使用LVM快照无所InnoDB备份

在这里插入图片描述

无锁备份只有一点不同。区别是不需要执行FLUSH TABLES WITH READ LOCK.这意味着不能保证MyISAM文件在磁盘上一致,如果只使用InnoDB,这就不是问题。mysql系统数据库中依然有部分MyISAM表,但如果是典型的工作负载,在快照时这些表不太可能发生改变。如果你认为mysql系统表可能会变更,那么可以锁住并刷新这些表。一般不会对这些表有长时间运行的查询,所以通常会很快:

mysql> LOCK TABLES mysql.user READ, mysql.db READ;
mysql> FLUSH TABLES mysql.user, mysql.db;

由于没有用全局读锁,因此不会从SHOW MASTER STATUS 中获取到任何有用的信息。尽管如此,基于快照启动MySQL(来验证备份的完整性)时,也将会在日志文件中看到像下面的内容:

InnoDB: Doing recovery: scanned up to log sequence number 0 40817239
InnoDB: Starting an apply batch of log records to the database...
InnoDB:Progress in percents: 3 4 5 6 ..  [omitted] ... 97 98 99
InnoDB:Apply batch completed
InnoDB:Last MySQL binlog file position 0 3304937,file name /var/log/mysql/mysql-bin.000001
070928 14:08:42 InnoDB:Started; log sequence number 0 40817239

InnoDB记录了MySQL已经恢复得时间点对应的二进制日志位置,这个二进制日志位置可以用来做基于时间点的恢复。使用快照进行无锁备份的方法在MySQL5.0或更新版本中有变动。这些MySQL版本使用XA来协调InnoDB和二进制日志。如果还原到一个与备份时server_id不同的服务器,服务器在准备事务阶段可能发现这是从另外一个与自己不同ID的服务器来的。在这种情况下,服务器会变得困惑,恢复事务时可能会卡在PREPARED状态。这种情况很少发生,但是存在可能性。这也是只有经过验证才可以说备份成功的原因。有些备份也许是不能恢复的。如果时在备库上获取快照,InnoDB恢复时还会打印如下几行日志:

InnoDB:In a MySQL replica the last master binlog file
InnoDB:position 0 115, file name mysql-bin.001717

输出显示了InnoDB已经恢复了基于主库的二进制位置(相对于备库二进制日志位置),这对基于备库备份或基于其他备库克隆备库来说非常有用

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

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

相关文章

C++学习第十三天——stack/queue的使用及底层剖析双端队列容器适配器

✨ 少年的旅途应是星辰大海 🌏 📃个人主页:island1314 🔥个人专栏:C学习 🚀 欢迎关注:👍点赞 👂&am…

学会python——用python制作一个绘图板(python实例十九)

目录 1.认识Python 2.环境与工具 2.1 python环境 2.2 Visual Studio Code编译 3.制作一个绘图板 3.1 代码构思 3.2 代码实例 3.3 运行结果 4.总结 1.认识Python Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的可…

昇思25天学习打卡营第12天| 基于MindNLP+MusicGen生成自己的个性化音乐

之前都是看图文类的东西,今天体验一点不一样的。来点听力的内容。 mindspore有音乐生成模型MusicGen,MusicGen支持两种生成模式:贪心(greedy)和采样(sampling)。在实际执行过程中,采…

京东金融大数据分析平台总体架构:剖析和解读

京东金融大数据分析平台总体架构:剖析和解读 在现代金融行业中,大数据分析已成为决策支持和业务创新的重要工具。京东金融凭借其强大的大数据分析平台,成功地将海量数据转化为洞察力,为企业和用户提供优质服务。本文将深入探讨京…

代码随想录训练营第二十九天 134加油站 135分发糖果 860柠檬水找零 406根据身高重建队列

第一题: 原题链接:134. 加油站 - 力扣(LeetCode) 思路: 需要三个变量,一个变量start记录结果也就是出发的第一个加油站,一个变量curSum来记录此时加油耗油后剩余的油量,如果发现c…

微前端的需求有哪些?微前端的原理是怎么样的?为什么这么设计,及微前端的应用场景是什么?对有些客户,前端的重要性高于后端

微前端(Micro Frontends)是将前端应用拆分成多个独立、可部署的部分,每个部分可以由不同的团队独立开发、测试、部署和维护。这种架构类似于微服务在后端的应用,是为了应对复杂前端应用的维护和扩展问题而提出的。 来龙去脉 背景…

【吴恩达机器学习-week2】可选实验:使用 Scikit-Learn 进行线性回归

支持我的工作 🎉 📃亲爱的朋友们,感谢你们一直以来对我的关注和支持! 💪🏻 为了提供更优质的内容和更有趣的创作,我付出了大量的时间和精力。如果你觉得我的内容对你有帮助或带来了欢乐&#xf…

库表设计(基础)-实体与设计关系

实体关系分析 1 实体关系是指系统事务之间的联系。 2 实体关系需要双向分析。 3 实体关系决定表关系。 实体关系的种类 1 一对一 2 一对多 3 多对多 举例: 上面关系如下: 班级和学生 : 1:N 学生和课程:N : N 学生和学籍档案&a…

MISRA C 和MISRA C++:汽车软件安全的守护者

一、MISRA C与C语言 自1972年Dennis MacAlistair Ritchie在美国贝尔实验室创造C语言以来,它已成为当今最流行的编程语言之一。C语言以其使用的灵活性、功能的丰富性而广受欢迎,但同时也因其宽松的语法和不严格的数据类型给开发的产品带来了安全隐患。 …

如何批量给文件名添加编号?这个方法速度快!操作简单!

如何批量给文件名添加编号?这个方法速度快!操作简单!批量给文件重命名,这个是在工作中和生活中经常要用到的一个小技巧,许多人还不知道怎么操作,当然如果要按一定的格式和规律重命名大量的文件,…

Linux内核 -- 多核通信之RPMSG驱动使用

Linux Kernel RPMsg 驱动注册流程的高级用法与注意事项 在Linux Kernel中,RPMsg(Remote Processor Messaging)是一种用于不同处理器之间通信的机制,通常用于多核系统中的通信,如主处理器和协处理器之间的消息传递。了…

巴西电子游戏PWA借助海外快手kwai社交广告出海趋势解读

巴西电子游戏PWA借助海外快手kwai社交广告出海趋势解读 在数字化时代的浪潮中,电子游戏行业蓬勃发展,而广告投放策略也随之日新月异。特别是在巴西这样一个充满活力的市场,电子游戏的普及与流行程度不容小觑。在这样的背景下,在数…

java数据结构集合复习之ArrayList与顺序表

前言: 这是我最一年学习java的一部分的回顾总结 1.List 1.1什么是List? 在框架集合中,List是一个接口,继承自Collection。 Collection也是一个接口,该接口中规范了后序容器中常用的一些方法,具体如下所示 --------boolean add(E e)尾插 evoid a…

[pwn]静态编译

静态编译 1. 栈足够大的情况下 程序在ida打开后,左侧的函数栏目没有红色(系统调用的函数),而只有一些静态函数,通常这类文件的大小会必普通的pwn题程序要大得多。 这种静态编译的题没有调用库函数,也就没…

百度云智能媒体内容分析一体机(MCA)建设

导读 :本文主要介绍了百度智能云MCA产品的概念和应用。 媒体信息海量且复杂,采用人工的方式对视频进行分析处理,面临着效率低、成本高的困难。于是,MCA应运而生。它基于百度自研的视觉AI、ASR、NLP技术,为用户提供音视…

Vue 性能革命:揭秘前端优化的终极技巧;Vue优化技巧,解决Vue项目卡顿问题

目录 Vue优化路径 一、使用key 二、使用冻结对象 三、使用函数式组件 四、使用计算属性 五、使用非实时绑定的表单项 六、保持对象引用稳定 6.1、保持对象引用稳定定义 6.2、保持对象引用稳定与不稳定的例子 6.3、vue2判断数据是否变化是通过hasChanged函数实现的 ①…

2024年【四川省安全员B证】考试及四川省安全员B证考试题

题库来源:安全生产模拟考试一点通公众号小程序 2024年【四川省安全员B证】考试及四川省安全员B证考试题,包含四川省安全员B证考试答案和解析及四川省安全员B证考试题练习。安全生产模拟考试一点通结合国家四川省安全员B证考试最新大纲及四川省安全员B证…

golang项目中gorm框架的配置和具体使用

最近在改造golang项目,从postgre数据库迁移到达梦数据库,我还想在改造后的项目使用 gorm 操作数据库,保持较小的改动。查找了不少资料,最终从以下两篇文章中借鉴了不少 1、Gorm 入门介绍与基本使用 这篇知乎文章详细介绍了 gorm 框…

C语言 -- 操作符详解​

C语言 -- 操作符详解​ 1. 操作符的分类2. 二进制和进制转换​2.1 2进制转10进制​2.1.1 10进制转2进制数字​ 2.2 2进制转8进制和16进制​2.2.1 2进制转8进制​2.2.2 2进制转16进制​ 3. 原码、反码、补码​4. 移位操作符​4.1 左移操作符​ 4.2 右移操作符​5. 位操作符&…

Symfony实战手册:PHP框架的高级应用技巧

引言 Symfony是一个功能强大且广泛应用于PHP应用程序开发的框架,它提供了许多高级特性和工具,可以帮助开发人员更高效地构建和管理复杂的Web应用程序。以下是Symfony框架的几个关键方面及其高级应用技巧: 1. 路由和控制器 Symfony的路由组…