实现MySQL的主从复制基础

news2024/11/15 2:11:14

目录

1 MySQL实现主从复制的原理

1.1 实现主从复制的规则

1.2 如何实现主从复制

2 MySQL 实现主从复制实践

2.1 实验环境

2.2 my.cnf 配置添加

2.2.1 配置MSTER 端配置文件

2.2.2 配置SLAVE 端配置文件

2.2.3 三台MySQL服务器重启服务

2.3 创建用于复制的用户

2.4 保证三台主机的数据一致性

2.4.1 MASTER 给数据库加锁的原因

2.4.2 保证数据一致性过程分析

 2.4.3 实践

2.5 实现 MySQL 的主从复制 

2.5.1 查看MASTER 主机的状态

2.5.2 配置SLAVE主机

2.5.3 测试效果


1 MySQL实现主从复制的原理

主从复制步骤描述
Master 记录 Binlog主服务器(Master)在事务提交时记录数据变更到二进制日志(Binlog)。
Slave 读取 Binlog从服务器(Slave)读取主服务器的二进制日志文件(Binlog),并将内容写入自己的中继日志(Relay Log)。
Slave 重做 Relay Log从服务器重做中继日志中的事件,将改变反映到它自己的数据。

1.1 实现主从复制的规则

将源配置为使用基于二进制日志文件位置的 复制,则必须确保已启用二进制日志记录,并且 建立唯一的服务器 ID。

必须配置复制拓扑中的每个服务器 具有唯一的服务器 ID,可以使用 server_id 系统变量来指定该 ID。这 服务器 ID 用于标识 复制拓扑,并且必须是介于 1 之间的正整数 (232)−1。可以通过以下方式动态更改server_id值 发表如下声明:

如果MASTER服务器 ID 为 0,则MASTER将拒绝任何 来自SLAVE的连接,并且SLAVE拒绝连接到 MASTER,因此此值不能在复制拓扑中使用。 除此之外,您如何组织和选择服务器 ID 没有要求,只要每个服务器 ID 都不同 。

主服务器,因为二进制日志是复制的基础 从源到其副本的更改。如果二进制日志记录是 如果在使用该选项的MASTER上未启用,则无法进行复制。启用二进制日志记录 如果服务器尚未启用,则必须重新启动 服务器。在这种情况下。例如,要启用二进制文件 使用日志文件名前缀 进行日志记录,并配置服务器 ID , 以下是例子:

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

1.2 如何实现主从复制

在主服务器(master)上
    启用二进制日志
    选择一个唯一的server-id
    创建具有复制权限的用户
在从服务器(slave)上
    启用中继日志
    (二进制日志可开启,也可不开启)
    选择一个唯一的server-id
    连接至主服务器,并开始复制

2 MySQL 实现主从复制实践

2.1 实验环境

MASTER/SLAVE服务器名称I       P地址server-id
MASTERMySQL-01192.168.239.210 10        
SLAVE-1MySQL-02192.168.239.22020
SLAVE-2MySQL-03192.168.239.23030

2.2 my.cnf 配置添加

配置项含义
server-idMySQL 服务 ID,保证在整个集群环境中唯一,取值范围:1 - 2^32 - 1,默认为 1
super_read_only=onon 表示只读 , 默认是可写可读的
binlog-ignore-db=mysql忽略的数据,指不需要同步的数据库
binlog-do-db=db01指定同步的数据库

2.2.1 配置MSTER 端配置文件

[root@mysql-01 ~]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0

# 增加以下行
# super_read_only=on   # 读写
log_bin=mysql-bin  # 开启bin-log日志
server_id=10

2.2.2 配置SLAVE 端配置文件

[root@mysql-02 ~]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server_id=20
super_read_only=on  #只读
[root@mysql-03 ~]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server_id=30
super_read_only=on  #只读

2.2.3 三台MySQL服务器重启服务

systemctl restart mysqld
mysql -uroot -pOpenlab123!

2.3 创建用于复制的用户

每个SLAVE都使用 在MASTER上创建的远程链接用户 连接到MASTER,因此在MASTER上必须有一个用户帐户, 这个账户 SLAVE 可用于连接。任何 帐户可用于此操作,前提是这个用户已被 被授予 REPLICATION SLAVE 权限。

