news 2026/10/9 18:28:36

CentOS 7上安装GreatSQL 8.0.32:从环境配置到SQL查询实验全攻略

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CentOS 7上安装GreatSQL 8.0.32:从环境配置到SQL查询实验全攻略

简介:这是一份郑州大学计算机与人工智能学院《数据库系统原理》课程的实验报告,面向郑大计算机类专业学生,可作为数据库实验课程学习与报告撰写的参考资料。资源为单个docx文档,大小3.69MB,已有507人学习下载。内容从实验目的、实验类型到学时分配与仪器材料均有清晰呈现。报告完整覆盖数据库实验的各个环节,既包括DBMS系统工作原理与逻辑组件(基本表、视图、触发器、存储过程等)和物理组件认识,也详细记录了基于VMware+CentOS 7关闭SELinux与防火墙、安装依赖包、部署并启动万里数据库GreatSQL的具体命令及原因。实验过程部分还呈现了问题解决思路、结果分析和截图规范,并对后续数据库实践具有较强参考价值,适合需要完成数据库原理实验或规范撰写实验报告的同学。

1. 一份能直接照着做的数据库实验报告:从装环境到写查询

数据库原理课第一次上机,老师给的是 GreatSQL 8.0.32-25,要求在 CentOS 7 虚拟机上装好,再完成建库、建表、索引和交互式查询。大多数人卡在了第一步:装环境装到想哭,不是依赖报错,就是服务起不来。这份来自某高校计算机与人工智能学院的《数据库系统原理》实验报告,完整覆盖了从关闭 SELinux、安装依赖、解压二进制包、配置 systemd 服务,到创建数据库、建表、填充数据、建索引、写各类查询的整条链路。SQL 语句可以直接抄,安装命令能逐步复现,连翻车记录都写在问题总结里。适合正在准备数据库原理实验报告的学生,也适合想快速在 CentOS 上体验 GreatSQL 的开发者。

2. 在 CentOS 上装好 GreatSQL:先关 SELinux,再解压二进制包

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,这是永久关闭。两条都执行才算双保险。

之所以要关 SELinux,原因有三:第一,SELinux 是强制访问控制机制,数据库要执行文件读写、网络通信这类特权操作时,SELinux 策略可能直接把进程拦住;第二,SELinux 的配置策略复杂,实验中没必要为它额外排错;第三,它对每个进程做访问控制检查,会拖慢性能。防火墙同理,数据库默认监听 3306 端口,防火墙规则没放行就连不上。虚拟机内部做开发测试时,关掉防火墙能少很多玄学问题。

提示:生产环境不要照搬这个操作。SELinux 和防火墙在真实服务器上承担重要安全职责,正确做法是配置对应策略只放行数据库端口,而不是整体关闭。

2.2 依赖包与二进制包:版本号和目录规划

依赖包列表很长,但不要跳过任何一个。实验报告里用的是 yum 一次装齐:

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是 MySQL 异步 I/O 的依赖,numactl-*负责 NUMA 内存管理,openssl-devel提供 SSL 加密支持,jemalloc是内存分配器,perl-*系列是 MySQL 初始化脚本的运行环境。缺了任何一个,后面都有可能在初始化或启动阶段才报错,而且是那种看不出原因的底层错误。

依赖装完,下载二进制包并解压到/usr/local/:

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

这里要注意两点:一是选择 glibc 2.17 版本,对应 CentOS 7 的默认 glibc;二是选择minimal包,这个版本剔除了测试套件和不常用组件,安装体积小,启动更快,适合实验环境。解压后目录名自带版本号,后面配置 systemd 和 my.cnf 都要引用这个路径。

2.3 systemd 服务与 my.cnf:把启停交给系统托管

GreatSQL 安装不像 RPM 包会自带服务脚本,需要手动写 systemd 服务文件。实验报告给出的路径是/lib/systemd/system/greatsql.service,内容按常见模板补全:

vim /lib/systemd/system/greatsql.service
[Unit] Description=GreatSQL Server After=network.target [Service] 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 LimitNOFILE=65535 [Install] WantedBy=multi-user.target

