MySQL 8.4 实验环境与可重复初始化
可运行实验
在专用实验实例执行:
sql
DROP DATABASE IF EXISTS mysql_course;
CREATE DATABASE mysql_course
CHARACTER SET utf8mb4
COLLATE utf8mb4_0900_ai_ci;
USE mysql_course;
CREATE TABLE lab_probe (
id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
note VARCHAR(100) NOT NULL,
created_at TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6)
) ENGINE = InnoDB;
INSERT INTO lab_probe(note) VALUES ('mysql-8.4-baseline');
SELECT * FROM lab_probe;
SHOW CREATE TABLE lab_probe;机制解释
客户端把 SQL 发送给 MySQL Server;Server 负责解析、权限、优化和执行协调,InnoDB 负责页、索引、事务、锁与崩溃恢复。数据库默认字符集会成为新表的默认值,但已有对象不会因修改默认值自动重写。
SET SESSION 只影响当前连接;SET GLOBAL 影响之后新建的连接;可持久化参数还要区分运行值和重启后的值。连接池会复用会话,因此归还连接前必须恢复事务、隔离级别、时区等状态。
真实边界
- DROP DATABASE 是破坏性语句,只能在可丢弃实例执行。
- utf8mb4_0900_ai_ci 的比较是大小写和重音不敏感;标识符或安全令牌可能需要不同排序规则或二进制类型。
- 容器删除不代表数据卷删除;反过来,错误挂载会让重建容器后数据消失。
- 8.4 是本课程稳定基线。9.x 的行为必须在独立环境验证。
练习
- 新开两个客户端,在其中一个修改 SESSION time_zone,比较两个连接。
- 将排序规则改成大小写敏感的 utf8mb4_0900_as_cs,验证 'A' 与 'a' 的比较结果。
- 画出客户端、Server SQL 层和 InnoDB 的请求路径。
验收清单
- 初始化脚本可重复运行,最终表结构与数据一致。
- 报告包含 8.4 版本、SQL mode、时区、字符集和排序规则。
- 能用两个连接证明 SESSION 与 GLOBAL 的作用域差异。
深度加餐:实验环境也要像生产一样可复现
数据库学习最怕“我这里能跑”;先固定版本、字符集、SQL 模式和初始化脚本,再讨论结果。
先做一个可观察实验
sql
SELECT VERSION(), @@version_comment;
SELECT @@sql_mode, @@transaction_isolation, @@character_set_server,
@@collation_server, @@time_zone;
CREATE DATABASE IF NOT EXISTS mvcc_lab
CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
USE mvcc_lab;
CREATE TABLE IF NOT EXISTS probe (
id BIGINT PRIMARY KEY,
value INT NOT NULL
) ENGINE=InnoDB;预期:每次实验都能记录版本、隔离级别和字符集;同一脚本重复执行不会因为对象已存在而失控。
原理下潜与工程边界
客户端、Server 层和 InnoDB 层各有配置;SQL 模式影响隐式转换与错误行为,时区影响 TIMESTAMP/应用显示。初始化脚本要幂等、可回滚,并在实验后清理数据。
只在 GUI 中点选设置无法审计;root 账号运行应用会隐藏权限问题;不同客户端对 delimiter、自动提交和结果集展示的默认值可能不同。
反例排错路线
先执行 SELECT @@autocommit、SHOW WARNINGS 和 SHOW CREATE TABLE,再比较两会话的 session 变量;结论必须附版本与变量快照。
练习加码(仍不提供答案)
加码:写 reset_lab.sql,重复执行三次仍得到同一 schema、索引和种子数据,并输出校验摘要。
验收时请补充:一份可复现的环境/数据前提、正常结果、失败结果以及可回滚或清理动作。
继续查阅:MySQL 8.4 参考手册(外部资料已收录于证据账本) · InnoDB 文档(外部资料已收录于证据账本)