网上的教程大多是通过命令实现的,我比较懒,想着有没有比较简单的办法来实现呢,平时数据库管理用Navicat用得比较多,就琢磨着试试用navicat来实现。
基本构建思路
1.主从库的数据库版本尽量一致
2.确保数据相同
– 从库必须要有主库上的数据。
3.配置主服务器
– 启用binlog 日志
– 设置server_id
– 设置要同步的数据库
– 设置授权用户
– 记录需要同步的日志文件名及日志开始位置。
4.配置从服务器
– 设置 server_id
– 设置要同步的数据库
– 指定主数据库服务器信息
5. 测试配置
– 客户端连接主库,写入的数据,在连接从库的时候也能够访问到。
下载及安装激活过程可以查看这篇文章,介绍得很详细: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.切换至“服务器权限”,勾选File
和Replication 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_Running
和Slave_SQL_Running
的值都是Yes
,说明配置成功。
如果Slave_IO_Running
为No
,则查看后面的Last_IO_Error字段,里面会有详细的出错原因。
如果Slave_SQL_Running
为No
,则查看后面的Last_SQL_Error字段,里面会有详细的出错原因。
测试同步
在mysql-master
中的test数据库中新建一个表,然后查看mysql-slave
中的test数据库是否同步也创建了。
从库IO线程 和SQL线程的作用
IO线程 把主库binlog日志里的sql命令记录到本机的中继日志文件
SQL线程 执行本机中继日志文件里的sql命令,把数据写进本机。