写完后执行systemctl daemon-reload让 systemd 识别新服务。ExecStart必须指向解压目录里实际的mysqld路径,--defaults-file指定全局配置文件位置。LimitNOFILE设置文件描述符上限,数据库并发连接高时会用到,实验环境直接配上更稳妥。

接着编辑/etc/my.cnf,这是数据库全局配置入口:

[mysqld] datadir=/var/lib/mysql socket=/tmp/mysql.sock port=3306 character-set-server=utf8mb4 collation-server=utf8mb4_general_ci [client] default-character-set=utf8mb4

datadir指向数据文件存放目录,后面创建的用户和目录权限必须和这里对得上。utf8mb4字符集配置建议加上,不然后面插入中文大概率出现乱码,这是实验里最常见的坑之一。

2.4 启动后做四件事:状态、进程、端口、数据文件

启动前先创建 mysql 系统用户和相关目录:

/sbin/groupadd mysql /sbin/useradd -g mysql mysql -d /dev/null -s /sbin/nologin mkdir /var/lib/mysql/ chown -R mysql:mysql /var/lib/mysql/

mysql 用户不允许登录(-s /sbin/nologin),只用于运行数据库服务,这是 MySQL 系数据库的标准做法。然后启动服务并验证:

systemctl start greatsql systemctl status greatsql ps -ef | grep mysqld ss -lntp | grep mysqld ls /var/lib/mysql
systemctl status greatsql

systemctl status看服务整体状态;ps确认 mysqld 进程存在;ss -lntp确认 3306 端口在监听;ls /var/lib/mysql看初始化出来的数据文件。这四步缺一不可,哪怕服务显示 active,端口没监听或者数据文件没生成,实际也是不可用的。

注意:GreatSQL 自带一些 MySQL 8.0 没有的新特性,比如 MGR 单主模式选主机制、InnoDB 并行查询(TPC-H 测试性能提升十几倍)、事务锁从红黑树改成无锁哈希结构。实验阶段感知不明显,但写报告时值得在“DBMS 系统构架”一节提一句,能体现对数据库内核级特性有了解。

3. 把库、表、索引一次建明白:CREATE DATABASE 到 UNIQUE INDEX 的完整 SQL

3.1 创建数据库:库名、字符集与存储位置检查

实验二要求创建一个名为 DB 的数据库,并查看存储位置、文件名和大小。实验报告里先用了最简单的创建方式:

CREATE DATABASE DB; SHOW DATABASES; USE DB;

但我建议创建时显式指定字符集,避免后续中文乱码:

CREATE DATABASE DB DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

utf8mb4是 4 字节 UTF-8 编码,兼容所有 Unicode 字符,utf8mb4_general_ci是排序规则,MySQL 8.0 和 GreatSQL 默认都推荐这套组合。

查看数据库实际存储位置和文件信息,用两条命令:

SELECT @@datadir;
SELECT table_schema, table_name, data_length, index_length FROM information_schema.tables WHERE table_schema = 'DB';

第一条查看数据目录所在路径,第二条从系统表查各表的实际数据大小和索引大小。data_length是数据占用字节数,index_length是索引占用字节数。实验报告截图要求里要体现“学会察看数据库的存储位置、文件名称、对应的文件的个数、文件的大小”,这两条 SQL 正好覆盖。

3.2 正式建表:主键、外键、CHECK 约束与数据填充

实验报告里先演示了删表,再给正式建表语句。这个顺序值得学习——先跑通语句,再按教材要求重新建正式的表结构:

CREATE TABLE STUDENTS ( Sno char(9) PRIMARY KEY, Sname char(10) NOT NULL, Sex char(2), Birthday DATE, Speciality char(20), Dno char(4) );
CREATE TABLE Courses ( Cno char(5) PRIMARY KEY, Cname char(20) NOT NULL, Period int, Credit int );
CREATE TABLE SC ( Sno char(9), Cno char(5), Grade int, PRIMARY KEY (Sno, Cno) );

三张表的选型要点:学号、课程号用char定长字符串而不是varchar,因为定长字段存储定位快,且学号课程号长度固定;PRIMARY KEY (Sno, Cno)是联合主键,保证同一条选课记录不重复;NOT NULL约束加在必填字段上。这里 SC 表暂时没加外键,不是忘了,而是教材上外键通常在后续实验中通过ALTER TABLE追加,避免建表时引用顺序产生的循环依赖。

