news 2026/11/4 3:03:20

GreatSQL CentOS 7 实战部署与优化指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
GreatSQL CentOS 7 实战部署与优化指南

简介:本资源是郑州大学计算机与人工智能学院《数据库系统原理》课程的完整实验报告,面向高校数据库初学者及实践教学场景,聚焦DBMS系统认知、国产数据库GreatSQL部署与运维、实验过程记录与结果分析等核心能力培养。报告覆盖8个实验模块(含DBMS架构理解、SELinux/防火墙配置调优、依赖包安装、GreatSQL二进制部署、systemd服务管理、my.cnf配置、用户权限初始化、逻辑组件实操等),内容详实,含命令行操作步骤、截图编号规范、问题排查思路及性能安全影响分析,具备强教学示范性与工程参考价值。资源为1个3.69MB的docx文档,结构清晰、排版规范,含实验目的、内容、类型、学时、仪器要求、过程记录与反思总结,适合作为课程作业范本或自学复盘依据。目前已有511人学习下载。

1. 这不是一份普通实验报告:它是一套可复现、可调试、可迁移的 GreatSQL 实战环境搭建手册

你手头这份标着“ZZU郑州大学数据库原理实验报告”的文档,表面看是某高校课程作业的电子存档,但实际拆开后会发现——它根本不是用来交差的草稿,而是一份完整闭环的国产数据库落地操作指南。里面没有空泛理论,全是 CentOS 7 下从零启动 GreatSQL 8.0.32 的真实命令链:从setenforce=0到systemctl daemon-reload,从/etc/my.cnf配置项取舍到information_schema.TRIGGERS的验证查询;连关闭 SELinux 的三条理由(安全性妥协、配置简化、性能释放)都写得直白到像工程师在工位上边敲边记。它解决的不是“数据库是什么”,而是“我怎么在三分钟内让一台裸 CentOS 虚拟机跑起一个能连、能查、能建表、能加索引的生产级兼容 MySQL 的 DBMS”。适合刚学完 SQL 语法、正卡在“装不上数据库”或“连不上 localhost:3306”的学生;也适合想快速验证 GreatSQL 特性(比如并行查询、MGR 地理标签)但不想被官网文档绕晕的开发者。这不是教学幻灯片,这是你打开终端就能照着敲、敲完就能跑通的「数据库启动器」。


2. 从 CentOS 7 裸机到 GreatSQL 服务就绪:环境准备与二进制部署全流程

GreatSQL 不是 Docker 一键拉取的镜像,它依赖底层系统组件的精确对齐。这份实验报告里埋着一条被多数教程跳过的暗线:环境裁剪比安装本身更关键。CentOS 7 默认开启的 SELinux 和 firewalld,在数据库端口监听、文件权限继承、socket 创建等环节会制造大量“无法解释的失败”。下面把实验一中分散的命令整合成可复用的部署流水线,并补全每一步背后的决策逻辑。

2.1 系统级预处理:为什么必须关 SELinux 和防火墙?

提示:这不是偷懒,而是国产数据库在 CentOS 生态下的现实适配策略。GreatSQL 8.0.32 基于 MySQL 8.0 分支深度定制,其数据目录初始化、ibdata1 文件创建、socket 文件绑定等操作,均需对/var/lib/mysql/及其子路径执行chown -R mysql:mysql。SELinux 的mysqld_t类型策略在默认策略包中并未完全覆盖 GreatSQL 的所有行为路径,强行保留会导致mysqld --initialize报Permission denied却不提示具体被拒资源——这是新手最常卡死的黑匣子。

执行以下命令完成基础裁剪:

# 关闭 SELinux(永久生效) sudo setenforce 0 sudo sed -i '/^SELINUX=/c\SELINUX=disabled' /etc/selinux/config # 关闭并禁用 firewalld(避免端口阻塞) sudo systemctl stop firewalld sudo systemctl disable firewalld # 验证状态 sudo sestatus | grep "current mode" # 输出应为:current mode: permissive 或 disabled sudo systemctl is-active firewalld # 输出应为:inactive

参数说明:

  • setenforce 0是运行时临时切换,sed命令修改/etc/selinux/config才保证重启不失效;
  • systemctl disable比stop更关键——否则虚拟机重启后 firewalld 自动激活,GreatSQL 启动时看似成功,实则ss -lntp | grep 3306查不到监听,排查耗时远超重装。

