简介:这份资源是郑州大学计算机与人工智能学院《数据库系统原理》课程的实验报告文档,面向正在学习数据库课程、需要完成实验报告撰写或参考实验流程的高校学生。内容围绕万里数据库GreatSQL展开,涵盖DBMS系统构架认识、数据库安装配置与启停管理、逻辑组件与物理组件理解,以及虚拟机环境搭建、关闭SELinux和防火墙的原因分析、依赖包安装、二进制包下载解压等实践操作,并强调实验截图编号、表格规范与结果分析反思的撰写要求。资源包共1个docx文件,大小约3.69MB,完整呈现实验目的、内容、类型、学时分配与实验过程记录,可作为课程实验的对照范本与报告排版参考。目前已有509人学习,适合需要梳理实验步骤、规范报告格式或搭建后续实验平台的读者借鉴。
1. 数据库原理实验到底在练什么:一张从装库到查询的地图
很多人以为数据库实验就是敲几条 SQL 交差,真正上手才发现,卡住人的往往不是 SELECT,而是装库那一步:服务起不来、端口连不上、权限对不上,一个环节翻车后面全白搭。这份实验报告把九个单项实验串成了一条完整链路——先认识 DBMS 并搭好运行环境,再建库建表建索引,然后进入交互式 SQL 的查询与更新,最后落到视图、触发器、存储过程、约束这些逻辑组件和物理存储结构上。它适合正在系统学数据库原理、准备实验验收或期末复习的人:你需要的不是零散命令,而是一张能对上号的知识地图。梳理下来会发现,整门课的主线其实只有三条——环境能不能跑起来、数据能不能按规则存进去、查询能不能按需求取出来,其余都是围绕这三条做加法和排错。
2. 环境搭建:装库这一步的重点与坑位
2.1 为什么先关 SELinux 和防火墙
实验一的第一道门槛不是 SQL,而是让数据库服务在虚拟机上正常跑起来。报告里明确要求先关闭 SELinux 和防火墙,这不是随手一步,而是有明确因果的配置决策。SELinux 是强制访问控制机制,会限制进程的文件读写和网络通信权限,而数据库启动时需要执行一些特权操作,策略没放行就会导致服务异常;防火墙则会阻塞数据库监听的端口,外部连接直接失败。在虚拟机内做开发和测试的场景下,关掉这两者能显著简化配置、减少出错面。
# 临时关闭 SELinux(立即生效,重启失效) setenforce 0 # 永久关闭 SELinux(改配置文件,重启后仍生效) sed -i '/^SELINUX=/c'SELINUX=disabled /etc/selinux/config # 关闭防火墙并禁止开机自启 systemctl disable firewalld systemctl stop firewalld这几条命令要理解着记:setenforce 0只改运行时状态,改配置文件才是持久化;disable管开机自启,stop管当前进程,两条都要执行才算关干净。复习时最容易混的就是「临时」和「永久」这一对,考试问「重启后为什么又生效了」,答案就在这。
2.2 依赖包与二进制安装的完整顺序
装库的顺序是有讲究的,跳步就会在启动阶段报错。报告给出的路径是:装依赖包 → 下载解压二进制包 → 注册 systemd 服务 → 写全局配置 → 建系统用户和目录 → 启动验证。依赖包里libaio-devel、numactl系列关系到异步 IO 和内存分配,openssl系列关系到连接加密,缺了它们服务可能起得来但跑不稳。
# 安装运行依赖 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 # 解压二进制包到安装目录 cd /usr/local tar xf GreatSQL-8.0.32-25-Linux-glibc2.17-x86_64-minimal.tar.xz # 注册并重载 systemd 服务 vim /lib/systemd/system/greatsql.service systemctl daemon-reload # 创建专用系统用户(禁止登录,降低安全风险) /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/ /var/log /usr/local/GreatSQL-8.0.32-25-Linux-glibc2.17-x86_64-minimal这里的关键理解点:为什么数据库要用独立的mysql用户而不是 root 跑?因为数据库进程权限越大,被攻破后的破坏面越大,最小权限原则是运维常识。-s /sbin/nologin表示这个账号不能登录系统,只用来跑服务。启动后用三条命令交叉验证,缺一不可:
systemctl start greatsql # 启动服务 systemctl status greatsql # 看服务状态是否 active ps -ef | grep mysqld # 确认守护进程真的在 ss -lntp | grep mysqld # 确认端口在监听 ls /var/lib/mysql # 确认数据文件已生成status显示成功不代表进程健康,ps看进程、ss看端口、ls看数据文件,三层验证才叫「真的起来了」。这是排查启动类问题的标准动作,血泪经验是只信status一条命令,结果端口没监听还查半天。
2.3 逻辑组件与物理组件怎么区分
实验一还要求理解数据库系统的两层架构。逻辑组件是「你操作的对象」:基本表实际存数据,视图是虚表不落盘、本质是查询结果的动态映射,触发器在增删改事件上自动执行、用于维护一致性,存储过程是预编译的 SQL 集合、提高复用减少传输,约束是数据规则(主键、外键、唯一、非空)。物理组件是「引擎内部怎么干活」:连接池、SQL 接口、解析器、优化器、可插拔存储引擎、日志文件。物理存储的基本单位是数据页,数据以页为单位组织、以文件形式落盘。
| 组件 | 类型 | 是否实际存数据 | 典型用途 |
|---|---|---|---|
| 基本表 | 逻辑 | 是 | 数据存储的基础单位 |
| 视图 | 逻辑 | 否(虚表) | 简化复杂查询、限制行列访问 |
| 触发器 | 逻辑 | 否 | 事件驱动维护一致性 |
| 存储过程 | 逻辑 | 否 | 封装复杂操作、减少网络传输 |
| 约束 | 逻辑 | 否 | 保证数据完整性 |
| 数据页 | 物理 | 是(存储单位) | 磁盘与内存间的基本读写单元 |
这张表是复习时的锚点:判断一个对象「是不是表」,看它落不落盘;判断一个操作「贵不贵」,看它动的是逻辑层还是物理页。
3. 建库建表建索引:DDL 的规范与易错细节
3.1 从建库到建表的完整语句链
实验二的核心是把「数据库—表—索引」三级对象用 SQL 建出来。建库用CREATE DATABASE DB;,随后SHOW DATABASES;确认、USE DB;切换。建表时报告先建了简化版验证语法,再按教材属性建正式版,这个「先跑通再规范」的顺序值得学。正式建表语句里几个设计点要盯住:
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 SC( Sno char(9), Cno char(5), Grade int, PRIMARY KEY (Sno, Cno) -- 复合主键,一个学生一门课唯一 );SC表用(Sno, Cno)复合主键,是因为成绩的本质是「学生 + 课程」这个组合的唯一记录,单列做主键会允许重复选课记录。char与varchar的选择也是考点:定长字段用char查询更快但可能浪费空间,变长用varchar省空间但有额外开销。删除表时报告用了DROP TABLE ... CASCADE,级联删除会连带删掉依赖对象,复习时要能说清它和外键约束的联动关系。
3.2 索引的创建、唯一性与删除
索引部分报告建了两类:普通索引CREATE INDEX Student_Dept ON Students (Dno);和唯一索引CREATE UNIQUE INDEX Course_Cno ON Courses (Cno);。区别在于唯一索引强制列值不重复,普通索引只加速查找。删除索引用DROP INDEX Course_Cno ON Courses;,注意要带表名,因为索引名在部分数据库里是表级命名空间。
-- 普通索引:加速按系号查询 CREATE INDEX Student_Dept ON Students (Dno); -- 唯一索引:既加速又保证课程号唯一 CREATE UNIQUE INDEX Course_Cno ON Courses (Cno); -- 删除索引需指定所属表 DROP INDEX Course_Cno ON Courses;重点理解:主键本身自带唯一索引,再对主键列建唯一索引是重复劳动;索引不是越多越好,每个索引都会拖慢写入并占空间,这是后面性能分析的伏笔。
3.3 数据填充与外键的添加时机
实验三先建了院系、教师、学生、课程、选课、授课六张表并插入数据,然后才用ALTER TABLE补外键。这个顺序很关键:先插数据再加外键,可以避免插入顺序受约束限制;但如果数据本身违反引用完整性,加外键就会失败。报告里对SC表直接在建表时写了FOREIGN KEY,对teaches、students、teachers则用ALTER TABLE ... ADD FOREIGN KEY后补,两种方式都要会。
ALTER TABLE teaches ADD FOREIGN KEY (Cno) REFERENCES Courses(Cno); ALTER TABLE teaches ADD FOREIGN KEY (Tno) REFERENCES teachers(Tno); ALTER TABLE students ADD FOREIGN KEY (Dno) REFERENCES departments(Dno); ALTER TABLE teachers ADD FOREIGN KEY (Dno) REFERENCES departments(Dno);外键的复习要点是「引用方向」:子表的外键指向父表的主键,删除父表数据前要先处理子表引用,否则报错。这也是为什么建表顺序通常先父后子、删表顺序反过来。
4. 交互式 SQL:查询与更新的复习重点
4.1 查询的四类写法与执行顺序
实验三把查询按「不带 WHERE」「带 WHERE」「IN 表达式」等层次铺开,这个分类本身就是复习框架。不带条件的SELECT * FROM Courses;是全表扫描;带条件的查询靠 WHERE 过滤;BETWEEN ... AND ...处理区间;IN处理枚举集合,NOT IN取反。报告里还出现了用函数从日期算年龄的写法:
-- 用当前年份减出生年份估算年龄 SELECT sname, 2024 - YEAR(Birthday) AS Age FROM students; -- 区间查询:出生年份在 1997 到 1999 之间 SELECT Sname, Speciality FROM students WHERE YEAR(Birthday) BETWEEN 1997 AND 1999; -- 集合查询:专业属于计算机或软件工程 SELECT Sno, Sname FROM Students WHERE Speciality IN ('计算机', '软件工程');这里有个容易忽略的点:YEAR(Birthday)是对列做函数运算,会导致该列上的索引失效,数据量大时性能会掉。复习时要把「WHERE 里对列做函数」列为性能易错点。另外NOT BETWEEN和NOT IN在遇到 NULL 值时行为特殊,NOT IN的子查询里若有 NULL,整个条件可能返回空结果,这是 SQL 三值逻辑的经典坑。
4.2 更新操作与标准 SQL 的差异
更新部分覆盖插入、修改、删除三类。插入要注意列顺序与值顺序一一对应,多行插入用逗号分隔;修改用UPDATE ... SET ... WHERE ...,漏写 WHERE 会更新全表,这是最危险的操作之一;删除用DELETE FROM ... WHERE ...,同样漏 WHERE 会清空表。报告特别提示要对比标准 SQL 与具体 DBMS 的语法差异,比如日期字面量写法、函数名、CASCADE的支持程度,这些差异在换库迁移时最容易翻车。
提示:执行 UPDATE 和 DELETE 前先用同条件的 SELECT 验证影响行数,确认无误再改,这个习惯能省掉很多后悔药。
4.3 多表连接与聚合的复习抓手
虽然报告正文以单表查询为主,但六张表的结构已经为多表查询铺好了路:学生表连选课表拿成绩、选课表连课程表拿课名、教师表连授课表拿授课关系。复习时要把「连接条件写在哪」「聚合函数和 GROUP BY 的配合」「HAVING 与 WHERE 的区别」这三件事串起来:WHERE 在分组前过滤行,HAVING 在分组后过滤组,聚合函数不能出现在 WHERE 里。这几条是考试和实验验收的高频追问点。
5. 易错点清单:这些地方最容易翻车
5.1 易错点一:服务「启动成功」但连不上
易漏点 → 为什么漏:只看systemctl status显示 active 就以为万事大吉,忽略了端口监听和数据目录权限。怎么补:固定用ps、ss、ls三条命令交叉验证,端口没监听先查配置文件和防火墙,数据目录为空先查初始化和权限。
5.2 易错点二:建表时数据类型与长度拍脑袋
易漏点 → 为什么漏:char(9)和char(10)差一位,插入超长数据会被截断或报错,复习时只记语法不记长度约束。怎么补:建表前先列出每个字段的取值范围,定长字段算准长度,变长字段留余量,插入测试数据验证边界。
5.3 易错点三:外键添加顺序与数据冲突
易漏点 → 为什么漏:先加外键再插数据,或子表数据引用了父表不存在的值,导致ALTER TABLE失败。怎么补:先保证父表数据齐全,再加外键;加之前用查询核对子表外键值是否都能在父表找到。
5.4 易错点四:UPDATE/DELETE 漏写 WHERE
易漏点 → 为什么漏:手快直接执行,全表被改或清空。怎么补:养成「先 SELECT 同条件看行数,再执行写操作」的两步习惯,重要操作前备份。
5.5 易错点五:混淆视图与基本表
易漏点 → 为什么漏:以为视图也存数据,或对视图做更新时不清楚限制。怎么补:记住视图是查询结果的动态映射、不落盘,更新视图最终作用到基表且受可更新性限制,复习时把「视图能不能更新」作为自测题。
6. 复习落地:一份可执行的查漏补缺清单
复习这门课,最有效的方式不是重读报告,而是按「能不能独立复现」来验收。下面这份清单按实验链路排列,每一项都对应一个可操作的自测动作,做完打勾,卡住的就回去补对应章节。
| 模块 | 自测动作 | 通过标准 |
|---|---|---|
| 环境配置 | 不看笔记关 SELinux 和防火墙 | 能说清临时与永久的区别 |
| 安装部署 | 口述装库六步顺序 | 能解释每步缺了会怎样 |
| 服务验证 | 用三条命令确认服务健康 | 能区分 status 与真实监听 |
| 建库建表 | 手写 STUDENTS、SC 建表语句 | 主键、非空、类型都正确 |
| 索引 | 建普通索引和唯一索引各一个 | 说清两者区别与代价 |
| 外键 | 用 ALTER 补两个外键 | 说清引用方向与顺序 |
| 查询 | 写区间、集合、取反三类查询 | 注意 NULL 与函数失效 |
| 更新 | 写带条件的 UPDATE 和 DELETE | 先 SELECT 验证再执行 |
| 逻辑组件 | 区分表、视图、触发器、存储过程 | 判断是否落盘 |
| 物理组件 | 说出存储单位与落盘形式 | 数据页、文件 |
清单之外,再补一个具体技巧:把每个实验的「问题及总结」当成错题本用。报告里记录的「命令行界面不习惯、自己找图形化安装方法」这类看似琐碎的记录,恰恰是复习时最容易被跳过、又最能暴露理解缺口的地方——能复现当时怎么解决的,才算真会。我自己的习惯是每做完一个实验,强制用三句话写复盘:哪一步卡住、根因是什么、下次怎么提前避免。从那以后我每次碰新环境,都强制先跑一遍「服务状态—进程—端口—数据文件」四连查再往下走,省下的排查时间远比写这几行多。希望这份梳理能帮到你,把散落的命令收成一张能随时调用的地图。
本文还有配套的精品资源,点击获取