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 firewalld

2.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-libsNUMA 架构优化支持,避免跨节点内存访问延迟在多 CPU 虚拟机中性能下降明显,sysbench测试 QPS 降低 30%+
openssl-develSSL/TLS 加密连接支持,CREATE USER ... REQUIRE SSL语句必需无法启用加密连接,SHOW VARIABLES LIKE 'have_ssl'返回DISABLED
perl-JSONMGR(组复制)元数据解析依赖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-minimal

3. 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仅显示最后一次启动状态。
解决:

  1. 查看详细日志:journalctl -u greatsql -n 100 -f(实时跟踪)
  2. 关键线索:日志中mysqld: Error while loading shared libraries: libjemalloc.so.2: cannot open shared object file
  3. 执行ldd /usr/local/.../bin/mysqld | grep jemalloc,确认libjemalloc.so.2 => not found
  4. 修复: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未注释。
解决:

  1. 编辑/etc/my.cnf,在[mysqld]下添加:
    bind-address = 0.0.0.0 # skip-networking = OFF # 确保此行被注释或删除
  2. 重启服务:systemctl restart greatsql
  3. 验证: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,数据库名仅存在于数据字典,物理目录需创建表后才生成。
解决:

  1. 执行建表语句:CREATE TABLE DB.test (id INT) ENGINE=InnoDB;
  2. 再执行ls /var/lib/mysql/DB/,即可看到test.ibd文件
  3. 实验报告截图技巧: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 用户需显式刷新权限。
解决:

  1. 登录后执行:FLUSH PRIVILEGES;
  2. 或直接查询: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库。
解决:

  1. 确认当前库:SELECT DATABASE();
  2. 切换库:USE DB;
  3. 重新建表:CREATE TABLE STUDENTS(...);
  4. 郑州大学实验习惯:所有 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 -efgrep mysqld | grep -v grep`
TCP连接图(图3)ss输出必须含LISTEN且PID对应mysqldss -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,通过再截图。希望帮到你。

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