# MASTER
mysql> CREATE USER 'repl'@'%' IDENTIFIED BY 'Openlab123!';
# 这个权限允许用户作为复制从属服务器(slave)接收主服务器(master)的二进制日志事件并应用这些事件。
mysql> GRANT REPLICATION SLAVE ON *.* TO repl@'%';
mysql> FLUSH PRIVILEGES;


# 确保每台SLAVE都能连得上MASTER

[root@mysql-02 ~]# mysql -urepl -pOpenlab123! -h 192.168.239.210 -e "SELECT @@HOSTNAME"
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------+
| @@HOSTNAME |
+------------+
| mysql-01   |
+------------+

[root@mysql-3 ~]# mysql -urepl -pOpenlab123! -h 192.168.239.210 -e "SELECT @@HOSTNAME"
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------+
| @@HOSTNAME |
+------------+
| mysql-01   |
+------------+

2.4 保证三台主机的数据一致性


2.4.1 MASTER 给数据库加锁的原因

MASTER 加锁 FLUSH TABLES WITH READ LOCK

MySQL 主服务器(Master)上执行 FLUSH TABLES WITH READ LOCK 命令时,这会在所有表上加上全局的读锁,从而确保数据的一致性。这对于备份是非常有用的,因为它可以防止在备份过程中数据发生变化,从而打破数据的一致性

对从服务器(Slave)的影响

当在主服务器上执行 FLUSH TABLES WITH READ LOCK 命令时,这会对从服务器(Slave)产生一定的影响,具体取决于从服务器当前的状态:

从服务器正在进行数据同步:

如果从服务器正在进行数据同步,并且主服务器上执行了 FLUSH TABLES WITH READ LOCK 命令,从服务器将暂停接收和应用二进制日志(Binlog)事件,直到主服务器上的锁被释放,并且限制主服务器上的数据一直被写入。

这是因为在主服务器上加锁期间,所有写操作都将被阻止,包括发送给从服务器的二进制日志事件。

从服务器的数据恢复:

如果您在主服务器上执行了 FLUSH TABLES WITH READ LOCK 命令,并完成了备份,然后需要在从服务器上进行数据恢复,需要确保从服务器与主服务器的数据同步状态。

如果从服务器与主服务器的数据同步状态是一致的,可以使用主服务器的备份来恢复从服务器的数据。

如果从服务器与主服务器的数据同步状态不一致,可能需要先停止从服务器的数据同步,然后使用主服务器的备份来恢复从服务器的数据,再重新开始数据同步。

2.4.2 保证数据一致性过程分析

恢复数据到从服务器(Slave)

如果您希望使用主服务器上的备份数据来恢复从服务器(Slave),可以按照以下步骤操作:

  1. 在主服务器上执行备份:

    • 登录到 MySQL 数据库。
    • 执行 FLUSH TABLES WITH READ LOCK 命令来加锁并准备备份。
    • 完成备份操作。
    • 使用 UNLOCK TABLES 命令来释放锁。
  2. 在从服务器上停止数据同步:

    • 登录到从服务器的 MySQL 数据库。
    • 使用 STOP SLAVE 命令来停止从服务器的数据同步。
  3. 恢复数据:

    • 将主服务器的备份文件复制到从服务器。
    • 在从服务器上使用备份文件恢复数据。
    • 确保恢复过程中从服务器没有其他并发的写操作,以免数据不一致。
  4. 重新开始数据同步:

    • 使用 START SLAVE 命令重新开始从服务器的数据同步。

 2.4.3 实践

主从同步之前对数据库进行备份再导入从服务器,保证数据的一致性 

# 给MASTER上锁
[root@mysql-01 ~]# mysql -uroot -pOpenlab123! -e "flush tables with read lock;" 

[root@mysql-01 ~]# mysqldump -uroot -pOpenlab123! shuyan > ~/shuyan.sql

[root@mysql-01 ~]# scp shuyan.sql root@192.168.239.220:~
shuyan.sql                                                                 100% 2070     2.3MB/s   00:00    
[root@mysql-01 ~]# scp shuyan.sql root@192.168.239.230:~
shuyan.sql                                                                 100% 2070     2.8MB/s   00:00    


# 由于使用mysqldump 是不会自动创建数据库的,所以需要自己手动创建数据库。
# 使用一些备份的工具比如说使用第三方工具percona-xtrabackup进行数据备份与恢复

