简介这份《数据库原理实验报告》面向郑州大学计算机与人工智能学院《数据库系统原理》课程学习者也适合需要了解 DBMS 安装配置与 GreatSQL 实践流程的初学者。内容围绕实验一“认识 DBMS 系统”展开涵盖虚拟机与 CentOS 环境准备、关闭 SELinux 和防火墙的原因、依赖包安装、GreatSQL 二进制包部署及服务启动并延伸至基本表、视图、触发器、存储过程等逻辑组件的认识同时强调实验截图、图表编号与结果分析等报告规范。压缩包内为 1 个 docx 文件大小约 3.69MB便于直接查阅和整理。已有 509 人学习可作为课程实验参考、报告撰写模板与操作排错思路的辅助材料。1. 一份能照着跑通的数据库原理实验报告价值在哪里九成的数据库原理实验报告失败原因都相同截图齐全、SQL 能抄换一台机器就装不起来。这份资源的价值在于它保留了一条完整链路CentOS 7 上部署 GreatSQL 8.0.32 二进制包、注册成 systemd 服务、用 information_schema 把基本表/视图/触发器/存储过程/约束这五类逻辑组件逐个查出来、再建库建表建索引、最后跑交互式 SQL 的查询与更新。它原本来自某高校计算机学院的《数据库系统原理》课程九个实验串起来正好是一条从 DBMS 认知到 SQL 实战的路径。适合三类人要交课程实验的、想在本地搭一套 MySQL 8.0 兼容环境练手的、以及需要一份 Rocky/CentOS 二进制部署清单的运维新人。2. 虚拟机里的底座SELinux、防火墙和依赖包为什么先处理环境准备这一步最容易被跳过也最容易在半小时后以一层看不懂的报错还回来。数据库装不上八成不是安装包的问题而是 SELinux 拦了文件访问、firewalld 挡了 3306、或者某个 .so 动态库压根没装。2.1 先想清楚这三样到底挡住了什么SELinux 是强制访问控制它不看文件权限位看的是进程域和文件标签的匹配关系。mysqld 运行在mysqld_t域里默认策略只允许它写标了mysqld_db_t的路径。而二进制安装最常见的问题是 datadir 放在了/usr/local或者自建的/data/mysql这些路径的标签是usr_t或default_tmysqld 一写就被拒/var/log/audit/audit.log里留下一串avc: denied。症状很迷惑目录权限是 777mysql 用户手动 touch 能成mysqld 就是起不来。firewalld 挡的是网络层。3306 没放行本机 socket 连接一切正常远端客户端就是Cant connect to MySQL server。虚拟机上如果只做本地实验关掉最省事一旦要让宿主机或者同网段的其他虚拟机连进来就得放行端口。依赖包挡的是运行期。GreatSQL 的 mysqld 依赖 libaio 做异步 IO、依赖 numactl 做 NUMA 绑核、依赖 jemalloc 替换 glibc 的 malloc。缺一个--initialize阶段就直接退出报错形如error while loading shared libraries: libaio.so.1。这类错误信息很直白但第一次见的人容易怀疑是安装包损坏。需要说清的边界是生产环境不该直接关 SELinux。标准做法是给 datadir 打上mysqld_db_t标签再restorecon端口用semanage port -a -t mysqld_port_t -p tcp 3306单独放行。防火墙同理firewall-cmd --permanent --add-port3306/tcp才是正道。实验环境关掉只是图快别把这个习惯带出去。2.2 四条命令的正确写法和验证方式# 1) 临时把 SELinux 切到宽容模式仅当前运行期生效 setenforce 0 # 2) 改配置文件让重启后仍然是 disabled # 注意 c 后面是反斜杠 空格且正则只匹配行首的 SELINUX sed -i /^SELINUX/c\SELINUXdisabled /etc/selinux/config # 3) 取消 firewalld 开机自启 systemctl disable firewalld # 4) 立即停止 firewalld systemctl stop firewalld # 验证三件事缺一不可 getenforce # 期望输出 Permissive grep ^SELINUX /etc/selinux/config # 期望输出 SELINUXdisabled systemctl is-enabled firewalld # 期望输出 disabledsetenforce 0中间是空格不是等号。原报告里写成setenforce0shell 会回一句command not found而人往往扫一眼就过了结果 SELinux 一直是 Enforcing后面初始化数据库卡住排查方向全跑偏。这是整份报告里最容易翻车的第一处我见过不止一个人在这里耗掉整个下午。sed那行的正则是/^SELINUX/只匹配行首恰好是SELINUX的行。如果图省事写成/^SELINUX/会把配置文件里的SELINUXTYPEtargeted也一起替换成SELINUXdisabledSELinux 的策略类型直接丢了机器重启后可能出现更奇怪的行为。提示getenforce和配置文件是两套状态临时模式和永久配置要分别确认只改一个就会出现这次好了重启又坏。2.3 依赖包分成哪三类把那条长 yum 命令拆开看包其实分三种角色搞清楚以后换系统版本也知道该替换什么。类别包名作用缺了会怎样运行必需libaio-devel、numactl-libsInnoDB 异步 IO、NUMA 内存分配mysqld 启动即报 so 找不到编译头文件pkg-config、openssl-devel、jemalloc-devel编译插件、链接加密库编译期才报错二进制包场景可省脚本依赖perl、perl-Data-Dumper、perl-Digest-MD5、perl-JSON、python2自带工具、测试脚本、备份脚本服务能起跑自带工具时报模块缺失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-Simplenumactl-devel和numactl-libs是两个包前者给编译用后者给运行用只装一个会遇到编译过了运行挂。net-tools提供netstat虽然现在更推荐ss但不少旧脚本还在调它。jemalloc是可选项GreatSQL 用它替换 glibc 的 malloc长连接高并发下内存碎片明显更低不装也能跑只是默认走 glibc。python2在 CentOS 7 上是系统自带包名就是python2。如果换到 Rocky 9 或者 CentOS 8 之后的版本这个包名基本不可用得改成python3并且要确认数据库自带的那些 perl/python 脚本是否兼容。这一条不是照抄能解决的属于换环境必须重新核对的项。2.4 装完怎么确认不缺件装完别急着往下走用两条命令做硬性校验比事后看 error log 猜要快得多。# 1) 确认关键包确实装上了 rpm -q libaio-devel numactl-libs openssl-devel jemalloc # 2) 直接对 mysqld 二进制做动态库解析找 not found ldd /usr/local/GreatSQL-8.0.32-25/bin/mysqld | grep not found第二条是决定性的。ldd把 mysqld 依赖的所有共享库列出来只要输出里有任何一行带not found初始化阶段就一定会失败而且报错信息指的是库名不是包名回头查很费劲。先让这条命令输出为空再谈安装。这个顺序看起来多花两分钟实际能省掉一轮完整的环境回滚。3. 从 tar.xz 到 systemd 服务GreatSQL 8.0.32 的落地步骤二进制包安装和 yum 安装最大的区别在于所有路径、所有参数、所有权限都得自己定系统不会替你猜。定错了不会立刻报错而是在某个后续操作里以完全无关的形式暴露出来。3.1 解压前的两个决定路径和属主cd /usr/local # tar 会自动识别 xz 压缩不需要再带 -J tar xf GreatSQL-8.0.32-25-Linux-glibc2.17-x86_64-minimal.tar.xz # 目录名太长建个软链后面所有配置都写短路径 ln -s /usr/local/GreatSQL-8.0.32-25 /usr/local/greatsql ls -ld /usr/local/greatsql软链这一步不是可有可无。my.cnf 里的basedir、systemd 单元里的ExecStart、客户端连接时用的路径全都要引用这个目录。直接把长目录名写死进配置将来升级到 8.0.33 就要改三四处文件漏一处就是启动失败。用软链的话升级只需要重建一条ln -sfn。属主这部分二进制的属主和数据的属主是两回事原报告把两者一起chown -R了功能上没错但风险不小。# 建一个不能登录的系统账号专门跑数据库进程 groupadd mysql useradd -g mysql mysql -d /dev/null -s /sbin/nologin # 数据目录和日志目录分开建只给这两个目录授权 mkdir -p /var/lib/mysql /var/log/greatsql chown -R mysql:mysql /var/lib/mysql chown -R mysql:mysql /var/log/greatsql chown -R mysql:mysql /usr/local/GreatSQL-8.0.32-25-d /dev/null让这个账号没有家目录-s /sbin/nologin禁止它登录 shell这是所有守护进程账号的标准做法——数据库进程被攻破时攻击者拿不到一个可交互的 shell。注意别对/var/log整体执行chown -R mysql:mysql。系统日志目录里还有 rsyslog、audit、messages 这些文件属主被改成 mysql 之后rsyslog 写日志会出现权限异常症状是系统日志停止更新排查时根本想不到是装数据库引起的。新建/var/log/greatsql子目录单独授权才是正解。3.2 my.cnf真正需要改的只有这几项# /etc/my.cnf [mysqld] # 进程身份必须和 systemd 单元里的 User 一致 user mysql # 安装根目录指向软链升级只改软链 basedir /usr/local/greatsql # 数据目录初始化前必须是空目录 datadir /var/lib/mysql # socket 和 pid 落在 datadir 下避免 /tmp 被清理后客户端连不上 socket /var/lib/mysql/mysql.sock pid-file /var/lib/mysql/mysqld.pid # 错误日志单独目录方便按服务筛日志 log-error /var/log/greatsql/error.log # 字符集显式声明避免客户端不同编码插进来变问号 character-set-server utf8mb4 collation-server utf8mb4_0900_ai_ci # 表名大小写策略0 敏感1 不敏感必须在初始化前定死 lower_case_table_names 1 # 连接数与缓冲池按虚拟机内存调整 max_connections 500 innodb_buffer_pool_size 512M innodb_page_size 16K [client] socket /var/lib/mysql/mysql.sock default-character-set utf8mb4lower_case_table_names是这一堆参数里最硬的约束。它决定表名在磁盘上怎么存、在数据字典里怎么记。初始化完成之后再去改mysqld 直接拒绝启动报Different lower_case_table_names settings for server (1) and data dictionary (0)。这时候唯一的解法是把 datadir 清空重新初始化前面灌的数据全没了。虚拟机上一般选 1方便从 Windows 迁过来的脚本不至于因为表名大小写炸掉。innodb_page_size同理建库之后不能改。默认 16K和绝大多数 SSD 的 4K 物理扇区、以及操作系统的 4K 页配合得还算合理。只有在用大页内存或者特定 NVMe 调优时才需要动它动了就得从头再来。innodb_buffer_pool_size是性能参数里收益最大的一个。4G 内存的虚拟机上给 512M 到 1G 都合理给小了查询一多就开始刷脏页iostat里能看到明显的写放大。这个参数可以运行期动态调整不像前两个那么刚性。3.3 把 mysqld 交给 systemd# /lib/systemd/system/greatsql.service [Unit] DescriptionGreatSQL Server 8.0.32 Afternetwork.target [Service] Typenotify Usermysql Groupmysql ExecStart/usr/local/greatsql/bin/mysqld --defaults-file/etc/my.cnf ExecStop/bin/kill -TERM $MAINPID Restarton-failure RestartSec5 LimitNOFILE65535 [Install] WantedBymulti-user.target# 让 systemd 重新读取单元文件然后设为开机自启 systemctl daemon-reload systemctl enable greatsqlTypenotify要求 mysqld 在编译时带上了 systemd 通知支持启动就绪后主动告诉 systemd 我好了。如果systemctl start之后一直卡在activating (start)不往下走说明这个二进制没有 notify 支持把它改成Typesimple就行服务照样能起来只是 systemd 不知道 mysqld 什么时候真正就绪After依赖它的其他服务可能起早了。ExecStop用kill -TERM让 mysqld 走正常的关库流程停止接收新连接、刷脏页、写 redo、关闭文件。别用kill -9也别用systemctl kill那种关法轻则丢最后一批事务重则重启后要做崩溃恢复实验环境耽误时间生产环境就是事故。LimitNOFILE65535必须给。systemd 默认的文件描述符上限是 1024每个连接至少占一个 fd加上表空间文件、日志文件、临时文件并发一上来就撞上限症状是Too many open files而ulimit -n在 shell 里看又是正常的因为那是登录会话的限制不是服务的。3.4 初始化、启动与三层验证# 初始化datadir 必须是空目录--initialize-insecure 表示 root 空密码 /usr/local/greatsql/bin/mysqld \ --defaults-file/etc/my.cnf \ --initialize-insecure \ --usermysql # 启动服务 systemctl start greatsql # 第一层服务状态 systemctl status greatsql --no-pager # 第二层进程是否存在 ps -ef | grep [m]ysqld # 第三层端口和 socket 是否在监听 ss -lntp | grep 3306 # 数据目录里生成了什么 ls -lh /var/lib/mysql--initialize-insecure生成一个空密码的 root 账号只适合实验和本地环境。生产用--initialize它会生成一个随机临时密码写进 error.log用grep temporary password /var/log/greatsql/error.log取出来首次登录必须改掉。三层验证的意义在于快速定位故障位置而不是靠猜。systemctl status失败说明问题在 systemd 单元本身或者 mysqld 的启动阶段直接去看/var/log/greatsql/error.logstatus 显示 active 但ps看不到进程说明Type判断有问题或者进程起来就退了ps有进程但ss看不到 3306说明 my.cnf 里的port、bind-address或者skip-networking有问题。这三层分清楚排错时间能砍掉一大半。# 用 socket 连进去首次空密码 /usr/local/greatsql/bin/mysql -uroot -S /var/lib/mysql/mysql.sock-- 首次登录立刻改密码 ALTER USER rootlocalhost IDENTIFIED BY Str0ng#Pass2024; FLUSH PRIVILEGES;3.5 用信息模式看逻辑组件用目录看物理存储DBMS 的逻辑组件不是抽象名词information_schema里每一个都有对应的表查一遍比背概念有用得多。-- 基本表当前库下所有实际存在的表 SHOW TABLES; -- 视图对应 INFORMATION_SCHEMA.VIEWS SELECT TABLE_SCHEMA, TABLE_NAME, VIEW_DEFINITION FROM information_schema.VIEWS WHERE TABLE_SCHEMA DB; -- 触发器绑定在哪个表、什么事件、什么时机触发 SELECT TRIGGER_SCHEMA, TRIGGER p a hrefhttps://download.csdn.net/download/m0_74824716/90170224 stylecolor:#ec7500;font-size:14px; 本文还有配套的精品资源点击获取 /a img altmenu-r.4af5f7ec.gif srchttps://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif stylewidth:16px;margin-left:4px;vertical-align:text-bottom;cursor:text; /p