MySQL之复制(九)

news2024/11/28 16:48:00

复制

复制管理和维护

确定主备是否一致

在理想情况下,备库和主库的数据应该是完全一样的。但事实上备库可能发生错误并导致数据不一致。即使没有明显的错误,备库同样可能因为MySQL自身的特性导致数据不一致,例如MySQL的Bug、网络中断、服务器崩溃,非正常关闭或者其他一些错误。(如果你正在使用非事务型存储引擎,不首先调用STOP SLAVE就关闭服务器是很不妥当的)。
按照经验来看,主备一致应该是一种规范,而不是例外,也就是说,检查你的主备一致性应该是一个日常工作,特别是当使用备库来做备份时尤为重要,因为你肯定不希望从一个已经损坏的备库里获得备份数据。MySQL并没有内建的方法来比较一台服务器与别的服务器的数据是否相同。它提供了一些组建来为表和数据生成校验值,例如CHECKSUM TABLE。但当复制正在进行时,这种方法是不可行的。
Percona Toolkit里的pt-table-checksum能够解决上述几个问题。其主要特性是用于确认备库与主库的数据是否一致。工作方式是通过在主库执行INSERT …SELECT查询。这些查询对数据进行校验并将结果插入到一个表中。这些语句通过复制传递到备库,并在备库执行一遍,然后可以比较主备上的结果是否一样。由于该方法是通过复制工作的。它能够给出一致的结果而无须同时把主备上的表都锁上。
通常情况下可以在主库上运行该工具,参数如下:

$ pt-table-checksum  --replicate=test.checksum <master_host>

该命令将检查所有的表,并将结果插入到test.checksum表中。当查询在备库执行完后,就可以简单地比较主备之间的不同了。pt-table-checksum能够发现服务器所有的备库,在每台备库上运行查询,并自动地输出结果。

从主库重新同步备库

在职业生涯中,也许会不止一次需要去处理未被同步的备库。可能是使用校验工具发现了数据不一致,或是因为已经知道是备库忽略了某条查询或者有人在备库上修改了数据。传统的修复不一致的办法是关闭备库,然后重新从主库复制一份数据。当备库数据不一致的问题可能导致严重后果时,一旦发现就应该将备库停止并从生产环境移除,然后再从一个备份中克隆或恢复备库。
这种方法的缺点是不太方便,特别是数据量很大时。如果能够找出并修复不一致的数据,要比从其他服务器上重新克隆数据要有效得多。如果发现的不一致并不严重,就可以保持备库在线,并重新同步受影响的数据。最简单的办法是使用mysqldump转储受影响的数据并重新导入。在整个过程中,如果数据没有发生变化,这种方法会很好。你可以在主库上简单地锁住表然后进行转储,再等备库赶上主库,然后将数据导入到备库中。(需要等待备库赶上主库,这样就不至于为其他表引入新的不一致,例如那些可能通过和失去同步的表做join后进行数据更新的表)。
虽然这种方法再许多场景下是可行的。但在一个繁忙的服务器上有可能行不通。另外一个缺点是在备库上通过非复制的方式改变数据。通过复制改变备库数据(通过在主库上执行更新)通常是一种安全的技术,因为它避免了竞争条件和其他意料外的事情。如果表很大或者网络带宽首先,转储和重载数据的代价依然很高。当在一个有一百万行的表上只有一千行不同的数据呢?转储和重载表的数据是非常浪费资源的。
pt-table-sync是Percona Toolkit中的另外一个工具,可以解决该问题。该工具能够高效地查找并解决表之间的不同。它同样通过复制工作,在主库上执行查询,在备库上重新同步,这样就没有竞争条件。它是结合pt-table-checksum生成的checksum表来工作的。所以只能操作那些已知不同步的表的数据块。但该工具不是在所有场景下都有效。为了正确地同步主库和备库,该工具要求复制是正常地,否则就无法工作。pt-table-sync设计得很搞笑,但当数据量非常大时效率还是会很低。比较主库和备库上1TB的数据不可避免地会带来额外的工作。尽管如此,在那些合适的场景中,该工具依然能节约大量的时间和工作

改变主库

