image.png

环境准备

主数据库:CentOS7    MySQL8.0    192.168.10.6    keepalived

从数据库:CentOS7    MySQL8.0    192.168.10.7    keepalived

GTID主从复制的配置思路:

spacer.gifimage.png

第1步:同步服务器。  只有在不使用GTID的情况下复制服务器时才需要执行此步骤。对于新服务器,请继续执行步骤3. 通过发出以下命令,将服务器设置为每个服务器上read_only系统变量为 只读 ON

mysql> SET @@global.read_only = ON;

第2步:停止两台服务器。 如下所示, 使用mysqladmin停止每个服务器,其中username是具有足够权限关闭服务器的MySQL用户的用户名:

shell> mysqladmin -uusername -p shutdown

第3步:启用启用了GTID的两台服务器。

主数据库配置:

vim /etc/my.cnf

server-id=10

gtid-mode=on

enforce-gtid-consistency=true

master-info-repository=TABLE

relay-log-info-repository=TABLE

sync-master-info=1

slave-parallel-workers=2

binlog-checksum =CRC32

master-verify-checksum=1

slave-sql-verify-checksum=1

binlog-rows-query-log-events=1

slave_parallel_type=logical_clock

log-bin=mysql-bin.log

binlog_format=row

relay-log=relay-log.log

skip_slave_start=1

#report-port=3306

#report-host=192.168.10.9

注:有了skip_slave_start,除非使用START SLAVE命令,否则从服务器不会开始复制。

注:设置log_slave_updates,让从服务器更新记录日志,有助于在必要时把从切换成主。

注:在 MySQL 5.6 版本时,基于 GTID 的复制中 log-slave-updates 选项是必须的。但是其增大了从服务器的IO负载, 而在 MySQL 5.7 中该选项已经不是必须项。

重启服务

systemctl restart mysqld

2、在主数据库里创建一个同步账号并授权slave权限

1)每个从数据库会使用一个MySQL账号来连接主数据库,所以我们要在主数据库里创建一个账号,并且该账号要授予 REPLICATION SLAVE 权限,你可以为每个从数据库分别创建账号,当然也可以用同一个!

2)你可以用原来的账号不一定要新创账号,但你应该注意,这个账号和密码会被明文存放在master.info文件中,因此建议单独创一个只拥有相关权限的账号,以减少对其它账号的危害!

3)创建新账号使用“CREATE USER”,给账号授权使用“GRANT”命令,如果你仅仅为了主从复制创建账号,只需要授予REPLICATION SLAVE权限。

4)下面来创建一个账号,账号名:test,密码:Test@123,只允许192.168.1.的IP段登录,如下:

mysql> create user 'test'@'192.168.10.%' identified by 'Test@123';

mysql> grant replication slave on *.* to 'test'@'192.168.10.%';

mysql> flush privileges;

5)如果开启防火墙,可能要配置下端口,如下:

firewall-cmd --zone=public --add-port=3306/tcp --permanent

firewall-cmd --reload

从数据库配置:

vim /etc/my.cnf

server-id=20

gtid-mode=on

enforce-gtid-consistency=true

master-info-repository=TABLE

relay-log-info-repository=TABLE

sync-master-info=1

slave-parallel-workers=2

binlog-checksum =CRC32

master-verify-checksum=1

slave-sql-verify-checksum=1

binlog-rows-query-log-events=1

relay-log=relay-log.log

log-bin=mysql-bin.log

binlog_format=row

skip_slave_start=1

#report-port=3306

#report-host=192.168.10.9

重启服务

systemctl restart mysqld

第4步:配置从站使用基于GTID的自动定位。  告诉从属使用基于GTID事务的主数据作为复制数据源,并使用基于GTID的自动定位而不是基于文件的定位。

mysql> CHANGE MASTER TO

MASTER_HOST = 'host', 

MASTER_PORT = port, 

MASTER_USER = 'user', 

MASTER_PASSWORD = 'password', 

MASTER_AUTO_POSITION = 1;

第5步:采取新的备份。启用GTID之前创建的现有备份现在不能再用于这些服务器,因为您已启用GTID。在这一点上做一个新的备份,这样你就不会没有可用的备份。

第6步:启动从站并禁用只读模式。  像这样启动slave:

mysql> START SLAVE;

查看从服务器状态

mysql> show slave status\G;

只有在步骤1中将服务器配置为只读时,才需要执行以下步骤。要允许服务器再次开始接受更新,请发出以下语句:

mysql> SET @@global.read_only = OFF;

重要参数说明:

Retrieved_Gtid_Set: d1fabc3d-4ac8-11e8-9d05-000c292bff01:12-20

Executed_Gtid_Set: d1fabc3d-4ac8-11e8-9d05-000c292bff01:1-20

Retrieved_Gtid_Set:表示接收到的事物

Executed_Gtid_Set:表示已经执行完的事物

当主库修改后,从库同步报错的问题?

MySQL从库在应用日志的时候报出了错误。从库启用过了并行复制。

Last_SQL_Error: Coordinator stopped because there were error(s) in the worker(s). The most recent failure being: Worker 1 failed executing transaction 'd1fabc3d-4ac8-11e8-9d05-000c292bff01:12' at master log mysql-bin.000007, end_log_pos 1084. See error log and/or performance_schema.replication_applier_status_by_worker table for more details about this failure or others, if any.

修复方式和常规的略有一些差别

stop slave;

set @@session.gtid_next='d1fabc3d-4ac8-11e8-9d05-000c292bff01:12';

begin;

commit;

set @@session.gtid_next='automatic';

start slave;