实现MySQL的主从复制基础

目录

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.000006Position: 194Binlog_Do_DB: Binlog_Ignore_DB: 
Executed_Gtid_Set: cd27e5ae-5fe3-11ef-a5d8-000c29a51779:1-4mysql> 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 eventMaster_Host: 192.168.239.210Master_User: replMaster_Port: 3306Connect_Retry: 60Master_Log_File: mysql-bin.000006Read_Master_Log_Pos: 194Relay_Log_File: mysql-02-relay-bin.000002Relay_Log_Pos: 320Relay_Master_Log_File: mysql-bin.000006Slave_IO_Running: YesSlave_SQL_Running: YesReplicate_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 eventMaster_Host: 192.168.239.210Master_User: replMaster_Port: 3306Connect_Retry: 60Master_Log_File: mysql-bin.000006Read_Master_Log_Pos: 194Relay_Log_File: mysql-3-relay-bin.000002Relay_Log_Pos: 320Relay_Master_Log_File: mysql-bin.000006Slave_IO_Running: YesSlave_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.rhkb.cn/news/408796.html

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

相关文章

51单片机——模块化编程

1、模块化编程介绍 传统方式编程&#xff1a;所有的函数均放在main.c里&#xff0c;若使用的模块比较多&#xff0c;则一个文件内会有很多的代码&#xff0c;不利于代码的组织和管理&#xff0c;而且很影响编程者的思路。 模块化编程&#xff1a;把各个模块的代码放在不同的.…

运维学习————nginx2-配置详解及负载均衡

目录 一、配置文件详解 1.1、结构 1.2、重要配置解释 1.3、详细配置 全局配置 Events HTTP 服务器配置 server虚拟主机配置 location URL匹配配置 1.4、完整配置 二、负载均衡 2.1、概念 2.2、集群规划及实现 2.3、具体实现 2.3.1、克隆 2.3.2、修改tomcat1配…

MySQL分区表

1.分区算法 MySQL提供4种分区算法&#xff1a;取余&#xff1a;Key&#xff0c;hash 条件&#xff1a;List&#xff0c;range 。 参与分区的参数字段需要为主键的一部分。 &#xff08;1&#xff09;KEY – 取余 &#xff0c;按照某个字段进行取余 分成5个区&#xff0c;就…

力扣: 设计链表

文章目录 需求代码结尾 需求 你可以选择使用单链表或者双链表&#xff0c;设计并实现自己的链表。 单链表中的节点应该具备两个属性&#xff1a;val 和 next 。val 是当前节点的值&#xff0c;next 是指向下一个节点的指针/引用。 如果是双向链表&#xff0c;则还需要属性 p…

掌握电子邮件的艺术:使用 Mailbird 统一管理您的数字生活

在数字时代&#xff0c;电子邮件已成为我们沟通的骨干。无论是商务交流、家庭联络&#xff0c;还是订阅更新&#xff0c;我们几乎每天都在使用电子邮件。但随着账户数量的增加&#xff0c;管理这些账户变得日益复杂。如何有效地整合和优化您的电子邮件体验&#xff1f;Mailbird…

关于solidity知识总结

借此CSDN博客笔记来巩固一下对solidity知识的认识 1.helloworld // SPDX-License-Identifier:MIT pragma solidity ^0.8.0; contract First {string public hello "HelloWorld"; } public 修饰符自动创建一个get()函数用于返回内容 类似于 // SPDX-License-Ident…

策略产品 ①算法逻辑

目录 一、机器学习与AI的关系 二、机器学习全流程 1. 问题定义 2. 数据处理 3. 特征工程 4. 模型训练 5. 模型评估 6. 模型应用 机器学习是AI的关键技术之一&#xff0c;是指机器从历史数据中学习规律&#xff0c;从而提升系统某个性能度量的过程。这篇文章&#xff0c;我们在作…

78 Linux libusb库USB HID应用编程笔记

1 前言 这几天搞另外一个项目&#xff0c;基于Ubuntu开发一个小的应用程序&#xff0c;就是通过USB HID与设备通信。因此需要在Linux环境编写对应USB HID通信应用。 目前libusb库已经很好的支持USB相关应用的开发&#xff0c;库中提供了丰富的USB接口&#xff0c;用户可以直接调…

做空股指期货一手多少钱?

