尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

OpenProject 10.4.1 升级修复指南:时间条目数据恢复与关键 Bug 修复全解析

发布时间:2026/9/15 14:50:59

资讯中心
01
ARTICLE

OpenProject 10.4.1 升级修复指南:时间条目数据恢复与关键 Bug 修复全解析

OpenProject 10.4.1 升级修复指南:时间条目数据恢复与关键 Bug 修复全解析
OpenProject 10.4.1 升级修复指南时间条目数据恢复与关键 Bug 修复全解析【免费下载链接】openprojectOpenProject is the leading open source project management software for product, project and portfolio management. A powerful Jira alternative with agile planning, issue tracking, roadmaps, Gantt charts, time tracking, collaboration features, and more. Available on premises or in the cloud. ⭐ Star us on GitHub项目地址: https://gitcode.com/GitHub_Trending/op/openproject本篇技术指南以 OpenProject 10.4.1 版本发布说明docs/release-notes/10/10-4-1/README.md为核心聚焦 10.4.0 升级过程中因迁移脚本缺陷导致的时间条目Time Entry数据损坏问题给出完整的数据库级修复操作步骤并逐行解读底层修复 Rake 任务的实现原理。读者将掌握如何通过辅助数据库 openproject:reassign_time_entry_activities任务恢复被错误合并的时间条目活动、10.4.1 包含的 6 项关键 Bug 修复内容以及升级前的备份最佳实践。版本概览10.4.1 的发布背景OpenProject 10.4.1 于2020-03-04发布。该版本是一个以缺陷修复bug fix为核心的补丁版本官方在发布说明中明确建议所有用户升级到该最新版本The release contains several bug fixes and we recommend updating to the newest version.尽管 10.4.1 本身包含 6 项常规缺陷修复但它最重要的价值在于针对10.4.0 升级过程中一个会造成数据丢失的严重迁移脚本缺陷提供了官方修复路径。换言之10.4.1 既是修复版本也是 10.4.0 用户处理历史遗留数据问题的配套版本。问题根源10.4.0 升级中的时间条目损坏缺陷受影响范围与症状根据发布说明10.4.0 升级时运行的迁移脚本包含一个不幸的缺陷an unfortunate bug会导致部分安装实例遭受数据丢失受影响条件启用了按项目启用/禁用时间条目活动project-based time entry activities功能的安装实例损坏症状升级后所有时间条目被错误地分配到了同一个时间条目活动a single time entry activity下原本区分不同项目、不同活动的工时记录全部被合并数据性质属于不可逆的数据写入错误无法通过简单的界面操作恢复必须借助备份数据回填。相关的下游表现该数据损坏还连带引发了若干可观察的功能异常在 10.4.1 的修复清单中可以看到它们的身影#32358记录时间logging time时项目活动不再被过滤——即选择活动时丧失了按项目过滤的能力#32360成本控制Cost control模块中升级到 10.4 后活动类型activity types丢失。这两项正是时间条目活动被合并/丢失在工时录入与成本核算场景下的直接体现也从侧面印证了该缺陷的波及面——不仅影响时间追踪还影响成本控制模块的统计口径。数据恢复完整指南三步修复被损坏的时间条目官方修复指南位于 docs/installation-and-operations/misc/time-entries-corrupted-by-10-4/README.md。整个修复思路是从升级前的备份数据库中提取每个时间条目原本的活动归属再回写到当前数据库本质上是用历史备份做数据对账与回填。适用范围声明注意本指南仅适用于恰好升级到 10.4.0的安装实例。直接升级到 10.4.1 的实例不受影响。前置条件在动手之前必须确认满足以下三个条件一份 10.4.0 之前的数据库备份文件——这是修复的数据源没有它无法知道时间条目的原始活动归属数据库服务器上具备创建数据库权限的凭据——修复过程需要临时创建一个辅助数据库用于恢复备份OpenProject 服务器的控制台访问权限——需要执行openproject命令行工具与 PostgreSQL 客户端命令。第 1 步从备份创建第二个数据库修复的核心思想是并行操作新建一个辅助数据库而非直接覆盖当前正在运行的数据库把备份恢复到其中作为对照数据源。1.1 获取当前数据库连接信息连接到 OpenProject 服务器查询当前实例的数据库连接串$ openproject config:get DATABASE_URL # e.g.: postgres://dbusername:dbpassworddbhost:dbport/dbname实际输出示例$ openproject config:get DATABASE_URL postgres://openproject:L0BuQvlagjmxdOl6785kqwsKnfCEx1dv127.0.0.1:45432/openproject1.2 创建辅助数据库使用该连接串创建用于恢复备份的新数据库示例中命名为openproject_backup$ psql postgres://dbusername:dbpassworddbhost:dbport/dbname -c CREATE DATABASE new_dbname CREATE DATABASE实际输出示例$ psql postgres://openproject:L0BuQvlagjmxdOl6785kqwsKnfCEx1dv127.0.0.1:45432/openproject -c CREATE DATABASE openproject_backup CREATE DATABASE部分安装实例例如以postgres系统用户运行、peer 认证的环境可能无法直接执行上述命令此时可采用如下替代方案其中-O指定新库的所有者为 OpenProject 数据库用户su postgres -c createdb -O dbusername openproject_backup实际输出示例su postgres -c createdb -O openproject openproject_backup1.3 将备份恢复到辅助数据库备份文件通常位于/var/db/openproject/backup这是 官方备份命令 的默认输出目录。查看备份目录内容$ ls -al /var/db/openproject/backup/ total 1680 drwxr-xr-x 2 openproject openproject 4096 Nov 19 21:00 . drwxr-xr-x 6 openproject openproject 4096 Nov 19 21:00 .. -rw-r----- 1 openproject openproject 1361994 Nov 19 21:00 attachments-20191119210038.tar.gz -rw-r----- 1 openproject openproject 1060 Nov 19 21:00 conf-20191119210038.tar.gz -rw-r----- 1 openproject openproject 126 Nov 19 21:00 git-repositories-20191119210038.tar.gz -rw-r----- 1 openproject openproject 332170 Nov 19 21:00 postgresql-dump-20191119210038.pgdump -rw-r----- 1 openproject openproject 112 Nov 19 21:00 svn-repositories-20191119210038.tar.gz需要挑选的是在迁移到 10.4 之前生成的最新一个符合postgresql-dump-TIMESTAMP.pgdump命名的文件。随后用pg_restore将其恢复到新建的辅助数据库中。务必确保恢复目标是新建的辅助数据库而不是当前正在运行的数据库pg_restore -d postgres://dbusername:dbpassworddbhost:dbport/new_dbname /var/db/openproject/backup/postgresql-dump-TIMESTAMP.pgdump实际输出示例pg_restore -d postgres://openproject:L0BuQvlagjmxdOl6785kqwsKnfCEx1dv127.0.0.1:45432/openproject_backup /var/db/openproject/backup/postgresql-dump-20191119210038.pgdump执行完成后辅助数据库openproject_backup中就包含了升级前的时间条目数据。需要说明的是备份机制默认来自 内置的 OpenProject 备份命令若你使用的是自定义备份方案可参照本指南的步骤自行推导对应的恢复流程。第 2 步运行修复脚本核心修复动作是执行openproject内置的 Rake 任务openproject:reassign_time_entry_activities并通过环境变量BACKUP_DATABASE_URL指向辅助数据库BACKUP_DATABASE_URLpostgres://dbusername:dbpassworddbhost:dbport/new_dbname sudo openproject run bundle exec rails openproject:reassign_time_entry_activities实际输出示例BACKUP_DATABASE_URLpostgres://openproject:L0BuQvlagjmxdOl6785kqwsKnfCEx1dv127.0.0.1:45432/openproject_backup sudo openproject run bundle exec rails openproject:reassign_time_entry_activities脚本运行完毕后会打印修复的时间条目数量Fixing 341 time entries. Done.如果备份数据中不存在项目级活动即没有需要修复的记录脚本会提示无需操作As there are no project specific activities in the backup, nothing needs to be done.第 3 步清理辅助数据库脚本执行完成后辅助数据库的历史使命即告结束可以删除。再次强调删除时必须引用辅助数据库绝不能误删当前生产数据库$ psql postgres://dbusername:dbpassworddbhost:dbport/dbname -c DROP DATABASE new_dbname DROP DATABASE实际输出示例$ psql postgres://openproject:L0BuQvlagjmxdOl6785kqwsKnfCEx1dv127.0.0.1:45432/openproject -c DROP DATABASE openproject_backup DROP DATABASE修复脚本源码深度解析修复动作并非黑盒操作其完整实现保存在仓库的 lib/tasks/time_entry_activities.rake核心逻辑见 L29-L126。理解这段源码有助于管理员评估修复的准确性与风险边界。输入校验BACKUP_DATABASE_URL任务首先强制校验环境变量BACKUP_DATABASE_URLL34-L44若未定义直接输出提示并退出避免误操作。同时任务会捕获PG::ConnectionBad、ActiveRecord::NoDatabaseError等连接类异常L76-L86在连接串错误时给出友好报错而不是抛出难以定位的堆栈信息。判定逻辑检查备份中是否存在项目级活动脚本用一条 SQL 判定备份库中是否存在项目级时间条目活动。这里的enumerations表存储了 OpenProject 中的各类枚举包括TimeEntryActivity而parent_id非空的记录即表示绑定到某个项目的活动L46-L55SELECT te_source.id, enumerations.parent_id FROM time_entries te_source INNER JOIN enumerations ON te_source.activity_id enumerations.id AND enumerations.parent_id IS NOT NULL AND enumerations.type TimeEntryActivity若备份库中不存在此类记录任务直接输出无需处理并退出L88-L97。提取逻辑COALESCE 还原原始活动修复的数据源是备份库中时间条目的活动归属L57-L66。关键点在于COALESCE(enumerations.parent_id, enumerations.id)对于项目级活动其真实的活动 ID 是parent_id父活动对于普通活动则回退到活动自身 ID。这一步正是把被迁移脚本合并掉的归属还原回来的核心逻辑SELECT te_source.id, COALESCE(enumerations.parent_id, enumerations.id) activity_id FROM time_entries te_source LEFT OUTER JOIN enumerations ON te_source.activity_id enumerations.id WHERE enumerations.type TimeEntryActivity回写逻辑批量 UPDATE提取出(id, activity_id)映射后脚本将其拼接为 PostgreSQL 的VALUES列表通过单条UPDATE ... FROM (values ...)语句批量回写到当前生产数据库的time_entries表L99-L118。这种批量拼接方式避免了逐条更新的性能开销适合大规模数据修复场景。双连接架构的启示从源码可以确认整个任务使用了两条数据库连接L68-L86 连接备份库读取数据、L115-L120 连接当前库写入数据二者通过ActiveRecord::Base.establish_connection动态切换。这正是读备份、写生产的安全隔离设计——修复过程不会修改备份数据且只有经过校验的映射才会被写入。10.4.1 其他 Bug 修复清单除时间条目数据修复外10.4.1 还包含 6 项用户可感知的缺陷修复编号修复内容所属模块#32326无法删除查询queries查询管理#32328我的花费时间My Spent Time组件中特殊字符显示为 ASCII 码个人工作台组件#32356更改配色方案后自定义设计Custom Design丢失系统外观定制#32358记录时间时项目活动不再被过滤时间追踪#32360成本控制中活动类型在升级到 10.4 后丢失成本控制#32423使用 IME输入法时发生意外提交submit表单交互其中 #32356 涉及自定义设计在切换配色方案后丢失与系统外观配置的状态持久化相关#32423 则属于典型的输入法组合输入场景下的前端交互缺陷影响东亚语言用户的录入体验#32326 与查询删除相关涉及查询管理模块的权限与资源清理逻辑。升级建议与备份最佳实践升级前必须备份时间条目损坏事件再次印证了升级前备份的重要性。官方备份指南 docs/installation-and-operations/operation/backing-up/README.md 明确建议在升级到新版本之前务必定期备份。对于 DEB/RPM 包安装的实例一条命令即可完成全量备份sudo openproject run backup备份产物统一存放在/var/db/openproject/backup/包含数据库转储postgresql-dump-TIMESTAMP.pgdump、附件attachments-TIMESTAMP.tar.gz、配置文件conf-TIMESTAMP.tar.gz、SVN/Git 仓库等内容。官方建议将备份文件复制到安全位置如 S3 或专用备份服务器。正是这份postgresql-dump文件构成了本次时间条目修复的数据基石。版本升级路径建议尚在 10.4.0直接升级到 10.4.1并参考本指南检查时间条目是否已损坏若已损坏按上文三步流程修复早于 10.4.0 且尚未升级先完整备份再执行升级升级后立即抽查时间条目的活动归属是否正常已经是 10.4.1 或更高版本直接升级到 10.4.1 的实例不受迁移缺陷影响无需执行修复。社区贡献致谢OpenProject 的缺陷修复离不开社区的力量。10.4.1 的发布说明特别致谢了 Freddy Trotin、Harald Holzmann、Wojciech Niziński、Kanta Ebihara 四位社区成员感谢他们报告并协助定位了本版本修复的各项缺陷。OpenProject 自身也是开源社区协作模式的受益者与践行者——从 COPYRIGHT 与 CONTRIBUTING.md 可以看到其基于 GPL 许可的开源生态与贡献规范。小结OpenProject 10.4.1 是一个承上启下的修复版本它既针对 10.4.0 迁移脚本缺陷提供了可落地的数据恢复路径辅助数据库 reassign_time_entry_activitiesRake 任务又修复了查询删除、IME 输入、自定义设计、时间追踪过滤等 6 项用户可见缺陷。对于运维人员而言本指南的三步恢复流程创建辅助库 → 恢复备份 → 执行修复 → 清理可以直接作为运维手册使用对于开发者而言lib/tasks/time_entry_activities.rake 展示了 OpenProject 如何处理迁移误伤数据这类高危问题的工程化思路——用历史备份做数据源、用 SQL 校验兜底、用批量 UPDATE 收敛性能值得在类似的数据修复任务中借鉴。【免费下载链接】openprojectOpenProject is the leading open source project management software for product, project and portfolio management. A powerful Jira alternative with agile planning, issue tracking, roadmaps, Gantt charts, time tracking, collaboration features, and more. Available on premises or in the cloud. ⭐ Star us on GitHub项目地址: https://gitcode.com/GitHub_Trending/op/openproject创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。