mysql8多主一从复制_启用gtid_windows_mysql多实例

windows多实例mysql启用gtid多主一从测试

参考: mysql8官方文档: https://dev.mysql.com/doc/refman/8.0/en/installing.html

参考: mysql多实例安装: https://blog.csdn.net/qq_45675449/article/details/118032222

mysql多实例安装

windows安装mysql8(zip免安装版)

建配置文件夹

C:\Users\Administrator\Desktop\mysql\3306\conf
C:\Users\Administrator\Desktop\mysql\3307\conf
C:\Users\Administrator\Desktop\mysql\3308\conf

各自添加my.ini配置文件.

以下是C:\Users\Administrator\Desktop\mysql\3306\conf\my.ini

[client]
port=3306
#socket=/usr/local/mysql/data/3307/mysql.sock
default_character_set=utf8mb4

[mysqld]
port=3306
#socket=/usr/local/mysql/data/3306/mysql.sock
datadir=C:\\Users\\Administrator\\Desktop\\mysql\\3306\\data
basedir=C:\\Users\\Administrator\\Desktop\\mysql\\mysql-8.0.27-winx64
log-error=C:\\Users\\Administrator\\Desktop\\mysql\\3306\\data\\error.log
pid-file=C:\\Users\\Administrator\\Desktop\\mysql\\3306\\data\\mysql.pid
character_set_server=utf8mb4
lower_case_table_names=1

#C:\Users\Administrator\Desktop\mysql\3306\conf\my.ini
[client]
port=3306
#socket=/usr/local/mysql/data/3307/mysql.sock
default_character_set=utf8mb4

[mysqld]
port=3306
#socket=/usr/local/mysql/data/3306/mysql.sock
datadir=C:\\Users\\Administrator\\Desktop\\mysql\\3306\\data
basedir=C:\\Users\\Administrator\\Desktop\\mysql\\mysql-8.0.27-winx64
log-error=C:\\Users\\Administrator\\Desktop\\mysql\\3306\\data\\error.log
pid-file=C:\\Users\\Administrator\\Desktop\\mysql\\3306\\data\\mysql.pid
character_set_server=utf8mb4
lower_case_table_names=1

C:\Users\Administrator\Desktop\mysql\3307\conf\my.ini,

C:\Users\Administrator\Desktop\mysql\3308\conf\my.ini 与之类似

建数据文件夹

C:\Users\Administrator\Desktop\mysql\3306\data
C:\Users\Administrator\Desktop\mysql\3307\data
C:\Users\Administrator\Desktop\mysql\3308\data

mysql程序目录(可以将此目录下的\bin目录加入path环境变量)

C:\Users\Administrator\Desktop\mysql\mysql-8.0.27-winx64

初始化3个实例(会在数据文件夹下,建立必要的权限表等)

mysqld --defaults-file=C:\Users\Administrator\Desktop\mysql\3306\conf\my.ini --initialize-insecure  --console

mysqld --defaults-file=C:\Users\Administrator\Desktop\mysql\3307\conf\my.ini --initialize-insecure  --console

mysqld --defaults-file=C:\Users\Administrator\Desktop\mysql\3308\conf\my.ini --initialize-insecure  --console

windows环境下–defaults-file选项必须放在最前面(可能是个bug), –initialize-insecure指明要初始化实例(但是没有设置密码),–console将输出和错误显示到前台。

这里没有安装为服务, 而是直接在控制台打开(分别各自打开一个cmd管理员权限控制台窗口)

mysqld --defaults-file=C:\Users\Administrator\Desktop\mysql\3306\conf\my.ini --console

mysqld --defaults-file=C:\Users\Administrator\Desktop\mysql\3307\conf\my.ini --console

mysqld --defaults-file=C:\Users\Administrator\Desktop\mysql\3308\conf\my.ini --console

若要安装为服务, 用mysqld --install <SERVICE_NAME> --defaults-file=/XXX/my.ini.

允许root远程登陆(新开控制台

窗口)

mysql -h 127.0.0.1 -P 3306 -uroot
use mysql;
-- update user set host='%' where user='root';
-- flush privileges;
-- exit;

create user 'root'@'%' identified by 'Nov2014';

grant all privileges on *.* to 'root'@'%' with grant option;

flush privileges;

3307与3308端口的mysql实例类似配置,都允许远程登陆。

