恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
数据库原理实验:从DBMS安装到SQL查询的完整交付方案
首页
资讯中心
/
数据库原理实验:从DBMS安装到SQL查询的完整交付方案
数据库原理实验:从DBMS安装到SQL查询的完整交付方案
发布时间:2026/10/17 17:20:30
简介郑州大学计算机与人工智能学院《数据库系统原理》课程实验报告面向高校数据库相关专业学生及需要掌握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重启后失效仅本次会话有效 setenforce0 # 永久关闭SELinux把配置文件里的SELINUXenforcing改为disabled sed -i /^SELINUX/cSELINUXdisabled /etc/selinux/config # 停止并禁用防火墙服务 systemctl stop firewalld systemctl disable firewalld这里有一个容易踩坑的点setenforce0只是临时生效如果只执行这一条重启后SELinux会恢复成enforcing状态。要保证后续每次开机数据库都能正常启动必须执行sed那一条将配置文件永久改为SELINUXdisabled。验证永久关闭是否生效可以执行getenforce输出为Disabled才算彻底关闭。防火墙这边systemctl stop是立刻停止当前服务systemctl disable是禁止开机自启两个命令缺一不可。为什么实验环境要关闭SELinuxSELinux是一种强制访问控制机制会对进程的文件读写、网络通信做细粒度权限检查数据库服务在初始化数据目录、绑定网络端口时很容易被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进程已拉起且运行用户是mysqlss -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_TYPEPROCEDURE; -- 查看约束相关的键列信息 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_Deptkey字段是否实际用了这个索引。加了这一步实验二的深度就从“会建索引”升级到“能验证索引作用”也方便答辩时回答“索引为什么快”的问题。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 CHARSETutf8mb4;同时把客户端连接字符集也统一到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_names1让表名不区分大小写但要注意该参数在初始化后修改有风险常规做法还是在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源安装、外键约束的报错说明了什么。前两个问题在实验报告里已经有详细说明答辩时直接引用即可第三个问题要能说出“外键保证了引用完整性”这句话并举例说明是谁引用谁。从那次带实验之后我每次提交报告前都会强制自己对着一份打印出来的自查清单逐条打勾包括图的编号连续性、表名是否齐全、问题与总结是否真实描述了一次踩坑经历。希望这套方法也能帮你在数据库实验上顺利过关。本文还有配套的精品资源点击获取