了解MySQL的复制

了解MySQL的复制

MySQL的复制允许数据从一个MySQL数据库服务器(主服务器)复制到一个或多个MySQL数据库服务器(从服务器)。复制在数据库的扩展性和数据备份方面扮演着重要角色,特别是在大型企业和高可用性的应用场景中。

复制的工作原理

主从架构

主从架构是MySQL复制中最常见的一种形式,它包括一个主服务器和一个或多个从服务器。主服务器的角色是处理客户端请求,执行写操作(如INSERT、UPDATE和DELETE),并记录这些操作的详细信息到二进制日志(binlog)中。从服务器则通过读取并执行这些日志记录来同步主服务器的数据状态。

数据流向如下:首先,主服务器在执行写操作后,会将操作事件写入本地的二进制日志。然后,从服务器连接到主服务器,请求发送最新的二进制日志内容。主服务器响应这些请求,并将日志数据发送给从服务器。从服务器获取这些日志后,通过其SQL线程解析并执行日志中的事件,从而在本地数据库上复制主服务器的状态。

二进制日志和复制事件

二进制日志是MySQL数据库中用于记录所有修改了数据库状态的操作事件的日志文件。这些操作包括所有的DML(数据操纵语言)语句,如INSERT、UPDATE和DELETE,以及DDL(数据定义语言)语句,如CREATE TABLE和ALTER TABLE。二进制日志的主要作用是在数据库复制过程中提供数据源,同时也用于数据恢复。

当复制功能启用时,主服务器将其上的所有数据库更改作为“复制事件”写入二进制日志。每个复制事件都包含足够的信息来确保从服务器可以准确地复制这些更改。从服务器上的复制进程会定期从主服务器请求这些二进制日志,然后将其自身的数据库状态更新以匹配主服务器,这个过程称为“事件重放”。

通过使用二进制日志,MySQL不仅可以在主从架构下实现高效的数据复制,还能确保在发生系统故障时能够恢复到故障发生前的状态。

复制类型

同步复制与异步复制

在MySQL中,复制可以根据事务在主从服务器间的同步方式分为同步复制和异步复制。

同步复制确保在主服务器上执行的每个事务都在提交之前在一个或多个从服务器上同步和确认。这意味着主服务器在继续执行前,需要从所有配置为同步的从服务器收到事务已成功写入的确认。这种方法提高了数据的一致性和可靠性,但可能会由于等待从服务器确认而导致主服务器的性能降低。

异步复制,是MySQL默认使用的复制类型,其中主服务器执行事务并记录到二进制日志中,而不需要等待从服务器确认即可继续进行其他操作。从服务器会在自己的节奏中读取并应用这些二进制日志。这种方式的优点是主服务器的性能不会受到从服务器速度的影响,但缺点是在发生故障时可能导致数据在主从服务器间不一致。

基于行的复制与基于语句的复制

MySQL提供了基于行(row-based)和基于语句(statement-based)的复制方式,每种方式适用于不同的使用场景。

基于语句的复制(Statement-Based Replication, SBR)记录每一个会修改数据的SQL语句,并在从服务器上重新执行这些语句来进行复制。这种方式的优点是二进制日志文件较小,因为只记录了SQL语句。然而,它可能在特定情况下(如使用了非确定性函数的语句)导致主从数据不一致。

基于行的复制(Row-Based Replication, RBR)不记录每条SQL语句的内容,而是记录被修改行的新旧数据。从服务器接收到这些变更后,直接对相应的行进行更新。这种方法的优点是避免了由于SQL语句的非确定性执行结果导致的数据不一致问题,使复制过程更加可靠。缺点是如果修改了大量的行,二进制日志会相应变得非常大,增加了网络传输和存储的负担。

通常,基于行的复制更适合涉及大量写操作的数据库,而基于语句的复制适用于更新较少且需要节省日志空间的环境。MySQL还允许混合模式复制,根据情况自动选择使用基于行或基于语句的复制方式,以便结合两者的优点。

设置和配置复制

设置MySQL复制涉及在主服务器和从服务器上进行一系列配置,以确保数据能够顺利且正确地复制。

配置主服务器

