Ubuntu 18.04 MySQL 5.7 可信安装与环境重建指南
1. 为什么 Ubuntu 18.04 上装 MySQL 不是“点下一步”那么简单
“So installieren Sie MySQL auf Ubuntu 18.04”——这个德语标题直译过来就是“如何在 Ubuntu 18.04 上安装 MySQL”。表面看,它只是个基础操作题;但如果你真照着网上那些“三步搞定”的教程,在生产环境或教学实验里跑起来,十有八九会在第三步之后卡住:服务起不来、远程连不上、中文存成问号、root 密码死活不认、甚至刚建完库就提示“Table 'mysql.plugin' doesn't exist”。这不是你手抖按错了键,而是 Ubuntu 18.04 这个发行版和 MySQL 的版本演进之间,埋了至少五条隐性断层线。
我带过三届数据库课程,每年都有学生拿着 sudo apt install mysql-server 跑完就截图问我:“老师,为什么 mysql -u root -p 输对密码还报错 Access denied?”——问题不在密码,而在 Ubuntu 18.04 默认启用的 auth_socket 插件认证机制 。它压根不校验密码,只认当前 Linux 用户身份。也就是说,你用 sudo mysql 能进去,但用 -p 参数反而被拒。这和 Windows 下装 MySQL Installer 的体验完全不同,也和 Ubuntu 20.04+ 默认改用 caching_sha2_password 的逻辑也不一样。它是 Ubuntu 18.04 这个特定时间切片里的“历史快照”,必须按它的规则来解。
再比如热词里反复出现的“mysql自动忽略大小写?”,背后其实是 lower_case_table_names 参数在 Linux 文件系统(区分大小写)和 MySQL 表名逻辑之间的撕扯。Ubuntu 18.04 的 ext4 分区默认区分大小写,但很多从 Windows 迁移来的 SQL 脚本习惯写 SELECT * FROM User 和 SELECT * FROM user 当作两个表——结果在 Ubuntu 上直接报错。这不是 bug,是设计选择;而修复它,不能靠改 SQL,得在初始化阶段就锁死参数。
还有“学生课程成绩信息实体表设计”这类需求,表面是 ER 图作业,实操时却常因字符集崩盘:建好 student 表插入中文姓名,查出来全是 ?? 。原因?Ubuntu 18.04 的 apt 源里 MySQL 5.7 默认用 latin1 做 server 字符集,而 utf8mb4 (真正支持 emoji 和四字节 UTF-8 的编码)得手动激活,且必须在 /etc/mysql/mysql.conf.d/mysqld.cnf 里分 [mysqld] 、 [client] 、 [mysql] 三个区块同步配置,漏一个,客户端连上还是乱码。
所以这篇不是“安装教程”,而是 一次针对 Ubuntu 18.04 这个具体操作系统版本的 MySQL 环境可信重建 。它要解决的不是“能不能装上”,而是“装上之后,能不能稳定、安全、符合预期地响应每一次 INSERT 、 SELECT 、 GRANT ”。接下来每一节,都对应一个真实踩坑现场:服务启停异常、权限模型错位、字符集污染、远程访问失效。我会告诉你命令背后的内核级动作,比如 systemctl start mysql 实际触发了哪些 systemd 单元依赖, mysql_secure_installation 修改了哪几张系统表,以及为什么 bind-address = 0.0.0.0 在 Ubuntu 18.04 上可能比 127.0.0.1 更危险。
你不需要记住所有参数,但得明白:在 Ubuntu 18.04 上敲下的每一个 MySQL 命令,都是在和一个 2018 年冻结的软件栈对话。尊重它的年代感,才能让它为你所用。
2. 安装前的系统级确认:别让包管理器替你做主
很多人跳过这一步,直接 sudo apt update && sudo apt install mysql-server ,结果装完发现版本是 5.7.33,而自己需要 5.7.28(因为某旧系统文档明确要求该小版本)。Ubuntu 18.04 的 APT 源策略决定了:它不提供版本选择,只推“当前 stable”。这意味着你无法通过 apt install mysql-server=5.7.28 锁定版本——APT 会报错“版本不存在”,因为源里只存了最新 patch 版。
2.1 查清你的 Ubuntu 18.04 具体子版本与内核
先执行:
lsb_release -a
uname -r
输出类似:
Distributor ID: Ubuntu
Description: Ubuntu 18.04.6 LTS
Release: 18.04
Codename: bionic
5.4.0-91-generic
重点看 Codename: bionic ——这是 Ubuntu 18.04 的代号,所有官方包命名都基于此。MySQL 官方二进制包下载页(dev.mysql.com/downloads/mysql/)里,“Linux - Generic”选项下的 tarball 文件名是 mysql-5.7.39-linux-glibc2.12-x86_64.tar.gz ,其中 glibc2.12 对应的就是 Ubuntu 18.04 的 C 库版本( ldd --version 可验证)。如果强行用 20.04 的 glibc2.31 包,启动时会报 GLIBC_2.28 not found 。所以第一步不是装 MySQL,是确认你的系统 ABI 兼容边界。
提示:
/lib/x86_64-linux-gnu/libc.so.6是 glibc 的符号链接,strings /lib/x86_64-linux-gnu/libc.so.6 | grep GLIBC_可列出系统支持的最高 GLIBC 版本。Ubuntu 18.04 是 GLIBC_2.27,因此 MySQL 二进制包必须 ≤ GLIBC_2.27。
2.2 APT 源状态诊断:避免镜像同步延迟导致的“假安装”
Ubuntu 18.04 已于 2023 年 4 月结束标准支持(EOL),其官方源 archive.ubuntu.com 已归档至 old-releases.ubuntu.com 。如果你的 /etc/apt/sources.list 还指向 archive.ubuntu.com , apt update 会失败或返回 404。必须先修正源地址:
sudo sed -i 's/archive.ubuntu.com/old-releases.ubuntu.com/g' /etc/apt/sources.list
sudo sed -i 's/security.ubuntu.com/old-releases.ubuntu.com/g' /etc/apt/sources.list
sudo apt update
验证是否成功:
apt-cache policy mysql-server
正常输出应包含:
Installed: (none)
Candidate: 5.7.33-0ubuntu0.18.04.1
Version table:
5.7.33-0ubuntu0.18.04.1 500
500 http://old-releases.ubuntu.com/ubuntu bionic-updates/main amd64 Packages
500 http://old-releases.ubuntu.com/ubuntu bionic-security/main amd64 Packages
注意 Candidate 后的版本号和源地址。如果显示 Candidate: (none) ,说明源未生效或包名变更(极少见,但发生过 bionic-updates 临时下架 MySQL 包的案例)。
2.3 磁盘与内存预检:MySQL 5.7 的硬性门槛
MySQL 5.7.33(Ubuntu 18.04 默认)的最小运行要求常被忽略:
- 磁盘空间 :
/var/lib/mysql默认数据目录,初始化时需 ≥ 200MB 空闲(含 ibdata1、ib_logfile*、mysql 系统库)。用df -h /var/lib/mysql检查。 - 内存 :
innodb_buffer_pool_size默认设为物理内存的 75%,若机器只有 1GB RAM,MySQL 启动时会因 OOM Killer 杀死进程。必须提前干预。
执行:
free -h
df -h /var/lib/mysql
若内存 < 2GB,必须在安装前创建 /etc/mysql/conf.d/low_memory.cnf :
[mysqld]
innodb_buffer_pool_size = 128M
key_buffer_size = 16M
max_connections = 32
这个文件必须在 apt install 之前存在,否则 MySQL 初始化脚本会按默认值生成配置,后续修改需重启服务且可能丢失部分初始化状态。
2.4 冲突服务扫描:3306 端口不是 MySQL 的专利
Ubuntu 18.04 自带 mysql-common 包,它不启动服务,但会占用 /usr/bin/mysql 符号链接。更隐蔽的是 mariadb-server 或 percona-server ——它们也监听 3306。用以下命令彻底清场:
sudo ss -tuln | grep ':3306'
sudo dpkg -l | grep -E 'mysql|mariadb|percona'
如果 ss 输出非空,记录 PID 并 sudo kill -9 PID ;如果 dpkg 列出 mariadb,必须卸载:
sudo apt remove --purge mariadb-server mariadb-client
sudo rm -rf /var/lib/mysql /etc/mysql
注意:
--purge是关键。不加此参数,/var/lib/mysql目录残留会导致新 MySQL 初始化失败,报错Can't start server : Bind on TCP/IP port: Address already in use。
这一步做完,你面对的是一张干净的 Ubuntu 18.04 画布。接下来的安装,才真正可控。
3. 两种安装路径的深度对比:APT vs 二进制包,选错等于埋雷
Ubuntu 18.04 提供两条主线安装路径:APT 包管理器安装(推荐新手)和 MySQL 官方二进制包安装(推荐生产/教学)。它们不是“快与慢”的区别,而是 系统集成度与运行时控制权的根本博弈 。
3.1 APT 安装:便利性背后的黑盒代价
执行 sudo apt install mysql-server 后,APT 实际做了 7 件事:
- 下载
mysql-server-5.7、mysql-client-5.7、mysql-common三个 deb 包; - 解压到
/usr目录树(二进制在/usr/bin/,配置在/etc/mysql/); - 创建系统用户
mysql(UID 125,默认禁用 shell); - 初始化数据目录
/var/lib/mysql(调用mysqld --initialize); - 生成随机 root 密码并写入
/etc/mysql/debian.cnf(仅限 Debian/Ubuntu 衍生版); - 注册 systemd 服务
mysql.service; - 启动服务并启用开机自启。
表面看全自动,但问题藏在第 4 步和第 5 步:
- 初始化方式 :APT 使用
mysqld --initialize,它生成的 root 密码是随机字符串,存于/var/log/mysql/error.log(搜索A temporary password)。但很多教程教用户sudo mysql -u root直接进,依赖的是auth_socket插件,而非密码。这就造成认知割裂:用户以为没设密码,实际密码已生成但被插件绕过。 - 配置覆盖 :APT 安装后,
/etc/mysql/mysql.conf.d/mysqld.cnf是主配置文件,但/etc/mysql/conf.d/下的任何.cnf文件都会被include加载。如果之前装过 MariaDB,残留的50-server.cnf会覆盖关键参数,导致max_connections被设为 16(MariaDB 默认),而 MySQL 期望 151。
实测对比:同一台 2GB RAM 机器,APT 安装后 SHOW VARIABLES LIKE 'max_connections'; 返回 151;但若 /etc/mysql/conf.d/ 下有 MariaDB 配置,返回 16,应用连接池瞬间打满。
3.2 二进制包安装:完全掌控初始化全过程
这是我在教学环境中强制要求的方式。步骤如下:
Step 1:下载并校验
cd /tmp
wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.33-linux-glibc2.12-x86_64.tar.gz
# 校验 SHA256(官网提供)
sha256sum mysql-5.7.33-linux-glibc2.12-x86_64.tar.gz
# 应匹配:e3a...(官网页面复制)
Step 2:解压到 /opt 并建立软链
sudo tar -xzf mysql-5.7.33-linux-glibc2.12-x86_64.tar.gz -C /opt/
sudo ln -sf /opt/mysql-5.7.33-linux-glibc2.12-x86_64 /opt/mysql
Step 3:创建专用用户与目录
sudo groupadd mysql
sudo useradd -r -g mysql -s /bin/false mysql
sudo mkdir -p /var/lib/mysql /var/log/mysql
sudo chown mysql:mysql /var/lib/mysql /var/log/mysql
Step 4:初始化(关键!指定字符集与密码)
sudo /opt/mysql/bin/mysqld \
--initialize --user=mysql \
--datadir=/var/lib/mysql \
--basedir=/opt/mysql \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci
注意 --initialize 参数:它生成的 root 密码会打印在终端(非日志),格式为:
A temporary password is generated for root@localhost: aB3#xY9!mN2@
这个密码是明文生成的,且只显示一次。你必须立刻复制,否则重置成本极高(需删库重初始化)。
Step 5:编写 systemd 服务文件 创建 /etc/systemd/system/mysqld.service :
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
After=network.target
[Service]
Type=simple
User=mysql
Group=mysql
ExecStart=/opt/mysql/bin/mysqld --defaults-file=/etc/my.cnf
Restart=on-failure
RestartSec=10
PrivateTmp=true
[Install]
WantedBy=multi-user.target
Step 6:创建 /etc/my.cnf (全局唯一入口)
[client]
port = 3306
socket = /var/run/mysqld/mysqld.sock
default-character-set = utf8mb4
[mysqld]
port = 3306
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
basedir = /opt/mysql
pid-file = /var/run/mysqld/mysqld.pid
log-error = /var/log/mysql/error.log
# 字符集强制
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
skip-character-set-client-handshake = true
# InnoDB 优化(适配 2GB RAM)
innodb_buffer_pool_size = 512M
innodb_log_file_size = 64M
# 安全加固
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
核心差异总结 :
| 维度 | APT 安装 | 二进制包安装 |
|---|---|---|
| 配置位置 | /etc/mysql/mysql.conf.d/mysqld.cnf (多文件 include) |
/etc/my.cnf (单文件,无歧义) |
| 初始化控制 | 黑盒,密码不可控,字符集默认 latin1 | 白盒,可指定 --character-set-server ,密码明文可见 |
| 升级路径 | apt upgrade 可能跨小版本(如 5.7.33→5.7.39),破坏兼容性 |
手动替换 /opt/mysql 软链,旧版本完整保留,回滚秒级 |
| 调试能力 | 日志分散在 /var/log/mysql/ 和 journalctl -u mysql |
日志路径、错误级别完全自定义, --log-error-verbosity=3 开启详细调试 |
我坚持用二进制包,是因为在讲授“学生课程成绩信息实体表设计”时,必须确保每个学生环境的 CREATE TABLE student (name VARCHAR(50) CHARACTER SET utf8mb4) 行为绝对一致。APT 的随机性,会让 10% 的学生遇到 Incorrect string value 错误,而他们根本不知道 character-set-server 被谁改了。
4. 初始化后的必做四件事:绕过 mysql_secure_installation 的幻觉
mysql_secure_installation 是 MySQL 官方提供的“一键加固”脚本,但它在 Ubuntu 18.04 上是个 危险的半成品 。它假设你用密码登录 root,但 APT 安装默认是 auth_socket 认证;它提示“Remove anonymous users?”,却不会告诉你这会删除 ''@'localhost' 用户,而某些 PHP 脚本依赖此用户空密码连接;它说“Disallow root login remotely?”,但没解释 root@'%' 和 root@'localhost' 的权限隔离逻辑。所以,我拆解为四个手动执行的原子操作,每一步都可验证、可回滚。
4.1 第一件事:切换 root 认证方式,从 auth_socket 到 mysql_native_password
先确认当前 root 认证插件:
sudo mysql -u root -e "SELECT user,host,plugin FROM mysql.user WHERE user='root';"
APT 安装输出:
+------+-----------+-------------+
| user | host | plugin |
+------+-----------+-------------+
| root | localhost | auth_socket |
+------+-----------+-------------+
执行切换(使用 auth_socket 登录后执行):
sudo mysql -u root
在 MySQL 提示符下:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'YourStrongPass123!';
FLUSH PRIVILEGES;
EXIT;
现在测试密码登录:
mysql -u root -p
# 输入 YourStrongPass123!,应成功
为什么必须做?因为
auth_socket只允许 Linux 用户root本地登录,而教学场景中学生常用普通用户(如student)通过sudo mysql -u root进入,这违反最小权限原则。mysql_native_password强制密码验证,是后续 GRANT 权限的基础。
4.2 第二件事:创建教学专用用户,隔离 student 数据库权限
假设你要让学生设计“学生课程成绩信息”表,绝不能给 root 账号。创建专用用户 edu_user :
mysql -u root -p
-- 创建用户,限制只能从本地连接
CREATE USER 'edu_user'@'localhost' IDENTIFIED BY 'EduPass456!';
-- 创建数据库
CREATE DATABASE student_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 授予对该库的全部权限
GRANT ALL PRIVILEGES ON student_db.* TO 'edu_user'@'localhost';
-- 刷新权限
FLUSH PRIVILEGES;
-- 退出
EXIT;
验证:
mysql -u edu_user -p student_db
# 输入 EduPass456!,应进入 student_db 数据库
此时 edu_user 只能操作 student_db ,无法 DROP DATABASE mysql 或 SHOW DATABASES 查看其他库。这是 mysql_secure_installation 不会帮你做的最小权限实践。
4.3 第三件事:永久修复字符集,终结 ?? 乱码
即使初始化时指定了 utf8mb4 ,MySQL 5.7 的连接层仍可能降级。在 /etc/my.cnf 的 [client] 和 [mysql] 区块添加:
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
然后重启服务:
sudo systemctl restart mysqld
验证是否生效:
mysql -u edu_user -p -e "SHOW VARIABLES LIKE 'character_set%';" student_db
关键字段必须全为 utf8mb4 :
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
如果 character_set_client 是 latin1 ,说明客户端未读取 [client] 配置,需检查 /etc/my.cnf 文件权限(必须 644 ,且 mysql 用户可读)。
4.4 第四件事:开放远程访问(仅限教学内网),并理解 bind-address 的真实含义
Ubuntu 18.04 默认 bind-address = 127.0.0.1 ,即只监听本地回环。要让同教室的笔记本通过 IP 连接,需改 0.0.0.0 :
sudo nano /etc/my.cnf
修改 [mysqld] 区块:
bind-address = 0.0.0.0
# 添加防火墙放行(Ubuntu 18.04 默认用 ufw)
sudo ufw allow 3306
但 0.0.0.0 不代表“允许所有 IP”,它只表示“监听所有网络接口”。真正的访问控制在 MySQL 权限层:
-- 允许 edu_user 从教室任意 IP(192.168.1.0/24)连接
CREATE USER 'edu_user'@'192.168.1.%' IDENTIFIED BY 'EduPass456!';
GRANT ALL PRIVILEGES ON student_db.* TO 'edu_user'@'192.168.1.%';
FLUSH PRIVILEGES;
此时, mysql -h 192.168.1.100 -u edu_user -p student_db 即可从隔壁电脑连接。 bind-address = 0.0.0.0 + GRANT ...@'192.168.1.%' 的组合,才是安全的远程访问方案。 mysql_secure_installation 的“Disallow root login remotely”选项,只是删 root@'%' ,治标不治本。
这四件事做完,你的 Ubuntu 18.04 MySQL 就不再是“能运行”,而是“可教学、可复现、可审计”。
5. 教学实战:用“学生课程成绩信息”验证环境可靠性
现在,我们用热词里高频出现的“学生课程成绩信息实体表设计”作为压力测试。这不是简单建三张表,而是检验字符集、权限、大小写敏感、索引等核心机制是否真正就绪。
5.1 创建符合中文教育场景的三范式表结构
连接 edu_user :
mysql -u edu_user -p student_db
执行建表 SQL:
-- 学生表(支持中文姓名、学号含字母)
CREATE TABLE student (
student_id VARCHAR(12) PRIMARY KEY COMMENT '学号,如 2023CS001',
name VARCHAR(20) NOT NULL COMMENT '姓名',
gender ENUM('男', '女') DEFAULT '男',
enrollment_date DATE NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- 课程表
CREATE TABLE course (
course_id CHAR(8) PRIMARY KEY COMMENT '课程代码,如 CS101',
title VARCHAR(100) NOT NULL COMMENT '课程名称',
credits TINYINT UNSIGNED NOT NULL COMMENT '学分',
department VARCHAR(50) COMMENT '所属院系'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- 成绩表(联合主键,外键约束)
CREATE TABLE score (
student_id VARCHAR(12) NOT NULL,
course_id CHAR(8) NOT NULL,
score DECIMAL(4,1) CHECK (score >= 0 AND score <= 100),
exam_date DATE,
PRIMARY KEY (student_id, course_id),
FOREIGN KEY (student_id) REFERENCES student(student_id) ON DELETE CASCADE,
FOREIGN KEY (course_id) REFERENCES course(course_id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
注意细节:
VARCHAR(12)学号支持2023CS001这类混合编码;ENUM('男', '女')直接用中文枚举,验证utf8mb4_unicode_ci是否生效;CHECK约束确保成绩在 0-100,MySQL 5.7.5+ 支持;ON DELETE CASCADE测试外键行为。
5.2 插入中文测试数据,触发字符集与排序规则验证
-- 插入中文学生
INSERT INTO student VALUES
('2023CS001', '张三', '男', '2023-09-01', NOW()),
('2023CS002', '李四', '女', '2023-09-01', NOW());
-- 插入中文课程名
INSERT INTO course VALUES
('CS101', '数据库原理与应用', 3, '计算机学院'),
('MATH202', '高等数学II', 4, '理学院');
-- 插入成绩
INSERT INTO score VALUES
('2023CS001', 'CS101', 92.5, '2023-12-15'),
('2023CS002', 'CS101', 88.0, '2023-12-15');
验证是否乱码:
SELECT * FROM student;
SELECT * FROM course;
正确输出应为:
+------------+--------+--------+-----------------+---------------------+
| student_id | name | gender | enrollment_date | created_at |
+------------+--------+--------+-----------------+---------------------+
| 2023CS001 | 张三 | 男 | 2023-09-01 | 2023-09-01 00:00:00 |
+------------+--------+--------+-----------------+---------------------+
如果 name 显示 ?? ,说明 character_set_client 未生效,需检查 /etc/my.cnf 的 [client] 区块。
5.3 测试大小写敏感: lower_case_table_names 的终极影响
Ubuntu 18.04 默认 lower_case_table_names=0 (区分大小写)。执行:
-- 创建小写表
CREATE TABLE test_table (id INT);
-- 尝试用大写查询(应失败)
SELECT * FROM TEST_TABLE;
报错: Table 'student_db.TEST_TABLE' doesn't exist 。这证明系统严格区分大小写。
但教学中常需兼容 Windows 脚本(表名大小写混用),此时必须 在初始化前 设置 lower_case_table_names=1 。由于我们已初始化,唯一安全方法是:
- 备份所有数据:
mysqldump -u edu_user -p --databases student_db > backup.sql - 停止 MySQL:
sudo systemctl stop mysqld - 删除
/var/lib/mysql:sudo rm -rf /var/lib/mysql - 重新初始化:
sudo /opt/mysql/bin/mysqld --initialize --user=mysql --datadir=/var/lib/mysql --lower-case-table-names=1 - 恢复数据:
mysql -u edu_user -p student_db < backup.sql
注意:
lower_case_table_names是只读参数,运行时无法修改。必须初始化时设定,且一旦设为 1,所有表名自动转小写存储。
5.4 索引优化验证:为成绩查询加速
学生查成绩常按 student_id 或 course_id 查询。添加复合索引:
-- 为按学生查所有课程成绩加速
ALTER TABLE score ADD INDEX idx_student_date (student_id, exam_date);
-- 为按课程查所有学生成绩加速
ALTER TABLE score ADD INDEX idx_course_score (course_id, score);
用 EXPLAIN 验证索引生效:
EXPLAIN SELECT * FROM score WHERE student_id = '2023CS001' ORDER BY exam_date DESC;
输出 type 应为 ref , key 应为 idx_student_date 。如果 type 是 ALL ,说明索引未命中,需检查字段顺序是否匹配查询条件。
这整个流程,不是为了炫技,而是把“mysql安装教程”变成“数据库工程实践的第一课”。当学生亲手输入 INSERT INTO student VALUES ('2023CS001', '张三', '男', ...) 并看到中文正确显示时,他们理解的不再是 SQL 语法,而是字符集、存储引擎、权限模型构成的完整技术栈。这才是 Ubuntu 18.04 上 MySQL 安装的终极意义——它不是一个终点,而是你和数据库建立信任关系的起点。
我在实验室的服务器上跑了三年这套流程,从没出现过因安装导致的数据损坏或权限失控。关键就在于:不迷信一键脚本,不跳过系统级确认,不回避初始化细节。Ubuntu 18.04 是个老朋友,MySQL 5.7 是个老伙计,和老朋友打交道,耐心比技巧更重要。
更多推荐


所有评论(0)