ubuntu24搭建mysql8.0.36 mgr

环境准备

三台4G4核虚拟机,搭建ubuntu24.03系统。

ip分别为:

复制代码
mysql-master 192.168.133.128
mysql-slave1 192.168.133.130      
mysql-slave2 192.168.133.131

永久关闭防火墙

复制代码
root@warton:/www/mysql# ufw disable
防火墙在系统启动时自动禁用

配置hostname hosts

复制代码
# 依次设置三台服务器

# 先设置服务器hostname
root@warton:~# vim /etc/hostname
# 修改为
mysql-master

root@warton:~# hostname mysql-master
root@warton:~# hostname
mysql-master


#设置服务器的hosts记录文件
root@warton:~# vim /etc/hosts

# 修改127.0.0.1 的host名称
127.0.0.1 mysql-master

# 添加如下信息
192.168.133.128 mysql-master
192.168.133.130 mysql-slave1
192.168.133.131 mysql-slave2

下载mysql8.0.36并安装(三台都要执行安装)

分别在三台服务器上下载mysql,存储在/www/mysql-8.0.36目录下,并解压

复制代码
root@warton:~# mkdir -p /www/tools
root@warton:~# cd /www/tools/
root@warton:/www/tools# wget https://cdn.mysql.com/Downloads/MySQL-8.0/mysql-server_8.0.36-1ubuntu24.04_amd64.deb
root@warton:/www/tools# mkdir mysql-8.0.36
root@warton:/www/tools# tar -xvf mysql-server_8.0.36-1ubuntu23.10_amd64.deb-bundle.tar -C mysql-8.0.36/
root@warton:/www/tools# cd mysql-8.0.36/

解压出来的deb文件,逐一安装

复制代码
# 1. 安装基础依赖(按顺序)
root@warton:/www/tools/mysql-8.0.36#  dpkg -i mysql-common_8.0.36-1ubuntu23.10_amd64.deb
root@warton:/www/tools/mysql-8.0.36#  dpkg -i mysql-community-client-plugins_8.0.36-1ubuntu23.10_amd64.deb

# 2. 安装客户端库
root@warton:/www/tools/mysql-8.0.36# dpkg -i libmysqlclient21_8.0.36-1ubuntu23.10_amd64.deb
root@warton:/www/tools/mysql-8.0.36# dpkg -i libmysqlclient-dev_8.0.36-1ubuntu23.10_amd64.deb

# 3. 安装客户端核心组件
root@warton:/www/tools/mysql-8.0.36# dpkg -i mysql-community-client-core_8.0.36-1ubuntu23.10_amd64.deb
root@warton:/www/tools/mysql-8.0.36# dpkg -i mysql-community-client_8.0.36-1ubuntu23.10_amd64.deb
root@warton:/www/tools/mysql-8.0.36# dpkg -i mysql-client_8.0.36-1ubuntu23.10_amd64.deb

# 4. 安装服务端核心组件
root@warton:/www/tools/mysql-8.0.36#  dpkg -i mysql-community-server-core_8.0.36-1ubuntu23.10_amd64.deb
正在选中未选择的软件包 mysql-community-server-core。
(正在读取数据库 ... 系统当前共安装有 158163 个文件和目录。)
准备解压 mysql-community-server-core_8.0.36-1ubuntu23.10_amd64.deb  ...
正在解压 mysql-community-server-core (8.0.36-1ubuntu23.10) ...
dpkg: 依赖关系问题使得 mysql-community-server-core 的配置工作不能继续:
 mysql-community-server-core 依赖于 libaio1 (>= 0.3.93);然而:
  未安装软件包 libaio1。
 mysql-community-server-core 依赖于 libmecab2 (>= 0.996);然而:
  未安装软件包 libmecab2。

dpkg: 处理软件包 mysql-community-server-core (--install)时出错:
 依赖关系问题 - 仍未被配置
正在处理用于 libc-bin (2.39-0ubuntu8.6) 的触发器 ...
正在处理用于 man-db (2.12.0-4build2) 的触发器 ...
在处理时有错误发生:
 mysql-community-server-core
root@warton:/www/tools/mysql-8.0.36# 

