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已经恢复了基于主库的二进制位置(相对于备库二进制日志位置),这对基于备库备份或基于其他备库克隆备库来说非常有用

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

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

相关文章

python语句前面有一个$是什么意思

“$”是汇编语言中的一个预定义符号,等价于当前正汇编到的段的当前偏移值。例如:指令“jmp $3”中的“$”表示当前这条指令在代码段中的偏移量。 代表当前指令的地址,如: data segment str1 db a,b,c,d leng equ $-str 就是当前地…

CompletableFuture工具类使用

CompletableFuture工具类可以帮助实现Java并发编程中的任务编排 以上除了join用于阻塞调用该发放的线程并且接受CompletableFuture的返回值以外其它方法皆有Async异步和Executor指定线程池选项 对于supply,run,apply,accept的区别在于函数式编程的接口类型不同: supply: Sup…

Linux配置固定ip地址

虚拟机的Linux操作系统,其IP地址是通过DHCP服务获取的 DHCP:动态获取IP地址,即每次重启设备后都会获取一次,可能导致IP地址频繁变更。 一般系统默认的ip地址设置都是自动获取,故每次系统重启后ip地址都可能会不一样&a…

PEFT - 安装及简单使用

LLM、AIGC、RAG 开发交流裙:377891973 文章目录 一、关于 PEFT二、安装1、使用 PyPI 安装2、使用源码安装 三、快速开始1、训练2、保存模型3、推理4、后续步骤 本文翻译整理自:https://huggingface.co/docs/peft/index 一、关于 PEFT 🤗PEFT…

前端基础:JavaScript(篇一)

目录 JavaScript概述 JavaScript历史: 须知: 基本语法 变量 代码 运行 数据类型 1、数值型(number): 代码 运行 2、布尔型(boolean): 代码 运行 3、字符串型: 代码 运行 4、 undefined类型 代码…

Vue 邮箱登录界面

功能 模拟了纯前端的邮箱登录逻辑 还没有连接后端的发送邮件的服务 后续计划,再做一个邮箱、密码登录的界面 然后把这两个一块连接上后端 技术介绍 主要介绍绘制图形人机验证乃个 使用的是canvas,在源码里就有 界面控制主要就是用 表格、表单&#x…

Cookie的默认存储路径以及后端如何设置

问题场景 最近在写一个前后端分离的项目,需要跨域,前端开发同学遇到一个问题一直报错,本质上就是后端返回的cookie中的sessionID在前端发送http请求时无法被请求自动携带,每次htttpRequest都被后端识别为一个新的session&#xf…

Java传引用问题

本文将介绍 Java 中的引用传递,包括其定义、实现方式、通过引用修改原来指向的内容和通过引用修改当前引用的指向的区别 目录 1、引用传递的概念 2、引用传递的实现方式 3、传引用会发生的两种情况: 通过引用修改当前引用的指向 通过引用修改原来指…

IDEA 编译单个Java文件

文章目录 一、class文件的生成位置二、编译单个文件编译项目报错Error:java: 无效的源发行版: 8 一、class文件的生成位置 file->project structure->Modules 二、编译单个文件 选中文件,点击recompile 编译项目报错 Error:java: 无效的源发行版: 8 Fi…

谈大语言模型动态思维流程编排

尽管大语言模型已经呈现出了强大的威力,但是如何让它完美地完成一个大的问题,仍然是一个巨大的挑战。 需要精心地给予大模型许多的提示(Prompt)。对于一个复杂的应用场景,编写一套完整的,准确无误的提示&am…

【技术支持】console控制台输出美化(腾讯文档)

function style(color, size 12){return display:inline-block;background-color:${color};color:#fff;padding:2px 4px;font-size:${size}px; } const dataVersion 3.0.0 const codeVersion 3.0.28657969 const branchVersion release-20240617-f98487dc //注意此处%c后面…

Amesim应用篇-信号传递

前言 在Amesim中常见的信号传递是通过信号线连接,针对简单的模型通过信号线连接还可以是信号线清晰规整,方便查看。如果模型较复杂,传递信号的元件较多时,此时再继续使用信号线进行信号传递,可能会使草图界面看起来杂…

vxe-table合并行数据;element-plus的el-table动态合并行

文章目录 一、vxe-table合并行数据1.代码 二、使用element-plus的el-table动态合并行2.代码 注意&#xff1a;const fields 是要合并的字段 一、vxe-table合并行数据 1.代码 <vxe-tableborderresizableheight"500":scroll-y"{enabled: false}":span-m…

ASUS/华硕枪神4 G532L G732L系列 原厂win10系统 工厂文件 带F12 ASUS Recovery恢复

华硕工厂文件恢复系统 &#xff0c;安装结束后带隐藏分区&#xff0c;一键恢复&#xff0c;以及机器所有驱动软件。 系统版本&#xff1a;Windows10 原厂系统下载网址&#xff1a;http://www.bioxt.cn 需准备一个20G以上u盘进行恢复 请注意&#xff1a;仅支持以上型号专用…

【HALCON】如何实现hw窗口自适应相机拍照成像的大小

前言 在开发一个喷码检测软件的时候碰到相机成像和hw窗体的大小不一致&#xff0c;hw太小显示不完全成像的图片&#xff0c;这使得成像不均匀&#xff0c;现场辨别起来比较不直观&#xff0c;因此需要对其进行一个调整。 解决 省略掉读取图片的环节&#xff0c;我们只需要将…

BSI 第七届万物互联智慧高峰论坛:主题:拥抱AI时代,标准赋能组织实现可持续发展

BSI 第七届万物互联智慧高峰论坛&#xff1a;主题&#xff1a;拥抱AI时代&#xff0c;标准赋能组织实现可持续发展 主要收到 BSI 温女士的邀请参加的本次论坛。还是学到的很多 。 在科技日新月异的时代背景下&#xff0c;BSI 第七届万物互联智慧高峰论坛于[时间&#xff1a;6…

mac安装docker

1、首先打开docker官网 https://docs.docker.com/engine/install/ 2、下载好后安装到app应用 3、安装好环境变量 #docker echo export PATH"/usr/local/Cellar/docker/20.10.11/bin:$PATH" >> .bash_profile

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

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

不错的用户需求访谈方法

不错的用户需求访谈方法&#xff0c;可以用如下的矩阵&#xff0c;用来引导用户访谈&#xff1a;

vue实现搜索文章关键字,滑到指定位置并且高亮

1、输入搜索条件&#xff0c;点击搜索按钮 2、滑到定位到指定的搜索条件。 <template><div><div class"search_form"><el-inputv-model"searchVal"placeholder"请输入关键字查询"clearablesize"small"style&quo…