解决Planka升级V2版本数据异常

结城 工具箱 4 次阅读 927 字 发布于 21 天前 预计阅读时间: 4 分钟


刚刚升级计划管理软件 Planka 大版本升级 V2 版本,发现升级后无法启动了,日志提示存在数据库迁移记录与当前版本代码不匹配的问题。

查了查资料发现 V2 新版本的 Planka 为了精简代码,删除了早期的数据库迁移文件。但 PostgreSQL 数据库的 knex_migrations 表中仍然保留着这些旧文件的名字。

由于 Planka 使用的数据库管理框架 Knex.js 会在启动时进行严格校验,发现文件丢失后,就会抛出 The migration directory is corrupt(迁移目录已损坏)的错误,并强制阻断系统启动,展现出来的结果是容器不断重启,直到触发重启限制后停止。

官方给出的解决方案是运行专属的数据库升级脚本 npm run db:upgrade,该脚本会自动处理数据结构变更并清理旧的迁移记录。

目前研究了研究,相应的解决方案如下。

1.备份数据

进行任何数据库修正前,务必对当前的 Planka 数据库(PostgreSQL)进行完整备份,以防万一。切记不要无备份升级。

除了数据库备份,还需要进行资源文件备份,跨大版本升级后原有的资源文件链接会全部丢失,所以需要手动备份资源文件。

2.进入 Planka 应用目录

进入终端,切换到docker版本 Planka 的 docker-compose.yml 目录下。

3.执行官方升级脚本

由于当前 Planka 容器因为报错处于崩溃重启的状态,不能直接 docker exec 进入容器。你需要在应用目录下,执行以下命令,这会拉起一个临时的容器专门执行数据库升级任务:

docker compose run --rm planka npm run db:upgrade

如果系统提示找不到 docker compose​,尝试使用 docker-compose run --rm planka npm run db:upgrade,旧版本docker并没有现代版本的编排插件,这点需要注意。

逐条解释一下这个命令含义:

docker compose​:调用容器编排工具,它会自动读取当前目录下的 docker-compose.yml 文件。

​​run​:告诉 Docker 不要像平时那样启动后台守护进程,而是启动一次性任务。

​​--rm​:任务执行完毕后,无论成功或异常,立即自动删除这个临时容器。

​​planka​​:指定继承配置文件中为 planka 设置的所有环境变量、网络配置和挂载卷,相当于用同样的配置启动了一个独立容器,但没有启动应用本身。

​​npm run db:upgrade​​:读取 Node.js 环境下 package.json​ 中配置的 db:upgrade 脚本。调用 Knex.js 的数据库迁移命令,连上数据库重组数据表结构并清理冗余迁移记录。

4.重启服务

等待终端中的升级脚本执行完毕。所有的数据库迁移信息都会在终端中打印,如果没有任何报错并顺利结束,说明数据库记录已经修复完成。

之后执行命令重启容器,等待应用启动。

docker compose down
docker compose up -d

完成后,Planka 能顺利通过启动校验,历史看板数据也会正常保留。

需要注意的是,修复数据后的 Planka 原有的资源文件会丢失,包括计划板背景、用户头像、计划附件等,我个人是不需要修复直接删了重开,如果需要修复请自行解决数据库链接问题。