MYSQL8主从复制
概述
复制的常见应用场景
主从复制实现基本原理
MySQL支持的复制类型
复制解决的问题
复制过程
主从复制失败的原因
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
。
关闭主节点
和从节点
的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
# 修改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;
-- 锁定所有表并防止数据写入。这将确保您的备份是一致的,并且不会在正在进行复制时被更改。
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;
主从复制其他参数示范
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;
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;