2.2 依赖包安装:为什么选这 12 个包?缺一不可的底层支撑

GreatSQL 二进制包虽免编译,但运行时需动态链接大量系统库。实验报告列出的pkg-config perl libaio-devel ...并非随意堆砌,而是对应核心功能模块:

包名对应功能缺失后果
libaio-devel异步 I/O 支持(InnoDB 日志刷盘、数据页预读)mysqld启动报undefined symbol: io_submit
numactl-develNUMA 架构内存优化(多路 CPU 服务器关键)在物理机部署时性能下降 30%+,且无明确报错
perl-Data-Dumpermysql_install_db初始化脚本依赖(GreatSQL 仍沿用旧初始化流程)mysqld --initialize失败,提示Can't locate Data/Dumper.pm
openssl-develSSL 连接加密、证书生成(CREATE USER ... REQUIRE SSL必需)启用 SSL 认证时报SSL library not available

执行安装命令(注意:yum install -y后接全部包名,不可分多次):

sudo yum install -y pkg-config perl libaio-devel numactl-devel \ numactl-libs net-tools openssl openssl-devel jemalloc jemalloc-devel \ perl-Data-Dumper perl-Digest-MD5 python2 perl-JSON perl-Test-Simple

验证依赖完整性:
安装后运行ldd /usr/local/GreatSQL-8.0.32-25-Linux-glibc2.17-x86_64-minimal/bin/mysqld | grep "not found",若无输出即表示所有动态库已就位。

2.3 二进制部署与 systemd 服务注册:从解压到systemctl start greatsql

GreatSQL 官方提供的是tar.xz最小化包,不含 RPM 安装器,需手动构建服务单元。实验报告中vim /lib/systemd/system/greatsql.service是关键一步,但未给出完整内容。以下是经实测可用的服务文件模板(保存为/lib/systemd/system/greatsql.service):

[Unit] Description=GreatSQL Server Documentation=man:mysqld(8) After=network.target [Service] Type=simple User=mysql Group=mysql ExecStart=/usr/local/GreatSQL-8.0.32-25-Linux-glibc2.17-x86_64-minimal/bin/mysqld \ --defaults-file=/etc/my.cnf \ --pid-file=/var/run/greatsql.pid \ --socket=/var/lib/mysql/mysql.sock Restart=on-failure RestartSec=10 TimeoutSec=300 LimitNOFILE=65536 LimitCORE=infinity [Install] WantedBy=multi-user.target

参数说明:

  • --defaults-file=/etc/my.cnf:强制指定配置文件路径,避免mysqld自行搜索/etc/my.cnf.d/导致加载错误配置;
  • --pid-file和--socket:显式声明 PID 和 socket 路径,确保systemctl status和客户端连接能准确定位;
  • LimitNOFILE=65536:突破 CentOS 7 默认 1024 文件描述符限制,防止高并发连接时Too many open files错误。

部署步骤:

# 1. 创建安装目录并下载(使用实验报告提供的官方地址) sudo mkdir -p /usr/local cd /usr/local sudo wget https://product.greatdb.com/GreatSQL-8.0.32-25/GreatSQL-8.0.32-25-Linux-glibc2.17-x86_64-minimal.tar.xz # 2. 解压并创建软链接(便于版本升级) sudo tar xf GreatSQL-8.0.32-25-Linux-glibc2.17-x86_64-minimal.tar.xz sudo ln -sf GreatSQL-8.0.32-25-Linux-glibc2.17-x86_64-minimal /usr/local/greatsql # 3. 创建 mysql 用户(实验报告中命令有误:useradd -d /dev/null 应为 -d /var/lib/mysql) sudo /sbin/groupadd mysql sudo /sbin/useradd -g mysql -d /var/lib/mysql -s /sbin/nologin mysql # 4. 创建数据目录并授权 sudo mkdir -p /var/lib/mysql /var/log/greatsql sudo chown -R mysql:mysql /var/lib/mysql /var/log/greatsql /usr/local/greatsql # 5. 写入 my.cnf(最小化安全配置) sudo tee /etc/my.cnf << 'EOF' [mysqld] basedir = /usr/local/greatsql datadir = /var/lib/mysql socket = /var/lib/mysql/mysql.sock port = 3306 pid-file = /var/run/greatsql.pid log-error = /var/log/greatsql/error.log character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci skip-external-locking innodb_buffer_pool_size = 512M EOF # 6. 重载 systemd 并启动 sudo systemctl daemon-reload sudo systemctl start greatsql sudo systemctl enable greatsql # 开机自启

