【导航台账】制造业数据与AI践行者老蒋的技术博客全系列文章汇总(持续更新)
📌 文章摘要
DolphinScheduler 单机版重启后项目、工作流配置全部丢失?根本原因是默认使用 H2 内存数据库,服务停止数据即清空。本文完整讲解从 H2 内存数据库切换到 MySQL 持久化的全流程,覆盖双配置文件修改、JDBC 驱动部署、数据库初始化三大核心步骤,拆解 YAML 缩进、profile 默认值两个高频踩坑点,照着操作即可实现数据永久保存。

问题现象
兄弟们,你们有没有遇到过这种情况?
好不容易把DolphinScheduler搭起来,花了一个多小时配好了租户、数据源、工作流,信心满满地准备投入使用了。结果服务器重启了一下,再次登录Web UI——
所有配置全没了。
项目没了、工作流没了、数据源也没了。就像什么都没发生过一样。
我当时的第一反应是:这不科学啊……
我明明配置好了,怎么重启一下就全丢了?
后来翻了半天文档才发现,DolphinScheduler的Standalone模式,默认用的是H2内存数据库。
什么是H2内存数据库?简单说就是:数据存在内存里,服务一停,数据就没了。
这个设计本来是为了让新手“5分钟快速体验”的,但如果你打算正经用,必须把元数据库从H2换成MySQL,否则数据丢失是迟早的事。
📋 快速自检
你是不是也遇到了这些问题?
▢ Standalone 模式重启服务,所有配置 / 工作流全部消失
▢ 切换 MySQL 后启动报错,找不到 JDBC 驱动
▢ 执行初始化脚本,默认连到 PostgreSQL
本文一次性解决以上所有问题。
根因分析
第一层:H2内存数据库的“方便”与“代价”
DolphinScheduler Standalone模式的默认配置是这样的:
yaml
复制
下载
datasource: driver-class-name: org.h2.Driver url: jdbc:h2:mem:dolphinscheduler;MODE=MySQL;DB_CLOSE_DELAY=-1 username: sa password: ""
注意看URL里的mem:——数据存在内存里,不是磁盘上。
这个配置的好处是:零配置启动,不需要装MySQL就能跑起来。
但代价是:服务停止 = 数据蒸发。
第二层:官方文档的“隐藏步骤”
官方文档虽然说了可以切换到MySQL,但有几个关键步骤藏得比较深:
-
tools模块的配置需要单独改——只改standalone-server的配置不够,升级脚本还会读tools的配置
-
JDBC驱动要放到多个目录——不是只放一个地方就行
-
upgrade-schema.sh有个profile陷阱——直接执行可能会连到PostgreSQL
这些细节在官方文档里不是特别显眼,很容易踩坑。
第三层:YAML缩进问题
DolphinScheduler使用SnakeYAML解析配置文件,缩进必须严格正确。很多人在修改application.yaml时,缩进多了一个空格或少了一个空格,导致配置根本没生效。
解决方案
前置准备
| 项目 | 要求 |
|---|---|
| MySQL服务 | 5.7或8.0,已启动且可连接 |
| MySQL数据库 | 已创建dolphinscheduler库 |
| MySQL用户 | 已创建专用用户并授权 |
| JDK | 已配置JAVA_HOME |
创建数据库和用户:
CREATE DATABASE dolphinscheduler DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE USER 'ds_user'@'%' IDENTIFIED BY 'Ds@2026#Secure';
GRANT ALL PRIVILEGES ON dolphinscheduler.* TO 'ds_user'@'%';
FLUSH PRIVILEGES;
Step 1:修改standalone-server配置
文件路径:standalone-server/conf/application.yaml
找到spring.datasource配置块,将H2配置替换为MySQL:
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/dolphinscheduler?useUnicode=true&characterEncoding=UTF-8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
username: ds_user
password: Ds@2026#Secure
hikari:
connection-test-query: SELECT 1
minimum-idle: 5
maximum-pool-size: 20
pool-name: dolphinHikariCP
auto-commit: true
idle-timeout: 30000
max-lifetime: 1800000
connection-timeout: 30000
sql:
init:
schema-locations: classpath:sql/dolphinscheduler_mysql.sql
mode: always
platform: mysql
⚠️ 注意:
schema-locations必须指向dolphinscheduler_mysql.sql,而不是dolphinscheduler_h2.sql。YAML缩进必须正确,每层缩进2个空格,否则配置会被忽略。
Step 2:修改tools模块配置(很多人漏掉的一步)
文件路径:tools/conf/application.yaml
DolphinScheduler的upgrade-schema.sh脚本会读取tools模块的配置,如果这里还是H2或PostgreSQL,升级脚本就会连错数据库。
同样将datasource配置替换为MySQL,与Step 1保持一致。
Step 3:添加MySQL JDBC驱动
DolphinScheduler不会内置MySQL驱动,需要手动添加。
下载驱动(推荐8.0.33版本):
wget https://repo1.maven.org/maven2/com/mysql/mysql-connector-j/8.0.33/mysql-connector-j-8.0.33.jar
将驱动复制到以下目录:
cp mysql-connector-j-8.0.33.jar /opt/dolphinscheduler/tools/libs/
cp mysql-connector-j-8.0.33.jar /opt/dolphinscheduler/standalone-server/libs/
⚠️ 注意:两个目录都需要放,只放一个地方会导致部分模块加载不到驱动。
💡 补充坑:驱动版本与 MySQL 版本不匹配 不注意会怎样:MySQL 5.7 使用com.mysql.cj.jdbc.Driver会报错;MySQL 8.0 使用旧驱动类com.mysql.jdbc.Driver也会连接失败。 正确做法:MySQL 8.0+ 统一使用 mysql-connector-j 8.x 版本,驱动类为 com.mysql.cj.jdbc.Driver;MySQL 5.7 对应 5.1.x 版本驱动,驱动类为 com.mysql.jdbc.Driver。
Step 4:执行数据库初始化
切换到dolphinscheduler用户,执行:
cd /opt/dolphinscheduler
DATABASE=mysql ./tools/bin/upgrade-schema.sh
⚠️
DATABASE=mysql是必须要加的! 如果不加这个环境变量,脚本默认激活postgresqlprofile,会尝试连接PostgreSQL。加上之后,日志中应该看到:The following 2 profiles are active: "upgrade", "mysql"
执行成功后,可以用MySQL客户端验证表是否已创建:
mysql -u ds_user -p -e "USE dolphinscheduler; SHOW TABLES;"
应该能看到t_ds_开头的数十张表。
Step 5:重启DolphinScheduler
./bin/dolphinscheduler-daemon.sh stop standalone-server
sleep 5
./bin/dolphinscheduler-daemon.sh start standalone-server
查看启动日志,确认MySQL连接成功:
tail -100 standalone-server/logs/dolphinscheduler-standalone.log | grep -i "hikari\|mysql\|started"
预期看到:HikariPool-1 - Start completed.
验证持久化效果
-
登录Web UI,随便创建一个租户或数据源
-
重启DolphinScheduler服务
-
再次登录,确认数据依然存在
经验总结
怕你忘了,我再啰嗦一遍:DolphinScheduler Standalone模式默认用H2内存数据库,重启丢数据是正常现象。切换到MySQL才能真正实现持久化。
落到具体操作上就是四条:
-
改两个地方的配置:
standalone-server/conf/application.yaml和tools/conf/application.yaml都要改成MySQL。漏改tools会导致upgrade-schema.sh执行失败。 -
执行
upgrade-schema.sh时必须加DATABASE=mysql:不加的话默认走postgresqlprofile。加了之后日志会显示"upgrade", "mysql",没加会显示"upgrade", "postgresql"。 -
JDBC驱动要放到两个目录:
tools/libs/和standalone-server/libs/都需要放。驱动类名是com.mysql.cj.jdbc.Driver(MySQL 8.x专用)。 -
YAML缩进必须正确:每层缩进2个空格,多一个少一个都不行。建议修改前先备份原文件,防止改错后无法恢复。
实在人老蒋补充:
做了二十多年运维,最烦的就是这种 “默认配置能用但不能正经用” 的设计。新手踩一次坑半天就没了,把这些细节写透,大家少走点弯路。
适用范围:
本文方案适用于所有使用DolphinScheduler Standalone模式且需要数据持久化的场景。如果你只是临时体验一下DolphinScheduler,H2内存数据库确实够用;但如果你打算长期使用,务必切换到MySQL或PostgreSQL。集群模式下本身就需要外部数据库,不存在这个问题。
系列导航
-
系列传送门: 【制造业数据与AI落地实战】 【WorkBuddy工作场景应用实践】 【AI赋能数据开发工程手册】
-
上一篇:智联工坊数据底座搭建全记录:从零部署Apache Doris + DolphinScheduler(步步实操版)
-
下一篇:《DolphinScheduler数据源连接报错
com.mysql.cj.jdbc.Driver?JDBC驱动的“路径战争”》(即将发布)
本文问题源自:《制造企业数仓选型实战:为什么我们选了 Apache Doris + DolphinScheduler》《从零搭建 Apache Doris + DolphinScheduler:保姆级步步实操手册(附完整命令)》实战过程,完整源码及深度教程见该文。
【热榜文&精品推荐】
TOP1、我用 WorkBuddy 分析了 30 篇 优快云 博客,发现 3 个反直觉的流量真相
TOP2、还在翻 git log 写周报?WorkBuddy 一键生成结构化周报
TOP3、老攻城狮的AI开发环境搭建全记录:从零到跑通本地大模型(一日速通版)
TOP4、LangChain Agent 反复调用工具死循环?结构化返回 + Prompt 规则
TOP5、智联工坊实战:多工具协同Agent,让AI像人类一样规划与执行复杂任务
TOP6、代码审查不想得罪人?WorkBuddy 先做第一轮审查
💡 建议收藏:下次部署DolphinScheduler时,对照本文的四步流程操作,避免因H2内存数据库导致数据丢失。
互动与交流
你在部署DolphinScheduler时有没有遇到过“重启丢数据”的问题?或者切换到MySQL时卡在了某个步骤?欢迎评论区交流,咱们互相支支招——说实话,第一次发现配置全丢了的时候,我是真的有点崩的。
关于作者
制造业数据与AI践行者老蒋,23年IT老兵。聚焦制造业数据架构与AI融合落地。全流程实战,全源码开源。
标签:#排坑笔记 #DolphinScheduler #数据持久化 #H2数据库 #MySQL #运维踩坑 #调度系统 #数据架构
348



被折叠的 条评论
为什么被折叠?



