Mysql

一、mysql8.0安装(创建个人用户、配置读写执行权限、配置远程权限)

1. 配置官方 Yum 仓库

[root@nginx1 ~]# wget https://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm
[root@nginx1 ~]# rpm -Uvh mysql80-community-release-el7-7.noarch.rpm

2. 安装 MySQL 8.0

[root@nginx1 ~]# yum install -y mysql-community-server --nogpgcheck
#跳过签名认证

3. 启动 MySQL 服务并设置开机启动

[root@nginx1 ~]# systemctl start mysqld
[root@nginx1 ~]# systemctl enable mysqld

4. 获取初始 root 密码

[root@nginx1 ~]# grep 'temporary password' /var/log/mysqld.log
2025-06-24T02:31:11.460822Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: I?0E>Dx65hF:

5. 登录并修改 root 密码

[root@nginx1 ~]# mysql -u root -p
# 输入上一步获取的临时密码   I?0E>Dx65hF:

# 修改密码(注意:必须包含大小写字母、数字、特殊字符)
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'Root@1234';

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'Root@1234';
Query OK, 0 rows affected (0.00 sec)

#查看当前策略
mysql> SHOW VARIABLES LIKE 'validate_password%';
+-------------------------------------------------+--------+
| Variable_name                                   | Value  |
+-------------------------------------------------+--------+
| validate_password.changed_characters_percentage | 0      |
| validate_password.check_user_name               | ON     |
| validate_password.dictionary_file               |        |
| validate_password.length                        | 8      |
| validate_password.mixed_case_count              | 1      |
| validate_password.number_count                  | 1      |
| validate_password.policy                        | MEDIUM |
| validate_password.special_char_count            | 1      |
+-------------------------------------------------+--------+
8 rows in set (0.00 sec)

6.编辑配置文件永久修改密码策略(降低密码复杂度,便于自己练习使用)

[root@nginx1 ~]# vim /etc/my.cnf

#在 [mysqld] 区块下添加以下内容(如果已有则修改):
validate_password.policy=LOW
validate_password.length=4
validate_password.special_char_count=0
validate_password.check_user_name = OFF

[root@nginx1 ~]# systemctl restart mysqld

#修改密码为root
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';
Query OK, 0 rows affected (0.00 sec)

7.允许 MySQL 接受远程连接

[root@nginx1 ~]# vim /etc/my.cnf

找到 [mysqld] 段,在下面添加(或修改):

bind-address=0.0.0.0

表示允许所有 IP 访问 MySQL。

重启 MySQL 服务

[root@nginx1 ~]# systemctl restart mysqld

8.创建远程用户并授权

GRANT ALL PRIVILEGES ON *.* TO 'abcd'@'%' WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES;

二、下载navicat,连接mysql

三、练习DQL查询语法

四、mysql数据备份:全库全量备份,分表全量备份,全库增量备份。

全库全量备份:对数据库中的 所有表、所有数据、所有结构信息 做一次完整备份,相当于把整个数据库打包复制一份。常用于基线备份、灾备镜像、重大变更前的保护点。

分表全量备份:不是一次打包整个库,而是 按照表为单位 对数据库里每张表的数据做完整备份。一般场景:数据库很大,或者备份策略要求单表可恢复,用于粒度更细的恢复场景。

全库增量备份:基于上次的全量(或增量)备份,只备份 自那次备份之后新增加或发生变化的数据,这样备份文件小、效率高。恢复时,需要先恢复最近一次全量,再依次恢复后续增量备份。

1.全库全量备份

[root@nginx1 ~]# mysqldump -u root -proot --all-databases > /opt/all.sql 
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@nginx1 ~]# ll /opt
总用量 1276
-rw-r--r--. 1 root root 1305272 6月  28 14:53 all.sql
drwxr-xr-x. 2 root root       6 9月   7 2017 rh

2.分表全量备份

就是备份某个库里的某张表(含结构 + 数据)。命令示例如下:

mysqldump -u root -p 数据库名 表名 > /备份路径/文件名.sql

比如备份 test 数据库中的 emp 表:

[root@nginx1 ~]# mysqldump -u root -p test emp > /opt/test_emp.sql
Enter password:  root
[root@nginx1 ~]# ll /opt
总用量 1280
-rw-r--r--. 1 root root 1305272 6月  28 14:53 all.sql
drwxr-xr-x. 2 root root       6 9月   7 2017 rh
-rw-r--r--. 1 root root    3239 6月  28 15:29 test_emp.sql

3.全库增量备份