# 5.报错解决
root@warton:/www/tools/mysql-8.0.36# apt --fix-broken install
root@warton:/www/tools/mysql-8.0.36# apt install libmecab2
root@warton:/www/tools/mysql-8.0.36# curl -O http://launchpadlibrarian.net/646633572/libaio1_0.3.113-4_amd64.deb
root@warton:/www/tools/mysql-8.0.36# dpkg -i libaio1_0.3.113-4_amd64.deb
root@warton:/www/tools/mysql-8.0.36# dpkg -i mysql-community-server-core_8.0.36-1ubuntu23.10_amd64.deb

# 6.继续安装
# 注意,这一步需要设置root用户的密码,建议设置符合安全策略的密码,方便后续操作
root@warton:/www/tools/mysql-8.0.36# dpkg -i mysql-community-server_8.0.36-1ubuntu23.10_amd64.deb
root@warton:/www/tools/mysql-8.0.36# dpkg -i mysql-server_8.0.36-1ubuntu23.10_amd64.deb

修改数据库相关目录到指定地址(三台都执行)

复制代码
# 先关闭服务
root@warton:/www/tools/mysql-8.0.36# service mysql stop

# 创建相关数据目录
root@warton:/www/tools/mysql-8.0.36# mkdir -p /www/mysql/{data,logs,tmp,binlogs}
root@warton:/www/tools/mysql-8.0.36# cd /www/mysql/

# 迁移数据目录
root@warton:/www/mysql# cp -rf /var/lib/mysql/* /www/mysql/data
# 修改用户组
root@warton:/www/mysql# chown -R mysql:mysql /www/mysql

# 更新 AppArmor 配置‌(关键步骤)
root@warton:/www/mysql# vim /etc/apparmor.d/usr.sbin.mysqld