[root@mysql-02 ~]# mysql -uroot -pOpenlab123! -e "SHOW TABLES FROM shuyan;"
[root@mysql-02 ~]# mysql -uroot -pOpenlab123! shuyan < ~/shuyan.sql 


[root@mysql-03 ~]# mysql -uroot -pOpenlab123! -e "SHOW TABLES FROM shuyan;"
[root@mysql-03 ~]# mysql -uroot -pOpenlab123! shuyan < ~/shuyan.sql 

# 打开锁
[root@mysql-01 ~]# mysql -uroot -pOpenlab123! -e "unlock tables;"

2.5 实现 MySQL 的主从复制 

接下来正式进行MySQL的主从复制

2.5.1 查看MASTER 主机的状态

# MASTER
# 查看主库状态,即当前日志文件名和二进制日志偏移量
mysql> show master status\G
*************************** 1. row ***************************
             File: mysql-bin.000006
         Position: 194
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: cd27e5ae-5fe3-11ef-a5d8-000c29a51779:1-4

mysql> show master status;
+------------------+----------+--------------+------------------+------------------------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                        |
+------------------+----------+--------------+------------------+------------------------------------------+
| mysql-bin.000006 |      194 |              |                  | cd27e5ae-5fe3-11ef-a5d8-000c29a51779:1-4 |
+------------------+----------+--------------+------------------+------------------------------------------+

记住这 两个重要的参数 File 和 Position ,从服务器用得到

字段含义
File从哪个日志文件开始推送二进制日志
Position从哪个位置开始推送二进制日志
binlog_do_db指定需要同步的数据库
binlog_ignore_db指定不需要同步的数据库

使用 mysqlbinlog 可以查看加密的日志文件

2.5.2 配置SLAVE主机

参数名含义8.0.23 之前的名称
SOURCE_HOST主库 IP 地址MASTER_HOST
SOURCE_USER连接主库的用户名MASTER_USER
SOURCE_PASSWORD连接主库的密码MASTER_PASSWORD
SOURCE_LOG_FILEbinlog 日志文件名MASTER_LOG_FILE
SOURCE_LOG_POSbinlog 日志文件位置MASTER_LOG_POS

语法

 mysql> CHANGE MASTER TO
    -> MASTER_HOST='MASTER 的 IP 地址',
    -> MASTER_USER='在MASTER 创建并赋予REPLICATION SLAVE权限的用户',
    -> MASTER_PASSWORD='用户的密码',
    -> MASTER_LOG_FILE='在MASTER主机上查看状态的二进制文件名称',
    -> MASTER_LOG_POS=在MASTER主机上查看的从哪个地方开始推送的二进制日志文件的值;

MySQL-2

mysql> CHANGE MASTER TO
    -> MASTER_HOST='192.168.239.210',
    -> MASTER_USER='repl',
    -> MASTER_PASSWORD='Openlab123!',
    -> MASTER_LOG_FILE='mysql-bin.000006',
    -> MASTER_LOG_POS=194;


mysql> START SLAVE;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.239.210
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000006
          Read_Master_Log_Pos: 194
               Relay_Log_File: mysql-02-relay-bin.000002
                Relay_Log_Pos: 320
        Relay_Master_Log_File: mysql-bin.000006
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 

######################### 以下省略 ############################

IO块与SQL执行块都已经Running了

MySQL-3

mysql> CHANGE MASTER TO
    -> MASTER_HOST='192.168.239.210',
    -> MASTER_USER='repl',
    -> MASTER_PASSWORD='Openlab123!',
    -> MASTER_LOG_FILE='mysql-bin.000006',
    -> MASTER_LOG_POS=194;

mysql> START SLAVE;


mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.239.210
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000006
          Read_Master_Log_Pos: 194
               Relay_Log_File: mysql-3-relay-bin.000002
                Relay_Log_Pos: 320
        Relay_Master_Log_File: mysql-bin.000006
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

2.5.3 测试效果

可以发现在MASTER中创建数据库的时候,SLAVE数据库马上就将数据同步了,这就是数据库的主从复制

############################### MASTER ####################################

mysql> CREATE DATABASE ZUCONG;

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| ZUCONG             |
| mysql              |
| performance_schema |
| shuyan             |
| sys                |
+--------------------+

