问题描述
系统部署运行一段时日,伴随用户规模持续扩大,单台MySQL服务器逐渐不堪重负,难以应对所有访问请求,为支持更高数据库并发量,防止单台MySQL意外停摆,即丧失服务能力,进而导致整个应用系统瘫痪,此刻需引入MySQL集群,该时期常见的故障现象包括:
在生产环节,若MySQL正在服务,怎样将当前数据做好存档?
某个接口在特定情境中需要锁定数据表进行更新操作,与此同时,其他执行读取操作的线程会被迫暂停执行,等待资源释放,这种状况应当怎样改善?
访问量持续攀升,单台设备难以承载工作负荷,需寻求应对之策,具体方法是什么?
问题分析与解决方案
对于问题陈述中所涉及的疑问,均能通过MySQL主从复制得到处理。MySQL主从复制是应对单一MySQL服务器性能局限的一种主流方法。在系统业务繁杂的情况下,架构的演进使得业务规模持续增长,同时I/O读写操作频次显著提升,单台MySQL数据库逐渐难以承载压力,因此必须采用多库存储方案,以此减少磁盘I/O的负载,并增强单台服务器的I/O处理效能。
MySQL主从复制原理
MySQL的主从复制功能能够将数据从一台MySQL服务器,也就是主服务器或主节点,传输到另一个或多个从节点上,从节点可以复制主服务器上的全部数据库、某个数据库或某些特定的数据表。MySQL系统在默认情况下使用的是非同步的复制机制,这种机制允许从节点不需要持续连接到主服务器,而是可以在其他远程服务器上自行更新数据。
主要服务器就是指master服务器,一旦主要服务器里的数据出现变动,主要服务器就会把数据变动的记录保存在二进制日志文件里。
从服务器也称作从属服务器。从属服务器会定时检查主服务器的二进制日志,确认其是否出现变动。一旦主服务器数据发生变动,从属服务器就会开启一个输入输出线程,请求进行数据更新,详细步骤如下所示:
1. 部署过程中需要注意的事项
主服务器和从服务器的MySQL版本应当一致,否则可能会引发未知的异常情况,或者出现错误
主服务器与从服务器的时间需要保持一致,如果不一致,两个线程的时间标记可能会错开,进而造成数据同步不能成功。
在MySQL数据库系统中,通常至少设有两个从属服务器,当主服务器与从属服务器的数据出现不一致的情况,能够参照其他外部系统进行核对。
2. MySQL主从复制的架构拓扑
主服务器承担数据写入或读取任务,从服务器仅负责数据读取,并会从主服务器获取数据。这种主从配置应用范围不大,通常采用主从复制模式,该模式至少需要三台服务器,包括一台主服务器和两台从服务器。当一台服务器的数据出现异常时,可以参考其他服务器上的数据。
主主复制属于一种集群架构,这种模式将两台服务器都设定为独立的主服务器,允许它们各自独立地写入数据,同时也具备从对方获取数据的能力。这种设计具备扩展性,能够发展成交替排列的主从复制结构,具体表现为两台主服务器之间实现主主复制,并且每台主服务器都连接着一台从服务器进行主从复制。这种系统设计把负载均匀地划拨到几台机器上,分配过程不依据数据录入或调用的模式进行。
(3)一主多从:一主多从适合写入较少,但读取较多的场景。
多主一从模式,主要针对写入操作频繁而读取操作较少的应用场景,具体表现为多个主服务器负责数据录入,仅单台从服务器承担数据读取任务。
联级复制是一种特定的复制模式,表现为从master A开始,依次连接到slave B,再由slave B连接到slave C。在这种模式下,原先的master A会被slave B和slave C所取代。值得注意的是,经过这样的转换,slave B和slave C之间会建立起新的主从关系。采用这种联级复制方式,不仅有助于实现数据的迁移,还能让系统在需要时更加容易地进行切换。具体的架构示意图展示如下。
深入理解MySQL中的二进制日志
MySQL里的二进制日志是一种二进制文件,主要作用是记录对数据进行修改或者可能造成数据变化的SQL指令。这种日志文件详细记录了所有对MySQL数据库进行的改动操作,并且包含了指令执行的时间点、执行持续的时间长度、操作涉及的数据内容等附加信息,不过它不会记录SELECT、SHOW这类不涉及数据修改的SQL指令。二进制日志主要应用于数据库的修复工作,以及用于主从之间的数据同步,同时也支持安全监控。在MySQL实现主从复制功能时,二进制日志是整个复制架构的核心部分。
查看MySQL二进制日志状态
当系统变量log_bin的值设为关闭状态,意味着二进制日志功能未启用;当该变量值设为开启状态,则表明二进制日志功能已经启动。若想确认二进制日志是否处于激活状态,可在MySQL管理界面执行相应指令进行检测。
结果如图
模糊查询命令如下:
结果如图
log_bin和sql_log_bin的区别
二进制日志主要用来进行数据恢复,同时也能实现主从服务器间的数据同步功能。MySQL在启动时,能够借助配置文件来开启二进制日志,不过log_bin这个参数仅仅用来显示当前二进制日志是否已经启动的状态。如果需要调整二进制日志的开启情况,就必须在修改配置文件之后重新启动MySQL服务。
sql_log_bin是系统的一项设置,它具有双重属性,既可作用于单一对话,也可影响所有对话。若作为整体参数,对其调整仅适用于未来的对话,原有对话不受影响,此时该设置对当前对话失效。所以通常在更改全局sql_log_bin设置后,需要终止所有现有会话。倘若某个会话里将此参数设为关闭状态,那么该会话的所有客户端执行的数据变更动作都不会在MySQL的二进制记录文件里留下痕迹。所以,在运用log_bin来恢复数据库的情况下,为了防止将恢复的修改操作记录写入二进制日志,从而引发重复记录的问题,可以考虑将sql_log_bin参数设置为关闭状态。
开启二进制日志
检查MySQL的设置文档/etc/my.cnf,确认里面是否包含关于二进制记录的设定内容,需要仔细阅读相关部分。
如果没有,则在/etc/my.cnf的选项中追加以下内容:
倘若先前提及的内容并非在选项列表中新添,而是在其他选项里新加,即便调整了配置文件/etc/my.cnf,二进制日志依然无法开启。接下来,将阐述代码中各项的用途。
服务器标识:MySQL中的该属性值具备唯一性,其功能主要体现在以下方面。
MySQL在同步数据时会附带服务器标识,这个标识用来表明该指令最初是在哪个服务器上被记录的,因此服务器标识是必不可少的。
每一个从属节点在主节点上对应一个专属的主节点进程,该进程依据从属节点的服务器标识号来区分。
每个从属节点在主节点上最多只能对应一个主线程,倘若两个从属节点的服务器标识符一致,那么当后一个节点建立连接时,先前连接的节点会被强制断开。
当从属方自行建立与主方的关联,倘若从属方随后发出停止指令,那么关联便会中断,然而主方那边负责该关联的进程并未终止。
运行奴仆程序后,主程序不能再新建一个工作单元同时维持原有的工作单元,否则在信息交互阶段可能会引发故障。
在MySQL实现主主同步机制时,多个服务器必须组成环形结构,但在数据同步过程中必须防止信息重复循环,这是通过设定server-id来完成的。
log-bin是用来启动二进制记录功能的选项。在实现数据同步的过程中,作为主服务器的系统,必须确保这个功能已经启用。
二进制日志的格式及其设定方式。在MySQL环境下,实现复制二进制日志的主要途径有三种:
二进制日志模式存在三种类型,分别是声明式级别模式、行级模式以及混合模式,这些模式的利弊情况参见表格内容。
MySQL通常以声明式处理级别运作,但更提倡采用综合式处理级别。针对特定应用场景,可以选用记录式处理级别。比如,借助二进制记录进行数据变更同步,能够显著减少相关操作步骤,因此对于二进制记录的处理工作会变得格外便捷。当运用INSERT、UPDATE、DELETE等直接手段对表进行干预时,日志的形态会依照binlog_format的配置来决定。倘若借助GRANT、REVOKE、SET PASSWORD这类管理指令来实施对表的改动,就必须选用Statement Level的记录方式。
除此之外,还可以对二进制日志进行以下配置:
binlog_cache_size参数表示单个事务期间二进制日志记录所占据的缓存容量。当执行包含大量语句的复杂事务时,建议适当调大该参数数值,有助于提升系统运行效率。所有事务状态信息首先保存在二进制日志的缓存区,待事务提交后统一写入二进制日志文件。若事务数据量超过此参数设定值,系统将改用磁盘上的临时文件来存储相关数据。这个缓存项针对每个连接的事务,在首次改变其状态时才会生成,它属于会话层级,一般直接使用系统预设的数值,具体的书写方法展示在后面
max_binlog_cache_size:最高二进制日志存储空间,一般按照系统预设值使用,具体设置方法展示如下:
二进制日志的存储容量达到特定限度时,会自动进行切换,这个限度由max_binlog_size参数控制。该参数的取值范围上限为1GB,下限为4096字节,系统预设值为1GB。当执行较大的数据变更操作时,日志文件可能会突破预设容量,导致系统报错。一般情况建议维持默认配置,具体的参数设置方法见示例说明。
日志过期天数:移除已存留N日以上的二进制记录,一般按系统预设值设定,具体书写方法见下文:
调整配置文档/etc/my.cnf之后,运用下列指令能够重新启动MySQL服务,用以确认MySQL的二进制记录文档是否已经启用:
结果如图所示。
重新查看log_bin启动结果,如图所示。
若MySQL重启后无法正常启动,或者log-bin未正常开启,可检查Linux系统中的两个日志文件,看是否存在错误
通常情况下,若输入相对路径,二进制日志的存储位置是/var/lib/mysql,具体位置如图所示。

