本文章介绍下MySQL基于GTID复制的主从搭建(当MySQL5.7的版本安装好后,在数据目录下有一个auto.cnf的文件,就是存放着server-uuid):
查看 GTID 的相关的一些变量:
mysql> show variables like '%gtid%';
+----------------------------------+-----------+
| Variable_name | Value |
+----------------------------------+-----------+
| binlog_gtid_simple_recovery | ON |
| enforce_gtid_consistency | OFF |
| gtid_executed_compression_period | 1000 |
| gtid_mode | OFF |
| gtid_next | AUTOMATIC |
| gtid_owned | |
| gtid_purged | |
| session_track_gtids | OFF |
+----------------------------------+-----------+
8 rows in set (0.00 sec)
可以看到,官方的MySQL5.7 默认是没开启GTID的。
一、主库配置
点击首页上的 MySQL 服务图标,进入配置界面:
选择配置修改,可见 MySQL 服务当前的配置内内容:
配置 my.cnf
[mysqld]
#gtid 参数
gtid_mode=ON
enforce-gtid-consistency=ON
#开启log-bin二进制日志
log-bin=mysql-bin
#允许从服务器更新二进制日志
log-slave-updates=1
#配置唯一的服务器ID,一般使用IP最后一位
server-id=81
#GTID 复制时,binlog 使用 ROW 模式
binlog_format=row
#不需要同步的数据库,如果有多个,复制多份指定数据库名即可
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=sys
#下面不是必须配置
#使用带事务的InnoDB进行复制设置时尽可能提高持久性和一致性
innodb_flush_log_at_trx_commit=1
#使binlog在每1次binlog写入后与硬盘同步
sync_binlog=1
#只保留10天的二进制日志,以防磁盘被日志占满
expire-logs-days=10
上述参数中,比较重要的参数介绍:
- (1)、server-id:主从复制中必须的参数,且一个主从复制集群中是必须唯一的。
- (2)、binlog_format=row :二进制日志的存储模式,GTID 复制时,使用 ROW 行模式。
- (3)、 gtid_mode=ON:表示开启 GTID 模式的主从复制。如果 为 OFF ,则不启用 GTID 复制模式,而是普通的异步复制模式。
- (4)、enforce-gtid-consistency=ON :表示开启强一致性,必须设置为 ON。
检验设置是否成功
先使用下面命令登录数据库:
mysql -uroot -p9e1293cf0855f12e -h127.0.0.1
登录成功后输入下面命令检查:
show variables like 'server_id';
再输入命令:
show variables like 'log_bin';
再输入命令:
#skip_networking默认是OFF关闭状态,启用后,主从服务器将无法相互通信,所以这里必须是 OFF
show variables like '%skip_networking%';
全部检查完毕,主节点设置完成!
二、MySQL主数据库,建立主从复制的账号
执行下面命令:
GRANT REPLICATION SLAVE ON *.* to 'duplicator'@'%' identified by 'Ds472HFfiTTckXNB';
GRANT SUPER ON *.* to 'duplicator'@'%' identified by 'Ds472HFfiTTckXNB';
GRANT RELOAD ON *.* to 'duplicator'@'%' identified by 'Ds472HFfiTTckXNB';
一定要记得授权,不然会报下面的错误:
注意:
上面SQL的作用是创建一个用户【duplicator】密码为【Ds472HFfiTTckXNB】并且给【duplicator】用户授予REPLICATION SLAVE 权限,常用于建立复制时所需要用到的用户权限,也就是slave必须被master授权具有该权限的用户,才能通过该用户复制,如下:
然后执行下面命令:
#查看master的状态
show master status\G
主库已经配置好了,下面我们开始配置从库
三、从库配置
先在从库上执行下面语句检查下刚刚建立的账号是否可以连接
#IP是主库IP
mysql -uduplicator -p'Ds472HFfiTTckXNB' -h192.168.3.81
如果连接失败,说明使用的主库账号的远程访问权限没开启(需要开启远程访问权限)
,参考 《MySQL 远程访问权限》 的文章中说明开启主节点的root账号的远程访问,开启后再次重试如下:
配置 my.cnf
然后在【mysqld】节点下面新增下面内容:
[mysqld]
#gtid 参数
gtid_mode=ON
enforce-gtid-consistency=ON
#开启log-bin二进制日志
log-bin=mysql-bin
#使得更新的数据写进二进制日志中
log-slave-updates=1
#配置唯一的服务器ID,一般使用IP最后一位
server-id=82
#GTID 复制时,binlog 使用 ROW 模式
binlog_format=row
#需要同步的数据库,如果有多个,复制多份指定数据库名即可
#此处表示同步testdb
binlog_do_db=testdb
#relay-log-info-repository=TABLE
#relay-log-recovery
relay-log-index=slave-relay-bin.index
relay-log=slave-relay-bin
如下:
然后重启数据库,并查看刚配置的是否生效:
使用从数据库账号登录:
mysql -uroot -p42d464110d0c139f -h127.0.0.1;
show variables like 'server_id';
show variables like 'log_bin';
如果报错:
那就执行:
ALTER USER USER() IDENTIFIED BY '42d464110d0c139f!';
就可以了执行了:
配置复制参数
执行下面命令(从数据库账号登录后操作):
CHANGE MASTER TO MASTER_HOST='192.168.3.81',MASTER_PORT=13306,MASTER_USER='duplicator',MASTER_PASSWORD='Ds472HFfiTTckXNB',MASTER_AUTO_POSITION=1;
下面是主库的参数:
如果执行提示下面失败,表示权限不足:
授权后再执行前面的SQL, 如果执行失败,就执行:reset slave;
我这里执行成功了,就可以执行下面SQL语句启动主从了:
start slave;
查看主库状态
执行下面命令查看从库状态:
show master status\G
查看从库状态
执行下面命令查看从库状态:
show slave status\G
参数介绍:
# 负责与主机的io通信
Slave_IO_Running: Yes
# 负责自己的slave mysql进程
Slave_SQL_Running: Yes
若出错,则清理掉之前的配置,执行以下命令:
mysql> stop slave;
mysql> reset slave all;
注:Slave_IO_Running:写入状态。Slave_SQL_Running:本地数据库运行状态。当2个状态均为yes时,证明数据库主从状态设置成功。
show variables like 'datadir';
select uuid();
如果Slave_IO_Running
状态为no的时候,可能是server uuid的值就和主服务器是一样的。因为是复制来的,可能一样。这个时候,可以将从服务器里面的 auto.cnf 文件删除。重启服务就会生成一个新的。
如果Slave_SQL_Running
状态为No时,一般是主从数据库的初始数据不一致导致的。
解决上面问题之后。再次执行配置从服务器Slave,当2个都为yes的时候,主从服务器配置完成。可以在主库新建一个数据库。从库就会自动创建。这时候不要去操作从库,因为修改会导致主从失败。
测试
在我本地用Navicat工具连接主库和从库:
当前两个库都是一样的库,现在在主库上面新建一个【testdb】数据库,然后从库直接刷新,就可以看到这个数据库了,同样的,你在主库上新建什么表,添加什么数据,刷新从库后,会发现,数据都在了,说明测试成功了,现在主从复制功能就实现了:
参考文章:
https://blog.csdn.net/wujiangbo520/article/details/128150824
最后编辑:Jeebiz 更新时间:2024-08-22 10:22