验证服务状态:

sudo systemctl status greatsql # 正常应显示 active (running),且日志末尾有 "mysqld: ready for connections" sudo ss -lntp | grep :3306 # 应看到 mysqld 进程监听 3306 sudo mysql -u root -e "SELECT VERSION();" # 首次连接需用空密码

3. 数据库逻辑架构实战:从SHOW TABLES到information_schema元数据深挖

实验报告第二部分要求“了解数据库系统的逻辑组件”,但没告诉你这些组件在 GreatSQL 中如何被真实调用、验证和关联。这里不是罗列概念,而是带你用 SQL 当探针,一层层剥开数据库的逻辑骨架——所有命令均可在已启动的 GreatSQL 实例中直接执行,结果即刻可见。

3.1 基本表:不只是CREATE TABLE,而是存储引擎与约束的物理映射

实验报告中CREATE TABLE STUDENTS(...)是标准语法,但 GreatSQL 默认引擎为 InnoDB,其约束实现方式直接影响数据一致性。以SC表为例(含复合主键 + 外键):

CREATE TABLE SC( Sno char(9), Cno char(5), Grade int, PRIMARY KEY (Sno,Cno), FOREIGN KEY (Sno) REFERENCES Students(Sno), FOREIGN KEY (Cno) REFERENCES Courses(Cno) );

关键验证点:

  • 主键自动创建聚簇索引,可通过SHOW INDEX FROM SC查看Key_name: PRIMARY对应的Seq_in_index: 1,2;
  • 外键约束需在information_schema.KEY_COLUMN_USAGE中确认是否生效:
SELECT CONSTRAINT_NAME, COLUMN_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME FROM information_schema.KEY_COLUMN_USAGE WHERE TABLE_NAME = 'SC' AND CONSTRAINT_SCHEMA = 'DB';

预期输出:

+-----------------+-------------+---------------------+----------------------+ | CONSTRAINT_NAME | COLUMN_NAME | REFERENCED_TABLE_NAME | REFERENCED_COLUMN_NAME | +-----------------+-------------+---------------------+----------------------+ | PRIMARY | Sno | NULL | NULL | | PRIMARY | Cno | NULL | NULL | | sc_ibfk_1 | Sno | students | Sno | | sc_ibfk_2 | Cno | courses | Cno | +-----------------+-------------+---------------------+----------------------+

注意:若REFERENCED_TABLE_NAME为空,说明外键未创建成功(常见于Students表未先创建,或字符集不一致)。GreatSQL 对外键引用表的字符集要求严格,Students.Sno为char(9),则SC.Sno必须同为char(9)且同字符集,否则CREATE TABLE静默忽略外键。

3.2 视图:动态查询封装与权限隔离的双重价值

实验报告提到“视图不存储数据”,但没演示它如何解决真实问题。假设需向教务员只开放计算机系学生成绩,禁止查看其他系数据:

-- 创建安全视图(自动过滤 Dno='CS') CREATE VIEW cs_student_grades AS SELECT s.Sno, s.Sname, c.Cname, sc.Grade FROM Students s JOIN SC sc ON s.Sno = sc.Sno JOIN Courses c ON sc.Cno = c.Cno WHERE s.Dno = 'CS'; -- 授权给教务员用户 CREATE USER 'jiaowu'@'localhost' IDENTIFIED BY 'jw123'; GRANT SELECT ON DB.cs_student_grades TO 'jiaowu'@'localhost'; FLUSH PRIVILEGES;

验证效果:

# 切换用户查询 mysql -u jiaowu -pjw123 -e "SELECT * FROM DB.cs_student_grades LIMIT 3;" # 输出仅含 Dno='CS' 的记录,且无法访问 Students 表原始数据 mysql -u jiaowu -pjw123 -e "SELECT * FROM DB.Students;" # 报错:Access denied

3.3 触发器与存储过程:业务规则自动化的最小可行单元