使用gtid进行主从复制

参考: mysql官方文档: https://dev.mysql.com/doc/refman/8.0/en/replication-gtids-howto.html

  1. 同步服务器(仅对已配置使用传统binlog+文件位置方式复制的情况下需要)
mysql > SET @@GLOBAL.read_only = ON

等待所有正在进行的事务提交或回滚。然后,让副本赶上源。在继续之前确保副本已处理所有更新非常重要

  1. 停止两台服务器
mysqladmin -uroot shutdown

有密码的话, 还需要加-p

  1. 在启动gtid的情况下启动两台服务器。
#master实例配置为使用gtid时增加的配置
server-id=3316
gtid_mode=ON
enforce-gtid-consistency=ON


##slave实例配置为使用gtid时增加的配置
server-id=3317
gtid_mode=ON
enforce-gtid-consistency=ON

gtid_mode要启用基于 GTID 的复制,必须通过将变量 设置为启用 GTID 模式来启动每个服务器 ON,并 enforce_gtid_consistency 启用变量以确保仅记录对基于 GTID 的复制安全的语句。

源服务器添加用于从服务器登陆的账户(这里没有限制登陆范围, 也没有设置密码, 生产环境是需要安全的密码的)

create user rep;
grant replication slave on *.* to rep;
flush privileges;
  1. 将副本配置为使用基于gtid的自动定位。(8.0.23之后的版本使用CHANGE REPLICATION SOURCE TO)
CHANGE REPLICATION SOURCE TO          
                    MASTER_HOST = '127.0.0.1',
          MASTER_PORT = 3316,
          MASTER_USER = 'rep',
          -- MASTER_PASSWORD = password,
          MASTER_AUTO_POSITION = 1
FOR CHANNEL '3317_conn_3316';

注意,对于使用gtid复制,这一步中MASTER_AUTO_POSITION = 1是必要的。

然后启动复制

start slave; // start replica
show slave status;

增加使用gtid的源(多源复制)

与上一节做法相同, 添加一台使用gtid的mysql实例。

在源上创建复制账户(配置gtid之后再创建账户,会导致在副本上也执行一遍, 那时就会导致错误, 需要跳过)

create user rep;
grant replication slave on *.* to rep;
flush privileges;

新增的源配置gtid模式.

#新增master/源实例配置为使用gtid时增加的配置
server-id=3318
gtid_mode=ON
enforce-gtid-consistency=ON

然后在上一节的slave副本(server-id=3317)上,增加新的复制

CHANGE REPLICATION SOURCE TO          
                    MASTER_HOST = '127.0.0.1',
          MASTER_PORT = 3318,
          MASTER_USER = 'rep',
          -- MASTER_PASSWORD = password,
          MASTER_AUTO_POSITION = 1
FOR CHANNEL '3317_conn_3318';

注意,对于使用gtid复制,这一步中MASTER_AUTO_POSITION = 1是必要的。

这里与前面分别定义了通道名’3317_conn_3318’与’3317_conn_3316’, 方便单独管理各个复制。

然后启动复制

# 启动所有复制
start slave; // start replica
show slave status;

# 单独启动'3317_conn_3318'对应的复制
start slave FOR CHANNEL '3317_conn_3318'; // start replica
show slave status;

附录

gitd复制从库跳过某事务

事故

从使用gtid的一主一从, 改为多源复制(增加主实例)时, 副本复制新增源失败。

show slave status,结果slave sql running列显示NO,最近失败列显示: Coordinator stopped because there were error(s) in the worker(s). The most recent failure being: Wor…

处理时参考了以下博文排查步骤:

mysql主从同步报错,提示Last_Error: Coordinator stopped because there were error(s) in the worker(s). The most_jerry-89的博客-CSDN博客

原因

配置源复制时, 先配置gtid模式, 后在源上创建复制账户。导致创建复制账户的过程在副本上也执行了一遍。副本执行出错,复制停止。

处理操作

先按参考博文定位复制失败的位置,

然后按如操作跳过了失败的gtid事务。

stop slave;

show slave status;

SET @@SESSION.GTID_NEXT = '723443fc-cc16-11ec-bc2a-2a06133d06ef:1';

begin;end;
COMMIT;

SET @@SESSION.GTID_NEXT = AUTOMATIC;

start slave;


show slave status;

评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注