OpenAnolis8配置MySQL5.7主从复制🍒
MySQL5.7有多种主从复制方式,本文使用GTID方式做主从复制。
一、GTID主从复制的核心原理
-
GTID的组成
GTID由两部分组成:-
server_uuid
:MySQL实例的唯一标识符,存储在数据目录的auto.cnf
文件中。 -
transaction_id
:事务提交时生成的递增序列号,保证同一实例内唯一。
-
-
工作流程
-
主库事务提交:主库为每个事务生成GTID并记录到二进制日志(binlog)中。
-
从库同步:
-
I/O线程:从库通过I/O线程拉取主库的binlog并写入本地中继日志(relay log)。
-
SQL线程:从库读取relay log中的GTID,检查本地
gtid_executed
集合。若该GTID未执行,则执行事务并记录到自身binlog;若已存在则跳过。
-
-
自动定位:通过
MASTER_AUTO_POSITION=1
参数,从库自动向主库请求缺失的GTID事务,无需手动指定log_file
和log_pos
。
-
-
核心优势
-
简化故障转移:无需手动查找binlog位置,直接基于GTID自动同步。
-
数据一致性:GTID连续无空洞,确保主从数据一致。
-
安全性:每个GTID仅执行一次,避免重复执行导致数据混乱。
-
二、GTID主从复制的部署步骤
1. 环境准备
-
主库(Master):IP
192.168.66.189
,MySQL 5.6及以上版本。 -
从库(Slave):IP
192.168.66.244
,MySQL版本需与主库一致。 -
确保主从服务器时间同步(如使用Chrony服务,见chrony时间同步)。
2. 主库配置
部署MySQL见 MySQL5.7部署,这里不再赘述。
修改配置文件/etc/my.cnf,添加GTID配置信息。
[root@localhost ~]# vim /etc/my.cnf
[client]
# 默认连接 MySQL 时使用的字符集
default-character-set = utf8mb4
socket=/var/lib/mysql/mysql.sock
[mysqld]
user=mysql
socket=/var/lib/mysql/mysql.sock
port=3306
pid-file=/var/lib/mysql/mysql.pid
basedir=/usr/local/mysql5.7
datadir=/var/lib/mysql
# GITD配置
server-id = 1
log-bin = mysql-bin
gtid_mode = ON
enforce_gtid_consistency = ON
log-slave-updates = ON
binlog_format = ROW
skip_slave_start = 1
lower_case_table_names = 1
explicit_defaults_for_timestamp = 1
#日志配置
log-error = /var/log/mysql/error.log
slow-query-log = 1
slow-query-log-file = /var/log/mysql/mysql-slow.log
long_query_time = 2
expire_logs_days = 7
# 字符集设置及排序规则
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
重启MySQL
[root@localhost ~]# systemctl restart mysql
创建复制用户
[root@localhost ~]# mysql -uroot -p
mysql> CREATE USER 'repl'@'192.168.66.244' IDENTIFIED BY 'Noleaf';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.66.244';
mysql> FLUSH PRIVILEGES;
3. 从库配置
修改配置文件,添加GTID配置信息。
[root@localhost ~]# vim /etc/my.cnf
[client]
# 默认连接 MySQL 时使用的字符集
default-character-set = utf8mb4
socket=/var/lib/mysql/mysql.sock
[mysqld]
user=mysql
socket=/var/lib/mysql/mysql.sock
port=3306
pid-file=/var/lib/mysql/mysql.pid
basedir=/usr/local/mysql5.7
datadir=/var/lib/mysql
# GITD配置
server-id = 2
log-bin = mysql-bin
gtid_mode = ON
enforce_gtid_consistency = ON
log-slave-updates = ON
binlog_format = ROW
skip_slave_start = 1
lower_case_table_names = 1
explicit_defaults_for_timestamp = 1
#日志配置
log-error = /var/log/mysql/error.log
slow-query-log = 1
slow-query-log-file = /var/log/mysql/mysql-slow.log
long_query_time = 2
expire_logs_days = 7
# 字符集设置及排序规则
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
重启MySQL
[root@localhost ~]# systemctl restart mysql
4. 数据同步
导出主库数据
[root@localhost ~]# mysqldump -uroot -p --all-databases --single-transaction --set-gtid-purged=ON > master_dump.sql
导入从库
[root@localhost ~]# mysql -uroot -p < master_dump.sql
5. 启动主从复制
配置从库连接主库
[root@localhost ~]# mysql -uroot -p
mysql> CHANGE MASTER TO
MASTER_HOST = '192.168.66.189',
MASTER_USER = 'repl',
MASTER_PASSWORD = 'Noleaf',
MASTER_AUTO_POSITION = 1;
启动复制
mysql> start slave;
验证复制状态
mysql> SHOW SLAVE STATUS\G;
主要观察以下两个线程状态
6. 总结
基于GTID的主从复制通过全局事务标识符实现了高可靠、自动化的数据同步,尤其适合复杂拓扑和高可用场景。
部署时需注意GTID模式的一致性配置及数据备份的完整性,日常运维中可通过GTID集合监控快速定位同步问题。