MySQL 8.0 支持的复制方法:
传统方法(基于二进制日志文件位置)
新方法(基于GTID)
MySQL 8.0 支持的同步类型:
异步复制(内置)
同步复制(NDB集群)
半同步复制(半同步复制插件)
延迟复制(CHANGE MASTER TO语句的MASTER_DELAY选项)
MySQL 8.0 支持的复制格式类型:
基于语句的复制(binlog_format=statement)
基于行的复制(binlog_format=row)
基于混合模式的复制(binlog_format=mixed)
设置基于二进制日志文件位置的复制
设置中需要考虑的常见地方:
Master端,启用二进制日志、设置一个唯一的Server ID。
Slave端,设置一个唯一的Server ID。
注:如果Slave是从Master克隆的,比如虚拟机,注意删除Slave端数据目录下的auto.cnf文件。该文件记录了Server UUID,在复制环境中,Server UUID也需要唯一。在MySQL Server启动后,会重新生成该文件。
可选的,为Slave创建一个单独用户用于读取Master二进制日志。
在创建快照或者启动复制前,需要记录Master端当前的二进制日志文件位置。这个位置是作为复制起始点的。可以通过mysqldump工具提供的--master-data选项在备份Master数据时,记录备份开始时二进制日志坐标位置。在备份数据时还需要考虑存储数据所使用的存储引擎,对于非事务存储引擎,比如MyISAM,需要在Master端获取一个读锁(比如:flush tables with read lock;)来停止处理语句,拷贝数据,读取二进制日志坐标位置。对支持事务的存储引擎,比如InnoDB,不需要获取读锁,可以通过多版本读一致性,mysqldump工具提供的--single-transaction选项实现。这里需要事务足够长,能够传输快照(可能存在类似Oracle中快照过久的问题)。
配置Slave端连接信息。
实现Master和Slave之间的安全复制。
下面是具体实现:
配置Master端
在MySQL 8.0版本,二进制日志默认启动,通过下面命令验证:
mysql> select @@log_bin;
可以位置二进制日志指定非默认base name,这是也推荐的。在my.cnf选项文件中添加如下信息:
log_bin='/usr/local/mysql-5.7.28-linux-glibc2.12-x86_64/log/binlog'
设置MySQL Server ID,在my.cnf选项文件中添加如下信息:
server_id=140
注:Server ID需要在复制环境中唯一,用来唯一标识Server。在MySQL 8.0 中,Server ID默认值是1,之前的版本这个值是需要显式设置的,否则二进制日志不能启用。Server ID的值不能设置为 0,在Master端如果该值为 0,会导致Slave不能连接到该Master;如果Slave端Server ID设置为 0,会导致Slave拒绝连接到Master端。这里用IP地址的最后一位来作为Server ID。
下面这些是可选的系统变量设置:
innodb_flush_log_at_trx_commit=1
sync_binlog=1
注:这两个系统变量用于保证最大的持久性和一致性。
skip_networking 系统变量不能启用,否则会导致Slave无法连接到Master。
配置Slave端
在Slave端需要配置Server ID,在整个复制拓扑中唯一,比如:
server_id=150
注:MySQL 8.0 中由于默认启用了二进制日志,该日志在Slave端不是必须的,如果不需要,可以通过如下方式禁用:
skip_log_bin=1
log_slave_updates=0
在Slave端启用二进制日志的好处:Slave可以做备份和崩溃恢复,以及在级联复制中,即作为slave也作为master。
Slave端的中继日志默认使用的是主机名作为base name,可以通过下面系统变量调整设置:
relay_log='/usr/local/mysql/log/relay-bin'
为复制创建用户
mysql> create user 'repl'@'192.168.1.%' identified by 'oracle';
mysql> grant replication slave on *.* to 'repl'@'192.168.1.%';
注:在MySQL 8.0中,默认是caching_sha2_password 插件做用户认证。通过该用户连接到Master有两种方式:使用加密连接或者RSA密钥。
获取Master二进制日志坐标
情况一:如果计划停掉Master来做数据快照,获取二进制日志索引文件即可获取二进制日志坐标,因为下次Master Server启动后会生成一个新的二进制日志文件。
情况二:如果是新的Master和Slave环境,可以通过下面方式获取Master二进制日志坐标:
mysql> show master status;
情况三:如果Master是包含数据正在运行的环境,可以通过下面方式获取二进制日志坐标:
mysql> flush tables with read lock;
注:该语句会阻塞用户的写操作。同时注意在完成后续操作前,不要退出运行该语句的会话,否则READ LOCK会被释放。
mysql> show master status;
情况四:如果之前Master没有启用二进制日志,那么二进制日志坐标是 ' ' 和 4。
选择方法做数据快照
方法1:使用mysqldump工具做数据快照,这对于使用InnoDB存储引擎存储数据的Master更加合适。比如:
mysqldump -uroot -poracle --all-databases --master-data > dbdump.db
注:mysqldump 选项说明:
--master-data:使用这个参数会在DUMP文件中生成备份开始时的二进制日志坐标位置,这个位置信息在做时间点恢复或者配置复制时使用。这个选项也会自动添加一个全局读锁,在备份完成后自动释放读锁。因此,如果使用该选项,前面的FLUSH TABLES WITH READ LOCK语句则不需要了。一般与--single-transaction配合使用,仅在开始时添加读锁。
--single-transaction:在单个事务中对所有表做一致性快照。仅对支持多版本的存储引擎保证DUMP文件一致性,目前只有InnoDB。为保证有效的DUMP文件,在备份过程中,需要没有其他的ALTER TABLE, DROP TABLE, RENAME TABLE,TRUNCATE TABLE操作。
--set-gtid-purged:如果Master和Slave开启了GTID,DUMP文件默认包含GTID信息,可以通过该参数调整。
方法2:使用裸数据文件创建数据快照
设置复制Slave
步骤1:
情况一:如果Master和Slave都是新的,可以启动Slave并执行CHANGE MASTER TO语句。
情况二:如果新的Master数据来源于其他数据库,可以先配置好主从复制,在将数据导入到Master,这样数据会自动复制到Slave端。比如:
shell> mysql -h master < fulldb.dump
情况三:如果需要导入Master的快照数据,可以根据产生数据快照的方法进行数据导入,比如:
使用mysqldump工具导入数据:
shell> mysql < fulldb.dump
使用裸数据文件创建的快照,可以通过下面方式提取数据文件到数据目录:
shell> tar xvf dbdump.tar
步骤2:
使用 --skip-slave-start 选项启动Slave Server,这样复制在启动时不会开始。如果Slave端没有配置到Master端的复制连接信息,这个选项可以不添加。
步骤3:
配置Slave到Master连接,比如:
CHANGE MASTER TO
MASTER_LOG_FILE='binlog.000001',
MASTER_LOG_POS=155,
MASTER_USER='repl',
MASTER_PASSWORD='oracle',
MASTER_HOST='192.168.1.140',
MASTER_SSL=1;
步骤4:
启动Slave 线程:
mysql> start slave;
补充:
查看复制连接信息,可以通过下面命令,比如:
mysql> show slave status\G
Slave提供了两个状态日志用于跟踪复制进度,存储复制配置信息:
MySQL 8.0 中默认使用mysql.slave_master_info、mysql.slave_relay_log_info表。在之前的版本中,master_info_repository、relay_log_info_repository配置使用table或者file存储信息。
在执行上面的CHANGE MASTER TO 语句时有两个WARNINGS,解决方法如下:
通过SSL连接到Slave后,执行下面的命令:
CHANGE MASTER TO
MASTER_LOG_FILE='binlog.000001',
MASTER_LOG_POS=155,
MASTER_HOST='192.168.1.140',
MASTER_SSL=1;
START SLAVE USER='repl' PASSWORD='oracle';