Bootstrap

MYSQL8主从复制

概述

image.png


复制的常见应用场景

image.png


主从复制实现基本原理

image.png


MySQL支持的复制类型

image.png


复制解决的问题

image.png


复制过程

image.png
image.png


主从复制失败的原因

image.png


MYSQL8主从复制实现

关键点:
主库创建一个远程用户授予复制权限
主库从库my.cnf配置服务器唯一id;
开启全局事务ID;


1、MYSQL主节点配置HOST

# 在msyql的主从节点配置host
sudo tee -a /etc/hosts << EOF
192.168.1.100 mysql-master
192.168.1.101 mysql-slave1
EOF

2、修改配置文件中的ServerID

my.cnf 文件中启用二进制日志记录,并为其分配一个唯一的服务器 ID
image.png


关闭主节点从节点的mysql服务。

# 关闭mysql服务
systemctl stop msyqld

主服务器配置

每个数据库实例的服务器ID唯一值

[mysqld]
# 启用binlog日志记录
log-bin=mysql-bin
# 主服务器唯一服务器ID
server-id=1

从服务器配置

注意:请确保此服务器的服务器 ID 不同于主服务器

[mysqld]
# 从服务器唯一服务器ID
server-id=2

修改主从参数–启用全局事务标识符(GTID)

主库备库都要添加下列参数。
https://blog.csdn.net/kang_01/article/details/124415221


image.png

# 修改my.cnf
[mysqld]
# 启用全局事务标识符(GTID),用于标识复制拓扑结构中多个服务器上的事务
gtid_mode=ON
# 使用基于GTID的复制时强制执行严格一致性检查,防止数据不一致性
enforce_gtid_consistency=ON
# 必须参数
# 设置多级复制拓扑结构(包括双master环境),其中一个从属方作为向下游的其他从属方的主节点,则这很有用
# 控制slave数据库 是否把 从master 接受到的log 合并在 本slave 执行的内容记录到slave的二进制日志中
log_slave_updates=1

重启MySQL服务

保存配置后,启动mysql服务

# 重启mysql服务
systemctl restart msyqld

3、主库创建用户repl@%并授权

主库上执行。
repl用户是专门用于主从复制的用户

-- 为主库创建repl用户
CREATE USER 'repl'@'%.example.com' IDENTIFIED WITH mysql_native_password BY 'password';

-- 为repl用户授权 在所有库.表上 均有REPLICATION SLAVE权限
-- REPLICATION SLAVE权限允许用户作为从服务器连接到主服务器,并接收主服务器上更改的副本
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%.example.com';

-- 应用权限配置
FLUSH PRIVILEGES;

image.png

-- 锁定所有表并防止数据写入。这将确保您的备份是一致的,并且不会在正在进行复制时被更改。
FLUSH TABLES WITH READ LOCK;

查看主库的binlog位置和binlog名称

将这些值记录下来,因为它们将在配置从服务器时使用。

-- 查看二进制日志的名称和位置。
SHOW MASTER STATUS;

释放表锁

-- 释放表锁
UNLOCK TABLES;

4、从库开始主从复制

从库上执行。
MASTER_AUTO_POSITION = 1 启用自动复制拓扑,能实现自动切换主库
启用 MASTER_AUTO_POSITION = 1自动拓扑参数后,从库自动记录每个从库当前所处的拓扑位置,当发生主库故障切换时,从库会自动尝试连接新的主库,并根据之前记录的拓扑位置信息重新开始复制数据,从而实现自动切换主库,避免了手动干预的繁琐操作。

-- 配置从库连接到主库,准备执行复制数据
-- MASTER_AUTO_POSITION = 1 启用自动复制拓扑
CHANGE MASTER TO
MASTER_HOST = 'master.example.com',
MASTER_USER = 'repl',
MASTER_PASSWORD = 'password',
MASTER_AUTO_POSITION = 1;

image.png


主从复制其他参数示范

MASTER_LOG_FILE MASTER_LOG_POS 的值应该是您在步骤3中记录的binlog的位置和名称

MASTER_LOG_POS = 107 指定主库binlog文件当前正在写入的位置(偏移量)。这个参数的值是一个整数。
在主从复制中,从库会连到主库获取主库binlog文件,然后从上次读取的位置继续读新的日志数据
因此,MASTER_LOG_POS 参数以及相关的 MASTER_LOG_FILE 参数对于从服务器来说非常重要,它们告诉从服务器应该从哪里开始读取主服务器的日志数据。

-- 配置从库连接到主库,准备执行复制数据
CHANGE MASTER TO
MASTER_HOST = 'master.example.com',
MASTER_USER = 'repl',
MASTER_PASSWORD = 'password',
MASTER_LOG_FILE = 'mysql-bin.000001',
MASTER_AUTO_POSITION = 1,
MASTER_LOG_POS = 107;

启动从库复制进程

-- 启动从库复制进程:
START SLAVE;

-- 检查从库的状态
SHOW SLAVE STATUS\G;

image.png


5、测试主从复制是否生效

-- 在主库上创建数据库
CREATE database scott;

-- 在主库上创建表
CREATE TABLE scott.emp(
    empno FLOAT(4),
    ename VARCHAR(10),
    job VARCHAR(9),
    hiredate DATE,
    sal FLOAT(7, 2),
    comm FLOAT(7.2),
    deptno FLOAT(2)
);

从库查看:

--  进入scott库
use scott;

-- 查看有哪些表
show tabtles;

image.png

;