填充数据用多值 INSERT,一次插多行比逐条插入效率高:

INSERT INTO STUDENTS VALUES ('201705001', '张华', '男', '1999-12-16', '计算机', 'CS'), ('201705002', '张晓霞', '女', '1999-01-01', '软件工程', 'SE'), ('201706001', '李玉', '女', '1999-10-17', '数学', 'MA'); INSERT INTO COURSES VALUES ('CS101', '计算机科学导论', 2, 1), ('CS102', '数据库系统', 4, 4), ('CS103', '操作系统', 4, 3); INSERT INTO SC VALUES ('201705001', 'CS101', 89), ('201705002', 'CS102', 92), ('201705003', 'CS101', 88);

注意一个细节:三位学生里201705003在 STUDENTS 表中并不存在,但 SC 表插入了他的成绩。如果建表时就加了外键约束,这条插入会直接报错。实验报告这样设计是为了先演示基本功能,后续建外键时再暴露数据不一致的问题,这是教学场景里的一种常见安排。

3.3 索引创建与删除:普通索引、唯一索引与实际选择

索引部分逻辑简单,但选型要理解:

CREATE INDEX Student_Dept ON Students (Dno); CREATE UNIQUE INDEX Course_Cno ON Courses (Cno); DROP INDEX Course_Cno ON Courses;

CREATE INDEX创建普通索引,用在 Dno 这个经常作为查询条件的字段;CREATE UNIQUE INDEX创建唯一索引,Course_Cno 建在 Cno 上,但 Cno 本身已经是主键,主键自带唯一索引,实验里建这个唯一索引更多是为了演示语法。删除索引用DROP INDEX ... ON ...,注意 GreatSQL 和 MySQL 的删除语法一致,不需要指数据库名,但要求当前正在使用正确的库。

实际做实验时,更建议在 SC 表的(Sno, Cno)联合主键以外,给Sno单独建一个普通索引。因为在真实查询里,最频繁的操作是“按学号查选课记录”,联合主键的最左前缀规则没法单独高效命中 Sno 列。

4. 交互式 SQL 查询:从 SELECT * 到 WHERE 条件组合的可用模板

4.1 不带 WHERE 的查询:先看全量,再谈过滤

实验三要求在教材指定页面上完成各类查询操作,核心是先建好课程相关的多个表,再逐类跑查询。第一个是查看全部数据:

SELECT * FROM Courses;

这个语句用来确认数据是否填充完整。还有一个经典写法是“查询每个学生的年龄”:

SELECT Sname, 2024 - YEAR(Birthday) AS Age FROM Students;

这里的YEAR()是 MySQL 从日期中提取年份的函数,2024 - YEAR(Birthday)直接算出年龄。要注意的是,这是 MySQL/GreatSQL 的函数写法,标准 SQL 里更通用的写法是EXTRACT(YEAR FROM Birthday)。实验报告要求对比标准 SQL 和 GreatSQL 的差异,这里就是第一个差异点。

4.2 带 WHERE 的条件查询:比较、区间、集合匹配

带 WHERE 的查询是重点,几类写法逐一说明:

SELECT Tname, Sex FROM Teachers WHERE Title = '讲师';

字符类型字段的等值比较,注意值必须用单引号。字符串是定长char(10)时,MySQL 比较会自动去掉尾部空格,所以'讲师'即使存进去时补齐了空格也能匹配上,这是 MySQL 的隐式处理,和 Oracle 的char比较行为不同。

SELECT DISTINCT Sno FROM SC WHERE Grade < 60;

DISTINCT去重,因为一个学生可能有多门课不及格,学号会重复出现。这里的知识点是:DISTINCT去重的是整行数据,如果 SELECT 多列,只有当所有列都相同才认为重复。

SELECT Sname, Speciality FROM Students WHERE YEAR(Birthday) BETWEEN 1997 AND 1999;

BETWEEN ... AND ...是闭区间,包含边界。这条查询的隐含前提是数据里生日字段格式干净,如果混入了1999_12_16这种下划线格式,YEAR()可能返回 NULL,最终结果会丢数据。实验报告里原始数据就出现过格式不一致,跑之前先检查数据质量。

