mysql(十)mysql主从复制--主库切换

概述

可能为了更迭升级服务器,或者主库出现问题,又或者只是希望重新分配容量,此时需要切换主库。

如果这是计划内的切换,会相对容易点。只需要在从库上使用CHANGE MASTER TO命令,并设置合适的值。大多数的值都是可选的,至少要指定需要改变的项即可。从库将抛弃之前的配置和中继日志并从新的主库开始复制。同样新的参数会被更新到master.info文件中,这样就算重启,从库配置也不会丢失。

整个过程中最难得就是获取新的主库上合适的二进制日志位置,这样从库才可以从和老主库相同的逻辑位置开始复制

把从库提升为主库要更困难一点。有两种场景需要将从库替换成主库,一种是计划内的,一种是计划外的

计划内的提升

把从库提升为主库理论上是简单的。

  1. 停止向老的库写入
  2. 让从库追赶上主库
  3. 将一台从库配置为新的主库
  4. 将从库和写操作指向新的主库,然后开启主库的写入

上述步骤中还是隐藏着很多细节,更深入一点,下面步骤就是大多数配置需要的步骤

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

计划外的提升

当主库崩溃的时候,需要提升一台从库来代替它,这个过程就不会太容易。如果只有一台从库,可以直接使用这台从库。但如果有超过一台的从库,就需要一些额外的工作。

另外,还有潜在的丢失复制事件。可能主库上已发生的修改还没有更新到它的任何一台设备上的情况。甚至还可能一条语句在主库上执行了回滚,但在从库上没有回滚,这样从库可能超过主库的逻辑复制位置。如果能在某一点恢复主库的数据,也许就可以取得丢失的语句并手动执行他们。

在以下的步骤中,需要确保在计算中使用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_0File/Read_Master_Log_Pos 的值
  5. 执行前一小节的10~12 步。

再次需要注意,在配置主从复制的时候,所有从库开启log_binlog_slave_updates,这样就可以帮助你将所有的从库恢复到一个一致的时间点,如果没有开启这两个选项,则很难可靠的做到这一点。

确定期望的日志位置

如果有从库和新主库的位置不相同,则需要找到该从库最后一条执行的事件在新主库的二进制日志中相应的位置,然后再执行 CHANGE MASTER TO。可以通过mysglbinlog 工具来找到从库执行的最后一条查询,然后在主库上找到同样的查询,进行简单的计算即可得到。

为了便于描述,假设每个日志事件有一个自增的数字ID,最新的从库,也就是新的主库,在旧主库崩溃的时获得了编号为100的事件,假设有另外两台设备:replica2和replica3。replica2已经获得了99号事件,replica3获取了98号事件。如果把这两台从库都指向了新主库的同一个二进制日志的位置,他们将会从101号事件开始复制,从而导致数据不同步。但只要新主库的二进制日志已经通过log_slave_updates打开,就可以在新主库的二进制中找到99和100日志,从而将从库恢复到一致的状态。

由于服务器重启,不同的配置,日志轮转或者FLUSH LOGS命令,同一个事件在不同的服务器上可能有不同的偏移量。找到这些事件可能会耗很长时间并且枯燥,但是通常没有难度。通过mysqlbinlog从二进制日志或中继日志中解析出每台从库上执行的最后一事件,并同样使用该命令解析新主库上的二进制日志,找到相同的查询,mysglbinlog 会打印出该事件的偏移量,在 CHANGE MASTER TO命令中使用这个值

更快的方式是把新主库和停止的从库上的字节偏移量相减,它显示了字节位置的差异。然后把这个值和新主库当前的二进制日志的位置相减,就可以得到期望的查询的位置。然后验证一下就可以据此启动从库。

假设 server1是 server2和 server3 的主库,其中服务器server1已经崩溃。根据SHOW SLAVE STATUS获得 Master_Log_File/Read_Master_Log_Pos 的值,server2 已经执行完了 server1上所有的二进制日志,但 server3还不是最新数据。

在这里插入图片描述
如图所示,我们可以肯定 server2 已经执行完了主库上的所有二进制日志,因为Master_Log_File和Read Master_Log_Pos值和server1上最后的日志位置是相吻合的,因此我们可以将 server2 提升为新主库,并将 server3 设置为 server2的从库。

