一、准备环境
-
1、两台mysql 8.0数据库的服务器,分别为源端数据库和目标段数据库(如果想要搭建多个数据库数据库复制,可以尝试innodb集群)
-
2、查看两个数据库的server_id,确保两个数据库的server_id不一样,每个mysql数据库的初始server_id为1。
mysql>show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 1 |
+---------------+-------+
1 row in set (0.01 sec)
#将源端和副本的server_id设置成不一样的值
mysql>SET GLOBAL server_id = 2;
3、查看源端的数据库是否开启二进制日志记录(binlog)
mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | ON |
+---------------+-------+
1 row in set (0.01 sec)
#若源端未开启二进制日志(binlog)记录,则开启该配置,在mysql 8.0中binlog默认开启
4、在创建数据快照或者开始复制之前,在源端记录二进制日志中的当前位置,配置副本时以便副本知道二进制日志中开始执行事件的位置。
5、为了在使用InnoDB与事务的复制设置中获得最大的持久性和一致性,在源端的my.cnf配置文件中加入
echo 'innodb_flush_log_at_trx_commit=1'>>/etc/my.cnf
echo 'sync_binlog=1' >> /etc/my.cnf
#要放在[mysqld]下,不要放在[client],否则会导致连接数据库时读取参数文件出现问题导致无法连接至数据库
6、确保在源端上未启用skip_networking系统变量。如果网络已禁用,副本无法与源端通信,复制失败。
7、在源端数据库创建一个用户并对其进行授权,用于副本连接到源端进行复制。创建的命令如下:
mysql>create user 'repl'@'%' identified by 'password';
mysql>grant replication slave on *.* to 'repl'@'slave_host';
8、获取源端的二进制日志的坐标,在源端刷新所有的表和数据块:
mysql>flush tables with read lock;
#在源端的不同会话中查看当前的二进制日志文件名称和位置
ysql> show master status\G
*************************** 1. row ***************************
File: binlog.000007
Position: 157
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)
#file显示日志文件的名称,position显示文件中的位置,记录这些数值坐标,在稍后的配置副本时需要用到。
二、设置副本连接源端复制相关参数准备复制
1、要设置副本与源端通信,在副本上配置有必要的连接信息,执行change replication source to 语句(从mysql 8.0.23)或者change master to 语句(在8.0.23之前),将选项值替换为与系统相关的实际值。
mysql> CHANGE MASTER TO
-> MASTER_HOST='source_host_name',
-> MASTER_USER='replication_user_name',
-> MASTER_PASSWORD='replication_password',
-> MASTER_LOG_FILE='recorded_log_file_name',
-> MASTER_LOG_POS=recorded_log_position;
Or from MySQL 8.0.23:
mysql> CHANGE REPLICATION SOURCE TO
-> SOURCE_HOST='source_host_name',
-> SOURCE_USER='replication_user_name',
-> SOURCE_PASSWORD='replication_password',
-> SOURCE_LOG_FILE='recorded_log_file_name',
-> SOURCE_LOG_POS=recorded_log_position;
#复制不能使用Unix套接字文件。必须能够使用TCP/IP连接到源端的mysql服务器。
2、在副本配置完成后,输入开始命令开始开始进行复制。
mysql>start replica;
三、源端和副本查看复制状态
1、副本查看复制状态;
mysql>show slave status\G
Or from MYSQL 8.0.23:
mysql>show replica status\G
2、源端查看连接状态;
mysql>show replicas;