每次重新启动MySQL服务时都会创建一个新的二进制日志文档,这等同于对二进制日志文件进行了更换。在执行二进制日志文件更换操作期间,可以观察到mysql-bin文件名中的编号持续增长。
除了二进制记录文件,另外创建了一个索引文件。该文件记录了全部二进制记录文件的列表,也称作二进制记录的目录。
查看二进制日志文件的名称、大小和状态
查看二进制日志文件的名称和大小的命令如下所示:
结果如图所示。
也可以输入如下命令进行查看:
这个指令跟显示二进制日志的指令作用一样,输出内容跟图里的一样
查看当前二进制文件状态的命令如下所示,结果如图所示。
删除某个日志之前的所有二进制日志文件
先前曾提及,能够借助expire_logs_days参数实现依据时间自动清除二进制日志文件。接下来阐述怎样运用purge命令手动移除特定日志之前的所有二进制日志文件。首要步骤是确认当前MySQL系统中的二进制日志文件,具体指令如下所示:
结果如图所示。
使用purge指令移除mysql-bin.000002以前的全部二进制记录文件时,这项移除动作会波及二进制记录文件索引区域的资料,具体指令写法如下:
结果如图所示。
执行清理指令后,重新检查MySQL的二进制记录文件,能够确认,编号为mysql-bin.000002的二进制记录文件已经不见了,具体操作指令为:
结果如图所示。
删除某个时间点以前的二进制日志文件
删除某个时间点以前的二进制日志文件的命令如下所示:
删除7天前的二进制日志文件的命令如下所示:
删除所有的二进制日志文件
执行清除所有二进制日志文件的指令后,所有相关文件将被移除,系统会自动创建新的mysql-bin.000001文件,具体指令内容展示如下:
结果如图所示。
查看二进制日志文件内容
查看二进制日志文件信息时,需先建立一张表格,目的是让二进制日志文件记录可辨识的数据,建立表格的指令如下:
在MySQL的命令行状态下,获取相关的二进制日志文件,具体指令如下,其执行效果展示在附图之中。
图中能够识别出,制定表格的指令也包含在内,并且附带诸多设定参数。实施添加记录的指令:
再次查看二进制日志,命令如下所示:
结果如图所示。
查看二进制日志文件的部分输出,命令如下所示:
结果如图所示。
一旦察觉前述显示信息并非一目了然,亦可借助下列指令来继续监测二进制日志
结果如图所示。
在运作场合,常常会对MySQL执行诸多修改、删除、增加等动作,此刻能够借助Pos参数,选取某个时间节点往后的信息,具体指令如下所示:
结果如图所示
倘若数据量依旧相当可观,便能够运用限制分页的指令,具体用法如下所示:
结果如图所示。
limit分页参数里附带了一个隐含设置,比如输入limit 1,2,这个指令会让查询先忽略掉第一行数据,然后返回接下来的两行结果,具体用法如下:
结果如图所示。
备份二进制日志,再把它翻译成文本格式,具体指令如下:
使用指令cat /log.txt配合grep查找不含任何字符的drop字符串能够顺利检索出log.test里的二进制记录信息,具体效果展示在附图之中。

CopyrightC 2009-2025 All Rights Reserved 版权所有 芜湖人才网 本站内容仅供参考,不承担因使用信息、外部链接或服务中断导致的任何直接或间接责任,风险自担。如有侵权,请联系删除,联系邮箱:ysznh@foxmail.com 鄂ICP备2025097818号-15
地址: EMAIL:qlwl@foxmail.com
Powered by PHPYun.