SELECT Sname, Speciality FROM Students WHERE YEAR(Birthday) NOT BETWEEN 1997 AND 1999;

取反区间,注意NOT BETWEEN是整体取反,而不是YEAR(Birthday) NOT ...。

再往下是 IN 表达式:

SELECT Sno, Sname FROM Students WHERE Speciality IN ('计算机', '软件工程');
SELECT Sno, Sname FROM Students WHERE Speciality NOT IN ('计算机', '软件工程');

IN的底层实现本质上是多个等值条件的OR拼接,适合集合范围不大的场景。集合元素很多时,性能可能不如EXISTS关联子查询,这是后续优化课程的内容,实验阶段知道有这层区别即可。

4.3 更新操作与标准 SQL 差异:INSERT、UPDATE、DELETE 的注意事项

更新操作教材里有大量实例,这里的实验报告只给出了建表和填充,实际更新语句需要自行完成。常见做法是补三类操作:

INSERT INTO SC VALUES ('201706001', 'CS102', 95);
UPDATE Students SET Dno = 'CS' WHERE Sno = '201705003';
DELETE FROM SC WHERE Grade < 60;

注意UPDATE和DELETE都强调 WHERE 条件。执行前先跑一条相同条件的SELECT确认影响范围,这是避免误操作的基本习惯。

标准 SQL 和 GreatSQL 在更新操作上的差异集中在几个点:字符串字面量用单引号,双引号在默认sql_mode下可能被当成字符串标识符;表名和列名如果用了保留字,需要用反引号包裹;MySQL 的DELETE不支持FROM ... USING这种多表删除语法(这是 PostgreSQL 的写法);INSERT支持ON DUPLICATE KEY UPDATE做存在则更新、不存在则插入,标准 SQL 没有这个语法。

5. 实验避坑:五条常见翻车记录,现象与解法对照

5.1 服务启动失败:目录权限和用户没配对

现象:systemctl start greatsql执行后提示失败,systemctl status greatsql显示进程退出,/var/log/mysql日志报权限不足。

原因:解压目录和/var/lib/mysql的属主不是 mysql。二进制包解压后默认属主是 root,而 systemd 服务配置了User=mysql,mysqld 启动时没权限写数据目录。

解决:手动归权。

chown -R mysql:mysql /usr/local/GreatSQL-8.0.32-25-Linux-glibc2.17-x86_64-minimal chown -R mysql:mysql /var/lib/mysql

之后再启动一次,如果还失败,重点看/var/lib/mysql下是否已经生成mysql.ibd和ibdata1文件,没有就是初始化没完成。

5.2 端口连不上:防火墙关了但监听地址不对

现象:systemctl status显示服务正常,但ss -lntp | grep mysqld无输出,客户端连接报 2003 错误。

原因:最常见是 my.cnf 里bind-address没有配置,MySQL 8.0 默认只监听 127.0.0.1。虚拟机里从宿主机或其他机器连接时,自然连不上。

解决:在[mysqld]段加一行bind-address=0.0.0.0,重启后确认监听的地址变成*:3306。

systemctl restart greatsql ss -lntp | grep mysqld

5.3 中文字符变成问号:字符集没有显式指定

现象:插入中文后,SELECT查出来是??或???,英文字符正常。

原因:数据库、表或连接的字符集不是 UTF-8。给表插数据时命令行客户端默认用系统字符集,而数据库默认可能是latin1或utf8mb3。

解决:建库时显式指定utf8mb4,并在 my.cnf 里配置character-set-server=utf8mb4。已经建好的库可以修改:

ALTER DATABASE DB CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; ALTER TABLE STUDENTS CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

注意第二行会重建表,耗时取决于数据量,实验环境数据量小可以直接跑。

5.4 DROP TABLE CASCADE 报语法错误:MySQL 不认识这个关键字

现象:执行DROP TABLE students CASCADE报语法错误,像这样:

DROP TABLE students CASCADE;

原因:标准 SQL 里CASCADE和RESTRICT是合法的级联选项,但 MySQL 和 GreatSQL 的DROP TABLE语法不支持这两个关键字,写了直接报错。这是教材示例和实际数据库的语法差异点。

