利用Navicat傻瓜化实现MySQL8.0主从同步

网上的教程大多是通过命令实现的,我比较懒,想着有没有比较简单的办法来实现呢,平时数据库管理用Navicat用得比较多,就琢磨着试试用navicat来实现。

基本构建思路

1.主从库的数据库版本尽量一致
2.确保数据相同
– 从库必须要有主库上的数据。
3.配置主服务器
– 启用binlog 日志
– 设置server_id
– 设置要同步的数据库
– 设置授权用户
– 记录需要同步的日志文件名及日志开始位置。
4.配置从服务器
– 设置 server_id
– 设置要同步的数据库
– 指定主数据库服务器信息
5. 测试配置
– 客户端连接主库,写入的数据,在连接从库的时候也能够访问到。

下载并安装Navicat

下载及安装激活过程可以查看这篇文章,介绍得很详细:https://www.jianshu.com/p/5f693b4c9468

下载及安装MySQL8.0

下载

MySQL8.0下载地址:https://dev.mysql.com/downloads/mysql/

安装

解压并配置my.ini

下载后解压到E盘根目录,将文件夹重命名为mysql-master,进入mysql-master文件夹,新建my.ini文件,写入以下内容:

[client] 
port=3307
#设置客户端字符集
default-character-set=utf8 
[mysqld]
#绑定IPv4
bind-address = 0.0.0.0
#设置端口号
port=3307 
character_set_server=utf8 
# 设置mysql的安装目录,即你解压缩安装包的位置
basedir=E:/mysql-master
# 设置mysql数据库的数据的存放目录
datadir=E:/mysql-master/data
# 允许最大连接数
max_connections = 200
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
default-storage-engine=INNODB
[WinMySQLAdmin] 
Server = E:/mysql-master/bin/mysqld.exe

由于我的3306端口已被占用,故配置文件写的3307。

初始化data目录

"E:/mysql-master/bin/mysqld" --initialize-insecure --user=mysql

安装mysql服务

"E:/mysql-master/bin/mysqld" install mysql-master --defaults-file="E:/mysql-master/my.ini"

启动MySQL服务

net start mysql-master

修改root账号密码

刚安装完成时root账号默认密码为空,此时可以将密码修改为指定的密码。如:123456
登录数据库:

"E:/mysql-master/bin/mysql" -uroot -P3307

修改密码:

use mysql;
ALTER user 'root'@'localhost' IDENTIFIED BY '123456';


按相同的方法安装另一个mysql服务,文件夹和服务命名为:mysql-slave
PS:从解压开始,不要为了方便直接复制文件夹。注意替换命令中的路径。

安装完成后,在计算机管理->服务中可以看到两个mysql服务都为启动状态:

在Navicat中新建两个数据库链接,分别为mysql-master和mysql-slave,确保都可以连上。

同时为两个数据库都创建一个名为test的数据库,该数据库将用于同步。

环境说明

主Mysql(mysql-master):
ip:127.0.0.1
端口:3307
账号:root
密码:123456
同步数据库名称:test

从MySQL(mysql-slave):
ip:127.0.0.1
端口:3308
账号:root
密码:123456
同步数据库名称:test

目标:mysql-master和mysql-slave实现test数据库的主从同步。

配置主库(mysql-master)

修改主库my.ini配置文件

在my.ini的配置文件中,添加如下信息:

[mysqld]
log-bin=mysql-bin
server-id=3307
binlog-ignore-db=information_schema
binlog-do-db=test

log-bin:表示启用binlog功能,并指定二进制日志的存储目录
server-id:指定唯一的servr ID,两台数据库的server-id必须是不一样的数字,这里为了方便,用端口号作为server-id,一般线上环境可以用ip地址的最后一段作为server-id。
binlog-ignore-db:binlog日志不记录指定库的更新
binlog-do-db:binlog日志只记录指定库的更新

重启主库

net stop mysql-master
net start mysql-master

创建用于同步的账号

在mysql-master创建一个账号,该账号用于mysql-slave连接到mysql-master,允许该账号在mysql-master上读取日志,赋予mysql-slave有File权限及REPLICATION SLAVE的权限。

1.选中mysql-master数据库,点击“用户”->“新建用户”:

2.填写用户名及密码
例如用户名填写:slave,密码填写:slave123
密码过期策略设置为NEVER
主机填写slave的IP地址,这里是127.0.0.1

3.切换至“服务器权限”,勾选FileReplication Slave,点击保存:

4.登录至mysql-slave数据库,测试是否可以使用账号连接到mysql-master
登录上去后,输入mysql命令:

show variables like '%server_id%';

如果显示server_id为3307则说明从库可以顺利连上主库。

线上情况如果连不上,需要检查防火墙是否阻挡或者阿里云安全组是否限制了。

重启主库,登录mysql,查看主库信息

重启mysql-master,登录mysql,查看mysql-master信息:

show master status;

File是同步会使用到的binlog文件

配置从库(mysql-slave)

修改mysql-slave的my.ini配置文件

[mysqld]
log-bin=mysql-bin
server-id=3308
binlog-ignore-db=information_schema
replicate-do-db=test
replicate-ignore-db=mysql
log-slave-updates
slave-skip-errors=all
slave-net-timeout=60

replicate-do-db:要进行主从复制的数据库名
replicate-ignore-db:不进行主从复制的数据库名
log-slave-updates:记录从库更新,允许链式复制( A-B-C )。当该从库作为其他库的主库时,需要添加该参数

重启mysql-slave,进入mysql,配置同步

stop slave;
change master to master_host='127.0.0.1',master_port=3307,master_user='slave',master_password='slave123',master_log_file='mysql-bin.000001', master_log_pos=0;
start slave;

master_host:主库的ip地址,这里为127.0.0.1
master_port:主库的端口,默认为3306,这里为3307
master_user:同步账号,这里为slave
master_password:同步账号的密码,这里为slave123
master_log_file:开始同步的日志文件
master_log_pos:开始同步的日志的开始位置

查看同步状态

show slave status

如果Slave_IO_RunningSlave_SQL_Running的值都是Yes,说明配置成功。

如果Slave_IO_RunningNo,则查看后面的Last_IO_Error字段,里面会有详细的出错原因。
如果Slave_SQL_RunningNo,则查看后面的Last_SQL_Error字段,里面会有详细的出错原因。

测试同步

mysql-master中的test数据库中新建一个表,然后查看mysql-slave中的test数据库是否同步也创建了。

从库IO线程 和SQL线程的作用

IO线程 把主库binlog日志里的sql命令记录到本机的中继日志文件
SQL线程 执行本机中继日志文件里的sql命令,把数据写进本机。

发表评论

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