增量备份:增量备份是针对于数据库的bin-log日志进行备份的,需要开始数据库的bin-log日志。增量备份是在全量的基础上进行操作的。增量备份主要是靠mysql记录的bin-log日志。(可以把二进制日志保存成每天的一个文件)

创建存放日志目录

[root@nginx1 ~]# mkdir -p /wwq/logs/mysql/

1.开启二进制日志文件;

[root@nginx1 ~]# echo -e "log-bin = /wwq/logs/mysql nserver_id = 1n max_binlog_size = 100M " >>/etc/my.cnf
配置项 作用
log-bin = /wwq/logs/mysql 启用 二进制日志(binlog)功能,日志文件将以 /wwq/logs/mysql 为前缀,保存在该目录中(MySQL 会自动加上 .000001 这类后缀)。这一步是启用增量备份、主从复制的前提条件。
server_id = 1 设置 MySQL 的 服务器唯一标识,主从复制中必须设置,不能重复。单机使用也必须设置才能启用 binlog。
max_binlog_size = 100M 设置单个 binlog 文件的最大大小为 100MB,超过这个大小时会生成新日志文件。

2.确保 /wwq/logs/ 目录存在且 MySQL 有写权限

[root@nginx1 ~]# chown -R mysql:mysql /wwq/logs

3,重启服务

[root@nginx1 ~]# systemctl restart mysqld

根据 Position 恢复:

[root@nginx1 ~]# mysqlbinlog --start-position=1 --stop-position=795 /wwq/logs/mysql.000001 | mysql -uroot -proot
mysqlbinlog: [Warning] option 'start-position': unsigned value 1 adjusted to 4.
mysql: [Warning] Using a password on the command line interface can be insecure.

根据时间点恢复(注意使用英文单引号):

[root@nginx1 ~]# mysqlbinlog --start-datetime='2025-06-28 14:49:25' --stop-datetime='2025-06-28 14:52:39' /wwq/logs/mysql.000001 | mysql -uroot -proot
mysql: [Warning] Using a password on the command line interface can be insecure.

恢复整个 binlog 文件:

[root@nginx1 ~]# mysqlbinlog /wwq/logs/mysql.000001 | mysql -uroot -proot
mysql: [Warning] Using a password on the command line interface can be insecure.

五、数据库MySQL集群MGR搭建,并总结mysql集群的实现方式。

1.MGR 前置介绍

阿里云RDS集群方案用的就是MGR模式!

1.1.什么是 MGR

MGR(MySQL Group Replication)是MySQL 5.7.17版本诞生的,是MySQL自带的一个插件,可以灵活部署。
保证数据一致性又可以自动切换,具备故障检测功能、支持多节点写入。
集群是多个MySQL Server节点共同组成的分布式集群,每个Server都有完整的副本,它是基于ROW格式的二进制日志文件和GTID特性。

1.2.MGR 优点

强一致性:基于原生复制及paxos协议的组复制技术,并以插件的方式提供,提供一致数据安全保证。
高容错性:只要不是大多数节点坏掉就可以继续工作,有自动检测机制,当不同节点产生资源争用冲突时,不会出现错 误,按照先到者优先原则进行处理,并且内置了自动化脑裂防护机制。
高扩展性:节点的新增和移除都是自动的,新节点加入后,会自动从其他节点上同步状态,直到新节点和其他节点保持一 致,如果某节点被移除了,其他节点自动更新组信息,自动维护新的组信息。
高灵活性:有单主模式和多主模式。单主模式下,会自动选主,所有更新操作都在主上进行;多主模式下,所有server都 可以同时处理更新操作。工作中优先使用单主模式!

1.3.MGR 缺点

● 仅支持InnoDB表,并且每张表一定要有一个主键,用于做write set的冲突检测。
● 必须打开GTID特性,二进制日志格式必须设置为ROW,用于选主与write set;主从状态信息存于表中(–master-info- repository=TABLE 、–relay-log-inforepository=TABLE),–log-slave-updates打开。
● MGR不支持大事务,事务大小最好不超过143MB,当事务过大,无法在5秒的时间内通过网络在组成员之间复制消息, 则可能会怀疑成员失败了,然后将其驱逐出局。
● 目前一个MGR集群最多支持9个节点。
● 不支持外键于save point特性,无法做全局间的约束检测与部分事务回滚。
● 二进制日志不支持Binlog Event Checksum。

1.4MGR 适用场景

  • 金融交易、重要数据存储、对主从一致性要求高的场景。
  • 核心数据总量未过亿。
  • 读多写少,如:互联网电商。

