简介:郑州大学计算机与人工智能学院《数据库系统原理》课程实验报告,面向高校数据库相关专业学生及需要掌握DBMS操作的初学者。报告以万里数据库GreatSQL为核心,完整记录了从运行环境配置、依赖包安装到二进制包部署与启动的全过程,并涵盖数据库逻辑组件与物理组件的认识,以及实验报告规范撰写要点。内容包含关闭SELinux与防火墙的原因分析、常用命令详解、实验过程遇到的问题及解决方法,能帮助读者系统梳理数据库管理系统操作思路,也为后续数据库实验搭建平台提供参考。资源为单份docx文档,约3.69MB,内容编排遵循课程实验要求,图文配合,适合对照练习与复习备考。已有509人浏览学习,适用于郑州大学数据库原理课程学生及相关课程实验参考。
1. 数据库原理实验:从认识DBMS到交互式SQL的完整交付方案
不少人做数据库原理实验,容易卡在同一个岔路口:以为把数据库装起来、建两张表、跑几条查询就算完事,结果交上去的报告被老师批“过程不完整”“缺少结果分析”。我之前在带某高校的《数据库系统原理》课程实验时,见到最多的翻车现场就是这类情况。这份实验报告方案,核心解决的不只是“装好GreatSQL、建好表”,而是把一次数据库原理实验拆成一条可交付的链路:先讲清楚DBMS怎么装、组件怎么认,再落到SQL怎么写、索引怎么建,最后用一份符合校内规范的实验报告把结果呈现出来。适合正在做数据库课设、需要交完整实验报告的同学,也适合想照着搭一套“安装—架构—SQL—验收”完整流程的人参考。
2. 环境搭建与GreatSQL安装:从CentOS系统配置到二进制包部署
2.1 运行环境准备:为什么先关SELinux和防火墙
实验要求操作系统是虚拟机VMware加上CentOS 7或以上版本。第一次装数据库时,很多人直接跳过系统配置去装数据库,结果启动时报各种权限错误或连接超时,最后发现是SELinux和防火墙在背后捣乱。这块的准备工作,是整个安装过程中最容易被忽略、又最影响后续动作的一步。
关闭SELinux和防火墙的具体命令如下:
# 临时关闭SELinux,重启后失效,仅本次会话有效 setenforce=0 # 永久关闭SELinux:把配置文件里的SELINUX=enforcing改为disabled sed -i '/^SELINUX=/c'SELINUX=disabled /etc/selinux/config # 停止并禁用防火墙服务 systemctl stop firewalld systemctl disable firewalld这里有一个容易踩坑的点:setenforce=0只是临时生效,如果只执行这一条,重启后SELinux会恢复成enforcing状态。要保证后续每次开机数据库都能正常启动,必须执行sed那一条,将配置文件永久改为SELINUX=disabled。验证永久关闭是否生效,可以执行getenforce,输出为Disabled才算彻底关闭。防火墙这边,systemctl stop是立刻停止当前服务,systemctl disable是禁止开机自启,两个命令缺一不可。
为什么实验环境要关闭SELinux?SELinux是一种强制访问控制机制,会对进程的文件读写、网络通信做细粒度权限检查,数据库服务在初始化数据目录、绑定网络端口时,很容易被SELinux的策略挡住。而防火墙拦截的是数据库对外通信端口,虚拟机内部做开发测试时,保留防火墙会让后续mysql -h之类的连接操作平添很多网络层的报错。关闭这两者,本质是让数据库运行环境尽可能纯净,减少教学实验中与SQL本身无关的干扰项。
2.2 依赖包安装与二进制包下载解压
在装入GreatSQL之前,需要先安装一批依赖包。很多同学会直接跳过这一步,等到启动时报缺少libaio.so或libnuma.so才知道回头补装。正确的做法是一开始就把依赖装齐:
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支持,数据库在磁盘读写时要依赖它;numactl-devel和numactl-libs用于NUMA内存管理,在多核服务器上影响内存访问性能;jemalloc是一个内存分配器,数据库在高并发场景下用它来降低内存碎片;openssl-devel则用于支持加密连接和密码加密算法。在CentOS环境安装GreatSQL,这些依赖是标准配置,缺哪个启动时大概率直接报错。
依赖装好后,下载并解压二进制包:
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这里选择minimal版二进制包,是因为它剔除了大部分非必要组件,安装体积小、文件布局清晰,适合教学实验快速部署。下载后先不要急着启动,还需要注册systemd服务、准备运行目录。将服务文件写入/lib/systemd/system/greatsql.service,通常的内容包含服务描述、启动命令、运行用户和日志配置;完成后再创建运行目录并调整属主:
# 编辑systemd服务文件 vim /lib/systemd/system/greatsql.service # 重新加载systemd,使greatsql服务注册生效 systemctl daemon-reload # 创建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/ /var/log创建mysql用户的目的,是让数据库进程以一个低权限用户身份运行,避免用root直接跑实例,这是一种基本的安全隔离措施,实验报告里写的时候要能说清楚。之后编辑全局配置/etc/my.cnf,写入数据目录、端口、socket等相关参数,这些配置项对应了数据库物理存储位置的确定。很多安装问题都出在/etc/my.cnf写错或漏写,导致启动时找不到数据目录。
2.3 启动与状态验证:不只“能起”还要“能看”
启动GreatSQL并验证进程状态,是安装完成的标志。这里不要只执行一条systemctl start greatsql就结束,建议把验证步骤也纳入实验记录:
# 启动GreatSQL systemctl start greatsql # 查看服务状态,确认Active状态为running systemctl status greatsql # 查找mysqld进程及运行参数 ps -ef | grep mysqld # 查看监听端口,确认3306端口已被mysqld占用 ss -lntp | grep mysqld这三条验证命令分别覆盖服务状态、进程存在性、网络监听三个维度。systemctl status给出的是systemd视角的服务健康状态;ps -ef确认mysqld进程已拉起且运行用户是mysql;ss -lntp确认端口已在监听,之后客户端连接才不会失败。我再补充一个我常用的验证动作:直接执行ls /var/lib/mysql,查看数据目录下是否生成了mysql、performance_schema等系统库目录,有这些目录就说明数据库在物理层面完成初始化了。
完成这一步,意味着整个实验平台搭建成功,后续的所有建库、建表、SQL练习都在这套环境上展开。这也是实验报告第一个值得截图记录的结果:进程状态、TCP连接列表、数据库文件目录三张截图,构成“安装成功”的完整证据链。
3. 数据库系统构架认知:逻辑组件与物理存储成分
3.1 逻辑组件:用数据字典看数据库的“零件”
搭建好平台后,下一步是认识数据库系统的逻辑组件。这里说的基本表、视图、触发器、存储过程、约束,不能停留在概念背诵层面,而是要通过information_schema数据字典把它们逐个查询出来,形成直观认知。
-- 查看当前所有基本表 SHOW TABLES; -- 查看数据库中定义的触发器 SELECT * FROM information_schema.TRIGGERS; -- 查看存储过程 SELECT * FROM information_schema.ROUTINES WHERE ROUTINE_TYPE='PROCEDURE'; -- 查看约束相关的键列信息 SELECT * FROM information_schema.KEY_COLUMN_USAGE;SHOW TABLES;显示的是当前库里的基本表清单,基本表是实际存储数据的载体,是数据库存储的基础单位;视图是一张虚拟表,本质是一条查询语句的结果集命名化,本身不存储数据,起到简化查询和限制访问范围的作用;触发器依附于表的增删改事件自动执行,用于维护数据一致性;存储过程则是预编译的SQL集合,减少网络传输,提高重复操作效率;约束(主键、外键、唯一、非空、CHECK)用来保证数据完整性和准确性。我建议实验报告里把每个组件的定义、查询命令、查询结果截图对应起来写,不要只贴概念。
3.2 物理组件:数据页、表空间与存储位置
物理组件的认知重点有两个:存储单位是什么、数据存在哪里。GreatSQL物理存储的基本单位是数据页(Page),默认页大小一般为16KB。数据在磁盘上以数据文件形式存放,每个InnoDB表可以对应独立的.ibd文件,共享表空间则以ibdata1文件存在。确定数据存放位置的方法是查询数据库的配置参数:
-- 查看数据目录、数据页大小、关键参数 SHOW VARIABLES LIKE 'datadir'; SHOW VARIABLES LIKE 'innodb_page_size'; SHOW VARIABLES LIKE 'innodb_data_file_path';这些参数对应的就是/etc/my.cnf里datadir、innodb_data_file_path等配置项。实验环境里,数据目录是/var/lib/mysql,它的位置和权限在安装阶段已经确认过。做这一步实验时,我一般会把datadir查询结果和ls /var/lib/mysql的截图放在一起,说明“配置文件指向的路径”和“实际落盘的文件”是一致的,这样才叫真正理解了物理存储。
3.3 GreatSQL的特色能力:MGR、并行查询与锁优化
认知DBMS架构时,还要额外关注GreatSQL相对标准开源数据库的一些增强特性,这些内容往往在实验三之后的综合应用里会用到。GreatSQL的MGR(组复制)提供高可用解决方案,新增地理标签解决多机房数据同步问题,优化流控算法,解决磁盘满导致MGR阻塞、节点恢复耗时长等缺陷。InnoDB并行查询特性特别适用于OLAP场景或周期性统计任务,官方TPC-H测试显示性能平均提升15倍、最高提升40多倍。InnoDB事务锁数据结构从红黑树优化为无锁哈希结构,提升了事务并行性能。此外,仲裁节点用于提高可靠性、降低成本,单主模式选主机制让主节点切换更快。
这些特性在实验二、实验三里不一定全部实操,但实验报告可以单独开一段写“对DBMS扩展能力的了解”,并思考一个问题:为什么SELECT大数据量大查询时直接跑会慢?GreatSQL采用并行查询后,多线程协同扫描,结果响应时间能缩短一个量级。这种“从架构层面理解SQL执行瓶颈”的分析,正是数据库实验报告拉开分差的地方。
4. 创建数据库、表与索引:搭建实验数据平台
4.1 创建数据库与查看存储信息
建库是实验二的第一步。执行CREATE DATABASE DB;后,不要急着建表,按实验要求先学会查看数据库的物理位置、文件名和大小:
-- 创建数据库DB CREATE DATABASE DB; -- 查看数据库列表,确认DB已创建 SHOW DATABASES; -- 切换到DB数据库 USE DB; -- 查看数据目录所在位置 SHOW VARIABLES LIKE 'datadir'; -- 查看DB库的信息(文件路径、大小等) SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_ROWS, DATA_LENGTH FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'DB';SHOW DATABASES;确认创建成功;USE DB;切换当前库;information_schema.TABLES可以查到库下每个表的数据行估算值和存储字节数。实验中一开始创建的库是空的,information_schema.TABLES查不到表,但要理解这个查询的作用——后续建完表后再查,就能看到每个表的存储大小变化。
建库时一个被我反复强调的注意点是:数据库名用DB这种简单名称没有技术问题,但一旦库里表多了,DB这个名字就缺少自解释性。正式项目中一般用course_db、student_management这类命名。不过课程实验里按题目要求写就显得“守规矩”且不会扣分,所以报告里可以保留最原始的建库语句,再写一句自我分析说明“正式项目建议用更具语义的库名”。
4.2 基本表设计:从简单版本到规范版本
实验内容里给了两次建表过程:第一次是快速验证用,比如create table STUDENTS(id int primary key, name varchar(60));;第二次是正式建表,用Sno做主键、带多个属性和约束。这两步的差异正好用来解释为什么要规范设计。
-- 实验过程一:验证用简化表 CREATE TABLE STUDENTS(id int primary key, name varchar(60)); CREATE TABLE COURSES(cid int primary key, cname varchar(60)); CREATE TABLE SC(id int, cid int, primary key(id, cid), grade int); -- 实验过程二:正式建表(含主键、非空、日期类型) 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) );简化版和正式版对比,看起来只是字段多了几个,但核心差异在三点:一是Sno用char(9)而不是id int,因为学号是定长数字字符串,用int会丢失前导零且语义不准确;二是增加了NOT NULL约束,保证姓名等关键字段非空;三是SC表的主键设为(Sno, Cno)联合主键,表达“一个学生选一门课只能有一条成绩记录”的业务规则。这些设计决策在报告里逐条写清楚,比单纯贴一份建表语句有价值得多。
正式版建完后填充数据,需要按外键依赖顺序插入。先插STUDENTS,再插COURSES,最后插SC。插入时注意日期格式和字符串引号一致,这是交互式SQL实验里最容易翻车的点。
4.3 索引的创建、删除与验证
索引是实验二的核心内容之一,对应两个常用场景:在普通列上建索引加速查询,在唯一列上建唯一索引限制重复值:
-- 在Students表的Dno上创建普通索引 CREATE INDEX Student_Dept ON Students (Dno); -- 在Courses表的Cno上创建唯一索引 CREATE UNIQUE INDEX Course_Cno ON Courses (Cno); -- 删除索引Course_Cno DROP INDEX Course_Cno ON Courses;普通索引Student_Dept的作用,是加速按Dno(院系编号)过滤学生时的查询速度。唯一索引Course_Cno则额外保证Cno不能重复——主键本身已经保证唯一,这里再用唯一索引是为了练习“唯一索引”这类约束的创建方式。DROP INDEX可以回退索引变更,这是一种常见维护操作。
索引这块我一般会在实验报告里补一个验证步骤:用EXPLAIN看一下带索引和不带索引的查询计划差异:
EXPLAIN SELECT * FROM Students WHERE Dno = 'CS';查看结果里possible_keys是否包含Student_Dept,key字段是否实际用了这个索引。加了这一步,实验二的深度就从“会建索引”升级到“能验证索引作用”,也方便答辩时回答“索引为什么快”的问题。
4.4 数据填充:多行插入与注意事项
数据填充采用多值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);这里注意一个细节:SC表插入的第三条数据('201705003', 'CS101', 88),对应的Sno并不在STUDENTS表里,会出现外键约束失败报错。这是正规教育中的常见现象,后面在实验三的排查部分会细说。之所以表格数据里允许出现这种冲突,恰恰说明外键约束在起作用——报告里如果能主动分析这个报错,反而能加分。
5. 交互式SQL实验中的常见问题排查与避坑:三个最容易被扣分的点
5.1 外键约束失败:报错Cannot add or update a child row
实验三里创建SC表时已经加了外键FOREIGN KEY (Sno) REFERENCES Students(Sno),插入SC数据时如果引用了不存在的学号,会直接报类似Cannot add or update a child row: a foreign key constraint fails的错误。原因很简单:外键强制SC里的Sno必须在Students表中存在,否则数据完整性被破坏。
解决方法是先查一下Students里已有哪些学号,把SC的插入数据改成存在范围内,或者先插入缺失的Students记录。我在带实验时反复强调一个习惯:每次执行INSERT前先查一遍父表数据,养成“先查后插”的意识,数据库实验里很多报错都是在无序操作时发生的。
5.2 中文字符集乱码:插入正常、查询变问号
现象是插入的学生姓名在SELECT查询时显示成???。原因是CentOS系统字符集、客户端连接字符集、表字符集三者不一致,比如表用了latin1,客户端用utf8,写入时中文就变成了乱码。解决方法是建表时统一指定字符集:
CREATE TABLE Students ( Sno char(9) PRIMARY KEY, Sname varchar(20) NOT NULL ) DEFAULT CHARSET=utf8mb4;同时把客户端连接字符集也统一到utf8mb4,执行SET NAMES utf8mb4;。字符集问题在实验报告里是个特别好的“问题与更正”素材——因为几乎所有做实验的人都会遇到一次,写清楚现象、原因、三步解决命令,老师一看就知道你真实操作过。
5.3 日期格式不统一:字符串、短横线、下划线混用
实验中INSERT日期数据时,可以看到'1999_12_16'和下划线写法,也有'1999-12-16'短横线写法。数据库对日期字面量的解析有一定容忍度,但实验里混用容易造成插入失败或查询结果异常。解决方法是统一用'YYYY-MM-DD'格式插入,不要把下划线、斜杠等分隔符混进去。如果是从外部数据导入,建议先用SELECT STR_TO_DATE()做一次格式转换,再写入目标表。
5.4 表名大小写敏感:Linux下Students和students不一致
现象是创建的表叫Students,有些查询里写成students,在Linux环境下报“表不存在”。原因是Linux系统区分大小写,而lower_case_table_names参数值为0时,MySQL区分表名大小写;Windows环境下参数默认是1,不区分大小写——这也解释了为什么很多同学在自己电脑上写得通、到服务器上就翻车。解决方法是统一使用创建时的表名,或者设置lower_case_table_names=1让表名不区分大小写,但要注意该参数在初始化后修改有风险,常规做法还是在SQL语句里保持表名大小写全一致。
5.5 启动失败先看日志:mysqld.log里藏着答案
安装阶段如果systemctl start greatsql失败,现象是服务启动后立刻退出,systemctl status显示Active: failed。原因有很多,可能是数据目录权限不对、my.cnf配置错误、依赖包缺失等。解决的入口一定不是反复重启,而是看错误日志——在/var/log/mysqld.log或/var/lib/mysql/*.err中定位关键报错词汇,再针对性修复。这个排查思路在实验报告“问题与解决”部分写出来,会比只写“重试成功”更有说服力。
6. 实验报告验收与答辩:按这份清单自查一遍再提交
6.1 排版与截图规范自检
实验报告要按校内书面排版要求呈现:段首空两个字,行文用书面语,内容完整,按内在逻辑顺序组织。电子版报告还要为每张截图配图的编号和图题,如图1、图2依次编号;如果包含表格,表格上方要有编号和表名,表由属性行和若干数据行组成。我建议提交前按这样一张清单逐项自查:截图是否都编号且图题齐全,表格是否有表名,实验目的、内容、过程、问题与总结是否完整,SQL语句是否和运行结果对得上。
6.2 答辩讲解时怎么组织表达
答辩时会让你讲“做了什么、遇到什么问题、怎么解决的”。我的建议是把每个实验压缩成三句话:一句话描述目标、两到三句讲主要操作、再用一个问题收尾。比如实验一:“本次实验目标是在CentOS虚拟机中部署GreatSQL并理解DBMS架构,操作上完成了依赖安装、服务注册、启动验证三个步骤,过程中我遇到的关键问题是端口监听异常,最后通过查看进程和监听状态定位到防火墙未完全关闭。”这个结构在5分钟内讲完三个实验是足够的。
6.3 常见追问的应对
老师最常追问的问题集中在三处:为什么关闭SELinux、为什么用二进制包而不是yum源安装、外键约束的报错说明了什么。前两个问题在实验报告里已经有详细说明,答辩时直接引用即可;第三个问题要能说出“外键保证了引用完整性”这句话,并举例说明是谁引用谁。从那次带实验之后,我每次提交报告前都会强制自己对着一份打印出来的自查清单逐条打勾,包括图的编号连续性、表名是否齐全、问题与总结是否真实描述了一次踩坑经历。希望这套方法也能帮你在数据库实验上顺利过关。
本文还有配套的精品资源,点击获取