迟早会有把备库指向一个新的主库的需求。也许是为了更迭升级服务器,或者是主库出现问题时需要把一台备库转换成主库,或者只是希望重新分配容量。不管处于什么原因,都需要告诉其他的备库新主库的信息。如果这是计划内的操作,会比较容易(至少比紧急情况下要容易)。只需在备库简单地使用CHNAGE MASTER TO命令,并指定合适的值。大多数值都是可选的。只需要指定需要改变的项即可。备库将抛弃之前的配置和中继日志并从新的主库开始复制。同样新的参数会被更新到master.info文件中,这样就算重启,备库配置信息也不会丢失。
整个过程中最难的是获取新主库上合适的二进制日志文职,这样备库才可以从和老主库相同的逻辑位置开始复制。把备库提升为主库要更困难一点。有两种场景需要将备库替换为主库,一种是计划内的提升,一种是计划外的提升。

计划内的提升

把备库提升为主库理论上是很简单的。简单来说,有以下步骤:

  • 1.停止向老的主库ieru
  • 2.让备库追赶上主库(可选的,会简化下面的步骤)
  • 3.将一台备库配置为新的主库
  • 4.将备库和写操作指向新的主库,然后开启主库的写入

但这其中还隐藏着很多细节。一些场景可能依赖于复制的拓扑结构。例如,主-主结构和主-备结构的配置就有所不同。
更深入一点,下面是大多数配置需要的步骤:

  • 1.停止当前主库上的所有写操作。如果可以,最好能将所有的客户端程序关闭(除了复制连接)。为客户端程序建立一个"do not run"这样的类似标记可能会有所帮助。如果正在使用虚拟IP地址,也可以简单地关闭虚拟IP,然后断开所有地客户端连接以关闭其打开地事务
  • 2.通过FLUSH TABLES WITH READ LOCK在主库上停止所有活跃的写入,这一步是可选的。也可以在主库上设置read_only选项。从这一刻开始,应该禁止向即将备替换的主库做任何写入。因为一旦它不是主库,写入就意味着数据丢失。注意,即使设置read_only也不会阻止当前已存在的事务继续提交。为了更好地保证这一点,可以"kill"所有打开的事务,这将会真正地结束所有写入
  • 3.选择一个备库作为新的主库,并确保它已经完全跟上主库(例如,让他执行完所有从主库获得的中继日志)
  • 4.确保新主库和旧主库的数据是已知的。可选
  • 5.在新主库上执行STOP SLAVE
  • 6.在新主库上执行CHANGE MASTER TO MASTER_HOST=‘’,然后再执行RESET SLAVE,使其断开与老主库的连接,并丢弃master.info里记录的信息(如果连接信息记录在my.cnf里,会无法正确工作,这也是建议不要把复制连接信息写到配置文件里的原因之一)
  • 7.执行SHOW MASTER STATUS记录新主库的二进制日志坐标
  • 8.确保其他备库已经追赶上
  • 9.关闭旧主库
  • 10.在MySQL5.1及以上版本中,如果需要,激活新主库上事件
  • 11.将客户端连接到新主库
  • 12.在每台备库上执行CHANGE MASTER TO语句,使用之前通过SHOW MASTER STATUS获得的二进制日志坐标,来指向新的主库。

当将备库提升为主库时,要确保备库上任何特有的数据库、表和权限已经备移除。可能还需要修改备库特有的配置选项,例如innodb_flush_log_at_trx_commit选项,同样的,如果是把主库降级为备库,也要保证需要的配置。如果主备的配置相同,就不需要做任何改变。

计划外的提升

在这里插入图片描述
在这里插入图片描述

当主库崩溃时,需要提升一台备库来代替它,这个过程可能就不太容易。如果只有一台备库,可以直接使用这台备库。但如果有超过一台的备库,就需要做一些额外的工作。另外,还有潜在的丢失复制事件的问题。可能有主库上已经发生了修改还没有更新到它的任何一台备库上的情况。甚至还可能一条语句在主库上执行了回滚,但在备库上没有回滚,这样备库可能超过主库的逻辑复制位置(这是有可能的,即使MySQL在事务提交前并不记录任何事件。另外一种场景是主库崩溃后恢复,但没有设置innnodb_flush_log_at_trx_commit的值为1,所以可能会丢失一些更新)。如果能在某一点恢复主库的数据,也许就可以取得丢失的语句并手动执行它们。在以下的步骤中,需要确保在计算中使用Master_Log_File和Read_Master_Log_Pos的值。以下是对主备拓扑结构中的备库进行提升的过程:

  • 1.确定哪台备库的数据最新。检查每台备库上的SHOW SLAVE STATUS命令的输出,选择其中Master_Log_File/read_Master_Log_Pos的值最新的那个。
  • 2.让所有哦备库执行完所有其从崩溃前的旧主库那获得的中继日志。如果在未完成前修改备库的主库,它会抛弃剩下的日志事件,从而无法获知该备库在什么地方停止
  • 3.执行前面的5~7步
  • 4.比较每台备库和新主库上的Master_Log_File/Read_Master_Log_Pos的值
  • 5.执行前面的10~12步