# 在末尾添加
/www/mysql/ r,
/www/mysql/** rwk,
/www/mysql/data/ r,
/www/mysql/data/** rwk,
/www/mysql/logs/ rw,
/www/mysql/tmp/ rw,

root@warton:/www/mysql# systemctl reload apparmor

修改数据库的配置文件(三台都执行)

复制代码
# 编辑mysql配置文件
root@warton:/www/mysql# vim /etc/mysql/mysql.conf.d/mysqld.cnf
# 添加如下内容

[mysqld]
datadir = /www/mysql/data
log-error = /www/mysql/logs/error.log
socket = /www/mysql/mysql.sock
tmpdir = /www/mysql/tmp
pid-file = /www/mysql/mysql.pid
log_bin = /www/mysql/binlogs/binlog

# ========================
# 内存优化配置 (2核4G专属)
# ========================
# 缓冲池配置(占物理内存50%-60%)
innodb_buffer_pool_size  = 1280M
innodb_buffer_pool_instances = 2  # 匹配CPU核心数

# 连接与线程优化
max_connections          = 80     # 避免内存耗尽
thread_cache_size        = 16
table_open_cache         = 1024
table_definition_cache   = 512

# InnoDB引擎优化
innodb_log_file_size     = 128M
innodb_log_buffer_size   = 32M
innodb_flush_log_at_trx_commit = 1
innodb_flush_method      = O_DIRECT
innodb_file_per_table    = 1
innodb_thread_concurrency= 0      # 自动优化

# 临时表与排序优化
tmp_table_size           = 64M
max_heap_table_size      = 64M
sort_buffer_size         = 2M
join_buffer_size         = 2M
read_buffer_size         = 128K
read_rnd_buffer_size     = 256K

# ========================
# 安全与维护配置
# ========================
skip_name_resolve        = ON
log_slow_extra           = ON
long_query_time          = 2
log_queries_not_using_indexes = OFF
max_allowed_packet       = 64M
transaction_isolation    = READ-COMMITTED

[client]
socket=/www/mysql/mysql.sock

启动mysql 服务进行验证(三台都执行)

复制代码
root@warton:/www/mysql# service mysql start
root@warton:/www/mysql# service mysql status
● mysql.service - MySQL Community Server
     Loaded: loaded (/usr/lib/systemd/system/mysql.service; enabled; preset: enabled)
     Active: active (running) since Tue 2026-01-13 15:24:55 CST; 13s ago
       Docs: man:mysqld(8)
             http://dev.mysql.com/doc/refman/en/using-systemd.html
    Process: 4272 ExecStartPre=/usr/share/mysql-8.0/mysql-systemd-start pre (code=exited, status=0/SUCCESS)
   Main PID: 4311 (mysqld)
     Status: "Server is operational"
      Tasks: 39 (limit: 4572)
     Memory: 389.8M (peak: 404.3M)
        CPU: 4.421s
     CGroup: /system.slice/mysql.service
             └─4311 /usr/sbin/mysqld

1月 13 15:24:52 warton systemd[1]: Starting mysql.service - MySQL Community Server...
1月 13 15:24:55 warton systemd[1]: Started mysql.service - MySQL Community Server.

至此,三台服务器的mysql已经全部安装完毕。

增加MGR相关配置(三台都需要配置)

复制代码
root@warton:/www/mysql# service mysql stop
root@warton:/www/mysql# vim /etc/mysql/mysql.conf.d/mysqld.cnf
# 在[mysqld]下增加

# ========================
# MGR 集群核心配置
# ========================
# 服务器编号,这个要唯一,我选择用ip尾数
server_id = 128 
# 开启binlog的GTID模式
gtid_mode = ON
# 开启后MySQL只允许能够保障事务安全,并且能够被日志记录的SQL语句被执行
enforce_gtid_consistency = ON
# 关闭binlog校验
binlog_checksum = NONE
# 确保从库执行的中继日志(relay log)操作被记录到自身的二进制日志(binlog)中
log_slave_updates = ON
# 设置binlog记录模式为"行级模式",即记录数据行的变更细节(而非SQL语句)。
binlog_format = ROW
# 定义用于事务期间哈希写入提取的算法,组复制模式下必须设置为XXHASH64。
transaction_write_set_extraction = XXHASH64

# MGR专用配置
loose-group_replication_group_name = "161ec121-861b-4f61-b6ed-c969087cc1be" # 这个要全部一致,可以使用uuidgen在服务器中执行获取
loose-group_replication_start_on_boot = OFF
# 在组复制恢复阶段,自动从主节点获取公钥,用于加密连接认证。
loose-group_replication_recovery_get_public_key = ON
# 确定组复制恢复时是否应该应用SSL,通常设置为"开",但默认设置为"关"。
loose-group_replication_recovery_use_ssl = ON
# 指定当前节点用于组内通信的地址和端口,需确保与其他节点的group_seeds配置互通,且端口未被占用‌
loose-group_replication_local_address = "192.168.133.128:33061" 
# 定义集群"种子节点"列表,新节点加入集群时,通过种子节点发现集群成员并建立连接。建议包含所有节点以提高容错性‌
loose-group_replication_group_seeds = "192.168.133.128:33061,192.168.133.130:33061,192.168.133.131:33061"
loose-group_replication_bootstrap_group = OFF

# 启动服务
root@warton:/www/mysql# service mysql start
root@warton:/www/mysql# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.36 MySQL Community Server - GPL

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

创建mysql相关必要账户(三台都要执行)

复制代码
# 直接复制以下代码进入数据库后直接运行

#创建rp1_user账户,此账户用于实现主从数据同步
CREATE USER 'rpl_user'@'%' IDENTIFIED BY '@Password1122!';
#赋予主从同步权限
GRANT REPLICATION SLAVE ON *.* TO 'rpl_user'@'%';
#创建一个远程连接用户,这个用户用在Navcate、JDBC登录的时候,直接用root登录不好
create user 'warton'@'%' identified by '@Password1122!';
#为warton用户赋予所有数据库资源的访问权限,熟悉grant的小伙伴可以自己调整
grant all privileges on *.* to 'warton'@'%';
#让刚才的修改生效
FLUSH PRIVILEGES;
#大坑3:
#删除已产生的Binlog
#一定要RESET MASTER,它会删除刚才已产生的Binlog
#因为刚才Binglog包含创建用户这种高权限操作,用于主从同步的rpl_user账户是没有权限执行的
#这就会导致RelayLog重放无法正确执行,导致从属服务器卡死在"RECEVING"状态
#利用RESET MASTER删除这些无法执行的binlog,就没问题了
RESET MASTER;
#安装Group Replication插件
INSTALL PLUGIN group_replication SONAME 'group_replication.so';

主节点执行

复制代码
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;

从节点执行

复制代码
CHANGE MASTER TO MASTER_USER="rpl_user", MASTER_PASSWORD="@Password1122!" FOR CHANNEL 'group_replication_recovery';
start group_replication;

校验MGR的members的通信情况

复制代码
mysql>  select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+--------------+-------------+--------------+-------------+----------------+----------------------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST  | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | MEMBER_COMMUNICATION_STACK |
+---------------------------+--------------------------------------+--------------+-------------+--------------+-------------+----------------+----------------------------+
| group_replication_applier | 83806307-f112-11f0-822a-000c29b13668 | mysql-master |        3306 | ONLINE       | PRIMARY     | 8.0.36         | XCom                       |
| group_replication_applier | 85ed9069-f112-11f0-96d9-000c29f10b53 | mysql-slave1 |        3306 | ONLINE       | SECONDARY   | 8.0.36         | XCom                       |
| group_replication_applier | 8868042b-f112-11f0-a2f2-000c293bd06c | mysql-slave2 |        3306 | ONLINE       | SECONDARY   | 8.0.36         | XCom                       |
+---------------------------+--------------------------------------+--------------+-------------+--------------+-------------+----------------+----------------------------+
3 rows in set (0.00 sec)

报错解决

复制代码
mysql>  select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | MEMBER_COMMUNICATION_STACK |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
| group_replication_applier | 83806307-f112-11f0-822a-000c29b13668 | warton      |        3306 | ONLINE       | PRIMARY     | 8.0.36         | XCom                       |
| group_replication_applier | 85ed9069-f112-11f0-96d9-000c29f10b53 | warton      |        3306 | RECOVERING   | SECONDARY   | 8.0.36         | XCom                       |
| group_replication_applier | 8868042b-f112-11f0-a2f2-000c293bd06c | warton      |        3306 | RECOVERING   | SECONDARY   | 8.0.36         | XCom                       |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+

# 当有hostname、hosts文件未配置时发生的各种报错如上面情况,三个节点都往warton节点通信
# 还有直接点primary显示的是ONLINE,其余从节点显示RECEVING,判断通信异常
# 可以通过如下命令重新配置

解决情况1

复制代码
# 这里用来在从节点上执行,实现重新配置用于同步的账号信息

mysql> STOP GROUP_REPLICATION;
Query OK, 0 rows affected (3.08 sec)

mysql> RESET SLAVE ALL;
Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> CHANGE REPLICATION SOURCE TO SOURCE_USER='rpl_user', SOURCE_PASSWORD='@Password1122!' FOR CHANNEL 'group_replication_recovery';
Query OK, 0 rows affected, 2 warnings (0.01 sec)

mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected (5.68 sec)

# 当从服务器遇到异常问题时,需要关闭重启
mysql> STOP GROUP_REPLICATION;
Query OK, 0 rows affected (3.08 sec)

# 后续等解决问题之后再重新开启
mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected (4.12 sec)
相关推荐
_OP_CHEN2 小时前
【测试理论与实践】(十)Web 项目自动化测试实战:从 0 到 1 搭建博客系统 UI 自动化框架
运维·自动化测试·python·测试开发·selenium·自动化·测试开发工程师
石像鬼₧魂石2 小时前
补充章节:WPScan 实战后的 “打扫战场 + 溯源” 流程
数据库·学习·mysql
tokepson9 小时前
Mysql下载部署方法备份(Windows/Linux)
linux·服务器·windows·mysql
C_心欲无痕10 小时前
Dockerfile:构建 Docker 镜像
运维·docker·容器
zz_nj11 小时前
工作的环境
linux·运维·服务器
极客先躯11 小时前
如何自动提取Git指定时间段的修改文件?Win/Linux双平台解决方案
linux·git·elasticsearch
C_心欲无痕12 小时前
nginx - 实现域名跳转的几种方式
运维·前端·nginx
suijishengchengde12 小时前
****LINUX时间同步配置*****
linux·运维
什么都不会的Tristan12 小时前
MybatisPlus-扩展功能
数据库·mysql