MySQL 8.0 容器化部署需配置 mysql_native_password 插件、utf8mb4 字符集及正确时区参数,初始化时注意外键约束与索引优化,Spring Boot 连接须严格校验 URL 参数与 JPA 策略。

MySQL 8.0 容器化部署(Docker 快速启动)
在线教育平台对 MySQL 版本和隔离性有明确要求,直接装系统级 MySQL 容易与宿主机冲突、版本难统一。用 Docker 启一个干净、可复现的实例最省事。
常见错误现象:Connection refused、Access denied for user 'root'@'172.x.x.x',多数因 root 密码未设或绑定地址未放开。
- 执行
docker run -d --name mysql-edu -p 3306:3306 -e MYSQL_ROOT_PASSWORD=edu123 -e MYSQL_DATABASE=edu_system -e MYSQL_USER=edu_app -e MYSQL_PASSWORD=app456 -v /path/to/my.cnf:/etc/mysql/conf.d/my.cnf:ro -v /path/to/data:/var/lib/mysql -d mysql:8.0 -
my.cnf中必须含default_authentication_plugin=mysql_native_password,否则 Python/Java 连接时抛Client does not support authentication protocol - 容器启动后,立刻进容器执行
mysql -uroot -pedu123 -e "CREATE USER 'edu_app'@'%' IDENTIFIED WITH mysql_native_password BY 'app456'; GRANT ALL ON edu_system.* TO 'edu_app'@'%'; FLUSH PRIVILEGES;",避免权限遗漏
edu_system 数据库初始化脚本执行要点
课程管理模块依赖固定表结构(如 course、teacher、enrollment),但直接 source 大 SQL 文件常失败——不是语法错,而是字符集或时间戳默认值惹的祸。
使用场景:导入课程管理系统提供的 init_schema.sql 和 sample_data.sql。
- 先确认容器内 MySQL 字符集:执行
mysql -uedu_app -papp456 -e "SHOW VARIABLES LIKE 'character_set%';",确保character_set_server和collation_server是utf8mb4,否则中文课程名乱码 - 执行前加
SET NAMES utf8mb4;,再source /init/init_schema.sql;若报Invalid default value for 'created_at',说明 SQL 里用了DATETIME DEFAULT CURRENT_TIMESTAMP,而 MySQL 8.0 默认 strict mode 拒绝该写法,需改用TIMESTAMP DEFAULT CURRENT_TIMESTAMP或临时关 strict:SET sql_mode = ''; - 示例字段定义应为:
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,而非DATETIME DEFAULT NOW()
Spring Boot 应用连接 edu_system 的配置陷阱
教育平台后端多用 Spring Boot,application.yml 配错会导致服务启动成功但查不到课程数据,日志里只显示连接池超时,不报具体 SQL 错误。
参数差异直接影响课程列表加载速度和并发能力:
-
spring.datasource.url必须带?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true,缺任一都可能连上却读不出start_time字段(时区错位导致时间全为 0000-00-00) -
spring.jpa.hibernate.ddl-auto在生产环境必须是validate或none,绝不能是update—— 否则每次重启都试图改表,课程表被意外删列就无法恢复 - 连接池推荐 HikariCP,
maximum-pool-size: 20足够支撑 500 并发课程查询;若设成 5,高峰期会卡在HikariPool-1 - Connection is not available
课程管理模块首次运行前的校验清单
数据库跑起来了、应用也连上了,但教师进后台看不到课程?大概率是初始化数据没落库,或外键约束阻断了插入。
容易被忽略的地方:
- 检查
course表中category_id是否有对应记录在category表里,否则INSERT INTO course会因外键失败且无提示(除非开show_sql: true) - 执行
SELECT COUNT(*) FROM course;前,先USE edu_system;,别在information_schema下查空表 - 若用 MyBatis,确认
CourseMapper.xml中resultMap的id字段类型是Long,不是Integer—— MySQL 的BIGINT主键映射错会导致课程 ID 全为 0
环境搭完不是终点,课程管理模块真正稳定,得等第一次批量导入 1000+ 课程后看慢查询日志里有没有 SELECT * FROM course ORDER BY created_at DESC 没走索引 —— 那时候才该加 INDEX(created_at)。