############################### SLAVE1 ####################################

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| ZUCONG             |
| mysql              |
| performance_schema |
| shuyan             |
| sys                |
+--------------------+

mysql> SELECT @@HOSTNAME;
+------------+
| @@HOSTNAME |
+------------+
| mysql-02   |
+------------+

############################### SLAVE2 ####################################
mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| ZUCONG             |
| mysql              |
| performance_schema |
| shuyan             |
| sys                |
+--------------------+

mysql> SELECT @@HOSTNAME;
+------------+
| @@HOSTNAME |
+------------+
| mysql-03   |
+------------+

创建表并增加数据

mysql> CREATE TABLE HAHA(
    -> id INT NOT NULL,
    -> name VARCHAR(20),
    -> ipaddres VARCHAR(20)
    -> );

mysql> INSERT INTO HAHA(id,name,ipaddres) VALUES(1,'shuyan','wuzhou');

查看两台 SLAVE 的数据同步情况 

那如果在SLAVE服务器上修改数据呢?

尝试着把表给删掉,但提示报错,不让删掉  --验证了开启 super_read_only=on 的作用

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

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

相关文章

Android实战:过root检测

在启动这个app时&#xff0c;我们会看到一个提示&#xff0c;表示设备处于root环境。如下图所示&#xff1a; 为了过掉到这个root检测&#xff0c;我们可以通过直接Hook Toast.show()方法&#xff0c;并打印调用堆栈信息来实现定位关键代码。以下是相关的Frida脚本代码&#…

esxi 安装 精简版win10

镜像来源&#xff1a;[【不忘初心】Windows10 22H2 (19045.4780) X64 无更新 纯净[深度精简版]1.27G](https://www.pc528.net/22h2s.html) 提供下载地址&#xff1a;https://www.123pan.cn/s/lYtRVv-Wmuf3?提取码:GaD4 先把下载esd 转成iso安装 把下载的esd 重命名为install…

如何使用ssm实现学生宿舍管理

TOC ssm094学生宿舍管理jsp 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff0c;规范化管理。这样…

YOLOv5改进 | 融合改进 | C3融合EffectiveSE-Convolutional【完整代码 + 小白必备】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录&#xff1a; 《YOLOv5入门 改…

如何用comate快速生成一个剩菜好帮手

想法 上班后不想吃饭店的饭菜&#xff0c;时长想自己做一些饭菜&#xff0c;买完菜后却经常放到冰箱中&#xff0c;剩下的菜有无法一下子处理&#xff0c;单纯扔掉有些可惜&#xff0c;但是基于冰箱中的剩菜如何能做出一顿像样的饭菜一致困扰着我&#xff0c;查市面上的程序有…

在不修改应用数据源的情况下,如何确保应用程序能够正常访问adg切换后的主库?

在不修改应用数据源的情况下&#xff0c;如何确保应用程序能够正常访问adg切换后的主库&#xff1f; oracle12c rac测试通过&#xff1a; 1.修改原主库的scanip为某个临时ip&#xff0c;新主库的scanip修改为原生产 2.修改新主库的service_names&#xff1a;dgorcl为原生产的…

学习2d直线拟合

直线拟合算法&#xff08;续&#xff1a;加权最小二乘&#xff09;_加权拟合直线法-CSDN博客 直线拟合算法_相位拟合直线-CSDN博客 特别感谢博主无私分享 博文中提到的参考资料《机器视觉算法与应用&#xff08;双语版&#xff09;》[德] 斯蒂格&#xff08;Steger C&#x…

GPT-4o语音功能潜在风险分析与技术挑战

引言 近年来&#xff0c;随着大语言模型&#xff08;LLM&#xff09;技术的飞速发展&#xff0c;人工智能的能力在语音处理领域也取得了显著进展。OpenAI推出的GPT系列模型正成为人工智能领域的标杆。然而&#xff0c;在最新的GPT-4o版本中&#xff0c;尽管语音功能具备广阔的…

vue3 多文件下载zip压缩包

vue3多文件下载zip文件包 效果图 代码块 在这里插入代码片 <template><div><el-button type"primary" click"downLoadClick">下载文件zip</el-button></div> </template><script setup lang"ts"> i…

Springsecurity 自定义AuthenticationManager

