环境准备
主数据库:CentOS7 MySQL8.0 192.168.10.6 keepalived
从数据库:CentOS7 MySQL8.0 192.168.10.7 keepalived
GTID主从复制的配置思路:
第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;