2.MySQL MGR 搭建流程

2.1、环境准备

本次集群搭建,我使用3台服务器。服务器配置如下:

Master服务器(hostname:nginx1):192.168.152.131
Slave服务器1(hostname:nginx2):192.168.152.133
Slave服务器2(hostname:nginx3):192.168.152.134

2.2.搭建流程

2.2.1、配置系统环境

将Hosts文件写入nginx1/nginx2/nginx3节点与内网IP对应关系,后面配置采用域名访问:

# 3台服务器都执行
cat > /etc/hosts <<-'EOF'
192.168.152.131 nginx1
192.168.152.133 nginx2
192.168.152.134 nginx3
EOF
2.2.2、安装 MySQL

参考一步骤

2.2.3、配置启动 MySQL

主节点ngin1执行: (注意主机名是否正确)

# 修改 MySQL 配置
[root@nginx1 ~]# cat >> /etc/my.cnf <<-'EOF'
# 使用mysql_native_password密码策略,防止navicat连不上mysql8
default_authentication_plugin=mysql_native_password
# 设置MySQL插件目录:MGR基于插件,必须设置插件路径
plugin_dir=/usr/lib64/mysql/plugin
# 服务器编号,Master=1
server_id=1
# 开启binlog的GTID模式(MGR强制要求)
gtid_mode=ON
# 开启后MySQL只允许能够保障事务安全,并且能够被日志记录的SQL语句被执行
enforce_gtid_consistency=ON
# 关闭binlog校验(MGR强制要求)
binlog_checksum=NONE

# 定义用于事务期间哈希写入提取的算法,组复制模式下必须设置为 XXHASH64。
transaction_write_set_extraction=XXHASH64
# 确定组复制恢复时是否应该应用 SSL,通常设置为“开”,但默认设置为“关”。
loose-group_replication_recovery_use_ssl=ON
# 服务器实例所在复制组名称,必须是有效的 UUID,所有节点必须相同。
loose-group_replication_group_name="bbbbbbbb-bbbb-cccc-dddd-eeeeeeeeeeee"
# 确定服务器是否应该在服务器启动期间启动组复制。
loose-group_replication_start_on_boot=OFF

# 为复制组中其他的成员提供的网络地址,指定为“主机:端口”的格式化字符串。
# 很多人想当然认为端口应该是3306,起始不然,MGR需要开启新端口24901同步交换
# 所以这里不要写错,同时,前面我们配置了hosts文件做了主机名与IP的映射,这里直接写主机名即可
loose-group_replication_local_address="nginx1:24901"

# 用于建立新成员到组的连接组成员列表。
# 这个列表指定为由分隔号间隔的组成员网络地址列表,类似 host1:port1、host2:port2 的格式。
# 同样采用nginx1-nginx3的主机名替代
loose-group_replication_group_seeds="ngnix1:24901,nginx2:24901,nginx3:24901"

# 配置此服务器为引导组,这个选项必须仅在一台服务器上设置,
# 并且仅当第一次启动组或者重新启动整个组时。成功引导组启动后,将此选项设置为关闭。
loose-group_replication_bootstrap_group=OFF
EOF

从节点nginx2执行:

[root@nginx2 ~]# sudo cat >> /etc/my.cnf <<-'EOF'
default_authentication_plugin=mysql_native_password
plugin_dir=/usr/lib64/mysql/plugin

# 设置唯一的服务器编号
server_id=2
gtid_mode=ON
enforce_gtid_consistency=ON
binlog_checksum=NONE

# 这个参数决定primary节点到secondary节点的请求是否为基于 RSA 密钥对的密码交换所需的公钥
loose-group_replication_recovery_get_public_key=ON
loose-group_replication_recovery_use_ssl=ON
loose-group_replication_group_name="bbbbbbbb-bbbb-cccc-dddd-eeeeeeeeeeee"
loose-group_replication_start_on_boot=OFF

# 设置本机地址nginx2:24901
loose-group_replication_local_address="nginx2:24901"
loose-group_replication_group_seeds="nginx1:24901,nginx2:24901,nginx3:24901"
loose-group_replication_bootstrap_group=OFF
EOF

从节点ngin3执行:

[root@nginx3 ~]# sudo cat >> /etc/my.cnf <<-'EOF' 
default_authentication_plugin=mysql_native_password
plugin_dir=/usr/lib64/mysql/plugin