应该在server3上为需要执行的CHANGE MASTER TO语赋予什么样的参数呢?
这里需要做一点点计算和调查。server3 在偏移量 1493 停止,比 server2执行的最后一条语句的偏移量 1582要小89字节。server2正在向偏移量为8167的二进制日志写入,8167-89=8078,因此理论上我们应该将 server3 指向 server2的日志的偏移量为8078 的位置。最好去确认下这个位置附近的日志事件,以确定在该位置上是否是正确的日志事件,因为可能有别的例外,例如有些更新可能只发生在 server2 上。

假设我们观察到的事件是一样的,下面这条命令会将 server3 切换为 server2的从库

mysql > CHANGE MASTER TO MASTER_HOST="server2",MASTER_LOG_FILE="mysql-bin.000009",MASTER_LOG_POS=8078;

如果服务器在它崩溃时已经执行完成并记录了超过一个事件,会怎么样呢?
因为server2仅仅读取并执行到了偏移位置 1582,你可能永远地失去了一个事件。但是如果老主库的磁盘没有损坏,仍然可以通过 mysglbinlog 或者从日志服务器的二进制日志中找到丢失的事件。

上述流程中一个可调整的地方是使用可靠的方式来存储二进制日志,如 SAN 或分布式复制数据库设备 (DRBD)。即使主库完全失效,依然能够获得它的二进制日志。也可以设置一个日志服务器,把从库指向它,然后让所有从库赶上主库失效的点。这使得提升一个从库为新的主库没那么重要,本质上这和计划中的提升是相同的。

主从复制会有哪些问题以及解决方案

数据损坏或丢失的错误

主库意外关闭

描述:
如果没有设置主库的 sync_binlog 选项,就可能在崩溃前没有将最后的几个二进制日志事件刷新到磁盘中。从库I/0 线程因此也可一直处于读不到尚未写入磁盘的事件的状态中。当主库重新启动时,从库将重连到主库并再次尝试去读该事件,但主库会告诉从库没有这个二进制日志偏移量。二进制日志转储线程通常很快,因此这种情况并不经常发生。

解决方案:
解决这个问题的方法是指定从库从下一个二进制日志的开头读日志。但是一些日志事件将永久地丢失,建议使用 Percona Toolkit 中的pt-table-checksum 工具来检查主从一致性,以便于修复。可以通过在主库开启 sync_binlog 来避免事件丢失。

即使开启了 sync_binlog,MyISAM 表的数据仍然可能在崩溃的时候损坏,对于InnoDB事务,如果innodb_flush_log_at_trx_commit没有设为1,也可能丢失数据(但数据不会损坏)。

从库意外的关闭

当从库在一次非计划中的关闭后重启时,会去读 master.info 文件以找到上次停止复制的位置。不幸的是,该文件并没有同步写到磁盘,文件中存储的信息可能是错误的。从库可能会尝试重新执行一些二进制日志事件,这可能会导致唯一索引错误除非能确定从库在哪里停止 (通常不太可能),否则唯一的办法就是忽略那些错误。Percona Toolkit 中的pt-slave-restart 工具可以帮助完成这一点。

如果使用的都是InnoDB表可以在重启后观察MySQL错误日志。InnoDB在恢复过程中会打印出它的恢复点的二进制日志坐标。可以使用这个值来决定从库指向主库的偏移量。Percona Server 提供了一个新的特性,可以在恢复的过程中自动将这些信息提取出来,并更新 master.info 文件,从根本上使得复制能够协调好从库上的事务

主库上的二进制日志损坏

如果主库上的二进制日志损坏,除了忽略损坏的位置外,你别无选择。可以在主库上执行FLUSH LOGS命令,这样主库会开始一个新的日志文件,然后将从库指向该文件开始的位置。也可以试着去发现损坏区域的结束位置。某些情况下可以通过SET GLOBAL SQL_SLAVE_SKIP_COUNTER =1来忽略一个损坏的事件。如果有多个损坏的事件,就需要重复该步骤,直到跳过所有损坏的事件。但如果有太多的损坏事件,这么做可能就没有意义了。损坏的事件头会阻止服务器找到下一个事件。这种情况下,可能不得不手动的去找到下一个完好的事件。