解决:去掉CASCADE,直接执行DROP TABLE students;。如果多张表有外键依赖,按依赖顺序删除,或者在my.cnf里开启FOREIGN_KEY_CHECKS=0后删除,删完再恢复:

SET FOREIGN_KEY_CHECKS=0; DROP TABLE students; SET FOREIGN_KEY_CHECKS=1;

5.5 systemctl 找不到 greatsql 服务:daemon-reload 没执行

现象:创建完greatsql.service文件后,执行systemctl start greatsql提示Unit greatsql.service not found。

原因:systemd 不会自动扫描新写入的服务文件,需要先重载配置。

解决:写完.service文件后执行重载,再启停。

systemctl daemon-reload systemctl start greatsql

这个坑几乎每个第一次手写 systemd 服务的人都会踩一次,属于流程顺序问题,不是配置内容问题。

6. 把实验报告变成自己的运维脚本:三条提高效率的习惯

6.1 每次实验前跑一遍状态巡检

实验做到后面,服务是不是活着、端口是否正常、磁盘还剩多少,这些状态直接决定 SQL 能不能跑通。我一般把巡检固化成一行命令:

systemctl status greatsql --no-pager && ss -lntp | grep 3306 && df -h /var/lib/mysql

--no-pager避免 systemctl 输出分页卡住交互;查看端口和服务状态一次完成;df -h防止数据文件把磁盘写满导致启动失败。

6.2 把常用建表 SQL 存成模板文件

实验三开始要建六张带外键的表,每次从教材手敲一遍太容易错。先把稳定版本存成/root/schema.sql,需要时就地执行:

mysql -u root -p < /root/schema.sql

写模板时给每条语句加注释说明字段含义,后期查问题不用翻教材。

6.3 备份优先:实验前快照,翻车后恢复

手动实验免不了删错表、改错数据。血泪经验是:每次开始新实验前,先打一次虚拟机快照。快照恢复后数据库回到实验开始前的状态,比逐条回滚 SQL 快得多,也是做嵌套实验时最有效的后悔药。从那以后,我每搭一套数据库实验环境,都会在改 any 配置前强制走一遍“快照 + 巡检 + schema 备份”的组合流程,这个习惯让我少踩了很多重复的坑。希望帮到你。

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

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

电机失速系统性排查与解决:变频器控制到负载匹配实战指南

1. 失速从来不是电机一个人的问题&#xff1a;先想清楚现象背后的系统逻辑做工业控制这些年&#xff0c;我见过太多现场一报“电机失速”就急着换变频器、换电机的操作。说实话&#xff0c;大部分情况下换完还是失速&#xff0c;因为失速根本不是一个孤立故障&#xff0c;而是一…

作者头像 李华
网站建设 2026/10/9 18:26:47

PLC远程维护中ping通但下载失败?MTU排查全流程解析

1. 从"能 ping 通"到"下载失败"的认知断层很多人第一次遇到这个问题时&#xff0c;脑子里蹦出来的第一个念头是"网络没问题啊&#xff0c;ping 都通了"。这个判断本身没错&#xff0c;但结论下错了。ping 通只证明了一件事&#xff1a;ICMP 报文…

作者头像 李华
网站建设 2026/10/9 18:26:44

Altium Designer电路仿真实战:SPICE模型、三种仿真与收敛排查

在Altium Designer里做电路仿真&#xff0c;是很多从画图转做验证的人绕不开的一个坎。我刚用这个功能时也踩过不少坑&#xff1a;明明原理图看着没问题&#xff0c;一仿真就报错&#xff0c;或者波形出来了却不知道怎么读。后来把SPICE那套逻辑理顺了才发现&#xff0c;Altium…

作者头像 李华
网站建设 2026/10/9 18:26:01

电子报纸订购系统数据库课设说明书写作指南

简介&#xff1a;本资源是一份完整的数据库课程设计实践文档&#xff0c;面向高校计算机及相关专业本科生&#xff0c;解决数据库课设中电子报纸订购系统从需求分析到系统实现的全流程方案落地问题。文档以Word格式&#xff08;.doc&#xff09;单文件封装&#xff0c;大小5.94…

作者头像 李华