配置主服务器主要包括启用二进制日志记录、创建复制用户并授予必要的权限。以下是详细步骤:

  1. 启用二进制日志
    在主服务器的my.cnf(或my.ini,取决于操作系统)配置文件中启用二进制日志功能。你需要添加如下配置:

    [mysqld]
    log-bin=mysql-bin
    server-id=1
    

    log-bin指定二进制日志文件的基本名称,server-id是这台服务器的唯一ID,每台服务器的ID必须不同。

  2. 创建复制专用用户
    登录到MySQL服务器,创建一个专用于复制的用户并授予必要的权限。执行以下SQL命令:

    CREATE USER 'replicator'@'%' IDENTIFIED BY 'password';
    GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'%';
    FLUSH PRIVILEGES;
    

    这里'replicator'@'%'表示从任何IP地址都允许连接,password应替换为一个安全的密码。

  3. 记录二进制日志位置
    在开始复制之前,记录当前二进制日志的位置,这将用于从服务器的配置。可以通过执行以下命令获取:

    SHOW MASTER STATUS;
    

    记下FilePosition的值,这些信息稍后在配置从服务器时需要用到。

配置从服务器

从服务器的配置涉及指定要连接的主服务器、设置复制起始点等。

  1. 配置从服务器
    在从服务器的my.cnf配置文件中设置server-id和指定复制使用的主服务器信息。例如:

    [mysqld]
    server-id=2
    

    注意确保server-id与主服务器的不同。

  2. 设置复制信息
    登录到从服务器的MySQL服务,设置复制需要连接的主服务器信息,包括主服务器的IP、复制用户及起始点。执行以下SQL命令:

    CHANGE MASTER TO
    MASTER_HOST='master_ip_address',
    MASTER_USER='replicator',
    MASTER_PASSWORD='password',
    MASTER_LOG_FILE='recorded_log_file_name',
    MASTER_LOG_POS=recorded_log_position;
    

    替换master_ip_addresspasswordrecorded_log_file_namerecorded_log_position为实际的值。

  3. 启动复制进程
    在完成设置后,启动复制进程:

    START SLAVE;
    

    使用SHOW SLAVE STATUS\G;来查看从服务器的复制状态,确保Slave_IO_RunningSlave_SQL_Running都是Yes

通过以上步骤,你可以成功在主服务器设置复制并在从服务器上启动复制进程。

复制的监控和维护

监控复制进程

监控MySQL复制是确保数据一致性和系统性能的关键部分。以下是一些监控复制状态和性能的方法以及常用的监控工具。

  1. 使用MySQL内置命令监控状态
    SHOW SLAVE STATUS; 是一个强大的命令,它提供从服务器复制状态的详细信息。这个命令的输出包括连接到主服务器的状态、当前正在处理的二进制日志文件和位置、复制延迟等关键信息。重点关注以下字段:

    • Slave_IO_RunningSlave_SQL_Running:这两个字段应该都是Yes,表示复制正常运行。
    • Seconds_Behind_Master:显示从服务器落后于主服务器的时间(秒)。理想情况下,这个值应该是很小的。
  2. 使用性能监控工具

    • Percona Toolkit:Percona Toolkit 提供了多个工具来辅助监控和管理MySQL复制,例如pt-table-checksumpt-table-sync可以用来检查和解决数据一致性问题。
    • MySQL Enterprise Monitor:这是一个商业解决方案,提供实时监控,自动警报和复制性能分析。
    • Prometheus 和 Grafana:这一组合可以用来收集MySQL性能指标并通过Grafana进行可视化,支持自定义警报。
  3. 定期审核和日志记录
    定期检查错误日志和慢查询日志可以帮助识别可能影响复制的问题。MySQL的错误日志会记录与复制相关的错误和警告,慢查询日志有助于识别可能导致复制延迟的长查询。

复制故障处理