从库上的中继日志损坏

如果主库上的日志是完好的,就可以通过CHANGE MASTER TO 命令丢弃并重新获取损坏的事件。只需要将从库指向它当前正在复制的位置(Relay_Master_Log_File/Exec_Master_Log_Pos)。这会导致从库丢弃所有在磁盘上的中继日志。就这点而言,MySQL 5.5之后的版本做了改进,它能够在崩溃后自动获取中继日志。

二进制日志和InnDB事务日志不同步

当主库崩溃时,InnDB可能将一个事务标记为已提交,此时该事物可能还没有记录到二进制日志当中。除非是某个从库的中继日志已经保存,否则没有任何办法恢复丢失的事务。在MySQL 5.0 版本可以设置 sync_binlog 选项来防止该问题,对于更早的MySQL4.1可以设置 sync_binlog和 safe_binlog选项。

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

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

相关文章

苍穹外卖 day12 Echats 营业台数据可视化整合

苍穹外卖-day12 课程内容 工作台Apache POI导出运营数据Excel报表 功能实现:工作台、数据导出 工作台效果图: 数据导出效果图: 在数据统计页面点击数据导出:生成Excel报表 1. 工作台 1.1 需求分析和设计 1.1.1 产品原型 工作台是系…

2023年智能家居占消费电子出货量28%,蓝牙Mesh照明占据重要位置

市场研究机构 TechInsights 的最新报告显示,预计 2023 年全球消费者在智能家居相关硬件、服务和安装费方面的支出将复苏,达到 1310 亿美元,比 2022 年增长 10%。TechInsights 表示,消费者在智能家居系统和服务上的支出将继续强劲增…

架构师如何做好需求分析

架构师如何做好需求分析 目录概述需求: 设计思路实现思路分析1.主要步骤 2.主要步骤2操作步骤 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,make a better result,…

Fiddler安装与使用教程(2) —— 软测大玩家

😏作者简介:博主是一位测试管理者,同时也是一名对外企业兼职讲师。 📡主页地址:【Austin_zhai】 🙆目的与景愿:旨在于能帮助更多的测试行业人员提升软硬技能,分享行业相关最新信息。…

数据结构例题代码及其讲解-递归与树