一、认证流程 1、当用户提交了一个他的凭证(用户名、密码) AbstractAuthenticationProcessingFilter 将会创建一个凭证信息&#xff0c;最终&#xff0c;该请求会被UsernamePasswordAuthenticationFilter 拦截将请求中用户名和密码&#xff0c;封装为 Authentication 对象&…

4个学生党必备好用 AI 学术论文写作工具

随着人工智能技术的不断进步&#xff0c;AI论文写作工具已成为研究人员和学生的得力助手。学姐今天将介绍4个市面上广受好评的免费AI论文写作工具&#xff0c;它们能帮助用户高效地完成从论文大纲到最终校对的各个阶段。 一、梅子AI论文 梅子AI提供快速论文撰写功能&#xff…

Datawhale X 李宏毅苹果书 AI夏令营 学习笔记(二)

自适应学习率 我们梯度下降在参数更新上&#xff0c;公式是 W t W t − 1 − η g t &#xff0c; η 是学习率&#xff0c; g t 是梯度 W_tW_{t-1}-\eta g_t&#xff0c;\eta是学习率&#xff0c;g_t是梯度 Wt​Wt−1​−ηgt​&#xff0c;η是学习率&#xff0c;gt​是梯度…

2024软件测试必问的常见面试题1000问!

01、您所熟悉的测试用例设计方法都有哪些&#xff1f;请分别以具体的例子来说明这些方法在测试用例设计工作中的应用。 答&#xff1a;有黑盒和白盒两种测试种类&#xff0c;黑盒有等价类划分法&#xff0c;边界分析法&#xff0c;因果图法和错误猜测法。白盒有逻辑覆盖法&…

数据结构——链式二叉树的实现与分治编程思维(c语言实现)

目录 前言&#xff1a; 1.前置说明 2.链式二叉树的遍历 2.1 前序&#xff0c;中序及后续遍历 2.2 前序遍历实现 2.3 中序遍历实现 2.4 后续遍历实现 3.结点个数以及高度等 3.1 结点个数 3.2 结点高度 3.3 叶子结点的个数 前言&#xff1a; 在之前的学习中&…

从“云、边、端”的统一管理,为传统工厂数字化转型赋能的智慧地产开源了

智慧地产视觉监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。 AI是新形势下数…

这些软件测试面试题一定要会,自动化测试面试题(含答案)

1、你会封装自动化测试框架吗&#xff1f; 自动化框架主要的核心框架就是分层PO模式&#xff1a;分别为&#xff1a;基础封装层BasePage&#xff0c;PO页面对象层&#xff0c;TestCase测试用例层。然后再加上日志处理模块&#xff0c;ini配置文件读取模块&#xff0c;unittest…

多模态大模型技术详解(图像分块、特征对齐)

多模态 多模态发展图像预处理自适应图像切割弥补语义损失 视觉编码器视觉文本特征对齐线性映射或MLPCross AttentionPerceiver ResamplerQ-Former&#xff08;Querying Transformer&#xff09;模型结构表示学习 大语言模型 这篇文档主要讲解目前比较流行的缝合式的多模态大模型…

设计模式—装饰者模式

一、什么是装饰者模式 装饰者模式是一种结构型设计模式&#xff0c;它允许你动态地向对象添加新的行为而不影响其原有的行为。它在运行时给对象动态地添加一些额外的职责&#xff0c;通常是在原有的行为基础上&#xff0c;通过装饰器进行一些修饰&#xff0c;实现了更加灵活的代…

【软考】流水线

目录 一、指令控制方式1.1 说明1.2 顺序方式1.3 重叠方式1.4 流水方式 二、流水线的种类三、流水的相关处理3.1 说明3.2 RISC 中采用的流水技术3.2.1 超流水线(Super Pipe Line)技术3.2.2 超标量(Super Scalar)技术3.2.3 超长指令字(Very Long Instruction Word&#xff0c;VLI…

阿一网络安全之log4j2漏洞CVE-2021-44228复现

漏洞简介 Apache Log4j 2 是对 Log4j 的升级&#xff0c;它⽐其前身 Log4j 1.x 提供了显 着改进&#xff0c;并提供了 Logback 中可⽤的许多改进&#xff0c;同时修复了 Logback 架构中的⼀些固有问题。 2021 年 12 ⽉&#xff0c;在 Apache Log4j2 中发现了⼀个 0-day 漏洞。 …