处理复制中的问题是维护复制系统健康的重要部分。以下是一些常见的复制问题及其解决方案:

  1. 复制延迟

    • 优化查询:优化长时间运行的查询可以减少复制延迟。
    • 增加网络带宽:网络延迟或带宽不足也可以导致复制延迟,提升网络设施可能有助于此类问题。
    • 并行复制:从MySQL 5.6开始,支持并行复制,可以在从服务器上并行应用事件,减少延迟。
  2. 数据不一致

    • 使用校验工具pt-table-checksum 可用于检查主从数据一致性,pt-table-sync 可用于解决数据不一致问题。
    • 重新同步数据:在极端情况下,如果复制错误导致数据严重不一致,可能需要重新同步从服务器的数据。
  3. 复制中断

    • 检查并重置复制状态:如果复制因为错误停止,需检查SHOW SLAVE STATUS输出中的Last_IO_ErrorLast_SQL_Error,根据错误信息进行相应的修复后,使用START SLAVE命令重新启动复制。
    • 手动处理复制错误:对于某些特定的错误,可能需要手动干预,如跳过一个特定的错误日志事件。

参考链接

  • MySQL复制官方文档:链接地址
  • 二进制日志详解:链接地址
  • 复制监控工具介绍:链接地址

在这里插入图片描述

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

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

相关文章

时序预测 | Transformer时间序列预测 Matlab代码

文章目录 效果一览文章概述源码设计参考资料 效果一览 文章概述 1.时序预测 | Transformer时间序列预测 Matlab代码 2.单变量时间序列预测; 3.多指标评价,评价指标包括:R2、MAE、MBE等,代码质量极高; 4.excel数据&…

Git使用总结(不断更新中)

branch 本地分支操作 删除本地分支 git branch -d <local-branch-name>远端分支操作 从远端分支创建本地分支 git checkout -b <local-branch-name> origin/<remote-branch-name>git ignore 如果工程的代码文件中有不希望上传到远端的文件&#xff0c;…

Java数据类型以及范围

数据类型&#xff1a; 取值范围&#xff1a; 取值&#xff1a;

将 Notepad++ 添加到右键菜单

目录 方式一&#xff1a;添加注册表&#xff08;手动&#xff09; 方式二&#xff1a;添加注册表&#xff08;一键添加&#xff09; 有时安装了notepad后&#xff0c;在txt文件上右键&#xff0c;在弹出的菜单栏中没有【通过 Notepad 打开】&#xff0c;如下&#xff1a; 这…

c语言基础总结

1. c语言概述 c语言是计算机编程语言的一种&#xff0c;编程语言用于人和机器交流。 1.1 c语言特点 简洁 ​ c语言的语法简单&#xff0c;语句清晰明了&#xff0c;使得程序易于阅读和理解 高效 ​ c语言的执行效率高&#xff0c;可以用于开发需要高性能的应用程序 可移…

[C++][算法基础]求约数(试除法)

给定 n 个正整数 &#xff0c;对于每个整数 &#xff0c;请你按照从小到大的顺序输出它的所有约数。 输入格式 第一行包含整数 n。 接下来 n 行&#xff0c;每行包含一个整数 。 输出格式 输出共 n 行&#xff0c;其中第 i 行输出第 i 个整数 的所有约数。 数据范围 1≤…

Django模型的字段类型

Django模型中最重要并且也是唯一必须执行的就是字段定义。字段在类中进行定义&#xff0c;对应于实体数据库的字段。另外&#xff0c;定义模型字段名时为了避免冲突&#xff0c;不建议使用模型API中已经定义的关键字。 字段类型用以指定数据库的数据类型&#xff0c;例如Integ…

瑞芯微RK3328(ROC-RK3328-PC)buildroot 开发QT的hello world

第一部分&#xff1a;编译rk3328 sdk 0. 环境 - EC-R3328PC&#xff08;ROC-RK3328-PC&#xff09; - ubuntu18&#xff08;100GB&#xff09; 1. 安装依赖 sudo apt-get updatesudo apt-get install repo git-core gitk git-gui gcc-arm-linux-gnueabihf u-boot-tools devi…

C++ //练习 12.26 用allocator重写第427中的程序。

C Primer&#xff08;第5版&#xff09; 练习 12.26 练习 12.26 用allocator重写第427中的程序。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /************************************************************************…

Linux入门攻坚——19、sed入门、bash脚本编程续