树 ​ 树的很多题目中都包含递归的思想 递归 递归包括递归边界以及递归式 即:往下递,往上归 递归写法的特点:写起来代码较短,但是时间复杂度较高 01 利用递归求解 n 的阶乘。 int Func(int n) {if (n 0) {return 1;}else …

码云使用记录

码云使用记录 主要步骤 1、https://gitee.com 注册 2、下载Git 3、配置SSH 4、创建远程仓库 5、切到本地项目目录下将本地项目推到远程 前两步根据提示进行即可,下面从第三步开始讲解 3、配置SSH(用于提交代码和更新代码) https://gitee.…

行人属性识别数据集PA100K介绍

本文介绍pa100k数据集,是从GitHub上paddleCLA工程中提供的路径下载,针对该数据集进行介绍: 01 - 图像信息 训练集 - 80000张图像验证集 - 10000张图像测试集 - 10000张图像 02 - 标签信息 属性1:有无帽子 - [0] 属性2&#xf…

CP Autosar-Ethernet配置

文章目录 前言一、Eth层级结构介绍二、Autosar实践2.1 ETH Driver2.2 Eth InterfaceEth Interface Autosar配置2.3 TcpIp模块Eth TcpIp Autosar配置2.4 SoAdEth SoAd配置前言 因汽车E/E架构和功能的复杂度提升而带来的对车辆数据传输带宽提高和通讯方式改变(基于服务的通讯-S…

London Dock丨伦敦一区的房产明星,拥揽泰晤士河美景,尽享都市奢华生活

生活在伦敦一区,似乎就意味跻身上流阶层 皆是精英环绕,也为下一代创造了极好的社区氛围 所谓“一方水土养一方人”,泰晤士河穿过的伦敦 也孕育着伦敦人的礼貌绅士与严谨认真。 河流,是城市发展的源头。 源远流长的塞纳河&…

Text文件在MATLAB中读写示例基础

背景 为了便于和外部程序进行交换,以及查看文件中的数据,也常常采用文本数据格式与外界交换数据。在文本格式中,数据采用ASCII码格式,可以使用字母和数字字符。可以在文本编辑器中查看和编辑ASCII文本数据。MATLAB提供了导入函数…

spring boot项目上传头像

应用还是验证码使用的原理;但是代码逻辑却有所不同。 逻辑前端传给后端,然后写入本机磁盘去,文件名用uuid避免重复。写完就可以顺带把文件名保存到数据库里。上传就这样子。 怎么取用的;还是通过配置映射的方式;通过sr…

Vue3【Provide/Inject】

前言 自从使用了Provide/Inject代码的组织方式更加灵活了,但是这个灵活性的增加伴随着代码容错性的降低。我相信只要是真的在项目中引入Provide/Inject的同学,一定一定有过或者正在经历下面的状况: 注入名(Injection key&#x…

Ubuntu 22.04 桌面美化成Mac风格

安装插件 sudo apt install gnome-tweaks gnome-shell-extensions -y安装完成后在应用中可以搜索到一个名为(tweaks/优化)的应用。 下载安装主题、图标 主题 git clone https://github.com/vinceliuice/WhiteSur-gtk-theme.git cd WhiteSur-gtk-them…

iOS开发Swift-9-SFSymbols,页面跳转,view屏幕比例,启动页-和风天气AppUI

1.创建项目 2.设置好测试机型,App显示名称,以及关闭横向展示. 3.下载SF Symbols. https://developer.apple.com/sf-symbols/ 右上角搜索 search ,可以找到很多系统自带图标.选择喜欢的图标,拷贝图标的名字. 插入一个Button,在Image中粘贴图标名称并选择,即可将Button变成想要的…

Kafka3.0.0版本——文件存储机制

这里写木目录标题 一、Topic 数据的存储机制1.1、Topic 数据的存储机制的概述1.2、Topic 数据的存储机制的图解1.3、Topic 数据的存储机制的文件解释 二、Topic数据的存储位置示例 一、Topic 数据的存储机制 1.1、Topic 数据的存储机制的概述 Topic是逻辑上的概念&#xff0c…

Verilog 代码规范

搬自https://hitsz-cslab.gitee.io/cpu/home/codingstyle/ 1. 标题命名规范 1.1 标题文件命名规范 仿真文件应使用后缀“_sim”,如modulename_sim; 测试文件应使用后缀“_tb”,如modulename_tb。 1.2 模块命名规范 一个文件只定义一个m…

CPU及并发

2.9G Hz,即每秒进行2.9G次运算(即29亿次) 几个命令 us: 用户使用的cpu sy: 系统(内核)使用的cpu id: idle,即空闲cpu wa: 等待I/O的cpu st: 开虚拟机后会有的一个指标,即虚拟机的cpu使用率 一个进程拥有一整套虚拟地址空间,该进程的所有线程都共享该地址空间. 线程是CPU运算的最…

ZYNQ上的简单 FSK 基带发射器

绪论 由于某种需求需要生成正弦波,因此使用 C 应用程序中的sin()函数来计算单位圆的幅度值,然后将该幅度值转换为 AD9717 的适当 DAC 代码(当然将每个角度值转换为弧度)。 能够使用DAC生成简单的正弦波,下一个想法就是…

QT QToolBox控件使用详解

本文详细的介绍了QToolBox控件的各种操作,例如:新建界面、添加页签、索引设置当前项、获取当前项的索引、获取当前项窗口、获取索引值是int的窗口、移除索引值项、获取项的数量、获取指定索引值、设置索引项是否激活、获取索引值项是否激活、设置项的图标…

vue+antd——table组件实现动态列+表头下拉选择功能——技能提升

Table 表格 展示行列数据。 何时使用 当有大量结构化的数据需要展现时; 当需要对数据进行排序、搜索、分页、自定义操作等复杂行为时。 最近在写vueantd的框架,遇到一个需求:就是要实现table表格的动态列,并且相应的表头要实现下拉…