MySQL 8 复制

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';

 

 

 

 

你可能感兴趣的:(MySQL 8 复制)