#设置唯一的服务器编号
server_id=3
gtid_mode=ON
enforce_gtid_consistency=ON
binlog_checksum=NONE

#这个参数决定primary节点到secondary节点的请求是否为基于 RSA 密钥对的密码交换所需的公钥
loose-group_replication_recovery_get_public_key=ON
loose-group_replication_recovery_use_ssl=ON
loose-group_replication_group_name="bbbbbbbb-bbbb-cccc-dddd-eeeeeeeeeeee"
loose-group_replication_start_on_boot=OFF

#设置本机地址nginx3:24901
loose-group_replication_local_address="nginx3:24901"
loose-group_replication_group_seeds="nginx1:24901,nginx2:24901,nginx3:24901"
loose-group_replication_bootstrap_group=OFF
EOF

三台服务器,依次重启 MySQL

systemctl restart mysqld
2.2.4、设置主从同步

三台数据库控制台中,都执行下述命令(3台服务器都执行):

# 创建rpl_user账户,此账户用于实现主从数据同步
CREATE USER rpl_user@'%' IDENTIFIED BY 'asAS123456!';
# 赋予主从同步权限
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';

# 创建一个远程连接用户,这个用户用在Navcate、JDBC登录的时候,直接用root登录不好
create user 'remote'@'%' identified with mysql_native_password by 'asAS123456!';
# 为remote用户赋予所有数据库资源的访问权限,熟悉grant的小伙伴可以自己调整
grant all privileges on *.* to remote@'%';

# 让刚才的修改生效
FLUSH PRIVILEGES;

# 删除已产生的Binlog
# 一定要RESET MASTER,它会删除刚才已产生的Binlog
# 因为刚才Binglog包含创建用户这种高权限操作,用于主从同步的rpl_user账户是没有权限执行的
# 这就会导致RelayLog重放无法正确执行,导致从属服务器卡死在"RECEVERING"状态
# 利用RESET MASTER删除这些无法执行的binlog,就没问题了
RESET MASTER;
2.2.5、安装 MGR 插件

在三台服务器的MySQL控制台中,安装MGR插件,执行命令:

# 3台服务器都执行
INSTALL PLUGIN group_replication SONAME 'group_replication.so';

在主服务器的MySQL控制台上,执行下述命令:

# 注意:只在主服务器上运行
# 在 primary.cnf 配置文件中把 group_replication_bootstrap_group 参数设置成 OFF
# 在 primary 服务器启动时并不会直接启动复制组,通过下面的命令动态的开启复制组是我们的集群更安全
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;

在两个从服务器MySQL控制台上,执行下述命令:

# 指定主从账户与指定通信频道
CHANGE MASTER TO MASTER_USER="rpl_user", MASTER_PASSWORD="asAS123456!" FOR CHANNEL 'group_replication_recovery';

# 开启组网数据同步
START GROUP_REPLICATION;

当两个从节点都运行完毕后,运行下面SQL结果进行验证:

SELECT * FROM performance_schema.replication_group_members;

出现以下情况,每个节点都是ONLINE状态,说明集群搭建成功:

3.MySQL MGR 故障转移

上面已经将MySQL MGR集群搭建完毕,并且节点都是ONLINE状态。

3.1、主节点n0下线,重新选举

首先,在主服务器nginx1上执行停止mysql命令,如下:

[root@nginx1 ~]# systemctl stop mysqld;

此时,在从节点nginx2查看集群状态发现,nginx2被选举为主节点:

mysql> SELECT * FROM performance_schema.replication_group_members;

这是由于MGR集群选举策略为:

  • 优先低版本节点
  • 版本一样,优先权重大的节点
  • 版本与权重一样,按照 server uuid 的字母顺序选主

在nginx2从节点上,通过命令查看故障转移日志:

# 查看MySQL日志
[root@nginx2 ~]# tail -n 50 /var/log/mysqld.log

nginx2日志解析如下:

# nginx1:3306(主节点nginx1)从组中被移除掉
2025-06-29T05:34:13.599017Z 0 [Warning] [MY-011499] [Repl] Plugin group_replication reported: 'Members removed from the group: nginx1:3306'

# 重新选举新的 Primary 主节点
2025-06-29T05:34:13.599079Z 0 [System] [MY-011500] [Repl] Plugin group_replication reported: 'Primary server with address nginx1:3306 left the group. Electing new Primary.'

# nginx2:3306(从节点nginx2)被选举为主节点,执行之前未完成的事务处理
2025-06-29T05:34:13.599250Z 0 [System] [MY-011507] [Repl] Plugin group_replication reported: 'A new primary with address nginx2:3306 was elected. The new primary will execute all previous group transactions before allowing writes.'

