简介:这份资源是郑州大学计算机与人工智能学院《数据库系统原理》课程的实验报告文档,面向计算机类专业学生及需要完成数据库实验的学习者,帮助其理解DBMS系统架构、掌握万里数据库GreatSQL的安装配置与日常管理,并规范实验报告的撰写格式。压缩包内为1个docx文件,约3.69MB,完整记录了实验一至实验九的内容,涵盖实验目的、内容、类型与学时分配,以及运行环境配置、依赖包安装、二进制包下载解压、服务启动与进程状态检查等实践环节,并配有带编号和图题的实验截图。报告还详细说明了关闭SELinux与防火墙的原因及操作命令,分析了实验中的问题与解决方法,并对结果进行反思。已有509人学习,适合需要参考实验流程、排错思路与报告排版规范的读者对照使用。
1. 从一台干净的 CentOS 说起:GreatSQL 8.0.32 装不上,多半是环境没铺平
虚拟机里刚装完 CentOS 7,命令行一片黑,很多人第一反应是直接wget二进制包解压开跑,结果mysqld起不来、端口连不上、日志里全是权限和依赖报错。这套「VMware + CentOS 7 + GreatSQL 8.0.32-25」的组合在数据库原理实验里出现频率极高,装不好后面建库、建表、写查询全都卡在第一步。这篇笔记按我实际部署的顺序走一遍:先关 SELinux 和防火墙,再补依赖,然后解压二进制包、写 systemd 服务、配my.cnf、建 mysql 用户和目录,最后启动验证。适合刚接触 Linux 下数据库部署的开发者,也适合想复盘版本差异和参数取舍的熟手。
2. 装前环境准备:SELinux、防火墙与依赖包一个都不能少
2.1 为什么先关 SELinux 和防火墙
GreatSQL 需要读写数据目录、监听 3306 端口,SELinux 的强制访问控制会拦截这些特权操作,防火墙则可能直接把端口挡在外面。实验环境里我一般先关掉这两个,减少变量。命令如下:
# 临时关闭 SELinux(当前会话生效) setenforce 0 # 永久关闭 SELinux,改配置文件,重启后依然生效 sed -i '/^SELINUX=/c SELINUX=disabled' /etc/selinux/config # 关闭防火墙并禁止开机自启 systemctl disable firewalld systemctl stop firewalldsetenforce 0只对当前运行状态生效,机器一重启就恢复,所以必须同时改/etc/selinux/config,把SELINUX=那一行替换成disabled。防火墙这边disable管开机自启,stop管当前进程,两条都要执行。注意这是实验和开发环境的做法,生产环境应该用firewall-cmd放行 3306 而不是直接关掉,SELinux 也应该配策略而不是禁用,这个取舍心里要有数。
2.2 依赖包清单与安装
GreatSQL 二进制包不自带所有运行时库,缺libaio会在启动时报libaio.so.1: cannot open shared object file。我一般一次性把常用依赖装齐:
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-Simplelibaio-devel和numactl-devel是 InnoDB 异步 IO 和 NUMA 绑定的基础,jemalloc是内存分配器,GreatSQL 在高并发下用它替代 glibc malloc 能减少碎片。perl-Data-Dumper、perl-Digest-MD5这些是mysql_install_db和部分脚本依赖的,缺了初始化阶段就会报错。python2在 CentOS 7 上默认就有,但有些精简镜像被裁掉了,显式装上更稳。
提示:如果
yum源不可用,先确认虚拟机能访问软件源,别急着怀疑 GreatSQL 包本身。
2.3 版本选择:为什么是 8.0.32-25 而不是别的
实验材料指定的是GreatSQL-8.0.32-25-Linux-glibc2.17-x86_64-minimal.tar.xz。glibc2.17对应 CentOS 7 的 glibc 版本,选错 glibc 版本会在解压后运行mysqld --version时直接报GLIBC_2.xx not found。minimal是精简包,去掉了调试符号和部分工具,体积小、够用。8.0.32 属于 8.0 系列,和 MySQL 8.0 语法基本兼容,实验里的CREATE DATABASE、CREATE TABLE、CREATE INDEX都能直接跑。如果换成 5.7 系列,CHECK约束、窗口函数这些会有差异,实验三里的CHECK(Grade >0 AND Grade <=100)在 5.7 里是被忽略的,8.0 才真正生效,这个版本差异值得留意。
3. 安装 GreatSQL 8.0.32:解压、systemd 服务与 my.cnf 配置
3.1 下载解压到 /usr/local
二进制包统一放/usr/local/,解压后目录名带版本号,后面配置路径要对应上:
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解压出来是GreatSQL-8.0.32-25-Linux-glibc2.17-x86_64-minimal这个长目录。我一般会再建一个软链接ln -s指向它,叫greatsql,这样my.cnf和服务文件里写路径短一点,将来升级版本只改软链接。这一步不是必须,但能省掉后面一堆长路径拼写错误。
3.2 写 systemd 服务文件
手工mysqld_safe启动不方便管理,用 systemd 托管才能systemctl start/stop/status。新建/lib/systemd/system/greatsql.service:
[Unit] Description=GreatSQL Server After=network.target [Service] Type=forking User=mysql Group=mysql ExecStart=/usr/local/GreatSQL-8.0.32-25-Linux-glibc2.17-x86_64-minimal/bin/mysqld --defaults-file=/etc/my.cnf --daemonize ExecStop=/usr/local/GreatSQL-8.0.32-25-Linux-glibc2.17-x86_64-minimal/bin/mysqladmin -uroot -p shutdown LimitNOFILE=65535 Restart=on-failure [Install] WantedBy=multi-user.targetType=forking是因为mysqld --daemonize会 fork 到后台,systemd 需要知道主进程什么时候退。User=mysql保证进程不以 root 跑,LimitNOFILE=65535是文件描述符上限,数据库连接多了默认 1024 不够用。写完执行:
systemctl daemon-reloaddaemon-reload让 systemd 重新读取服务文件,不执行这一步systemctl start greatsql会提示服务不存在。
3.3 建 mysql 用户和数据目录
数据库进程不能用 root 跑,建一个无登录权限的系统用户:
/sbin/groupadd mysql /sbin/useradd -g mysql mysql -d /dev/null -s /sbin/nologin mkdir -p /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-d /dev/null -s /sbin/nologin表示这个用户没有家目录、不能登录 shell,纯粹给服务用。chown把数据目录、日志目录和安装目录都划给 mysql 用户,漏掉任何一个,启动时都会在错误日志里看到Permission denied。
3.4 my.cnf 关键参数
/etc/my.cnf是全局配置,实验环境我一般写这些:
[mysqld] basedir=/usr/local/GreatSQL-8.0.32-25-Linux-glibc2.17-x86_64-minimal datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock port=3306 user=mysql log-error=/var/log/greatsql-error.log pid-file=/var/lib/mysql/greatsql.pid character-set-server=utf8mb4 default-storage-engine=InnoDBbasedir和datadir必须和实际路径一致,socket是本地连接用的,port是 TCP 端口。character-set-server=utf8mb4避免中文乱码,实验里插入「张华」「李玉」这些中文名,字符集不对会变成问号。log-error指向的目录要提前存在且有写权限,否则启动失败但错误信息无处可看,这就是个黑匣子。
3.5 初始化与启动
首次启动前要初始化数据目录:
/usr/local/GreatSQL-8.0.32-25-Linux-glibc2.17-x86_64-minimal/bin/mysqld \ --defaults-file=/etc/my.cnf --initialize --user=mysql--initialize会生成 root 临时密码,写在log-error指定的日志里,用grep 'temporary password' /var/log/greatsql-error.log找出来。然后启动服务:
systemctl start greatsql systemctl status greatsqlstatus显示active (running)才算起来。再用ps -ef | grep mysqld确认进程在,ss -lntp | grep mysqld确认 3306 在监听,ls /var/lib/mysql能看到ibdata1、mysql目录这些文件。三步都过,安装才算落地。
4. 避坑排查:GreatSQL 启动失败的五种典型现场
4.1 现象:systemctl start报Job for greatsql.service failed
原因多半是my.cnf路径写错或数据目录权限不对。先看journalctl -xe和服务文件里的ExecStart路径,再确认datadir存在且属主是 mysql。解决:chown -R mysql:mysql /var/lib/mysql,核对basedir与实际解压目录一致。
4.2 现象:错误日志报libaio.so.1: cannot open shared object file
原因:依赖包没装全,libaio缺失。解决:yum install -y libaio libaio-devel,装完ldconfig刷新动态库缓存再启动。
4.3 现象:Access denied for user 'root'@'localhost'
原因:初始化时生成的临时密码没记下来,或者用了错误的密码。解决:停服务,删掉datadir下内容重新--initialize,或者用--skip-grant-tables启动后改密码再正常启动。我一般初始化完立刻把临时密码记到笔记里,省得回头翻日志。
4.4 现象:端口 3306 被占用,启动报Address already in use
原因:之前装过 MySQL 或 MariaDB,旧进程还在。解决:ss -lntp | grep 3306找到 PID,kill掉,或者改my.cnf里的port。CentOS 7 自带mariadb-libs,有时会残留,rpm -qa | grep mariadb查一下,冲突就卸掉。
4.5 现象:中文插入后显示乱码
原因:客户端和服务端字符集不一致。解决:my.cnf里character-set-server=utf8mb4,建库时CREATE DATABASE DB DEFAULT CHARACTER SET utf8mb4;,连接时SET NAMES utf8mb4;。三处统一,乱码基本消失。
5. 装完怎么验证:从建库建表到查询跑通的一条龙检查
装完不是看到active (running)就完事,得用实际 SQL 把链路走一遍。先用临时密码登录:
mysql -uroot -p -S /var/lib/mysql/mysql.sock登录后先改密码,再建库建表:
-- 改 root 密码 ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPass123!'; -- 建库并指定字符集 CREATE DATABASE DB DEFAULT CHARACTER SET utf8mb4; 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) ); -- 插入中文数据验证字符集 INSERT INTO STUDENTS VALUES ('201705001','张华','男','1999-12-16','计算机','CS'), ('201705002','张晓霞','女','1999-01-01','软件工程','SE'); -- 查询验证 SELECT * FROM STUDENTS;PRIMARY KEY保证学号唯一,NOT NULL防止姓名空值,utf8mb4让中文正常显示。查询结果里中文不乱码、两条记录都在,说明存储和字符集都通了。再建个索引验证 DDL:
CREATE INDEX Student_Dept ON STUDENTS(Dno); SHOW INDEX FROM STUDENTS;SHOW INDEX能看到Student_Dept这一行,说明索引创建成功。最后用systemctl restart greatsql重启一次,再查一遍数据还在,确认数据目录持久化没问题。这套检查我每次装完都走一遍,因为「服务起来了」和「能正常读写」是两回事,前者只证明进程活着,后者才证明这套环境真能跑实验。从那以后我每次部署完数据库,都强制走一遍「建库、插中文、查索引、重启再查」这四步,少一步都可能在上实验课时翻车。希望帮到你。
本文还有配套的精品资源,点击获取