sed&#xff1a;Stream EDitor&#xff0c;流编辑器&#xff0c;行编辑器&#xff1a;实现文本编辑时是逐行进行的。 用法&#xff1a; sed [option]... script inputfile... script&#xff1a;‘地址命令’&#xff0c;如1,4d sed是将文件内容读取后放入自己的编辑…

Junit 历史-ApiHug准备-测试篇-008

&#x1f917; ApiHug {Postman|Swagger|Api...} 快↑ 准√ 省↓ GitHub - apihug/apihug.com: All abou the Apihug apihug.com: 有爱&#xff0c;有温度&#xff0c;有质量&#xff0c;有信任ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplace 背景 J…

【人工智能书籍】一本书读懂AIGC:ChatGPT、AI绘画、智能文明与生产力变革(PDF分享)

今天又来给大家推荐一本人工智能方面的书籍<一本书读懂AIGC&#xff1a;ChatGPT、AI绘画、智能文明与生产力变革>。本书以通俗易懂的方式从各个层面介绍了AIGC的基础知识&#xff0c;并辅以大量案例引领读者了解AIGC的应用实践&#xff0c;让读者可以更快速地利用AIGC改善…

02节-51单片机-LED模块

文章目录 1.点亮一个LED灯2.LED闪烁3.LED流水灯 1.点亮一个LED灯 #include <REGX52.H> void main() {P20xFE; //1111 1110while(1){} }2.LED闪烁 增加延时&#xff0c;控制LED的亮灭间隙 延时函数的添加依靠STC-ISP软件的延时函数功能代码自动生成&#xff0c;如图 #i…

递归 python

↵一、简单理解 解决问题的一种方法&#xff0c;它将问题不断的分成更小的子问题&#xff0c;直到子问题可以用普通的方法解决。通常情况下&#xff0c;递归会使用一个不停调用自己的函数。 【注】&#xff1a;每一次递归调用都是在解决一个更小的问题&#xff0c;如此进行下…

数据库管理-第171期 Oracle是用这种方式确保读一致的(20240418)

数据库管理171期 2024-04-18 数据库管理-第171期 Oracle是用这种方式确保读一致的&#xff08;20240418&#xff09;1 基本概念2 用处3 注意事项总结 数据库管理-第171期 Oracle是用这种方式确保读一致的&#xff08;20240418&#xff09; 作者&#xff1a;胖头鱼的鱼缸&#x…

Docker文档阅读笔记-How to Run GUI Based Applications inside Docker?

以后的文档阅读笔记不在一一介绍。以后只总结干货和重点。 Step 1 使用Systemctl命令启动docker服务&#xff1a; systemctl start docker // to start the docker service. systemctl status docker // to check the status . systemctl restart docke…

mybatis创建入门流程体验

mysql数据库中建表 drop table if exists tb_user;create table tb_user(id int primary key auto_increment,username varchar(20),password varchar(20),gender char(1),addr varchar(30) );INSERT INTO tb_user VALUES (1, zhangsan, 123, 男, 北京); INSERT INTO tb_user …

四川易点慧电子商务抖音小店:安全先行,购物无忧

随着互联网的飞速发展&#xff0c;电子商务已成为人们日常购物的重要渠道。抖音小店作为新兴的电商平台&#xff0c;凭借其独特的社交属性和庞大的用户基础&#xff0c;迅速崛起并吸引了众多商家的入驻。在这个背景下&#xff0c;四川易点慧电子商务有限公司&#xff08;以下简…

Android11应用安装未知来源的权限改动

最近开发的App需要下载安装另一个App。这就涉及到了app的安装代码。关于App的安装代码&#xff0c;写了不少&#xff0c;所以这一块觉得不是问题&#xff1a; 判断版本&#xff0c;Android8.0判断是否有未知来源安装全选&#xff0c;没有则打开未知来源安装权限设置界面去开启…

Linux并发程序设计(1):进程的创建和回收

目录 1、基本概念概念 1.1 程序 1.2 进程 1.3 进程的内容 1.4 进程类型 1.5 进程状态 2、常用命令 2.1 查看进程信息 2.2 改变进程优先级 2.2.1 按用户指定的优先级运行进程 2.2.2 改变正在运行进程的优先级 2.3 其他相关指令 3、进程的创建和结束 3.1 子进程创建 3.1.1 …