# 组成员目前只剩 nginx2:3306, nginx3:3306
2025-06-29T05:34:13.599523Z 0 [System] [MY-011503] [Repl] Plugin group_replication reported: 'Group membership changed to nginx2:3306, nginx3:3306 on view 17511750415084520:4.'

# 关闭 nginx2 节点的只读状态
2025-06-29T05:34:13.600422Z 20 [System] [MY-013731] [Repl] Plugin group_replication reported: 'The member action "mysql_disable_super_read_only_if_primary" for event "AFTER_PRIMARY_ELECTION" with priority "1" will be run.'

# 设置 super_read_only=OFF
2025-06-29T05:34:13.600470Z 20 [System] [MY-011566] [Repl] Plugin group_replication reported: 'Setting super_read_only=OFF.'

# 当前节点(n1)以主节点身份工作
2025-06-29T05:34:13.601342Z 38 [System] [MY-011510] [Repl] Plugin group_replication reported: 'This server is working as primary member.'

在nginx3从节点上,通过命令查看故障转移日志:

# 查看MySQL日志
[root@nginx3 ~]# tail -n 50 /var/log/mysqld.log
# nginx1:3306(主节点n0)从组中被移除掉
2025-06-29T05:31:17.614964Z 10 [System] [MY-011511] [Repl] Plugin group_replication reported: 'This server is working as secondary member with primary member address nginx1:3306.'

# 重新选举新的 Primary 主节点
2025-06-29T05:34:13.597787Z 0 [System] [MY-011500] [Repl] Plugin group_replication reported: 'Primary server with address nginx1:3306 left the group. Electing new Primary.'

# nginx2:3306(从节点nginx2)被选举为主节点,执行之前未完成的事务处理
2025-06-29T05:34:13.597848Z 0 [System] [MY-011507] [Repl] Plugin group_replication reported: 'A new primary with address nginx2:3306 was elected. The new primary will execute all previous group transactions before allowing writes.'

# 组成员目前只剩 nginx2:3306, nginx3:3306
2025-06-29T05:34:13.597950Z 0 [System] [MY-011503] [Repl] Plugin group_replication reported: 'Group membership changed to nginx2:3306, nginx3:3306 on view 17511750415084520:4.'

# 当前节点(n2)作为主节点(n1)的从成员身份工作
2025-06-29T05:34:13.598805Z 34 [System] [MY-011511] [Repl] Plugin group_replication reported: 'This server is working as secondary member with primary member address nginx2:3306.'

3.2.新主节点nginx2下线,集群不可用

当在新晋升的主节点nginx2上执行停止MySQL操作:

[root@nginx2 ~]# systemctl stop mysqld;

此时,在nginx3上通过命令查看发现,nginx2主节点尽管已经下线,但nginx3查看集群状态时还在显示,因为只有1个节点的情况下,少于n/2+1的规则,导致整体 MGR 集群失效,nginx3节点无法产生重新选举,同时nginx3的日志也不会有任何新内容产生:

mysql> SELECT * FROM performance_schema.replication_group_members;

3.3.恢复 MGR 集群

恢复流程很简单,先将三台服务器的MySQL各自重启:

# 3台服务器都执行
systemctl restart mysqld

然后重复执行 2.2.4 ~ 2.2.5 章节流程即可恢复 MGR 集群。

4.单主模式和多主模式

4.1.模式介绍

4.1.1.单主模式

在单主模式下, 组复制具有自动选主功能,每次只有一个 server成员可以作为主节点。

单主模式 group 内只有一台节点可写可读,其他节点只可以读。对于group的部署,需要先跑起primary主节点,然后再跑起其他的节点,并把这些节点加进group。其他的节点就会自动同步primary节点上面的变化,然后将自己设置为只读模式。

当primary主节点意外宕机或者下线,在满足大多数节点存活的情况下,group内部发起选举,选出下一个可用的读节点,提升为primary节点。

4.1.2.多主模式

在多主模式下,所有的 MySQL 节点都可以同时接受读写操作。group内的所有节点都是primary主节点,同时可以进行读写操作,并且数据是最终一致的。

4.2.模式切换

之前我们搭建的 MySQL MGR 集群就是单主模式(默认),那么如何切换为多主模式呢?按照如下操作进行。

4.2.1.单主 ——> 多主

从 nginx1 ~ nginx3 停止组复制,开启多主模式(3个节点都执行):

