CentOS 7 部署 GreatSQL 8.0.32:绕过 SELinux 与 firewalld 静默拦截
简介:本资源是郑州大学计算机与人工智能学院《数据库系统原理》课程配套的完整实验报告,面向高校数据库初学者及实践教学场景,聚焦DBMS系统认知、国产数据库GreatSQL部署与运维、实验过程记录与结果分析等核心能力培养。报告覆盖8个递进式实验(含DBMS架构理解、SELinux/防火墙配置调优、依赖包安装、GreatSQL二进制部署、systemd服务管理、逻辑组件实操等),并严格遵循课程对截图编号、图题表名、书面行文等规范要求。压缩包为单个3.69MB的docx文件,内容结构完整,含实验目的、环境配置命令、操作步骤详解、问题反思与性能安全讨论,可直接用于课程提交或作为数据库实践参考模板。目前已有511人学习下载,适合需要对标高校实验标准、掌握Linux下国产数据库落地实操的本科生与自学开发者。
1. GreatSQL 8.0.32 实验环境搭建:CentOS 7 上装万里数据库,别被 SELinux 和防火墙“静默拦截”坑哭
你是不是也经历过——所有命令都敲对了,systemctl start greatsql显示 active (running),但mysql -u root -p死活连不上,ss -lntp | grep 3306一片空白?查日志只看到mysqld: Can't open shared library 'libjemalloc.so.2'或更玄学的Permission denied?这不是你手残,是 CentOS 7 默认开启的 SELinux 和 firewalld 在后台悄悄掐断了数据库的命脉。郑州大学《数据库系统原理》实验一明确要求在 VMware + CentOS 7 环境下部署万里数据库 GreatSQL 8.0.32-25,而这份实验报告里埋着一个关键提示:关闭 SELinux 不是偷懒,而是让数据库进程能真正读写/var/lib/mysql、加载jemalloc内存库、绑定 3306 端口的必要前提。很多同学卡在“安装成功但无法连接”,本质是把setenforce 0当成可选项,结果服务看似启动,实则被安全策略锁死在初始化阶段。本文全程基于 GreatSQL 官方二进制包GreatSQL-8.0.32-25-Linux-glibc2.17-x86_64-minimal.tar.xz,覆盖从裸机 CentOS 7 到可交互 SQL 的完整链路,每一步都标注了“为什么必须这样”,尤其聚焦那些不报错却让数据库变成黑匣子的隐性配置。适合正在赶郑州大学数据库实验报告、需要一份能当天跑通的部署笔记的你。
2. 环境准备与依赖安装:CentOS 7 基础加固与 GreatSQL 运行时依赖闭环
GreatSQL 并非开箱即用的“绿色版”,它对底层系统有明确的运行时契约。跳过这步直接解压启动,90% 的失败源于缺失关键依赖或内核级权限限制。本节严格按实验报告原文顺序执行,但每条命令背后都补全了“不装会怎样”的血泪经验。
2.1 关闭 SELinux 与防火墙:不是妥协,是解除系统级访问枷锁
实验报告明确要求执行三步:
setenforce 0 sed -i '/^SELINUX=/c\SELINUX=disabled' /etc/selinux/config systemctl disable firewalld systemctl stop firewalld提示:
setenforce 0是临时禁用,重启后失效;sed命令才是永久生效的关键。务必确认/etc/selinux/config中SELINUX=disabled已写入,否则 reboot 后服务又挂。
为什么必须关?
- SELinux:默认策略禁止
mysqld进程访问/var/lib/mysql(类型mysqld_db_t)和加载libjemalloc.so.2(类型lib_t)。即使chown mysql:mysql权限正确,SELinux 仍会拦截,日志中仅显示avc: denied,无具体错误码。 - firewalld:CentOS 7 默认开启,且
publiczone 默认拒绝所有入站连接。GreatSQL 默认监听0.0.0.0:3306,若未放行端口,本地mysql -h 127.0.0.1 -P 3306可连,但mysql -h <虚拟机IP>必然超时——这是郑州大学实验中截图失败的最常见原因。
验证是否生效:
# 检查 SELinux 状态(应为 disabled) sestatus # 检查防火墙状态(应为 inactive) systemctl status firewalld2.2 安装核心依赖包:补齐 GreatSQL 的“肌肉”与“神经”
GreatSQL 8.0.32 依赖一系列底层库,缺一不可。实验报告列出的yum install命令是经过验证的最小集:
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各依赖作用与缺失后果:
| 依赖包 | 作用 | 缺失表现 |
|---|---|---|
libaio-devel | 提供异步 I/O 支持,InnoDB 高性能写入必需 | mysqld启动失败,报undefined symbol: io_submit |
jemalloc&jemalloc-devel | 内存分配器,GreatSQL 默认启用以提升并发性能 | 启动时报error while loading shared libraries: libjemalloc.so.2: cannot open shared object file |
numactl-devel&numactl-libs | NUMA 架构优化支持,避免跨节点内存访问延迟 | 在多 CPU 虚拟机中性能下降明显,sysbench测试 QPS 降低 30%+ |
openssl-devel | SSL/TLS 加密连接支持,CREATE USER ... REQUIRE SSL语句必需 | 无法启用加密连接,SHOW VARIABLES LIKE 'have_ssl'返回DISABLED |
perl-JSON | MGR(组复制)元数据解析依赖 | START GROUP_REPLICATION失败,报JSON parser error |
注意:
python2是 GreatSQL 8.0.32 的硬依赖(用于部分管理脚本),CentOS 7 默认自带,但若系统曾卸载过需补回。net-tools提供ifconfig/netstat,虽非运行必需,但实验中排查网络问题必备。
2.3 创建 mysql 系统用户与目录结构:权限模型的起点
GreatSQL 遵循 MySQL 生态惯例,要求以非 root 用户运行。实验报告指令精准:
/sbin/groupadd mysql /sbin/useradd -g mysql mysql -d /dev/null -s /sbin/nologin mkdir -p /var/lib/mysql /var/log chown -R mysql:mysql /var/lib/mysql /var/log /usr/local/GreatSQL-8.0.32-25-Linux-glibc2.17-x86_64-minimal关键点解析:
-d /dev/null -s /sbin/nologin:确保mysql用户无家目录、无法登录 shell,符合最小权限原则。mkdir -p:-p参数避免因父目录不存在导致创建失败。chown -R:必须递归授权,尤其/usr/local/GreatSQL-8.0.32-25-Linux-glibc2.17-x86_64-minimal目录下bin/、lib/、share/子目录均需mysql权限,否则mysqld启动时无法读取配置文件或字符集。
验证权限:
# 检查用户与组 id mysql # 检查关键目录权限(应显示 mysql:mysql) ls -ld /var/lib/mysql /usr/local/GreatSQL-8.0.32-25-Linux-glibc2.17-x86_64-minimal3. GreatSQL 8.0.32 安装与服务注册:二进制部署的标准化流程
GreatSQL 提供免编译的二进制包,部署核心在于路径规范、服务文件编写和配置文件初始化。本节严格遵循实验报告步骤,但补全了官方文档未强调的细节。
3.1 下载与解压:选择正确的发行版与校验机制
实验报告指定下载地址:
cd /usr/local wget https://product.greatdb.com/GreatSQL-8.0.32-25/GreatSQL-8.0.32-25-Linux-glibc2.17-x86_64-minimal.tar.xz tar xf GreatSQL-8.0.32-25-Linux-glibc2.17-x86_64-minimal.tar.xz为什么选这个包?
glibc2.17:CentOS 7 的 glibc 版本为 2.17,此包为兼容性编译,若误用glibc2.28(对应 CentOS 8)将报GLIBC_2.28 not found。minimal:精简版,不含调试符号和测试套件,体积小、启动快,适合教学实验环境。- 强烈建议校验:下载后执行
sha256sum GreatSQL-8.0.32-25-Linux-glibc2.17-x86_64-minimal.tar.xz,比对官网发布的 SHA256 值,防止镜像源篡改。
解压后目录结构应为:
/usr/local/GreatSQL-8.0.32-25-Linux-glibc2.17-x86_64-minimal/ ├── bin/ # mysqld, mysql, mysqladmin 等可执行文件 ├── lib/ # libjemalloc.so.2, libssl.so.1.1 等动态库 ├── share/ # 字符集、错误消息、SQL 初始化脚本 └── support-files/ # my.cnf 模板、systemd 服务模板3.2 编写 systemd 服务文件:让 GreatSQL 成为真正的系统服务
实验报告要求创建/lib/systemd/system/greatsql.service。这是 CentOS 7 管理服务的标准方式,比手动nohup ./mysqld &更可靠。文件内容需严格匹配 GreatSQL 路径:
[Unit] Description=GreatSQL Server Documentation=man:mysqld(8) Documentation=https://greatdb.com/ 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 Restart=on-failure RestartSec=10 TimeoutSec=300 LimitNOFILE=65535 LimitCORE=infinity Environment="LANG=en_US.UTF-8" [Install] WantedBy=multi-user.target参数详解:
ExecStart:必须指定--defaults-file=/etc/my.cnf,否则mysqld将按默认顺序搜索配置文件(/etc/my.cnf,/etc/mysql/my.cnf...),易导致配置不生效。LimitNOFILE=65535:提高文件描述符上限,避免高并发连接时Too many open files错误。Environment="LANG=en_US.UTF-8":确保字符集一致,避免中文字段乱码。
注册服务:
systemctl daemon-reload systemctl enable greatsql # 开机自启注意:
systemctl enable必须在daemon-reload后执行,否则提示Failed to enable unit: Unit greatsql.service does not exist.
3.3 初始化配置文件 /etc/my.cnf:从模板到可用的最小化配置
GreatSQL 未提供开箱即用的my.cnf,需手动创建。实验报告未给内容,此处提供经验证的最小可行配置(保存为/etc/my.cnf):
[mysqld] # 基础设置 port = 3306 socket = /var/lib/mysql/mysql.sock datadir = /var/lib/mysql pid-file = /var/lib/mysql/mysqld.pid user = mysql # 字符集 character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci skip-character-set-client-handshake = 1 # 日志 log-error = /var/log/mysqld.log slow-query-log = 1 slow-query-log-file = /var/log/mysqld-slow.log long_query_time = 2 # InnoDB innodb_buffer_pool_size = 512M innodb_log_file_size = 256M innodb_flush_log_at_trx_commit = 1 # GreatSQL 特性开关(按需启用) # plugin-load-add = group_replication.so # loose-group_replication_group_name = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"关键配置说明:
datadir和socket:必须与chown授权的路径一致,否则mysqld无法创建 socket 文件。character-set-server = utf8mb4:支持完整 Unicode(含 emoji),utf8在 MySQL/GreatSQL 中仅为 3 字节编码,不兼容四字节字符。innodb_buffer_pool_size:设为物理内存的 50%-70%,CentOS 7 虚拟机建议 512M 起步,过小导致频繁磁盘 IO。skip-character-set-client-handshake:强制服务端字符集,避免客户端连接时协商失败。
4. 启动与初始化:从空数据目录到可登录的 root 用户
GreatSQL 8.0.32 的首次启动需初始化数据目录,生成系统表、root 密码等。此步极易出错,必须按顺序执行。
4.1 手动初始化数据目录:生成基础系统表
GreatSQL 不像 MySQL 8.0+ 提供mysqld --initialize自动初始化,需使用mysqld自带的--initialize-insecure模式(实验环境允许):
# 切换到 GreatSQL 目录 cd /usr/local/GreatSQL-8.0.32-25-Linux-glibc2.17-x86_64-minimal # 手动初始化(--initialize-insecure 生成空密码 root) bin/mysqld --defaults-file=/etc/my.cnf --initialize-insecure --user=mysql # 检查初始化结果(应有 ibdata1, ib_logfile0 等文件) ls -lh /var/lib/mysql/初始化后关键文件:
ibdata1:InnoDB 共享表空间,存储数据字典、undo log。ib_logfile0/ib_logfile1:InnoDB 重做日志,保障崩溃恢复。mysql/目录:包含user、db、tables_priv等系统表,定义权限。
注意:
--initialize-insecure生成的 root 用户密码为空,仅限实验环境。生产环境必须用--initialize(生成随机密码,记录在 error log)。
4.2 启动 GreatSQL 服务并验证进程
执行启动命令:
systemctl start greatsql验证是否真正启动:
# 1. 检查服务状态(active (running) 且无 failed) systemctl status greatsql # 2. 查看进程(必须有 mysqld 进程,且属 mysql 用户) ps -ef | grep mysqld | grep -v grep # 3. 检查端口监听(3306 应处于 LISTEN 状态) ss -ltnp | grep :3306 # 4. 检查错误日志(关键!首行应为 "mysqld: ready for connections") tail -20 /var/log/mysqld.log常见失败现象与日志线索:
ps无mysqld进程,systemctl status显示failed→ 查/var/log/mysqld.log最后 50 行,重点关注ERROR行。ss无 3306 端口 → 检查my.cnf中port是否被注释,或bind-address是否设为127.0.0.1(导致外部不可达)。- 日志末尾出现
Aborting→ 通常是datadir权限错误或libjemalloc.so.2加载失败。
4.3 首次登录与密码设置:建立安全访问通道
初始化后,root 用户密码为空,可直接登录:
# 使用本地 socket 登录(推荐,无需网络) /usr/local/GreatSQL-8.0.32-25-Linux-glibc2.17-x86_64-minimal/bin/mysql -u root -S /var/lib/mysql/mysql.sock # 或使用 TCP 登录(需确保 bind-address 配置正确) /usr/local/GreatSQL-8.0.32-25-Linux-glibc2.17-x86_64-minimal/bin/mysql -u root -h 127.0.0.1 -P 3306首次登录后立即设置密码:
-- 进入 MySQL 命令行后执行 ALTER USER 'root'@'localhost' IDENTIFIED BY 'ZhengDa2024!'; FLUSH PRIVILEGES;验证密码生效:
# 退出后重新登录(需输入新密码) mysql -u root -p -S /var/lib/mysql/mysql.sock提示:
ZhengDa2024!仅为示例,实际请使用符合复杂度要求的密码(大小写字母+数字+特殊字符)。
5. 常见问题排查:那些让郑州大学实验报告截图失败的“静默陷阱”
安装过程看似顺利,但实验报告要求的截图(如ps -ef | grep mysqld、ss -lntp | grep mysqld)失败,往往源于以下“不报错但无效”的配置。这些是我在帮某高校实验室批量部署 GreatSQL 时踩过的坑,整理成可复现的排查清单。
5.1 现象:systemctl status greatsql显示 active,但ps -ef | grep mysqld无进程
原因:mysqld进程启动后立即崩溃退出,systemd因Restart=on-failure重启,形成“闪退-重启”循环,systemctl status仅显示最后一次启动状态。
解决:
- 查看详细日志:
journalctl -u greatsql -n 100 -f(实时跟踪) - 关键线索:日志中
mysqld: Error while loading shared libraries: libjemalloc.so.2: cannot open shared object file - 执行
ldd /usr/local/.../bin/mysqld | grep jemalloc,确认libjemalloc.so.2 => not found - 修复:
echo '/usr/lib64' > /etc/ld.so.conf.d/greatsql.conf && ldconfig(将 jemalloc 路径加入动态库搜索)
5.2 现象:mysql -u root -p连接超时,ss -lntp | grep 3306无输出
原因:my.cnf中bind-address默认为127.0.0.1,仅监听本地回环,虚拟机外部(如宿主机)无法连接;或skip-networking未注释。
解决:
- 编辑
/etc/my.cnf,在[mysqld]下添加:bind-address = 0.0.0.0 # skip-networking = OFF # 确保此行被注释或删除 - 重启服务:
systemctl restart greatsql - 验证:
ss -ltnp | grep :3306应显示0.0.0.0:3306
5.3 现象:CREATE DATABASE DB;执行成功,但ls /var/lib/mysql/无DB目录
原因:GreatSQL 8.0.32 默认启用innodb_file_per_table=ON,数据库名仅存在于数据字典,物理目录需创建表后才生成。
解决:
- 执行建表语句:
CREATE TABLE DB.test (id INT) ENGINE=InnoDB; - 再执行
ls /var/lib/mysql/DB/,即可看到test.ibd文件 - 实验报告截图技巧:
SHOW DATABASES;后紧接着USE DB; CREATE TABLE t1(id INT); SHOW TABLES;,再截图ls /var/lib/mysql/DB/,确保目录存在。
5.4 现象:SELECT * FROM information_schema.TRIGGERS;返回空集,但实验报告图6要求有触发器
原因:information_schema.TRIGGERS表仅显示当前用户有权限查看的触发器,新初始化的 root 用户需显式刷新权限。
解决:
- 登录后执行:
FLUSH PRIVILEGES; - 或直接查询:
SELECT TRIGGER_NAME, EVENT_MANIPULATION, EVENT_OBJECT_TABLE FROM information_schema.TRIGGERS WHERE TRIGGER_SCHEMA='mysql';(系统触发器在 mysql 库)
5.5 现象:CREATE INDEX Student_Dept ON Students (Dno);报错Unknown table 'Students'
原因:实验二中CREATE TABLE STUDENTS语句未指定数据库,且未执行USE DB;,导致表创建在mysql系统库而非DB库。
解决:
- 确认当前库:
SELECT DATABASE(); - 切换库:
USE DB; - 重新建表:
CREATE TABLE STUDENTS(...); - 郑州大学实验习惯:所有 DDL 语句前加
USE DB;,避免跨库混淆。
6. 验证与实验衔接:用一条 SQL 验证整个环境是否 Ready for 实验一至九
装完 GreatSQL 只是起点,郑州大学实验报告的核心价值在于后续九个实验的连贯性。一个可靠的验证方法,不是简单mysql -V,而是模拟实验一至三的真实操作流,用一条复合 SQL 覆盖逻辑组件、物理组件和基础查询能力。
6.1 终极验证 SQL:一次执行,覆盖四大实验模块
将以下 SQL 保存为verify_zzu.sql,在 GreatSQL 中执行:
-- 1. 验证数据库存在性(实验一:认识DBMS) SELECT 'DBMS_VERSION' AS check_item, VERSION() AS result UNION ALL -- 2. 验证逻辑组件(实验一:基本表/视图/触发器/存储过程/约束) SELECT 'TABLE_COUNT', COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA='mysql' UNION ALL SELECT 'VIEW_COUNT', COUNT(*) FROM information_schema.VIEWS WHERE TABLE_SCHEMA='mysql' UNION ALL SELECT 'TRIGGER_COUNT', COUNT(*) FROM information_schema.TRIGGERS WHERE TRIGGER_SCHEMA='mysql' UNION ALL SELECT 'PROCEDURE_COUNT', COUNT(*) FROM information_schema.ROUTINES WHERE ROUTINE_SCHEMA='mysql' AND ROUTINE_TYPE='PROCEDURE' UNION ALL SELECT 'CONSTRAINT_COUNT', COUNT(*) FROM information_schema.KEY_COLUMN_USAGE WHERE CONSTRAINT_SCHEMA='mysql' UNION ALL -- 3. 验证物理组件(实验一:数据页/存储引擎) SELECT 'STORAGE_ENGINE', ENGINE FROM information_schema.ENGINES WHERE SUPPORT='YES' LIMIT 1 UNION ALL SELECT 'PAGE_SIZE', @@innodb_page_size UNION ALL -- 4. 验证实验二&三基础能力(建库/建表/查询) SELECT 'DB_CREATE', IF(EXISTS(SELECT 1 FROM information_schema.SCHEMATA WHERE SCHEMA_NAME='ZZU_TEST'), 'SUCCESS', 'FAILED') UNION ALL SELECT 'TABLE_CREATE', IF(EXISTS(SELECT 1 FROM information_schema.TABLES WHERE TABLE_SCHEMA='ZZU_TEST' AND TABLE_NAME='verify_test'), 'SUCCESS', 'FAILED') UNION ALL SELECT 'QUERY_RESULT', (SELECT COUNT(*) FROM ZZU_TEST.verify_test) ;执行步骤:
# 创建测试库与表 mysql -u root -p -S /var/lib/mysql/mysql.sock -e "CREATE DATABASE ZZU_TEST; USE ZZU_TEST; CREATE TABLE verify_test(id INT); INSERT INTO verify_test VALUES(1),(2);" # 执行验证SQL mysql -u root -p -S /var/lib/mysql/mysql.sock < verify_zzu.sql预期输出:
所有result列应为非空值,尤其DB_CREATE、TABLE_CREATE显示SUCCESS,QUERY_RESULT显示2。若任一为FAILED,说明对应模块未就绪。
6.2 实验报告截图标准化:确保每张图都“可复现、可验证”
郑州大学实验报告要求截图带编号与图题,为避免返工,我总结了一套截图前必做的检查清单:
| 截图类型 | 必检项 | 命令示例 | 为何重要 |
|---|---|---|---|
| 进程状态图(图1) | ps输出必须含--defaults-file=/etc/my.cnf参数 | `ps -ef | grep mysqld | grep -v grep` |
| TCP连接图(图3) | ss输出必须含LISTEN且PID对应mysqld | ss -ltnp | grep :3306 | 证明网络层已就绪,非仅进程存活 |
| 数据库文件图(图4) | ls必须显示ibdata1、mysql/、performance_schema/目录 | ls -F /var/lib/mysql/ | 证明初始化成功,非空目录 |
| SQL执行图(图5-7) | 每条 SQL 后必须跟SELECT ROW_COUNT();或SHOW WARNINGS; | SELECT * FROM information_schema.VIEWS; SELECT ROW_COUNT(); | 证明语句执行成功,非语法错误静默忽略 |
我的血泪经验:从那以后我每次帮学生部署 GreatSQL,都会在
~/.bashrc里加一行alias zzu_check='mysql -u root -p -S /var/lib/mysql/mysql.sock < /tmp/verify_zzu.sql',部署完第一件事就是zzu_check,通过再截图。希望帮到你。
本文还有配套的精品资源,点击获取