隐藏

Windows环境下MySQL主从复制

发布:2023/4/15 21:17:20作者:管理员 来源:本站 浏览次数:746

一、安装两个MySQL服务


1. 安装第一个MySQL服务

从网上下载一个MySQL免安装版,改下配置信息,注册服务启动即可。

我这里用的是mysql-5.7.32-winx64版本,


(有需要压缩包的可以私信我)

压缩包里面的东西如下:




新建一个my.ini文件,内容如下:

[mysql]

default-character-set=utf8


[mysqld]

character-set-server=utf8

default-storage-engine=INNODB


port=3306

bind-address=0.0.0.0


将my.ini文件放到MySQL的目录下:



以管理员的身份运行命令行,切换到MySQL目录下,运行mysql install命令:


这样就在windows安装了MySQL服务。


2. 开启MySQL的binlog

先检查MySQL是否开启binlog,可以用命令show variables like 'log_%';


第一次查看可能是OFF,需要在my.ini中添加如下配置信息开启binlog:


[mysqld]

#保存日志的位置,实际生成的日志会在后面添加对应的标志

log-bin = D:\mysql-5.7.32-winx64\data

#日志保存天数

expire-logs-days = 14

#日志大小

max-binlog-size = 500M

#用于同步时区分mysql实例,唯一,5.7以上版本必须填写

server-id = 1

#日志格式,MIXED,ROW,STATEMENT

binlog_format ='MIXED'


然后重启MySQL服务,重新用命令查看binlog状态即可。


3. 安装第二个MySQL服务

第一个MySQL服务安装完毕后,将MySQL的文件夹重新复制一份,并重命名为mysql-5.7.32-winx64-follower。修改下该文件夹下的my.ini文件,

1)修改端口号为3307。

2)修改server-id为2。

修改后的内容如下:

[mysql]

default-character-set=utf8


[mysqld]

character-set-server=utf8

default-storage-engine=INNODB


port=3307

bind-address=0.0.0.0


[mysqld]

#保存日志的位置,实际生成的日志会在后面添加对应的标志

log-bin = D:\mysql-5.7.32-winx64-follower\data

#日志保存天数

expire-logs-days = 14

#日志大小

max-binlog-size = 500M

#用于同步时区分mysql实例,唯一,5.7以上版本必须填写

server-id = 2

#日志格式,MIXED,ROW,STATEMENT

binlog_format ='MIXED'


修改完成后,同样管理员命令行进入到mysql-5.7.32-winx64-follower\bin目录下,执行mysql install MYSQLFollower命令,将注册一个新的服务到Windows。



此时,我们尝试启动该服务时,会出现报错信息。这时需要修改MYSQLFollower的注册表信息,我们使用快捷键win+r打开运行窗口,输入regedit然后回车打开注册表。找到刚刚安装的MYSQLFollower注册信息:



我们发现路径还是指向的之前的MySQL服务的路径,只需要更新路径地址到最新的地址即可(只需要修改路径地址,后面的服务名不需要改动)。


然后,重新启动即可。这时候,两个MySQL服务都已经启起来了。

二、MySQL主从复制配置


1. 主库中创建一个用户给从库进行IO连接

1)创建用户:CREATE USER 'slave'@'localhost' IDENTIFIED BY '123456';

2)授权:GRANT ALL ON . TO 'slave'@'localhost';

2. 主库查看binlog的位置

使用命令show master status; 找到File 和 Position 的值记录下来。


我们可以在主库my.ini中添加如下配置信息:


#需要复制的库,多个库用逗号隔开,如果此项不配置所有主库都参与复制

binlog-do-db=test

#binlog-ignore-db=mysql #不需要复制的库,和上项同理

#=========主从复制关键配置=====================


3. 从库slave指向master地址

在从库中使用命令:

change master to master_host=’127.0.0.1’,master_user=’slave’,master_password=’123456’, master_log_file=’data.000003’,master_log_pos=5050;


master_log_file参数和master_log_pos参数必须和步骤2里的参数一致。


使用命令show slave status;命令查看从库状态:



若Slave_IO_Running:Yes 以及Slave_SQL_Running:Yes 代表成功;若不成功,往下查看错误日志再进行相应处理。


问题一:如果是Slave_SQL_Running:no

能看到后面的错误信息是:[ERROR] Slave I/O for channel ‘’: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work. Error_code: 1593。

问题定位:由于uuid相同,而导致触发此异常。

解决方案:把uuid修改即可。修改D:\mysql-5.7.32-winx64-follower\data\auto.cnf,把里面的server-uuid修改成不一样的值即可。


重启从库的MySQL服务。


问题二:错误信息是:Error reading packet from server for channel '': bogus data in log event; the first event 'mysqlbinlog.000001' at 869, the last event read from './mysqlbinlog.000001' at 123, the last byte read from './mysqlbinlog.000001' at 888. (server_errno=1236)。

解决方案:

master端:

mysql> flush logs;

Query OK, 0 rows affected (0.02 sec)


mysql> show master status;

重新记住file和position这两个选项。比如data.000004,640。


slave端:

mysql> stop slave;

Query OK, 0 rows affected (0.01 sec)


mysql> change master to master_host=’127.0.0.1’,master_user=’slave’,master_password=’123456’, master_log_file=’data.000004’,master_log_pos=640;

Query OK, 0 rows affected (0.01 sec)


mysql> start slave;

Query OK, 0 rows affected (0.00 sec)


用命令查看show slave status;再次查看状态就会发现成功了。


这时,我们可以尝试新增、修改和删除主库里的表记录了,会发现从库里面的表记录也跟着变化了。此时,主从复制的配置大功告成!!!