# 停止组复制
stop group_replication;

# 是否启用单主模式,默认ON,OFF代表多主
set global group_replication_single_primary_mode=OFF;

# 是否开启条件检查,因为多主的约束更为严格,不符合要求的直接拒绝
# 不支持外键的级联操作
# 不支持“串行化Serializable”
set global group_replication_enforce_update_everywhere_checks=ON;

在 nginx1主节点启用组复制:

# 只在 nginx1 上执行
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;

在 nginx2,nginx3 节点上启用组复制:

# 只在 nginx2, nginx3 上执行
START GROUP_REPLICATION;

此时,可以看到三台MySQL都是主节点:

mysql> SELECT * FROM performance_schema.replication_group_members;

![image-20250629143218525](E:Softwarelittle toolsmarkdown 编辑器devops笔记image-20250629143218525.png)

4.2.2.多主 ——> 单主

从 nginx1 ~ nginx3 停止组复制,开启多主模式(3个节点都执行):

# 停止组复制
stop group_replication;

# 是否开启条件检查,因为多主的约束更为严格,不符合要求的直接拒绝
# 不支持外键的级联操作
# 不支持“串行化Serializable”
set global group_replication_enforce_update_everywhere_checks=OFF;

# 是否启用单主模式,默认ON,OFF代表多主
set global group_replication_single_primary_mode=ON;

在 nginx1 主节点启用组复制:

# 只在 nginx1 上执行
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;

在 nginx2,nginx3 节点上启用组复制:

# 只在 nginx2, nginx3 上执行
START GROUP_REPLICATION;

此时,可以看到三台MySQL变成了主从模式:

SELECT * FROM performance_schema.replication_group_members;

5.mysql集群的实现方式

✅ ** MGR 搭建总体流程**

🔹 准备阶段

  • 配置三台服务器(主机名:nginx1、nginx2、nginx3)
  • 修改三台服务器 /etc/hosts,设置主机名与内网 IP 映射
  • 安装 MySQL 8.0+ 并确保已启动

🔹 配置 MySQL 参数

三台服务器都需修改 my.cnf 配置:

  • 打开 GTID 模式、事务安全、一致性配置
  • 配置 group_replication 参数:
    • group_replication_group_name
    • group_replication_local_address
    • group_replication_group_seeds
    • group_replication_start_on_boot=OFF
    • group_replication_bootstrap_group=OFF(首次主节点后面会动态打开)

各节点 server_idlocal_address 必须唯一


🔹 初始化数据库

三台服务器 MySQL 控制台执行:

  • 创建 rpl_user 用户(用于复制通信)
  • 创建 remote 用户(客户端/工具远程连接)
  • 赋权后 FLUSH PRIVILEGES
  • RESET MASTER 清理 binlog(防止同步时出现权限或 binlog 重放问题)

🔹 安装 Group Replication 插件

三台服务器都执行:

INSTALL PLUGIN group_replication SONAME 'group_replication.so';

🔹 启动集群

  • 主节点 (nginx1)
    SET GLOBAL group_replication_bootstrap_group=ON;
    START GROUP_REPLICATION;
    SET GLOBAL group_replication_bootstrap_group=OFF;
    
  • 从节点 (nginx2, nginx3)
    CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='asAS123456!' FOR CHANNEL 'group_replication_recovery';
    START GROUP_REPLICATION;
    

🔹 验证

所有节点执行:

SELECT * FROM performance_schema.replication_group_members;

确认 所有节点状态为 ONLINE,其中一个是 PRIMARY 节点,其余是 SECONDARY


** MGR 故障转移**

  • 停止当前主节点 mysql 服务,MGR 会自动选举新的主节点
  • 新主节点可继续写入
  • 当失效节点恢复后,重新加入即可恢复集群

** 单主、多主模式切换**

🔷 单主 ➡️ 多主

  • 三节点停止 Group Replication
  • 设置:
    SET GLOBAL group_replication_single_primary_mode=OFF;
    SET GLOBAL group_replication_enforce_update_everywhere_checks=ON;
    
  • 按上述步骤重新启动 Group Replication
  • 所有节点均可写,处于 PRIMARY 状态

🔷 多主 ➡️ 单主

  • 三节点停止 Group Replication
  • 设置:
    SET GLOBAL group_replication_enforce_update_everywhere_checks=OFF;
    SET GLOBAL group_replication_single_primary_mode=ON;
    
  • 按上述步骤重新启动 Group Replication
  • 集群重新变为 一个 PRIMARY + 多个 SECONDARY