简介:这份《数据库原理实验报告》面向郑州大学计算机与人工智能学院《数据库系统原理》课程学习者,也适合需要了解 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_t,mysqld 一写就被拒,/var/log/audit/audit.log里留下一串avc: denied。症状很迷惑:目录权限是 777,mysql 用户手动 touch 能成,mysqld 就是起不来。
firewalld 挡的是网络层。3306 没放行,本机 socket 连接一切正常,远端客户端就是Can't 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-port=3306/tcp才是正道。实验环境关掉只是图快,别把这个习惯带出去。
2.2 四条命令的正确写法和验证方式
# 1) 临时把 SELinux 切到宽容模式,仅当前运行期生效 setenforce 0 # 2) 改配置文件,让重启后仍然是 disabled # 注意 c 后面是反斜杠 + 空格,且正则只匹配行首的 SELINUX= sed -i '/^SELINUX=/c\SELINUX=disabled' /etc/selinux/config # 3) 取消 firewalld 开机自启 systemctl disable firewalld # 4) 立即停止 firewalld systemctl stop firewalld # 验证三件事,缺一不可 getenforce # 期望输出 Permissive grep '^SELINUX=' /etc/selinux/config # 期望输出 SELINUX=disabled systemctl is-enabled firewalld # 期望输出 disabledsetenforce 0中间是空格,不是等号。原报告里写成setenforce=0,shell 会回一句command not found,而人往往扫一眼就过了,结果 SELinux 一直是 Enforcing,后面初始化数据库卡住,排查方向全跑偏。这是整份报告里最容易翻车的第一处,我见过不止一个人在这里耗掉整个下午。
sed那行的正则是/^SELINUX=/,只匹配行首恰好是SELINUX=的行。如果图省事写成/^SELINUX/,会把配置文件里的SELINUXTYPE=targeted也一起替换成SELINUX=disabled,SELinux 的策略类型直接丢了,机器重启后可能出现更奇怪的行为。
提示:
getenforce和配置文件是两套状态,临时模式和永久配置要分别确认,只改一个就会出现"这次好了,重启又坏"。
2.3 依赖包分成哪三类
把那条长 yum 命令拆开看,包其实分三种角色,搞清楚以后换系统版本也知道该替换什么。
| 类别 | 包名 | 作用 | 缺了会怎样 |
|---|---|---|---|
| 运行必需 | libaio-devel、numactl-libs | InnoDB 异步 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] Description=GreatSQL Server 8.0.32 After=network.target [Service] Type=notify User=mysql Group=mysql ExecStart=/usr/local/greatsql/bin/mysqld --defaults-file=/etc/my.cnf ExecStop=/bin/kill -TERM $MAINPID Restart=on-failure RestartSec=5 LimitNOFILE=65535 [Install] WantedBy=multi-user.target# 让 systemd 重新读取单元文件,然后设为开机自启 systemctl daemon-reload systemctl enable greatsqlType=notify要求 mysqld 在编译时带上了 systemd 通知支持,启动就绪后主动告诉 systemd "我好了"。如果systemctl start之后一直卡在activating (start)不往下走,说明这个二进制没有 notify 支持,把它改成Type=simple就行,服务照样能起来,只是 systemd 不知道 mysqld 什么时候真正就绪,After=依赖它的其他服务可能起早了。
ExecStop用kill -TERM,让 mysqld 走正常的关库流程:停止接收新连接、刷脏页、写 redo、关闭文件。别用kill -9,也别用systemctl kill,那种关法轻则丢最后一批事务,重则重启后要做崩溃恢复,实验环境耽误时间,生产环境就是事故。
LimitNOFILE=65535必须给。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 \ --user=mysql # 启动服务 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.log;status 显示 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 'root'@'localhost' 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 href="https://download.csdn.net/download/m0_74824716/90170224" style="color:#ec7500;font-size:14px;"> 本文还有配套的精品资源,点击获取 </a> <img alt="menu-r.4af5f7ec.gif" src="https://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif" style="width:16px;margin-left:4px;vertical-align:text-bottom;cursor:text;"> </p>