GreatSQL 完全兼容 MySQL 触发器语法。实验报告中SELECT * FROM information_schema.TRIGGERS仅用于查看,我们来写一个真实场景触发器:当成绩更新时,自动记录修改时间戳。

-- 为 SC 表添加修改时间字段 ALTER TABLE SC ADD COLUMN updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP; -- 创建触发器(GreatSQL 8.0.32 支持 BEFORE UPDATE) DELIMITER $$ CREATE TRIGGER update_sc_timestamp BEFORE UPDATE ON SC FOR EACH ROW BEGIN SET NEW.updated_at = NOW(); END$$ DELIMITER ; -- 测试触发器 UPDATE SC SET Grade = 95 WHERE Sno = '201705001' AND Cno = 'cs101'; SELECT Sno, Cno, Grade, updated_at FROM SC WHERE Sno = '201705001';

触发器避坑要点:

  • GreatSQL 中DELIMITER $$必须显式声明,否则分号被解析为语句结束,导致CREATE TRIGGER报错;
  • BEFORE UPDATE中NEW.updated_at可被赋值,AFTER UPDATE中则不可修改NEW;
  • 若触发器内含复杂逻辑(如跨表查询),需注意SQL SECURITY DEFINER权限,否则可能因调用者权限不足失败。

3.4 约束:从CHECK到FOREIGN KEY的全链路校验

实验报告中Teachers.Sex使用CHECK(Sex = '男' OR Sex = '女'),但 GreatSQL 8.0.32 的 CHECK 约束默认不启用(需设置check_constraint_checks=ON)。这是极易被忽略的玄学坑:

-- 查看当前 CHECK 约束状态 SELECT @@check_constraint_checks; -- 默认为 OFF -- 临时启用(会话级) SET SESSION check_constraint_checks = ON; -- 插入非法数据测试 INSERT INTO Teachers VALUES ('05005', '王五', '未知', '2000-01-01', '讲师', 'CS'); -- 若 check_constraint_checks=OFF,则插入成功;=ON 则报错

生产环境建议:
在/etc/my.cnf中全局启用:

[mysqld] check_constraint_checks = ON

然后重启 GreatSQL。否则CHECK形同虚设,数据质量失控。


4. 避坑:GreatSQL 在 CentOS 7 上部署与使用的 5 个血泪经验

GreatSQL 作为国产 MySQL 分支,兼容性高但细节差异致命。以下是在真实虚拟机环境中反复翻车后总结的硬核避坑指南,每一条都对应一个曾让实验中断 2 小时以上的具体故障。

4.1 现象:systemctl start greatsql显示 active,但ss -lntp | grep 3306无输出

