dockercompose启动mysql容器和springboot项目容器时,mysql容器启动慢导致springboot项目容器启动失败

dockercompose启动mysql容器和springboot项目容器时,mysql容器启动慢导致springboot项目容器启动失败。

报错如下:

bash 复制代码
vod@vod:~/playedu$ docker logs -f playedu-playedu-1
Waiting for MySQL to start...

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/

 :: Spring Boot ::                (v3.3.4)

2025-12-12T14:59:29.884+08:00  INFO 14 --- [           main] xyz.playedu.api.PlayeduApiApplication    : Starting PlayeduApiApplication v2.0 using Java 17.0.11 with PID 14 (/app/api/app.jar started by root in /)
2025-12-12T14:59:29.887+08:00  INFO 14 --- [           main] xyz.playedu.api.PlayeduApiApplication    : The following 1 profile is active: "prod"
2025-12-12T14:59:31.874+08:00  INFO 14 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port 9898 (http)
2025-12-12T14:59:31.898+08:00  INFO 14 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2025-12-12T14:59:31.898+08:00  INFO 14 --- [           main] o.apache.catalina.core.StandardEngine    : Starting Servlet engine: [Apache Tomcat/10.1.30]
2025-12-12T14:59:31.932+08:00  INFO 14 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2025-12-12T14:59:31.933+08:00  INFO 14 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1961 ms
2025-12-12T14:59:35.296+08:00  INFO 14 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port 9898 (http) with context path '/'
2025-12-12T14:59:35.308+08:00  INFO 14 --- [           main] xyz.playedu.api.PlayeduApiApplication    : Started PlayeduApiApplication in 5.92 seconds (process running for 6.507)
2025-12-12T14:59:35.321+08:00  INFO 14 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2025-12-12T14:59:40.574+08:00 ERROR 14 --- [           main] x.playedu.system.checks.MigrationCheck   : 数据库迁移执行失败,错误信息:Failed to obtain JDBC Connection
2025-12-12T14:59:40.652+08:00  INFO 14 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2025-12-12T14:59:40.718+08:00  INFO 14 --- [           main] com.zaxxer.hikari.pool.HikariPool        : HikariPool-1 - Added connection com.mysql.cj.jdbc.ConnectionImpl@195cbf5e
2025-12-12T14:59:40.719+08:00  INFO 14 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
2025-12-12T14:59:40.990+08:00 ERROR 14 --- [           main] x.playedu.system.checks.SystemDataCheck  : 超级管理员初始化失败,错误信息:
### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: Table 'vod.admin_roles' doesn't exist
### The error may exist in xyz/playedu/common/mapper/AdminRoleMapper.java (best guess)
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### SQL: SELECT  id,name,slug,created_at,updated_at  FROM admin_roles      WHERE  (slug = ?)
### Cause: java.sql.SQLSyntaxErrorException: Table 'vod.admin_roles' doesn't exist
; bad SQL grammar []
2025-12-12T14:59:40.997+08:00  INFO 14 --- [           main] .s.b.a.l.ConditionEvaluationReportLogger :

Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.
2025-12-12T14:59:41.011+08:00 ERROR 14 --- [           main] o.s.boot.SpringApplication               : Application run failed

org.springframework.jdbc.BadSqlGrammarException:
### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: Table 'vod.app_config' doesn't exist
### The error may exist in xyz/playedu/common/mapper/AppConfigMapper.java (best guess)
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### SQL: SELECT  id,group_name,name,sort,field_type,key_name,key_value,option_value,is_private,help,created_at,is_hidden  FROM app_config
### Cause: java.sql.SQLSyntaxErrorException: Table 'vod.app_config' doesn't exist
; bad SQL grammar []
        at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:246) ~[spring-jdbc-6.1.13.jar!/:6.1.13]
        at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:107) ~[spring-jdbc-6.1.13.jar!/:6.1.13]
        at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:92) ~[mybatis-spring-3.0.3.jar!/:3.0.3]
        at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:439) ~[mybatis-spring-3.0.3.jar!/:3.0.3]
        at jdk.proxy2/jdk.proxy2.$Proxy83.selectList(Unknown Source) ~[na:na]
        at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224) ~[mybatis-spring-3.0.3.jar!/:3.0.3]
        at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:164) ~[mybatis-plus-core-3.5.7.jar!/:3.5.7]
        at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:77) ~[mybatis-plus-core-3.5.7.jar!/:3.5.7]
        at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:152) ~[mybatis-plus-core-3.5.7.jar!/:3.5.7]
        at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) ~[mybatis-plus-core-3.5.7.jar!/:3.5.7]
        at jdk.proxy2/jdk.proxy2.$Proxy91.selectList(Unknown Source) ~[na:na]
        at com.baomidou.mybatisplus.extension.service.IService.list(IService.java:407) ~[mybatis-plus-extension-3.5.7.jar!/:3.5.7]
        at com.baomidou.mybatisplus.extension.service.IService.list(IService.java:428) ~[mybatis-plus-extension-3.5.7.jar!/:3.5.7]
        at xyz.playedu.common.service.impl.AppConfigServiceImpl.allKeys(AppConfigServiceImpl.java:47) ~[playedu-common-1.0.jar!/:1.0]
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
        at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
        at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:355) ~[spring-aop-6.1.13.jar!/:6.1.13]
        at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:716) ~[spring-aop-6.1.13.jar!/:6.1.13]
        at xyz.playedu.common.service.impl.AppConfigServiceImpl$$SpringCGLIB$$0.allKeys(<generated>) ~[playedu-common-1.0.jar!/:1.0]
        at xyz.playedu.system.checks.AppConfigCheck.run(AppConfigCheck.java:275) ~[playedu-system-1.0.jar!/:1.0]
        at org.sp

问deepseek好多遍,答复的原因是compose.yml配置错误

bash 复制代码
x-logging: &default-logging
  driver: "json-file"
  options:
    max-size: "10m"
    max-file: "10"

networks:
  playedu:
    driver: bridge

volumes:
  mysql-data:

services:
  playedu:
    image: jltalentcloud:v0.1
    restart: always
    environment:
      - DB_HOST=mysql
      - DB_PORT=3306
      - DB_NAME=vod
      - DB_USER=root
      - DB_PASS=27e3p2xn
      - SA_TOKEN_IS_CONCURRENT=false
      - SA_TOKEN_JWT_SECRET_KEY=${PLAYEDU_JWT_KEY:-ace42e00}
    ports:
      - "${PLAYEDU_API_PORT:-10079}:9898"
      - "${PLAYEDU_PC_PORT:-10089}:9800"
      - "${PLAYEDU_H5_PORT:-11089}:9801"
      - "${PLAYEDU_ADMIN_PORT:-10099}:9900"
    networks:
      - playedu
    depends_on:
      - mysql
    logging: *default-logging

  mysql:
    build: ./docker/mysql
    restart: always
    environment:
      - MYSQL_DATABASE=vod
      - MYSQL_ROOT_PASSWORD=27e3p2xn
      - TZ=UTC
    volumes:
      - mysql-data:/var/lib/mysql
    ports:
      - "${MYSQL_PORT:-16033}:3306"
    networks:
      - playedu
    logging: *default-logging

deepseek认为mysql容器配置的MYSQL_DATABASE数据库名与springboot项目容器配置的DB_NAME不一致,但是我修改时特意注意了数据库名和密码。也查看了数据库容器的dockerfile创建脚本

bash 复制代码
# docker\mysql\Dockerfile

FROM registry.cn-hangzhou.aliyuncs.com/hzbs/mysql:8.1

COPY my.cnf /etc/mysql/conf.d/my.cnf

RUN chmod 0444 /etc/mysql/conf.d/my.cnf

当执行创建数据库镜像时(在docker\mysql路径下执行docker build .),没有配置任何数据库参数;只有在执行docker-compose up -d时才会按照mysql下的配置启动数据库,并配置库名称。

这里库vod是由docker-compose脚本创建的,创建后vod库是空的,在第一次执行springboot程序是,会进行数据库表迁移。数据库表创建和插入初始化数据是通过执行java代码中所写的sql语句实现的,不像数据库导入导出时所执行vod.sql文件,sql语句在sql文件中。

这解开了我一直以来的迷惑,开始接触这个项目时,我发现整个项目源码中找不到创建数据库的sql脚本,但是数据库却能自动创建。数据库中的数据也不是来自容器初始化,因为刚刚初始化的mysql容器的vod库是空的。

这段java数据库迁移代码如下,这里的sql代码没有创建vod库,只是创建了表:

java 复制代码
/* playedu\playedu-api\playedu-system\src\main\java\xyz\playedu\system\checks\MigrationCheck.java
 * 
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package xyz.playedu.system.checks;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import xyz.playedu.system.service.MigrationService;

@Order(10)
@Component
@Slf4j
public class MigrationCheck implements CommandLineRunner {

    public static final List<Map<String, String>> TABLE_SQL =
            new ArrayList<>() {
                {
                    add(
                            new HashMap<>() {
                                {
                                    put("table", "migrations");
                                    put("name", "20231208_14_00_00_migrations");
                                    put(
                                            "sql",
                                            """
                                                    CREATE TABLE `migrations` (
                                                      `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
                                                      `migration` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '变更记录',
                                                      PRIMARY KEY (`id`)
                                                    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '课程章节表';
                                                    """);
                                }
                            });

                    add(
                            new HashMap<>() {
                                {
                                    put("table", "admin_permissions");
                                    put("name", "20231208_14_00_00_admin_permissions");
                                    put(
                                            "sql",
                                            """
                                                    CREATE TABLE `admin_permissions` (
                                                      `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
                                                      `type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '类型[行为:action,数据:data]',
                                                      `group_name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '分组',
                                                      `sort` int(11) NOT NULL DEFAULT 0 COMMENT '升序',
                                                      `name` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '权限名',
                                                      `slug` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'slug',
                                                      `created_at` timestamp NULL DEFAULT NULL COMMENT '创建时间',
                                                      PRIMARY KEY (`id`)
                                                    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT 'SQL变更记录表';
                                                    """);
                                }
                            });

                    add(
                            new HashMap<>() {
                                {
                                    put("table", "admin_logs");
                                    put("name", "20231208_14_00_00_admin_logs");
                                    put(
                                            "sql",
                                            """
                                                    CREATE TABLE `admin_logs`
                                                    (
                                                        `id`             bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
                                                        `admin_id`       int(11) NOT NULL DEFAULT 0 COMMENT '管理员ID',
                                                        `admin_name`     varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '管理员姓名',
                                                        `module`         varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci  NOT NULL DEFAULT '' COMMENT '模块',
                                                        `title`          varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci  NOT NULL DEFAULT '' COMMENT '请求方法标题',
                                                        `opt`            int(2) NOT NULL DEFAULT 0 COMMENT '操作指令(0其它 1新增 2修改 3删除 4登录 5退出登录)',
                                                        `method`         varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '请求方法',
                                                        `request_method` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci  NOT NULL DEFAULT '' COMMENT '请求方式POST,GET,PUT,DELETE',
                                                        `url`            varchar(266) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '请求URL',
                                                        `param`          mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT '请求参数',
                                                        `result`         mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT '返回参数',
                                                        `ip`             varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci  NOT NULL DEFAULT '' COMMENT 'IP',
                                                        `ip_area`        varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci  NOT NULL DEFAULT '' COMMENT '地址',
                                                        `error_msg`      mediumtext COLLATE utf8mb4_unicode_ci COMMENT '错误消息',
                                                        `created_at`     timestamp NULL DEFAULT NULL COMMENT '创建时间',
                                                        PRIMARY KEY (`id`),
                                                        KEY              `a_m_o` (`admin_id`,`module`,`opt`)
                                                    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '管理员操作日志记录表';
                                                    """);
                                }
                            });

                    add(
                            new HashMap<>() {
                                {
                                    put("table", "admin_role_permission");
                                    put("name", "20231208_14_00_00_admin_role_permission");
                                    put(
                                            "sql",
                                            """
                                                    CREATE TABLE `admin_role_permission` (
                                                      `role_id` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '角色ID',
                                                      `perm_id` int(10) unsigned NOT NULL DEFAULT 0 COMMENT '权限ID',
                                                      KEY `role_id` (`role_id`),
                                                      KEY `perm_id` (`perm_id`)
                                                    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '管理员角色权限关联表';
                                                    """);
                                }
                            });

                    add(
                            new HashMap<>() {
                                {
                                    put("table", "admin_roles");
                                    put("name", "20231208_14_00_00_admin_roles");
                                    put(
                                            "sql",
                                            """
                                                    CREATE TABLE `admin_roles` (
                                                      `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
                                                      `name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '角色名',
                                                      `slug` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'slug',
                                                      `created_at` timestamp NULL DEFAULT NULL COMMENT '创建时间',
                                                      `updated_at` timestamp NULL DEFAULT NULL COMMENT '修改时间',
                                                      PRIMARY KEY (`id`),
                                                      UNIQUE KEY `slug` (`slug`)
                                                    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '管理员角色表';
                                                    """);
                                }
                            });

                    add(
                            new HashMap<>() {
                                {
                                    put("table", "admin_user_role");
                                    put("name", "20231208_14_00_00_admin_user_role");
                                    put(
                                            "sql",
                                            """
                                                    CREATE TABLE `admin_user_role` (
                                                      `admin_id` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '管理员ID',
                                                      `role_id` int(10) unsigned NOT NULL DEFAULT 0 COMMENT '角色ID',
                                                      KEY `admin_id` (`admin_id`),
                                                      KEY `role_id` (`role_id`)
                                                    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '管理员角色关联表';
                                                    """);
                                }
                            });

                    add(
                            new HashMap<>() {
                                {
                                    put("table", "admin_users");
                                    put("name", "20231208_14_00_00_admin_users");
                                    put(
                                            "sql",
                                            """
                                                    CREATE TABLE `admin_users` (
                                                      `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
                                                      `name` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '姓名',
                                                      `email` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '邮箱',
                                                      `password` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '密码',
                                                      `salt` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT 'salt',
                                                      `login_ip` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '登录IP',
                                                      `login_at` timestamp NULL DEFAULT NULL COMMENT '登录时间',
                                                      `is_ban_login` tinyint(4) NOT NULL DEFAULT 0 COMMENT '1禁止登录,0否',
                                                      `login_times` int(11) NOT NULL DEFAULT 0 COMMENT '登录次数',
                                                      `created_at` timestamp NULL DEFAULT NULL COMMENT '创建时间',
                                                      `updated_at` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
                                                      PRIMARY KEY (`id`),
                                                      UNIQUE KEY `administrators_email_unique` (`email`)
                                                    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '管理员表';
                                                    """);
                                }
                            });

                    add(
                            new HashMap<>() {
                                {
                                    put("table", "app_config");
                                    put("name", "20231208_14_00_00_app_config");
                                    put(
                                            "sql",
                                            """
                                                    CREATE TABLE `app_config` (
                                                      `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
                                                      `group_name` varchar(24) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '分组',
                                                      `name` varchar(24) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '名称',
                                                      `sort` int(11) NOT NULL DEFAULT 0 COMMENT '升序',
                                                      `field_type` varchar(24) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '字段类型',
                                                      `key_name` varchar(188) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '键',
                                                      `key_value` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT '值',
                                                      `option_value` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT '可选值',
                                                      `is_private` tinyint(4) NOT NULL DEFAULT 0 COMMENT '是否私密信息',
                                                      `help` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '帮助信息',
                                                      `created_at` timestamp NULL DEFAULT NULL COMMENT '创建时间',
                                                      `is_hidden` tinyint(4) NOT NULL DEFAULT 0 COMMENT '1显示,0否',
                                                      PRIMARY KEY (`id`),
                                                      UNIQUE KEY `app_config_key_unique` (`key_name`)
                                                    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '系统配置表';
                                                    """);
                                }
                            });

                    add(
                            new HashMap<>() {
                                {
                                    put("table", "course_attachment");
                                    put("name", "20231208_14_00_00_course_attachment");
                                    put(
                                            "sql",
                                            """
                                                    CREATE TABLE `course_attachment`
                                                    (
                                                        `id`         int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
                                                        `course_id`  int(11) NOT NULL DEFAULT 0 COMMENT '课程ID',
                                                        `sort`       int(11) NOT NULL DEFAULT 0 COMMENT '升序',
                                                        `title`      varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '附件名',
                                                        `type`       varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci  NOT NULL DEFAULT '' COMMENT '附件类型',
                                                        `rid`        int(11) NOT NULL DEFAULT 0 COMMENT '资源ID',
                                                        `created_at` timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
                                                        PRIMARY KEY (`id`),
                                                        KEY          `course_id` (`course_id`)
                                                    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '课程附件表';
                                                    """);
                                }
                            });

                    add(
                            new HashMap<>() {
                                {
                                    put("table", "course_attachment_download_log");
                                    put("name", "20231208_14_00_00_course_attachment_download_log");
                                    put(
                                            "sql",
                                            """
                                                    CREATE TABLE `course_attachment_download_log`
                                                    (
                                                        `id`                    int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
                                                        `user_id`               int(11) NOT NULL DEFAULT 0 COMMENT '学员ID',
                                                        `course_id`             int(11) NOT NULL DEFAULT 0 COMMENT '课程ID',
                                                        `title`                 varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '课程标题',
                                                        `courser_attachment_id` int(11) NOT NULL DEFAULT 0 COMMENT '课程附件ID',
                                                        `rid`                   int(11) NOT NULL DEFAULT 0 COMMENT '资源ID',
                                                        `ip`                    varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci  NOT NULL DEFAULT '' COMMENT '下载IP',
                                                        `created_at`            timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
                                                        PRIMARY KEY (`id`)
                                                    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '课程附件下载日志记录表';
                                                    """);
                                }
                            });

                    add(
                            new HashMap<>() {
                                {
                                    put("table", "course_chapters");
                                    put("name", "20231208_14_00_00_course_chapters");
                                    put(
                                            "sql",
                                            """
                                                    CREATE TABLE `course_chapters` (
                                                      `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
                                                      `course_id` int(11) NOT NULL DEFAULT 0 COMMENT '课程ID',
                                                      `name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '章节名',
                                                      `sort` int(11) NOT NULL DEFAULT 0 COMMENT '升序',
                                                      `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
                                                      `updated_at` timestamp NULL DEFAULT NULL COMMENT '修改时间',
                                                      PRIMARY KEY (`id`)
                                                    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '管理员权限表';
                                                    """);
                                }
                            });
                    add(
                            new HashMap<>() {
                                {
                                    put("table", "course_department_user");
                                    put("name", "20231208_14_00_00_course_department_user");
                                    put(
                                            "sql",
                                            """
                                                     CREATE TABLE `course_department_user` (
                                                      `course_id` int(11) NOT NULL DEFAULT 0 COMMENT '课程ID',
                                                      `range_id` int(11) NOT NULL DEFAULT 0 COMMENT '指派范围ID',
                                                      `type` int(11) NOT NULL DEFAULT 0 COMMENT '指派范围类型[0:部门,1:学员]',
                                                      KEY `course_id` ( `course_id` ),
                                                    KEY `range_id` ( `range_id` )
                                                    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '课程指派范围表';
                                                    """);
                                }
                            });

                    add(
                            new HashMap<>() {
                                {
                                    put("table", "course_hour");
                                    put("name", "20231208_14_00_00_course_hour");
                                    put(
                                            "sql",
                                            """
                                                    CREATE TABLE `course_hour` (
                                                      `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
                                                      `course_id` int(11) NOT NULL DEFAULT 0 COMMENT '课程ID',
                                                      `chapter_id` int(11) NOT NULL DEFAULT 0 COMMENT '章节ID',
                                                      `sort` int(11) NOT NULL DEFAULT 0 COMMENT '升序',
                                                      `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '课时名',
                                                      `type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '课时类型',
                                                      `rid` int(11) NOT NULL DEFAULT 0 COMMENT '资源ID',
                                                      `duration` int(11) NOT NULL DEFAULT 0 COMMENT '时长[s]',
                                                      `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
                                                      `deleted` tinyint(1) unsigned NULL DEFAULT 0 COMMENT '删除标志[0:存在,1:删除]',
                                                      PRIMARY KEY (`id`),
                                                      KEY `course_id` (`course_id`)
                                                    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '课程课时表';
                                                    """);
                                }
                            });

                    add(
                            new HashMap<>() {
                                {
                                    put("table", "courses");
                                    put("name", "20230406_16_51_17_1111_courses");
                                    put(
                                            "sql",
                                            """
                                                    CREATE TABLE `courses` (
                                                      `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
                                                      `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '课程标题',
                                                      `thumb` int(11) NOT NULL DEFAULT 0 COMMENT '封面',
                                                      `charge` int(11) NOT NULL DEFAULT 0 COMMENT '课程价格(分)',
                                                      `short_desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '简介',
                                                      `class_hour` int(11) NOT NULL DEFAULT 0 COMMENT '课时数',
                                                      `is_show` tinyint(4) NOT NULL DEFAULT 0 COMMENT '显示[1:是,0:否]',
                                                      `is_required` tinyint(4) NOT NULL DEFAULT 0 COMMENT '1:必修,0:选修',
                                                      `sort_at` timestamp NULL DEFAULT NULL COMMENT '排序时间',
                                                      `extra` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '其它规则[设置]',
                                                      `admin_id` int(11) NOT NULL DEFAULT 0 COMMENT '管理员ID',
                                                      `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
                                                      `updated_at` timestamp NULL DEFAULT NULL COMMENT '修改时间',
                                                      `deleted_at` timestamp NULL DEFAULT NULL COMMENT '删除时间',
                                                      PRIMARY KEY (`id`)
                                                    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '课程表';
                                                    """);
                                }
                            });

                    add(
                            new HashMap<>() {
                                {
                                    put("table", "departments");
                                    put("name", "20230406_16_51_17_1111_departments");
                                    put(
                                            "sql",
                                            """
                                                    CREATE TABLE `departments` (
                                                      `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
                                                      `name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '部门名',
                                                      `parent_id` int(11) NOT NULL DEFAULT 0 COMMENT '父ID',
                                                      `parent_chain` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '父链',
                                                      `sort` int(11) NOT NULL DEFAULT 0 COMMENT '升序',
                                                      `from_scene` int(11) NOT NULL DEFAULT 0 COMMENT '来源[0:本地]',
                                                      `created_at` timestamp NULL DEFAULT NULL COMMENT '创建时间',
                                                      `updated_at` timestamp NULL DEFAULT NULL COMMENT '修改时间',
                                                      PRIMARY KEY (`id`)
                                                    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '学员上传图片日志记录表';
                                                    """);
                                }
                            });

                    add(
                            new HashMap<>() {
                                {
                                    put("table", "resource_categories");
                                    put("name", "20231208_14_00_00_resource_categories");
                                    put(
                                            "sql",
                                            """
                                                    CREATE TABLE `resource_categories` (
                                                      `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
                                                      `parent_id` int(11) NOT NULL DEFAULT 0 COMMENT '父ID',
                                                      `parent_chain` varchar(2550) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '父链',
                                                      `name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '分类名',
                                                      `sort` int(11) NOT NULL DEFAULT 0 COMMENT '升序',
                                                      `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
                                                      `updated_at` timestamp NULL DEFAULT NULL COMMENT '修改时间',
                                                      PRIMARY KEY (`id`)
                                                    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '部门表';
                                                    """);
                                }
                            });

                    add(
                            new HashMap<>() {
                                {
                                    put("table", "resource");
                                    put("name", "20231208_14_00_00_resource");
                                    put(
                                            "sql",
                                            """
                                                    CREATE TABLE `resource` (
                                                       `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
                                                       `admin_id` int(11) NOT NULL DEFAULT 0 COMMENT '管理员ID',
                                                       `type` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '类型',
                                                       `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '资源名',
                                                       `extension` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '文件类型',
                                                       `size` bigint(20) DEFAULT 0 COMMENT '大小[字节]',
                                                       `disk` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '存储磁盘',
                                                       `path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '相对地址',
                                                       `parent_id` int(11) NOT NULL DEFAULT 0 COMMENT '所属素材',
                                                       `is_hidden` tinyint(4) NOT NULL DEFAULT 0 COMMENT '隐藏[0:否,1:是]',
                                                       `created_at` timestamp NULL DEFAULT NULL COMMENT '创建时间',
                                                       PRIMARY KEY (`id`),
                                                       KEY `type` (`type`)
                                                   ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '资源表';
                                                    """);
                                }
                            });

                    add(
                            new HashMap<>() {
                                {
                                    put("table", "resource_category");
                                    put("name", "20231208_14_00_00_resource_category");
                                    put(
                                            "sql",
                                            """
                                                    CREATE TABLE `resource_category` (
                                                      `cid` int(11) NOT NULL DEFAULT 0 COMMENT '分类ID',
                                                      `rid` int(11) NOT NULL DEFAULT 0 COMMENT '资源ID',
                                                      KEY `cid` (`cid`),
                                                      KEY `rid` (`rid`)
                                                    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '资源分类关联表';
                                                    """);
                                }
                            });

                    add(
                            new HashMap<>() {
                                {
                                    put("table", "resource_course_category");
                                    put("name", "20231208_14_00_00_resource_course_category");
                                    put(
                                            "sql",
                                            """
                                                    CREATE TABLE `resource_course_category` (
                                                      `course_id` int(11) NOT NULL DEFAULT 0 COMMENT '课程ID',
                                                      `category_id` int(11) NOT NULL DEFAULT 0 COMMENT '父级ID',
                                                      KEY `course_id` (`course_id`),
                                                      KEY `category_id` (`category_id`)
                                                    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '课程分类关联表';
                                                    """);
                                }
                            });

                    add(
                            new HashMap<>() {
                                {
                                    put("table", "resource_extra");
                                    put("name", "20231208_14_00_00_resource_extra");
                                    put(
                                            "sql",
                                            """
                                                     CREATE TABLE `resource_extra`(
                                                       `id`         int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
                                                       `rid`        int(11) unsigned NOT NULL DEFAULT 0 COMMENT '资源ID',
                                                       `poster`     int(11) unsigned NOT NULL DEFAULT 0 COMMENT '封面资源ID',
                                                       `duration`   int(10) unsigned NOT NULL DEFAULT 0 COMMENT '视频、音频总时长,文档总页数',
                                                       `created_at` timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
                                                       PRIMARY KEY (`id`),
                                                       UNIQUE KEY `rid` (`rid`)
                                                       ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '资源详细信息表';
                                                    """);
                                }
                            });

                    add(
                            new HashMap<>() {
                                {
                                    put("table", "user_course_hour_records");
                                    put("name", "20231208_14_00_00_user_course_hour_records");
                                    put(
                                            "sql",
                                            """
                                                    CREATE TABLE `user_course_hour_records` (
                                                      `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
                                                      `user_id` int(11) NOT NULL DEFAULT 0 COMMENT '学员ID',
                                                      `course_id` int(11) NOT NULL DEFAULT 0 COMMENT '课程ID',
                                                      `hour_id` int(11) NOT NULL DEFAULT 0 COMMENT '课时ID',
                                                      `total_duration` int(11) NOT NULL DEFAULT 0 COMMENT '总时长',
                                                      `finished_duration` int(11) NOT NULL DEFAULT 0 COMMENT '已完成时长',
                                                      `real_duration` int(11) NOT NULL DEFAULT 0 COMMENT '实际观看时长',
                                                      `is_finished` tinyint(4) NOT NULL DEFAULT 0 COMMENT '是否看完[1:是,0:否]',
                                                      `finished_at` timestamp NULL DEFAULT NULL COMMENT '看完时间',
                                                      `created_at` timestamp NULL DEFAULT NULL COMMENT '创建时间',
                                                      `updated_at` timestamp NULL DEFAULT NULL COMMENT '修改时间',
                                                      PRIMARY KEY (`id`),
                                                      KEY `u_h_c_id` (`user_id`,`hour_id`,`course_id`)
                                                    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '线上课课时学员学习记录表';
                                                    """);
                                }
                            });

                    add(
                            new HashMap<>() {
                                {
                                    put("table", "user_course_records");
                                    put("name", "20231208_14_00_00_user_course_records");
                                    put(
                                            "sql",
                                            """
                                                    CREATE TABLE `user_course_records` (
                                                      `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
                                                      `user_id` int(11) NOT NULL DEFAULT 0 COMMENT '学员ID',
                                                      `course_id` int(11) NOT NULL DEFAULT 0 COMMENT '课程ID',
                                                      `hour_count` int(11) NOT NULL DEFAULT 0 COMMENT '课时数量',
                                                      `finished_count` int(11) NOT NULL DEFAULT 0 COMMENT '已完成课时数',
                                                      `progress` int(11) NOT NULL DEFAULT 0 COMMENT '进度',
                                                      `is_finished` tinyint(4) NOT NULL DEFAULT 0 COMMENT '看完[1:是,0:否]',
                                                      `finished_at` timestamp NULL DEFAULT NULL COMMENT '看完时间',
                                                      `created_at` timestamp NULL DEFAULT NULL COMMENT '创建时间',
                                                      `updated_at` timestamp NULL DEFAULT NULL COMMENT '修改时间',
                                                      PRIMARY KEY (`id`)
                                                    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '分类表';
                                                    """);
                                }
                            });

                    add(
                            new HashMap<>() {
                                {
                                    put("table", "user_department");
                                    put("name", "20231208_14_00_00_user_department");
                                    put(
                                            "sql",
                                            """
                                                    CREATE TABLE `user_department` (
                                                      `user_id` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '学员ID',
                                                      `dep_id` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '部门ID',
                                                      KEY `user_id` (`user_id`),
                                                      KEY `dep_id` (`dep_id`)
                                                    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '学员部门关联表';
                                                    """);
                                }
                            });

                    add(
                            new HashMap<>() {
                                {
                                    put("table", "user_learn_duration_records");
                                    put("name", "20231208_14_00_00_user_learn_duration_records");
                                    put(
                                            "sql",
                                            """
                                                    CREATE TABLE `user_learn_duration_records` (
                                                      `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
                                                      `user_id` int(11) NOT NULL DEFAULT 0 COMMENT '学员ID',
                                                      `created_date` date NOT NULL COMMENT '创建时间',
                                                      `duration` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '已学习时长[微秒]',
                                                      `start_at` timestamp NULL DEFAULT NULL COMMENT '开始时间',
                                                      `end_at` timestamp NULL DEFAULT NULL COMMENT '结束时间',
                                                      `from_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '来源ID',
                                                      `from_scene` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '记录来源[线上课:COURSE,学习任务:STUDY]',
                                                      PRIMARY KEY (`id`),
                                                      KEY `u_d` (`user_id`,`created_date`)
                                                    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '学员学习时长表';
                                                    """);
                                }
                            });

                    add(
                            new HashMap<>() {
                                {
                                    put("table", "user_learn_duration_stats");
                                    put("name", "20231208_14_00_00_user_learn_duration_stats");
                                    put(
                                            "sql",
                                            """
                                                    CREATE TABLE `user_learn_duration_stats` (
                                                      `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
                                                      `user_id` int(11) NOT NULL DEFAULT 0 COMMENT '学员ID',
                                                      `duration` bigint(20) NOT NULL DEFAULT 0 COMMENT '学习时长',
                                                      `created_date` date NOT NULL COMMENT '创建时间',
                                                      PRIMARY KEY (`id`),
                                                      KEY `u_d` (`user_id`,`created_date`)
                                                    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '学员学习时长记录表';
                                                    """);
                                }
                            });

                    add(
                            new HashMap<>() {
                                {
                                    put("table", "user_login_records");
                                    put("name", "20231208_14_00_00_user_login_records");
                                    put(
                                            "sql",
                                            """
                                                    CREATE TABLE `user_login_records` (
                                                      `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
                                                      `user_id` int(11) NOT NULL DEFAULT 0 COMMENT '学员ID',
                                                      `jti` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT 'JTI',
                                                      `ip` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '登录IP',
                                                      `ip_area` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT 'IP解析区域',
                                                      `browser` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '浏览器',
                                                      `browser_version` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '浏览器版本',
                                                      `os` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '操作系统',
                                                      `expired` bigint(20) NOT NULL DEFAULT 0 COMMENT '过期时间',
                                                      `is_logout` tinyint(4) NOT NULL DEFAULT 0 COMMENT '是否注销',
                                                      `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
                                                      PRIMARY KEY (`id`),
                                                      UNIQUE KEY `jti` (`jti`),
                                                      KEY `user_id` (`user_id`)
                                                    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '学员登录记录表';
                                                    """);
                                }
                            });

                    add(
                            new HashMap<>() {
                                {
                                    put("table", "user_upload_image_logs");
                                    put("name", "20231208_14_00_00_user_upload_image_logs");
                                    put(
                                            "sql",
                                            """
                                                    CREATE TABLE `user_upload_image_logs` (
                                                      `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
                                                      `user_id` int(11) NOT NULL DEFAULT 0 COMMENT '学员时间',
                                                      `typed` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '图片类型',
                                                      `scene` varchar(24) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '上传场景',
                                                      `driver` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '驱动',
                                                      `path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '相对路径',
                                                      `url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '访问地址',
                                                      `size` bigint(20) NOT NULL DEFAULT 0 COMMENT '大小,单位:字节',
                                                      `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '文件名',
                                                      `created_at` timestamp NULL DEFAULT NULL COMMENT '创建时间',
                                                      PRIMARY KEY (`id`)
                                                    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '线上课学员学习记录表';
                                                    """);
                                }
                            });

                    add(
                            new HashMap<>() {
                                {
                                    put("table", "users");
                                    put("name", "20231208_14_00_00_users");
                                    put(
                                            "sql",
                                            """
                                                    CREATE TABLE `users` (
                                                      `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
                                                      `email` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '邮件',
                                                      `name` varchar(24) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '真实姓名',
                                                      `avatar` int(11) NOT NULL DEFAULT 0 COMMENT '头像',
                                                      `password` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '密码',
                                                      `salt` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT 'salt',
                                                      `id_card` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '身份证号',
                                                      `credit1` int(11) NOT NULL DEFAULT 0 COMMENT '学分',
                                                      `create_ip` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '注册IP',
                                                      `create_city` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '注册城市',
                                                      `is_active` tinyint(4) NOT NULL DEFAULT 0 COMMENT '激活[1:是,0:否]',
                                                      `is_lock` tinyint(4) NOT NULL DEFAULT 0 COMMENT '锁定[1:是,0:否]',
                                                      `is_verify` tinyint(4) NOT NULL DEFAULT 0 COMMENT '实名认证[1:是,0:否]',
                                                      `verify_at` timestamp NULL DEFAULT NULL COMMENT '实名认证时间',
                                                      `is_set_password` tinyint(4) NOT NULL DEFAULT 0 COMMENT '设置密码[1:是,0:否]',
                                                      `login_at` timestamp NULL DEFAULT NULL COMMENT '登录时间',
                                                      `created_at` timestamp NULL DEFAULT NULL COMMENT '创建时间',
                                                      `updated_at` timestamp NULL DEFAULT NULL COMMENT '修改时间',
                                                      `from_scene` int(11) NOT NULL DEFAULT 0 COMMENT '来源[0:本地,1:企业微信,2:飞书]',
                                                      `deleted` tinyint(1) unsigned NULL DEFAULT 0 COMMENT '删除标志[0:存在,1:删除]',
                                                      PRIMARY KEY (`id`),
                                                      UNIQUE KEY `email` (`email`)
                                                    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '学员表';
                                                    """);
                                }
                            });

                    add(
                            new HashMap<>() {
                                {
                                    put("table", "ldap_user");
                                    put("name", "20240322_17_29_17_ldap_user");
                                    put(
                                            "sql",
                                            """
                                                    CREATE TABLE `ldap_user` (
                                                      `id` int unsigned NOT NULL AUTO_INCREMENT,
                                                      `uuid` varchar(64) NOT NULL DEFAULT '' COMMENT '唯一特征值',
                                                      `user_id` int(11) NOT NULL DEFAULT 0 COMMENT '用户ID',
                                                      `cn` varchar(120) NOT NULL DEFAULT '' COMMENT 'cn',
                                                      `dn` varchar(120) NOT NULL DEFAULT '' COMMENT 'dn',
                                                      `ou` varchar(255) NOT NULL DEFAULT '' COMMENT 'ou',
                                                      `uid` varchar(120) NOT NULL DEFAULT '' COMMENT 'uid',
                                                      `email` varchar(120) NOT NULL DEFAULT '' COMMENT '邮箱',
                                                      `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
                                                      `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
                                                      PRIMARY KEY (`id`),
                                                      UNIQUE KEY `unique_uuid` (`uuid`) USING BTREE
                                                    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
                                                    """);
                                }
                            });
                    add(
                            new HashMap<>() {
                                {
                                    put("table", "ldap_department");
                                    put("name", "20240322_17_29_30_ldap_department");
                                    put(
                                            "sql",
                                            """
                                                    CREATE TABLE `ldap_department` (
                                                      `id` int unsigned NOT NULL AUTO_INCREMENT,
                                                      `uuid` varchar(64) NOT NULL DEFAULT '' COMMENT '唯一特征值',
                                                      `department_id` int(11) NOT NULL DEFAULT 0 COMMENT '部门ID',
                                                      `dn` varchar(120) NOT NULL DEFAULT '' COMMENT 'dn',
                                                      `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
                                                      `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
                                                      PRIMARY KEY (`id`),
                                                      UNIQUE KEY `unique_uuid` (`uuid`) USING BTREE
                                                    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
                                                    """);
                                }
                            });

                    add(
                            new HashMap<>() {
                                {
                                    put("table", "");
                                    put("name", "20250519_09_00_00_migrations-data-insert");
                                    put(
                                            "sql",
                                            """
                                                    INSERT INTO migrations (migration) VALUES
                                                    ('20231224_14_00_00_update_courses'),
                                                    ('20240126_15_00_00_course_add_admin_id'),
                                                    ('20240722_12_00_00_course_hour_add_deleted'),
                                                    ('20240815_15_00_00_user_deteled_column_add');
                                                    """);
                                }
                            });
                    add(
                            new HashMap<>() {
                                {
                                    put("table", "ldap_sync_record");
                                    put("name", "20250517_13_23_ldap_sync_record");
                                    put(
                                            "sql",
                                            """
                                                    CREATE TABLE `ldap_sync_record` (
                                                      `id` int NOT NULL AUTO_INCREMENT,
                                                      `admin_id` int NOT NULL DEFAULT '0' COMMENT '执行同步的管理员ID,0表示系统自动执行',
                                                      `status` tinyint NOT NULL DEFAULT '0' COMMENT '状态:0-进行中,1-成功,2-失败',
                                                      `s3_file_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'S3存储中的文件路径',
                                                      `total_department_count` int NOT NULL DEFAULT '0' COMMENT '总部门数量',
                                                      `created_department_count` int NOT NULL DEFAULT '0' COMMENT '新增部门数量',
                                                      `updated_department_count` int NOT NULL DEFAULT '0' COMMENT '更新部门数量',
                                                      `deleted_department_count` int NOT NULL DEFAULT '0' COMMENT '删除部门数量',
                                                      `total_user_count` int NOT NULL DEFAULT '0' COMMENT '总用户数量',
                                                      `created_user_count` int NOT NULL DEFAULT '0' COMMENT '新增用户数量',
                                                      `updated_user_count` int NOT NULL DEFAULT '0' COMMENT '更新用户数量',
                                                      `deleted_user_count` int NOT NULL DEFAULT '0' COMMENT '删除用户数量',
                                                      `banned_user_count` int NOT NULL DEFAULT '0' COMMENT '被禁止的用户数量',
                                                      `error_message` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT '错误信息',
                                                      `created_at` datetime NOT NULL,
                                                      `updated_at` datetime NOT NULL,
                                                      PRIMARY KEY (`id`)
                                                    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='LDAP同步记录表';
                                                    """);
                                }
                            });
                    add(
                            new HashMap<>() {
                                {
                                    put("table", "ldap_sync_department_detail");
                                    put("name", "20250519_10_25_01_ldap_sync_department_detail");
                                    put(
                                            "sql",
                                            """
                                                    CREATE TABLE `ldap_sync_department_detail` (
                                                      `id` int NOT NULL AUTO_INCREMENT,
                                                      `record_id` int NOT NULL COMMENT '关联的同步记录ID',
                                                      `department_id` int NOT NULL DEFAULT '0' COMMENT '关联的部门ID',
                                                      `uuid` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'LDAP部门UUID',
                                                      `dn` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'LDAP部门DN',
                                                      `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '部门名称',
                                                      `action` tinyint NOT NULL COMMENT '操作:1-新增,2-更新,3-删除,4-无变化',
                                                      `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
                                                      PRIMARY KEY (`id`),
                                                      KEY `record_id` (`record_id`),
                                                      KEY `department_id` (`department_id`)
                                                    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='LDAP部门同步详情表';
                                                    """);
                                }
                            });
                    add(
                            new HashMap<>() {
                                {
                                    put("table", "ldap_sync_user_detail");
                                    put("name", "20250519_10_25_02_ldap_sync_user_detail");
                                    put(
                                            "sql",
                                            """
                                                    CREATE TABLE `ldap_sync_user_detail` (
                                                      `id` bigint NOT NULL AUTO_INCREMENT,
                                                      `record_id` int NOT NULL COMMENT '关联的同步记录ID',
                                                      `user_id` bigint NOT NULL DEFAULT '0' COMMENT '关联的用户ID',
                                                      `uuid` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'LDAP用户UUID',
                                                      `dn` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'LDAP用户DN',
                                                      `cn` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '用户名称',
                                                      `uid` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '用户ID/登录名',
                                                      `email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '用户邮箱',
                                                      `ou` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '用户部门路径',
                                                      `action` tinyint NOT NULL COMMENT '操作:1-新增,2-更新,3-删除,4-无变化,5-禁止',
                                                      `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
                                                      PRIMARY KEY (`id`),
                                                      KEY `record_id` (`record_id`),
                                                      KEY `user_id` (`user_id`)
                                                    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='LDAP用户同步详情表';
                                                    """);
                                }
                            });
                }
            };

    @Autowired private JdbcTemplate jdbcTemplate;

    @Autowired private MigrationService migrationService;

    @Override
    public void run(String... args) throws Exception {
        try {
            // 数据库已创建的表
            List<String> tables = jdbcTemplate.queryForList("show tables", String.class);
            // 已创建表的记录
            List<String> migrations = new ArrayList<>();
            if (tables.contains("migrations")) {
                migrations = migrationService.all();
            }

            for (Map<String, String> tableItem : TABLE_SQL) {
                String migrationName = tableItem.get("name");
                if (migrations.contains(migrationName)) {
                    continue;
                }

                String tableName = tableItem.get("table");
                if (!tables.isEmpty() && tables.contains(tableName)) {
                    // 数据表已创建但是没有创建记录
                    // 需要保存创建记录
                    migrationService.store(migrationName);
                    continue;
                }

                // 创建数据表
                jdbcTemplate.execute(tableItem.get("sql"));
                // 记录写入到migrations表中
                migrationService.store(migrationName);
            }

        } catch (Exception e) {
            log.error("数据库迁移执行失败,错误信息:" + e.getMessage());
        }
    }
}

在排除数据库连接参数错误的可能后,我猜想大概是数据库启动时间长,springboot项目容器启动脚本中等待数据库启动的睡眠时间不足以让mysql数据库完成启动。

bash 复制代码
# playedu\Dockerfile

FROM registry.cn-hangzhou.aliyuncs.com/hzbs/node:20-alpine AS node-builder

COPY playedu-admin /app/admin
COPY playedu-pc /app/pc
COPY playedu-h5 /app/h5

WORKDIR /app/admin
RUN pnpm i && VITE_APP_URL=/api/ pnpm build

WORKDIR /app/pc
RUN pnpm i && VITE_APP_URL=/api/ pnpm build

WORKDIR /app/h5
RUN pnpm i && VITE_APP_URL=/api/ pnpm build

FROM registry.cn-hangzhou.aliyuncs.com/hzbs/eclipse-temurin:17 AS java-builder

COPY playedu-api /app

WORKDIR /app

RUN /app/mvnw -Dmaven.test.skip=true clean package

FROM registry.cn-hangzhou.aliyuncs.com/hzbs/eclipse-temurin:17 AS base

COPY --from=java-builder /app/playedu-api/target/playedu-api.jar /app/api/app.jar

COPY --from=node-builder /app/admin/dist /app/admin
COPY --from=node-builder /app/pc/dist /app/pc
COPY --from=node-builder /app/h5/dist /app/h5

COPY docker/nginx/conf/nginx.conf /etc/nginx/sites-enabled/default

EXPOSE 9898
EXPOSE 9800
EXPOSE 9801
EXPOSE 9900

# sleep 15 睡眠时间只有15秒,而数据库第一次启动需要大约3分钟以上,改成sleep 300后首次启动既可成功完成数据库初始化,项目运行正常

CMD nginx; echo "Waiting for MySQL to start..."; sleep 15; java -jar /app/api/app.jar --spring.profiles.active=prod --spring.datasource.url="jdbc:mysql://${DB_HOST}:${DB_PORT:-3306}/${DB_NAME}?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true" --spring.datasource.username=${DB_USER} --spring.datasource.password=${DB_PASS} --sa-token.is-concurrent=${SA_TOKEN_IS_CONCURRENT:-false} --sa-token.jwt-secret-key=${SA_TOKEN_JWT_SECRET_KEY}

这里是通过睡眠15秒等待mysql启动,实际上15秒不够,但是设成300秒又太多,有没有办法每隔3秒或者5秒检测mysql端口是否已开启,一旦开启就进行后续的程序启动,以下是解决方案(未验证)。

https://blog.csdn.net/qq_27361945/article/details/155859715https://blog.csdn.net/qq_27361945/article/details/155859715

相关推荐
CodeAmaz2 小时前
MySQL 各种锁机制详解
数据库·mysql·mysql锁
愿你天黑有灯下雨有伞2 小时前
Spring Boot 使用FastExcel实现多文件打包 ZIP导出
windows·spring boot·后端
Swift社区2 小时前
数据库连接池监控最佳实践:用 Prometheus + Grafana 打造可视化监控体系
数据库·grafana·prometheus
牛奶咖啡132 小时前
达梦数据库在国产系统的生产环境下安装部署实践教程(下)
数据库·达梦数据库·国产达梦数据库的安装部署·达梦数据库的目录结构介绍·使用命令行登录达梦数据库·达梦数据库的常用查询命令·使用图形化工具管理达梦数据库
小满、2 小时前
Redis:高级数据结构与进阶特性(Bitmaps、HyperLogLog、GEO、Pub/Sub、Stream、Lua、Module)
java·数据结构·数据库·redis·redis 高级特性
xiangzhihong82 小时前
Windows环境下安装使用Redis
数据库·windows·redis
ewenge3 小时前
springboot+Selenium 实现html转图片(内含驱动包)
spring boot·selenium·html
islandzzzz3 小时前
从0开始的SQL表DDL学习(基础语法结构、索引/约束关键字)
数据库·sql·学习
qq_381454993 小时前
数据脱敏全流程解析
java·网络·数据库