股指期货的保证金比例是12%-15%不等&#xff0c;所以做空一手股指期货的保证金最少是要十几万元&#xff0c;部分平台两万。关于做空一手股指期货的具体金额&#xff0c;这并非固定不变&#xff0c;而是会根据市场的实时价格、合约的乘数以及交易所的规定等因素而有所变动。 股…

如何使用ssm实现开放式教学评价管理系统+vue

TOC ssm121开放式教学评价管理系统vue 第1章 绪论 1.1 背景及意义 系统管理也都将通过计算机进行整体智能化操作&#xff0c;对于开放式教学评价管理系统所牵扯的管理及数据保存都是非常多的&#xff0c;例如个人中心、教师管理、学生管理、游客管理、评价信息管理、综合评…

HCIP第五次作业

一、实验拓扑 二、实验要求 1.如图连接网络&#xff0c;合理规格IP地址&#xff0c;AS200内IGP协议为OSPF 2.R1属于AS 100:R2-R3-R4小AS 234 R5-R6-R7/AS567&#xff0c;同时声明大AS 200&#xff0c;R8属于AS300 3.R2-R5 R4-R7之间为联邦EBGP邻居关系 4.R1-R8之间通信 三、实…

第133天:内网安全-横向移动域控提权NetLogonADCSPACKDC永恒之蓝

案例一&#xff1a;横向移动-系统漏洞-CVE-2017-0146 这个漏洞就是大家熟悉的ms17-010&#xff0c;这里主要学习cs发送到msf&#xff0c;并且msf正向连接后续 原因是cs只能支持漏洞检测&#xff0c;而msf上有很多exp可以利用 注意msf不能使用4.5版本的有bug 这里还是反弹权…

基于STM32开发的智能风扇控制系统

目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 系统初始化温度与湿度监测风扇控制与状态显示Wi-Fi通信与远程控制应用场景 家庭与办公室的温控风扇管理工业环境的智能通风控制常见问题及解决方案 常见问题解决方案结论 1. 引言 智能风扇控…

react笔记(React18)

以下笔记可能毫无章法&#xff0c;仅供个人学习记录使用。 关于状态提升&#xff1a; 状态提升适用于兄弟组件之间传递数据&#xff0c;共享状态&#xff0c;其实就是把两个兄弟组件要共同使用的数据存放到共同的父组件中&#xff0c;称状态提升。 关于context跨层级组件通信…

Vodafone 推出了与 Wi-Fi 竞争的基于树莓派私人5G技术

随着全球5G网络的逐步推出&#xff0c;在其过程中遇到了可预见的起起伏伏&#xff0c;并且蜂窝技术也开始进入另一个无线技术 Wi-Fi &#xff0c;并且已经占据的市场。私有5G网络&#xff08;即个人或公司建立自己的全设施蜂窝网络&#xff09;如今正在寻找曾经属于Wi-Fi的唯一…

openai whisper使用

whisper使用 介绍 Whisper是一种通用的语音识别模型。它是在大量不同音频数据集上训练的&#xff0c;也是一个多任务模型&#xff0c;可以执行多语言语音识别、语音翻译和语言识别。 GitHub&#xff1a;https://github.com/openai/whisper 论文链接&#xff1a;https://arx…

SQL Server 2017上服务端设置强制加密启用SSL

在数据库服务端设置&#xff0c;强制所有客户端使用 SSL&#xff0c;设置完后&#xff0c;后续客户端所有连接&#xff0c;都将以密文传送&#xff0c;不论客户端是否指定安全连接&#xff08;即EncryptTrue/False&#xff09; 一、服务端强制加密使用 SSL 1.在数据库服务器上…

微服务事务管理

目录 一、分布式事务问题 1、本地事务 2、分布式事务 3、分布式事务问题 二、理论基础 1、CAP定理 &#xff08;1&#xff09;一致性 &#xff08;2&#xff09;可用性 &#xff08;3&#xff09;分区容错 &#xff08;4&#xff09;矛盾 2、BASE理论 3、解决分布式…

Java学习_21_多线程JUC

文章目录 前言多线程并发与并行多线程的实现方式Thread类Runnable接口Callable接口和Future接口 Thread类的相关方法线程对象线程优先级守护线程出让线程/礼让线程插入线程/插队线程 线程的相关问题生命周期安全问题Lock锁死锁等待唤醒机制&#xff08;生产者和消费者&#xff…

Flex的基本使用+综合案例

组成 弹性盒子没有设置高&#xff0c;就会自动拉伸 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport&q…