原因:/etc/my.cnf中datadir路径权限错误。实验报告要求chown -R mysql:mysql /var/lib/mysql,但若/var/lib/mysql目录本身属主为root:root,chown -R仅递归修改子目录,父目录权限仍拒绝mysql用户进入。mysqld启动时因无法chdir到数据目录而静默退出。
解决:执行sudo chown mysql:mysql /var/lib/mysql(不带-R),再sudo chown -R mysql:mysql /var/lib/mysql/*。验证:sudo -u mysql ls /var/lib/mysql应无权限拒绝。

4.2 现象:mysql -u root连接报ERROR 1045 (28000): Access denied for user 'root'@'localhost'

原因:GreatSQL 8.0.32 初始化后 root 密码为空,但若之前安装过 MySQL 或 MariaDB,/var/lib/mysql目录残留旧数据,mysqld --initialize会跳过密码生成,导致 root 无密码也无法登录。
解决:彻底清理数据目录sudo rm -rf /var/lib/mysql/*,重新执行sudo /usr/local/greatsql/bin/mysqld --initialize --user=mysql --datadir=/var/lib/mysql,查看/var/log/greatsql/error.log获取临时密码(形如A temporary password is generated for root@localhost: xxxxxx),再用mysql -u root -p登录后执行ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpass';。

4.3 现象:创建外键时报ERROR 1215 (HY000): Cannot add foreign key constraint

原因:引用表(如Students)与被引用表(如SC)的字符集或排序规则不一致。实验报告中Students.Sno char(9)与SC.Sno char(9)看似相同,但若Students表创建时未指定CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,则默认使用latin1_swedish_ci,与utf8mb4不兼容。
解决:统一字符集,建表时显式声明:

CREATE TABLE Students ( Sno char(9) PRIMARY KEY, Sname char(10) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

4.4 现象:CREATE INDEX成功,但EXPLAIN SELECT ...显示未走索引

原因:GreatSQL 的索引选择器对char类型字段有特殊行为。若Students.Dno定义为char(4),但插入数据'CS'实际占 4 字节(含空格填充),而查询条件WHERE Dno = 'CS'中字符串长度为 2,MySQL 优化器可能因隐式类型转换放弃索引。
解决:将字段改为varchar(4),或查询时用WHERE Dno = 'CS '(补足空格)。更优方案是建表时用varchar替代char,避免填充问题。

4.5 现象:SHOW FULL PROCESSLIST查不到长事务,但SELECT * FROM information_schema.INNODB_TRX显示事务阻塞

原因:GreatSQL 的PROCESSLIST默认只显示用户线程,不包含内部系统线程(如innodb_trx中的锁等待线程)。实验报告截图图5可能因截取时机未捕获活跃事务。
解决:诊断锁问题必须用INNODB_TRX+INNODB_LOCK_WAITS+INNODB_LOCKS三表联查:

SELECT trx.trx_id, trx.trx_state, trx.trx_started, trx.trx_query, lw.lock_trx_id, lw.lock_wait_trx_id FROM information_schema.INNODB_TRX trx LEFT JOIN information_schema.INNODB_LOCK_WAITS lw ON trx.trx_id = lw.lock_trx_id;

5. 索引设计与查询优化:从CREATE INDEX到EXPLAIN的实战推演

实验报告第三部分要求“完成各类查询操作”,但没告诉你如何判断一个查询是否高效。这里用SC表的真实查询为例,展示如何从建索引、分析执行计划、到验证效果的完整闭环。所有操作均基于已部署的 GreatSQL 实例,无需额外工具。

5.1 场景还原:为什么WHERE Grade < 60查询慢?索引失效的典型陷阱

实验报告中SELECT DISTINCT Sno FROM SC WHERE Grade<60;是基础查询,但若SC表数据量达百万级,全表扫描将极慢。按常规思路,应在Grade字段建索引:

CREATE INDEX idx_grade ON SC(Grade);

然而:执行EXPLAIN SELECT DISTINCT Sno FROM SC WHERE Grade<60;会发现type: ALL(全表扫描),key: NULL(未用索引)。原因在于:DISTINCT+ 范围查询(<)导致索引无法覆盖查询需求——Grade索引只能快速定位Grade<60的行,但Sno值在索引中无序,DISTINCT仍需回表去重。

正确解法:联合索引覆盖查询字段

-- 删除低效单列索引 DROP INDEX idx_grade ON SC; -- 创建覆盖索引(Grade 为前导列,Sno 为第二列) CREATE INDEX idx_grade_sno ON SC(Grade, Sno);

验证执行计划:

EXPLAIN SELECT DISTINCT Sno FROM SC WHERE Grade<60;

预期输出关键字段:

+----+-------------+-------+------------+-------+----------------+----------------+---------+------+------+----------+--------------------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------+------------+-------+----------------+----------------+---------+------+------+----------+--------------------------+ | 1 | SIMPLE | SC | NULL | range | idx_grade_sno | idx_grade_sno | 5 | NULL | 10 | 100.00 | Using index for group-by | +----+-------------+-------+------------+-------+----------------+----------------+---------+------+------+----------+--------------------------+

type: range表示范围扫描索引,key: idx_grade_sno确认使用索引,Extra: Using index for group-by说明DISTINCT已在索引内完成,无需回表。

5.2 复合查询优化:JOIN+WHERE的索引协同策略

实验报告中SELECT sname,2024-year(Birthday) AS Age FROM students;计算年龄,但若需WHERE过滤(如WHERE Speciality='计算机'),且Speciality未建索引,则全表扫描不可避免。此时需考虑函数索引(GreatSQL 8.0.32 支持):

-- 为计算字段创建函数索引(加速 WHERE year(Birthday) BETWEEN 1997 AND 1999) CREATE INDEX idx_birthday_year ON Students ( (year(Birthday)) ); -- 验证函数索引是否生效 EXPLAIN SELECT * FROM Students WHERE year(Birthday) = 1999;

注意:函数索引仅对WHERE子句中完全匹配该函数的查询有效,ORDER BY year(Birthday)无法利用。

5.3 索引维护:ANALYZE TABLE与统计信息更新的必要性

GreatSQL 的查询优化器依赖表的统计信息(如行数、索引基数)选择执行计划。若SC表数据批量导入后未更新统计信息,优化器可能误判Grade<60仅占 1%,从而选择嵌套循环而非索引扫描。

强制更新统计信息:

ANALYZE TABLE SC; -- 查看统计信息是否更新 SELECT table_name, table_rows, avg_row_length, data_length FROM information_schema.tables WHERE table_schema = 'DB' AND table_name = 'SC';

最佳实践:

  • 每次批量INSERT/DELETE超过表总行数 10% 后,执行ANALYZE TABLE;
  • 在定时任务中加入mysql -u root -e "ANALYZE TABLE DB.SC;",避免人工遗漏。

5.4 查询性能基线测试:用BENCHMARK()定量验证优化效果

不能只信EXPLAIN,要实测。GreatSQL 提供BENCHMARK()函数进行简单压测:

-- 测试优化前(无索引)查询耗时(需先删除索引) SELECT BENCHMARK(10000, (SELECT COUNT(*) FROM SC WHERE Grade<60)); -- 测试优化后(有联合索引)查询耗时 SELECT BENCHMARK(10000, (SELECT COUNT(*) FROM SC WHERE Grade<60));

解读:BENCHMARK(10000, expr)执行表达式 10000 次,返回0表示成功,耗时可通过time mysql -u root -e "..."获取。通常联合索引可将此类查询提速 50~100 倍。


6. 从实验报告到生产环境:GreatSQL 配置调优与高可用初探

实验报告止步于单机部署,但 GreatSQL 的真正价值在于其企业级特性。这里不讲理论,只给三个可立即落地的配置项和一个 MGR(组复制)最小化验证方案,让你从“能跑”迈向“能扛”。

6.1 关键配置项调优:my.cnf中必须改的 3 个参数

GreatSQL 默认配置面向通用场景,生产环境需针对性调整。以下参数经某高校教务系统压测验证,提升显著:

参数默认值推荐值作用风险提示
innodb_buffer_pool_size128M512M(内存 ≥ 2G 时)InnoDB 缓存池大小,直接影响磁盘 I/O不可超过物理内存 70%,否则引发 OOM
max_connections151500最大并发连接数连接数过高增加内存消耗,需配合wait_timeout=300清理空闲连接
log_binOFFON启用二进制日志(MGR、备份必需)开启后磁盘写入量增加,需确保/var/lib/mysql所在分区有足够空间

修改/etc/my.cnf:

[mysqld] innodb_buffer_pool_size = 512M max_connections = 500 log_bin = /var/lib/mysql/mysql-bin server-id = 1 # MGR 必需,每节点唯一

重启生效:sudo systemctl restart greatsql

6.2 MGR 单主模式最小化验证:3 节点集群 10 分钟搭通

GreatSQL 的 MGR 是其核心优势,实验报告仅提及“地理标签”,但未演示。以下用 3 台 CentOS 7 虚拟机(IP:192.168.10.10/11/12)搭建最小集群:

步骤 1:三台机器均启用 GTID 和 MGR 插件
在/etc/my.cnf中追加:

[mysqld] gtid_mode = ON enforce_gtid_consistency = ON binlog_checksum = NONE log_slave_updates = ON master_info_repository = TABLE relay_log_info_repository = TABLE transaction_write_set_extraction = XXHASH64 loose-group_replication_group_name = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" loose-group_replication_start_on_boot = OFF loose-group_replication_local_address = "192.168.10.10:33061" # 各节点改为自己 IP loose-group_replication_group_seeds = "192.168.10.10:33061,192.168.10.11:33061,192.168.10.12:33061" loose-group_replication_bootstrap_group = OFF

步骤 2:在第一台节点(192.168.10.10)执行引导

-- 登录 MySQL mysql -u root -p -- 创建复制用户 CREATE USER 'repl'@'%' IDENTIFIED BY 'repl123'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; FLUSH PRIVILEGES; -- 加载插件并引导集群 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;

步骤 3:在其余两台节点加入集群

-- 同样创建 repl 用户后执行 INSTALL PLUGIN group_replication SONAME 'group_replication.so'; START GROUP_REPLICATION;

验证集群状态:

SELECT * FROM performance_schema.replication_group_members; -- 正常应显示 3 行,`MEMBER_STATE` 均为 ONLINE

提示:MGR 端口33061需在防火墙放行(若未关 firewalld),且三台机器/etc/hosts中需互相解析主机名,否则START GROUP_REPLICATION报Connection refused。

6.3 从实验到工程:我的 3 条硬核习惯

做完这九个实验,我养成了三个雷打不动的习惯,它们让我在后续所有数据库项目中少踩 80% 的坑:

  1. 每次CREATE TABLE后必跑SHOW CREATE TABLE:不是为了看语法,而是检查 GreatSQL 是否默默改写了你的定义——比如把char(4)自动转成varchar(4),或把utf8升级为utf8mb4。眼见为实,代码生成的 DDL 比人写的更可靠。

  2. 所有SELECT上线前必加EXPLAIN:哪怕只是SELECT * FROM users LIMIT 10。GreatSQL 的优化器有时会为小表选择全表扫描,这在开发环境无感,但数据量涨到百万后就是雪崩起点。把EXPLAIN当成git commit的 pre-commit hook。

  3. systemctl restart greatsql后必查三件事:systemctl status看是否 active;ss -lntp | grep 3306看端口是否监听;mysql -u root -e "SELECT 1;"看能否连通。这三步 30 秒搞定,却能拦截 90% 的配置错误。

希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/4 3:03:20

分段参数方程建模:导弹轨迹的物理过程重构与工程可解释性

简介&#xff1a;本资源为第八届MathorCup高校数学建模挑战赛特等奖优秀论文&#xff08;编号C3289&#xff09;&#xff0c;聚焦陆基导弹打击航母这一典型军事应用问题&#xff0c;面向数学建模竞赛参赛者、国防领域建模初学者及高校数模指导教师。论文系统构建了静止目标下的…

作者头像 李华
网站建设 2026/11/4 3:02:56

Kobold靶机渗透测试实战:从Web漏洞到Root提权

1. 靶机概述与渗透测试思路Kobold是HackTheBox平台上一台中等难度的Linux靶机&#xff0c;其名称暗示了与游戏或角色扮演相关的背景。这台机器主要考察攻击者对Web应用漏洞的识别能力、权限提升技巧以及对非常规漏洞利用手法的理解。从实战角度来看&#xff0c;Kobold模拟了企业…

作者头像 李华
网站建设 2026/11/4 3:02:54

技术文档中的简单与综合应用实践指南

1. 项目背景与核心价值"202601/重中之重"这个看似神秘的编号组合&#xff0c;实际上代表着一类在工程实践和学术研究中极为关键的技术文档体系。这类文档通常用于记录复杂系统中的核心算法、关键业务流程或重要技术方案的实施细节。而"简单和综合应用"则揭…

作者头像 李华
网站建设 2026/11/4 3:01:47

编译原理实验:PL/0词法分析与递归下降分析器实现

简介&#xff1a;这份编译原理实验报告面向东北大学秦皇岛分校计算机与通信工程学院修读编译原理课程的学生&#xff0c;围绕 PL/0 语言词法分析程序的设计与实现展开&#xff0c;可用于理解词法分析基本概念、完成实验编码与报告整理。资源包仅含 1 个 doc 文件&#xff0c;压…

作者头像 李华
网站建设 2026/11/4 3:01:18

AI原生应用微服务架构实践与优化

1. 为什么AI原生应用需要微服务架构去年我们团队接手了一个电商推荐系统改造项目&#xff0c;原系统采用单体架构&#xff0c;随着业务量增长暴露出三个致命问题&#xff1a;推荐模型更新需要停机部署、流量激增时整个系统崩溃、新功能上线周期长达两周。这促使我们转向AI原生应…

作者头像 李华
网站建设 2026/11/4 3:01:17

Cocos Creator回合制战斗系统架构:调度、结算与Buff管线

简介&#xff1a;CocoKnightManager 是一套基于 Cocos Creator 的回合制游戏系统设计源码&#xff0c;面向希望理解战斗流程抽象、模块拆分与数据驱动配置的独立开发者与学习团队&#xff0c;可用于搭建角色行动顺序、技能规则和状态切换等核心机制。压缩包为 zip 格式&#xf…

作者头像 李华