正如开始推荐的,假设已经在所有的备库上开启了log_bin和log_slave_updates,这样可以帮助你将所有的备库恢复到一个一致的时间点,如果没有开启这两个选项,则不能可靠地做到这一点。

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

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

相关文章

Spring之IoC(容器配置、Spring坐标导入、获取bean)

这里的话&#xff0c;因为博主学习时间有限&#xff0c;并没有实际去操作&#xff0c;只是学习和了解一个大概的流程。 目录 一、引言 1、管理什么&#xff1f;&#xff08;对象&#xff1a;Service、Dao ...&#xff09; 2、如何将被管理的对象告知 IoC 容器?&#xff08;用…

Android入门第70天-调用手机摄像头拍照的最全讲解

背景 涉及手机摄像头的应用太多了,有拍照、有摄像、有二维码、条码的扫描。还有AI领域的拍照识图。 无处不使用摄像头。 网上充斥着大多教程,无一例是可以把摄像头给真正驱动起来和完成一个高清拍照并取出照片进行后续处理的流程。这的确是一个不健康的现象。 本篇教程就是…

Springboot3.3 整合Cassandra 4.1.5

一、数据库搭建 -- 创建Keyspace CREATE KEYSPACE school WITH replication {class:SimpleStrategy, replication_factor : 1};-- 创建表 CREATE TABLE student(id int PRIMARY KEY, name text, age int, genders int, address text ,interest set<text>,phone lis…

qml/c++:基础界面的串口设置逻辑

文章目录 文章介绍效果图本机串口打开从虚拟端串口传数据到本机串口 代码添加serialporthandler类serialporthandler.hserialporthandler.cpp获取串口列表打开串口关闭串口清空按钮接收数据按钮逻辑&#xff1a;打开和关闭串口、弹出信息框、按钮文字改变 main.cpp 文章介绍 上…

快捷方式(lnk)--加载HTA-CS上线

免责声明:本文仅做技术交流与学习... 目录 CS: HTA文档 文件托管 借助mshta.exe突破 本地生成lnk快捷方式: 非系统图标路径不同问题: 关于lnk的上线问题: CS: HTA文档 配置监听器 有效载荷---->HTA文档--->选择监听器--->选择powershell模式----> 默认生成一…

大数据学习-Hive 函数

目录 Hive函数 Hive的内置函数 数学函数 取整函数: round 指定精度取整函数: round 向下取整函数: floor 向上取整函数: ceil 取随机数函数: rand 幂运算函数: pow 绝对值函数: abs 字符串函数 字符串长度函数&#xff1a;length 字符串反转函数&#xff1a;reverse 字…

zookeeper + kafka消息队列

zookeeper kafka 消息队列 一、消息队列简介 1、什么是消息队列 消息队列&#xff08;Message Queue&#xff09;是一种用于跨进程或分布式系统中传递消息的通信机制。消息队列在异步通信、系统解耦、负载均衡和容错方面具有重要作用。 &#xff08;1&#xff09;特性 异步…

解决Docker容器启动RabbitMQ报错:error pulling image configuration

解决Docker容器启动RabbitMQ报错&#xff1a;error pulling image configuration 问题原因是&#xff1a;Linux中系统时间跟真实时间相差太多导致。 解决办法就是让Linux的时间和网络时间同步就行了。 yum install -y ntpdate ntpdate 0.cn.pool.ntp.org

技术管理转型之战:决策之道-管理中的智慧与策略

文章目录 引言一、决策的重要性二、常见的决策方式1. 理性决策&#xff08;Rational Decision Making&#xff09;2. 有限理性&#xff08;Bounded Rationality&#xff09;3. 直觉决策&#xff08;Intuitive Decision Making&#xff09;4. 循证管理&#xff08;Evidence-Base…

编码规则UTF-8 和 UTF-16的区别

UTF-8 和 UTF-16 的设计背景与历史 为了更好地理解 UTF-8 和 UTF-16 的设计选择和背景&#xff0c;以下是两种编码方案的历史、设计动机和它们在计算机科学中的应用。 Unicode 的背景 在 Unicode 之前&#xff0c;不同的字符集和编码方案使得跨平台和国际化的文本处理变得复…

[网络安全产品]---EDR

写在前面 前端时间看抖音&#xff0c;刷到周鸿祎介绍360为什么这么厉害&#xff0c;他提到一点就是360是全球第一个提出云查杀概念的公司&#xff0c;相比较传统的基于病毒特征库终端杀毒&#xff0c;360依托积累的庞大的信息数据能有效应对APT攻击。 然后又特意找了一下云查…

高阶图神经网络 (HOGNN) 的概念、分类和比较

图神经网络&#xff08;GNNs&#xff09;是一类强大的深度学习&#xff08;DL&#xff09;模型&#xff0c;用于对相互连接的图数据集进行分类和回归。它们已被用于研究人类互动、分析蛋白质结构、设计化合物、发现药物、识别入侵机器、模拟单词之间的关系、寻找有效的交通路线…

oracle12c到19c adg搭建(五)dg搭建后进行切换19c进行数据字典升级

一、备库切主库升级 12c切换为19c主库的时候是由低版本到高版本所以cdb和pdb的数据字典需要进行升级才可以让数据与软件版本兼容。 1.1切换 SQL> alter database recover managed standby database finish; Database altered. SQL> alter database commit to switcho…

C语言 | Leetcode C语言题解之第164题最大间距

题目&#xff1a; 题解&#xff1a; int maximumGap(int* nums, int numsSize) {if (numsSize < 2) {return 0;}int maxVal INT_MIN, minVal INT_MAX;for (int i 0; i < numsSize; i) {maxVal fmax(maxVal, nums[i]);minVal fmin(minVal, nums[i]);}int d fmax(1,…

计算机网络 MAC地址表管理

一、理论知识 1.MAC地址表&#xff1a;交换机使用MAC地址表来记录各MAC地址对应的端口&#xff0c;用于帧转发的目的。 2.老化机制&#xff1a;交换机会为每一条MAC地址表项设置老化时间&#xff0c;老化时间到期后未收到该MAC地址报文的表项将被删除&#xff0c;释放资源。 …

Java热部署:让应用更新如丝般顺滑,告别繁琐重启!

目录 手动启动热部署 自动启动热部署 参与热部署监控的文件范围配置 关闭热部署 什么是热部署&#xff1f;简单说就是你程序改了&#xff0c;现在要重新启动服务器&#xff0c;嫌麻烦&#xff1f;不用重启&#xff0c;服务器会自己悄悄的把更新后的程序给重新加载一遍&…

提升教学效率的全方位解决方案

在现代教育环境中&#xff0c;教学管理的复杂性与日俱增。如何高效管理教学活动、优化教师资源、提升教学质量&#xff0c;是每个教育机构面临的重要挑战。搭贝教务教学管理系统提供了一套全面的解决方案&#xff0c;涵盖了巡检、调课代课、生源登记、监考、外派、作业发布、听…

用群辉NAS打造影视墙(Jellyfin篇)

目录 1、安装Jellyfin媒体服务器 2、配置 (1)语言 (2)管理员账户 (3)添加媒体库 (4)指定元数据语言 (5)远程访问设置 (6)修改文件夹权限 (7)刷新电影 (8)启用硬件加速 3、PC浏览器访问 4、手机客户端 5、智能TV客户端 6、解决演员不能显示中文的问…

基于 NXP LS1046 +FPGA系列 CPCI 架构轨道交通专用板卡

基于 NXP LS1046 系列 CPCI 架构轨道板卡 该产品是一款 CPCI 无风扇架构的高可靠性板卡&#xff0c;CPU 选用 NXP LS1046A 系统平台&#xff0c;支持嵌入式 Linux 或者标准 Ubuntu Linux 、凝思等操作系统&#xff0c;轨道交通 EMC 及宽温级别设计&#xff0c;板载多路 M12 高速…

电脑ai写作软件,4款实用的软件!

在数字化时代&#xff0c;AI写作软件已经成为创作者们不可或缺的工具。它们利用先进的自然语言处理技术和大数据分析&#xff0c;能够快速生成高质量的文章&#xff0c;大大提升了创作效率。那么&#xff0c;市面上有哪些值得一试的电脑AI写作软件呢&#xff1f;让我们一起来盘…