jira迁移前先梳理这3类数据
去年第四季度,我接手了一个“死亡行军”式的项目:把一家 1200 人规模、用了 7 年 Jira Software Server 版的研发中心,完整迁移到 Jira Cloud。所有人都在关注时间线、插件兼容性、停机窗口,但没人告诉我,整个迁移过程中最致命的瓶颈,根本不是技术方案,而是“旧数据里的脏东西”。
迁移脚本跑了 14 次,每次都卡在差不多的位置:某个 Workflow 关联了 3 年前被删除的字段、Issue 历史里嵌套了 XML 实体引用、300 多个自定义字段里有一半从建好那天起就没人碰过。项目延期 6 周,直接成本超支 40 多万。更麻烦的是,上线后第一周,业务侧反馈大量工作流节点“走不通”,我们才发现旧逻辑里藏着几百条“自引用”的过渡规则。
这次教训让我形成了一个铁律:任何 Jira 迁移,真正的准备工作不应该从备份和方案评审开始,而应该从“数据梳理”开始。不是随便跑一份系统健康报告的那种梳理,而是针对迁移风险、数据完整性、业务可恢复性所做的三层结构式清理。
这篇文章要讲的就是这三类数据。它是我在过去 5 年里,经历了 9 次不同规模、不同版本的 Jira 迁移之后,反复验证出来的一套前置判断框架。你读完会发现,大多数迁移失败或严重延期,其实在“梳理阶段”就已经能被预判。

一、核心结论:迁移前为什么要先做数据梳理
如果只允许我用一句话总结 9 次 Jira 迁移的经验,那就是:迁移工具解决的是“能不能搬过去”,而数据梳理解决的是“搬过去之后能不能用”。
很多人把 Jira 迁移理解成一次“搬家”,把家具从一个房子搬到另一个房子。但实际上,Jira 迁移更像是一次“企业核心业务系统的数据重构”。因为 Server 版和 Cloud 版之间的差异,远远不止“部署方式的差异”,它们在字段配置、工作流引擎、插件生态和数据存储结构上都存在系统性断层。
举个例子:Jira Server 允许用户在 Issue 的“Comment”里直接插入 Jira 内部 Issue 链接,Server 版会用 Issue Key 做本地解析。但迁移到 Cloud 之后,如果 Issue Key 被修改了(很多企业会趁机做项目合并或 Key 重置),这些 Comment 里的链接就会全部变成死链。这不是迁移工具的问题,这是数据没有梳理的问题。
更隐蔽的一个风险是“数据债务转移”。所谓的 Jira 数据债务,指的是多年积累下来的僵尸自定义字段、互不兼容的 Screen Scheme、复制粘贴出来的 Workflow、已经离职但依然被配置为“默认经办人”的账号。这些东西在原系统里还能凑合用,但一旦迁移,系统会强制你做“合规性检查”,这时你会发现,大量配置根本无法通过校验,系统甚至不让你点“开始迁移”。
所以我的核心结论很直白:Jira 迁移不应该从“试迁移”开始,而应该从“数据梳理”开始。并且这个梳理不是泛泛地检查一下,而是按照三个明确的数据类型分类执行:配置型数据、流动性数据和审计与附件数据。这三种类型覆盖了迁移失败 90% 以上的根因。
接下来的内容,我会围绕这三类数据展开,讲清楚每一类数据“要梳理什么、怎么判断风险、哪些必须处理、哪些可以战略性放弃”。

二、深层背景:为什么 Jira 迁移比大多数系统迁移都脆弱
要理解为什么数据梳理如此重要,你必须先理解一个事实:Jira 不是传统的关系型业务系统,它是一个高度元数据驱动的配置平台。
传统的业务系统,比如 ERP 或财务系统,数据模型通常是固定的。迁移时你只需要关心“主数据”和“交易数据”的完整性。但 Jira 的复杂性在于,它的“业务逻辑”本身也是数据。你的 Workflow、Field Configuration、Screen Scheme、Permission Scheme、Notification Scheme、Issue Type Scheme,这些全部以元数据的形式存储在数据库里,并且彼此之间存在极其复杂的引用依赖关系。
我曾在一次迁移中复盘过一套 Jira Software Server 8.x 的实例,那家公司有 230 多个项目、18 个 Issue Type、2200 多个自定义字段。光是把这些字段和 Screen 的映射关系吃透,就花了我 4 天时间。结果发现,有 40% 的字段从未在任何 Screen 上出现过,但依然存在于数据库中,且在一些 Workflow 的“验证器”脚本里被引用了。
这种“幽灵引用”现象,在 Server 版里可以长期存活,因为 Jira Server 很多校验逻辑是惰性的。但 Cloud 版出于性能和安全的考虑,对数据完整性校验极其严格。迁移工具在执行导入时,会对每一个 Scheme 的引用链做完整性校验,只要有一个依赖对象不存在或状态异常,整个导入 job 就会直接 rollback。
另一个容易被忽略的背景因素是“插件后遗症”。大部分长期使用的 Jira Server 实例都安装过大量插件,其中一些插件会创建自己的自定义字段、Workflow 条件、甚至是独立的 Scheme 图元。当你决定迁到 Cloud 且不再续用这些插件时,插件留下的数据并不会自动消失。它们会变成“孤立引用”,成为迁移失败的定时炸弹。
这些深层次的脆弱性,决定了 Jira 迁移的容错率远低于大多数人的预期。也正因为这样,我才反复强调:数据梳理不是可选项,而是必选项。
三、两类绝对不要再犯的常见错误
在展开三类数据的详细梳理方法之前,我要先扎一针“预防针”:很多团队在 Jira 迁移前不是没做数据梳理,而是用错误的方式做了梳理。结果不仅没降低风险,还制造了虚假的安全感。
我在 5 年里反复看到两大类错误,这两类错误几乎可以涵盖 80% 以上的“梳理失败”。
1. 把“导出量”等同于“迁移可行性”
这是最常见也是最危险的一个误区。很多项目经理会要求运维或 Jira 管理员“把系统数据导出来看看”。结果运维跑了一份 SQL dump,或者用 Jira 自带备份功能生成了一个巨大的 XML 文件,然后报告说:“数据都完整导出了,没问题。”
但完备导出≠可成功导入。Server 版生成的备份文件里可以包含大量 Cloud 版不接受的元数据。举例来说:
- Server 版允许 Issue Type 名称里包含特殊字符(如斜杠、引号),但 Cloud 版对这些字符有严格限制;
- Server 版的 Workflow 可以拥有 200 多个状态,Cloud 版的性能阈值是 80 个状态/工作流;
- Server 版允许一个 Permission Scheme 关联几百个用户组,Cloud 版在用户组解析上依赖 Atlassian ID,对空组和无效组的容忍度极低。
导出成功只是“搬得动”,但你真正需要关心的是“搬得进”。
我经历过最夸张的一次案例:一个团队花了 3 周做导出备份测试,每次备份都 100% 成功,信心满满地进入迁移窗口。结果第一轮试迁移就失败了,原因是他们有一个名为“Done/完成”的 Issue Type,中间的斜杠字符导致 Cloud 校验失败,整个导入被回滚。修复这个问题只花了 30 秒,但定位它花了 6 个小时。
2. 只清理“显式报错”,不处理“隐性债务”
这个错误更隐蔽。有些团队确实做了梳理,但他们采用的是“试迁移驱动”的策略:跑一次试迁移,看报错日志,报什么改什么,改完再跑,直到跑通为止。
这种“打地鼠”式梳理的问题在于:能成功导入,不代表上线后能正常使用。
我在 2022 年帮一家金融科技公司做迁移后验收时发现,虽然迁移脚本跑过了,但他们的 Test Management 类 Issue 全部丢失了“Precondition”字段的值。查了之后发现,那个字段是以前一个测试管理插件创建的,迁移前团队没有把字段数据迁移到 Jira 原生字段,而是直接把插件卸载了。结果迁移工具把这个字段标记为“invalid”,默默地丢弃了所有数据,没有报错。
这种“静默丢失”比显式报错更可怕,因为它不会有任何日志告诉你去修复。等你发现的时候,往往是业务侧某个核心操作跑不通了。
下面我将详细拆解真正有效的梳理框架,以配置型数据、流动性数据、审计与附件数据三大类为纲,每一类都附上我自己的判断方法和真实案例。

四、第一类:配置型数据,决定迁移的“能不能”
配置型数据是 Jira 迁移里最硬的一堵墙,它直接决定了你“能不能”把数据导进目标环境。这不是影响性能的问题,这是一票否决的问题。
我在做前几次迁移时,对配置型数据的理解很粗浅,觉得无非就是字段、工作流、权限这些“设置”。后来才意识到,配置型数据在 Jira 里的真实含义是:所有影响系统对象结构完整性和引用闭合性的元数据。
换句话说,只要你梳理的东西在数据库里是以“ID”形式存在,并且被其他对象引用,它就属于配置型数据的梳理范畴。
1. 自定义字段的“三态清理法”
自定义字段是 Jira 迁移的“头号杀手”。根据 Atlassian 官方在 2023 年发布的一份 Cloud Migration Guide 里的数据,一次典型的中大型迁移中,自定义字段相关问题平均占迁移失败的 31%。实际上我自己的经历更极端,有两次迁移失败直接是被字段问题卡死的。
我把自定义字段的梳理总结为“三态清理法”,把字段分成三类状态来处理:活跃字段、僵尸字段和幽灵字段。
(1)活跃字段
活跃字段指当前仍然在至少一个 Screen 上显示,且在过去 90 天内有被更新的 Issue 使用的字段。这类字段是需要完整保留的,但它们的梳理重点是“跨系统兼容性”。
你需要检查:
- 字段类型是否存在于目标环境。例如 Server 版某个插件提供的“Multi-User Picker from Group”字段,Cloud 版可能没有完全对应的字段类型。这时你要么为这个字段找替代方案,要么在迁移前把它的值转存到 Jira 原生字段。
- 字段上下文(Context)的复杂度。Server 版允许一个自定义字段有多个上下文,每个上下文绑定不同项目、Issue Type 和选项值。Cloud 版对多上下文的支持有限。如果某个字段有十几个上下文,迁移后可能出现取值冲突,我建议在梳理阶段就做“上下文收敛”。
- 字段名称的合法性。包含特殊字符和过长的名称都可能触发 Cloud 校验失败。
我实操中有一个提速技巧:用 Jira REST API 拉出所有自定义字段的 contexts 和 screens 关联数据,写一个 Python 脚本做批量校验,而不是在 UI 上一个一个点。这个脚本我后面会给出示例框架。
(2)僵尸字段
僵尸字段指那些在过去 90 天内从未在任何 Issue 上被更新过,但依然存在于数据库中的字段。我每次做梳理,都会发现这样的字段占自定义字段总量的 30% 到 50%。
为什么会有这么多僵尸字段?原因很多:原管理员在测试时创建的、某个已废弃项目留下的、旧插件生成的、某个已离职的 Scrum Master 一年前做“流程改进”时批量创建的。
这类字段的处理原则是:能删就删,不能删就把它们从所有 Screen 和 Workflow 验证器中移除。因为它们的存在会干扰迁移后的数据校验和性能。具体来说,即使一个字段没有值,只要它关联了 Screen Scheme,Cloud 导入时就会为这个字段在数据库中建立索引,拖慢导入速度。
别觉得“删字段”是个小操作。在 Server 版里,如果你删除一个有值的字段,那些 Issue 上的历史数据就真的没了。所以我采用的策略是“先移屏,后归档,再删除”。但在本文的环境中,我们重点讲判断。
(3)幽灵字段
幽灵字段是我自己造的一个概念,特指那些在数据库中存在、名字看起来正常、但引用它的插件或 Workflow 验证器已经不存在或失效的字段。
之所以叫“幽灵”,是因为你通过 Jira Admin 界面几乎感知不到它们的存在。它们不会显示在任何 Screen 上,但 Workflow 的某个 Condition 或 Post Function 里依然挂着对它们的引用。
识别幽灵字段最有效的办法,不是 UI,是直接查数据库。你必须跑类似这样的 SQL:
SELECT cf.id, cf.cfname, wf.workflowname
FROM customfield cf
JOIN workflowtransition wf ON wf.conditionxml LIKE CONCAT('%', cf.id, '%')
WHERE cf.id NOT IN (SELECT customfieldid FROM screenschemeitem);
注意:这只是一个示意,实际 SQL 需要根据 Jira 版本和具体表结构调整。但逻辑是通用的,找出所有被 Workflow 引用但未绑定任何 Screen 的字段。
每次发现幽灵字段,我的第一反应不是“立刻删除”,而是判断这个 Workflow 是否还在使用。如果 Workflow 本身已被废弃,那这个字段就可以安全删除;如果 Workflow 仍在使用,但该 Condition 节点已经失效(比如插件被卸载),那就要清理这个 Condition 后再删字段。
不好好处理幽灵字段的后果是:迁移工具在导入 Workflow 时,会尝试查找这个字段,如果找不到,就直接中断导入。

2. Workflow 与 Scheme 的依赖收敛
Workflow 是配置型数据梳理的第二大难点,而且在迁移场景下,它的优先级甚至高于字段。因为Workflow 异构是导致迁移后业务流程跑不通的首要原因。
我习惯把 Workflow 梳理分成两个阶段:结构完整性和引用闭合性。
结构完整性指的是 Workflow 本身的定义是否在 Cloud 环境中可以完整运行。Cloud 版对 Workflow 有一些硬性限制:
- 单个 Workflow 的状态数量不能超过 80 个(这是 Atlassian 官方给出的阈值,实际上超过 60 个状态后性能就开始下降);
- 不允许有两个同名的状态存在于同一 Workflow 中(Server 版有这个容忍度);
- 云端 Workflow Designer 无法导入使用“Custom Script Post Function”的 Workflow,除非你先用迁移助手做转换。
所以梳理时,你第一步应该做的是拉出所有 Workflow 的状态数量统计。我发现过有公司的 Workflow 状态数超过 120 个,那是过去 5 年里反复“打补丁”的结果。这种情况,迁移前一定要做 Workflow 简化,否则导入 Cloud 后连 Workflow Editor 都打不开。
引用闭合性更隐蔽。它指的是:一个 Workflow 引用的所有条件(Condition)、验证器(Validator)、后处理函数(Post Function)、Screen,在目标环境里都要存在且可用。
举个真实案例:一个 Workflow 的“开始进度”转换里,设置了一个“Validate Attachment Exists”的验证器,这个验证器是插件提供的。迁移时插件没有 Cloud 版本,团队直接卸载了插件。但 Workflow 的 XML 里还是引用了这个验证器的 fully qualified class name。结果导入时 Cloud 拼命找这个类,找不到,整个 Workflow 导入失败。
为了避免这种问题,我的做法是:对每一个 Workflow,都用 REST API 导出完整的 XML 定义,然后写正则扫描里面所有的 class 引用,再人工逐一核查这些类是否来自插件、插件是否有 Cloud 版本。
3. Screen Scheme 和 Issue Type Scheme 的冗余清理
Screen Scheme 和 Issue Type Scheme 的梳理,不像字段和 Workflow 那么“高危”,但它是迁移后用户体验和系统整洁度的关键。
很多用 Jira 超过 3 年的企业,Screen Scheme 的数量会极度膨胀。我见过一个 300 人的团队,产生了 147 个 Screen Scheme。这种现象通常是因为大家习惯在“复制”现有的 Scheme 然后做小幅修改,但原来的 Scheme 既没有删除也没有归档。
迁移是一个绝佳的“清理窗口期”。因为用户对迁移带来的变化有心理预期,这个时候做界面简化,抵抗最小。
我会先梳理出以下两个名单:
- 零绑定项目的 Scheme:没关联任何项目的 Screen Scheme,可以直接归档或删除;
- 与默认 Scheme 内容高度一致的 Scheme:很多项目为了加一个字段,就复制了整个 Screen Scheme 然后只加了一个字段。这种 Scheme 应该被合并回默认 Scheme,然后项目改挂默认 Scheme。
Issue Type Scheme 同理。很多公司有几十个 Issue Type,但实际上长期活跃被使用的可能只有 5-8 个。多余的 Issue Type 不仅没人用,还会污染 JQL 和报表。迁移前我会把 Issue Type 的“最近使用频次”拉出来(可以从 Issue 表的 issuetype 字段按时间窗口做聚合统计),果断干掉那些一年内 Issue 数小于 10 的 Issue Type。
这里我顺便强调一句,很多人觉得“不影响的就留着吧,省得麻烦”。但 Jira Cloud 是按用户数计费的,数据量和复杂度直接关系到管理成本和未来扩展性。每多一个 Scheme、一个 Issue Type、一个字段,都是在为未来的每一次配置变更增加复杂度。
4. 插件依赖对象:提前做“去插件化”判断
所有配置型数据中,最具破坏力的就是插件依赖对象。而且它的风险不仅在于数据问题,更在于商业决策的连带影响。
Jira Server 的插件生态极其庞大,大量的流程和数据都是围着插件转的。当你决定迁 Cloud 时,摆在面前只有三条路:
- 在 Cloud 上找到对应插件继续使用;
- 抛弃插件,把插件承载的业务逻辑和数据迁移回 Jira 原生能力;
- 完全抛弃这个插件及其所有相关数据和流程。
这三条路的选择,不能等到迁移时再做,必须在梳理阶段就完成判断。
我的执行步骤是:
- 导出所有已安装插件的列表,并标记哪些是 Marketplace 应用,哪些是定制开发;
- 分析每个插件的“数据写入程度”,它只做展示?还是创建了自定义字段?还是接管了 Workflow 的 Post Function?还是在 Issue 面板上有固定的 Panel?
- 根据业务影响度给插件分级:核心业务依赖、辅助功能、已废弃但未卸载;
- 对核心业务依赖的插件,优先联系厂商确认是否有 Cloud 版本;
- 对暂时无 Cloud 替代方案的,评估是否可以改用 Jira Automation 或原生功能等效替代。
- 内嵌的 @Mention:格式为 [~username],迁移后如果用户帐号映射失败,会被转成纯文本;
- Issue Link 的旧式引用:形如 Issue #PROJ-123,若迁移中项目 Key 发生变化,这类引用不会自动更新;
- HTML 实体和特殊编码:部分老版本 Jira 用户有时会粘贴带 、<、非标准 Unicode 字符的内容,Cloud 清理机制可能直接截断或转义这些内容;
- 表格和面板宏:Server 版中用户用 {panel} 或 || 表格语法编写的内容,Cloud 编辑器不一定能完美回显。
- 匹配 [~xxx] 格式,生成一份 Mention 用户名列表,与目标 Cloud 环境的用户做比对;
- 匹配内部 Issue 引用关键词(如 PROJ- 或 Issue #),检查这些 Issue Key 在迁移后是否改变;
- 匹配 HTML 标签和实体编码,标记出高频出现的位置;
- 匹配 {code}、{panel}、{noformat} 等宏使用情况。
- 对于用户映射失败的 @Mention,提前告知业务部门“这些历史通知将不可恢复,只能保存为文本”;
- 对于依赖项目 Key 的内部链接,优先保证迁移时项目 Key 不变,如果必须变,就在迁移后用脚本做 Comment 内字符串的批量替换。
- 目标 Issue 丢失:被链接的 Issue 在迁移时因为数据问题被跳过,导致链接悬空;
- Issue Key 变更:迁移中重设了项目 Key,所有旧链接失效;
- 跨项目链接失效:若链接的两个项目不在同一个迁移批次里,导入时可能无法建立关系。
- 用 Issue Link 表统计出所有跨项目链接的数量和具体 Issue 列表;
- 建立一个“新旧 Key 映射表”,并确认迁移工具是否支持自动更新 Issue Link 内的 Key 引用(Jira Cloud Migration Assistant 在部分场景下支持,但不保证 100% 覆盖);
- 对于不会自动更新的引用(比如 Comment 内的文本链接),生成一份待修复清单,提前分配修复人力。
- 中文文件名:尤其是 GBK/GB2312 编码的文件名,在转 UTF-8 时可能产生乱码;
- 长文件名:Cloud 对文件名长度有限制,超过阈值会被截断;
- 特殊类型附件:如 .msg、.eml 邮件文件,迁移后可能因安全策略被拦截;
- 超大附件:Cloud 有单附件大小限制(通常是 100MB 或 2GB 取决于套餐),Server 版没有硬性限制。
- 附件总数量和总大小;
- 附件平均大小和中位数大小;
- 超过 Cloud 限制的附件数量及所属项目;
- 中文文件名附件数量和占比。
- 离职用户:Server 版里有大量已离职但 Issue 历史上还挂着的用户(经办人、报告人、评论作者)。如果 Cloud 侧没有为他们创建帐号或做映射,迁移会失败或者这些历史数据会被标为“Former user”。
- 同名或近似名用户:李雷和 Lilei,映射时容易因大小写或拼音差异造成匹配错误。
- 用户组名称冲突:如果把 Server 的 LDAP 组同步到 Cloud,可能会与 Cloud 已有的默认组(如 site-admins、trusted-users)冲突。
- 时间戳问题:如果迁移跨时区,或者在导入过程中系统时间配置有偏差,所有历史数据的时间戳可能会集体偏移。在合规审计中,时间偏移会被认为是“数据篡改”的线索。
- 归属人问题:如前面所述,离职员工没能正确映射,所有历史 Issue 上的操作者会变成“Former user”。在审计时,这意味着你无法追溯到具体的责任人,证据链断裂。
- 过去 Sprint 的完成图表、燃尽图将不可用,除非你把历史 Sprint 当作独立的 Issue 数据逐条保存;
- Agile Board 的配置无法直接迁移,必须在 Cloud 上重建所有 Board 和 Filter;
- 历史 Sprint 中的数据如果因为 Issue 迁移不完整而出现缺口,会直接影响 Velocity 和 Burndown 的历史统计。
- Workflow 引用了不存在的字段或已卸载插件条件;
- 用户映射缺失但用户被权限 Scheme 显式引用;
- 字段类型在 Cloud 端不存在且字段有值;
- Issue Type 名称包含非法字符。
- 做了一次系统备份导出;
- 运行 Jira Cloud Migration Assistant,开始试迁移;
- 导入失败,查看日志,发现 Workflow 引用不存在的字段;
- 管理员手动删除了那几个字段,重试;
- 再次失败,发现一个插件遗留的 Post Function 没有清理;
- 尝试卸载插件,结果发现插件数据清理不干净,残留配置依然在;
- 重试 7 次后终于导入成功,但这时候已经过去 4 周;
- 导入完成后开始 UAT,发现大量 Issue 附件中文名乱码、Comment 里旧链接失效;
- 进入加班修复阶段,最终延期 6 周才正式切换,且上线后第一周仍有多起业务中断事件。
- 第 1 周:完成自定义字段的三态清理、Workflow 依赖扫描、插件去留决策;
- 第 2 周:完成富文本和特殊字符的全量扫描、Issue 链接断裂分析、用户映射校验;
- 第 3 周:完成附件哈希校验、变更历史完整性评估、合规确认。
最典型的雷区是一款叫“ScriptRunner for Jira”的插件(Server 版)。很多公司高度依赖它,它甚至在某些 Workflow 里充当了绝对核心的角色。迁移到 Cloud 时,ScriptRunner 有对应的 Cloud 版,但它的 API 和功能集有差异,不是无缝衔接的。如果你不提前梳理哪些 ScriptRunner 脚本是必须的、哪些可以废弃,到迁移后会出现大量的 Post Function 失效。
我在一次为保险客户做迁移时,发现他们用 ScriptRunner 写了 140 多个 Groovy 脚本,90% 是 3 年前的开发者写的,文档全无。我们不得不逐行读脚本逻辑,判断哪些需要保留、哪些需要重写为 Jira Automation 规则。这项工作占用了至少 4 个人周,但如果不做,迁移后核心投保流程的工单流转就会彻底瘫痪。
所以我的策略很明确:插件梳理一定要早于任何技术迁移操作。而且梳理结果必须形成一个“插件退役清单”和“插件替代方案映射表”,交给业务负责人确认签字。这不是推卸责任,而是确保没有人会在上线后突然说“那个功能怎么能没有”。

五、第二类:流动性数据,决定迁移后“能不能用”
如果说配置型数据决定你能不能把数据搬进去,那么流动性数据就决定了你搬进去之后业务能不能跑起来。
流动性数据是我创造的一个分类术语,特指那些在迁移过程中容易发生“被截断、被转换、被丢弃或格式失真”的用户数据。它们不是元数据,而是普通用户每天读写的内容,但恰恰因为“普通”,最容易被忽视。
在九次迁移中,我形成了一个苦涩的认知:流动性数据的损伤几乎不会在试迁移阶段暴露。因为试迁移时,大家只会看 Issue 能不能打开、Workflow 能不能动、字段值在不在。没有人会在试迁移阶段去检查“附件里的中文文件名有没有乱码”或者“Issue Comment 里的 @Mention 是否还能正确通知到人”。
但恰恰是这些不起眼的地方,决定了上线后用户是先感知到“系统升级了”还是“系统坏了”。
1. 富文本、特殊字符与嵌入引用的转换风险
Jira 的 Description 和 Comment 是富文本字段,它们在 Server 版里用 Jira 自有的 Wiki Renderer 或 Markup 格式存储,底层数据体是 Atlassian Document Format。但 Cloud 版全面启用了新的编辑器,对以往的存储格式存在兼容性问题,尤其在处理以下内容时容易出错:
我在梳理流光性数据时,会专门跑一个脚本,从 jiraissue 表和 jiraaction 表中抽取所有 Description 和 Comment 的文本体,然后用正则匹配出四类模式:
之所以要跑全局扫描,是因为你不确定到底有多少 Issue 受影响。我曾经以为“只有少数老项目会有问题”,结果扫出来 22 万条 Comment 里有 3.6 万条包含旧式 @Mention,其中涉及到的用户名有 180 个已经在目标 Cloud 环境里不存在了。
这类问题的处理方法我知道很繁琐,但逻辑清晰:
我特别强调一句:批量替换 Comment 内容是一个非常高风险的操作,因为这是直接修改用户生成内容。我只有在获得业务方书面确认、且迁移后有完整的回滚窗口的情况下才敢做。如果你没有把握,就保留原样,把风险披露给用户,远比偷偷改了然后造成信息失真要好。
2. 历史 Issue 链路关系与“断裂引用”
Jira 里的 Issue 不是孤岛。它们通过父子关系、Duplicates/Blocks/Relates 等 Link Type 构成了一张复杂的有向图。这张图在迁移过程中会面临三种断裂风险:
我在 2021 年的一家软件公司迁移项目中,犯过一个惨痛的错误:为了让新环境看起来“更干净”,我在迁移前对项目 Key 做了重新规划,把原来混乱的缩写统一了。结果迁移完成后,所有历史测试用例里的“关联缺陷”链接全部变成了死链。QA 团队直接跑到我工位前质问。
那次之后,我总结出一条铁规:非万不得已,迁移时绝不改变 Issue Key。就算 Key 再不规范、再难看,也等迁移完全结束、数据校验通过后,再用 Cloud 的“移动 Issue”功能慢慢迁改。
但如果确实要改 Key,梳理阶段要做的事情是:
另一个容易被忽视的断裂引用是“子任务”。如果父任务在迁移中因某一项校验失败被丢弃,其所有子任务会变成“孤儿任务”。所以梳理时,我要求运维把同一父任务下的子任务做聚类,确保它们和父任务属于同一个迁移校验单元。
3. 附件与中文文件名编码问题
附件是所有流动性数据里“体量最大、关注度最低、出问题后抱怨声最响”的一类。
Server 版存储在文件系统或数据库里的附件,在迁移到 Cloud 时,会经过一次重新编码和上传。这个过程中,最容易出问题的是:
关于附件,我的第一个建议是硬杠杠的:在迁移前务必做一次附件的全量统计分析。至少要知道:
第二个建议是:如果附件总量特别大(比如超过 500GB),要提前评估云端存储费用。有些公司会选择把超过一定年限的历史附件迁移到便宜的对象存储(如 AWS S3 或阿里云 OSS),在 Jira Issue 里只保留一个链接。但这种方法有利有弊:好处是节省了 Cloud 存储成本;坏处是破坏了 Issue 的完整性,未来用户查看 Issue 时看不到附件,体验大打折扣。
我的取舍标准很简单:近 12 个月内的附件必须全量迁移;12 到 36 个月内的附件可以全量迁移但降低优先级;超过 36 个月的附件,只要业务方同意,可以转为只保留文件链接。
4. 用户和用户组的映射“陷阱”
用户和用户组是属于流动性数据里比较特殊的一种,它既像配置(因为涉及权限),又像数据(因为用户会流动)。但在迁移语境下,我坚定地把它归入流动性数据来梳理,因为它的最大风险不是“结构不合法”,而是“映射失真”。
Jira Server 版通常对接企业内部的 LDAP 或 AD 域,用户的唯一标识是用户名或内部 ID。而 Cloud 版使用 Atlassian Account ID 作为全局唯一标识。迁移过程会要求你做一个用户映射,把 Server 的用户“对应”到 Cloud 的 Atlassian 帐户。
这里有几个极易踩的坑:
我在梳理用户数据时的操作很具体:从 cwd_user 表导出一份完整的用户名列表,然后逐项标记每个用户的迁移状态:“已存在 Cloud 帐号”“需新建”“已离职不再映射”。对于“已离职不再映射”的用户,需要接受他们名下的所有 Issue 历史将变为“前员工”标签。
针对用户组,我会特别关注那些在权限 Scheme 中被显式指定的组。因为在迁移后,如果某个组没能成功映射,所有依赖这个组的权限被清空,可能会导致“除了管理员谁都能看所有项目”的灾难级越权风险。
所以梳理阶段一定要拉出一份“权限 Scheme – 用户组”的关联矩阵,确保每个在权限 Scheme 里被引用的组,在 Cloud 侧都有对应的组且成员一致。

六、第三类:审计与附件数据,决定迁移后的“证据力”
第三类数据是我认为企业级 Jira 迁移里最被低估、最容易被战略放弃、但放弃后代价极高的一类:审计与附件数据。
审计与附件数据不直接决定系统能不能启动,也不在第一时间影响用户操作体验。但它决定了你的 Jira 在合规层面还有没有“法律证据效力”。
我接触过的金融、保险、医疗客户,对这类数据的敏感度远高于一般科技公司。因为对这些企业来说,Jira 不只是一个研发管理工具,它同时也是审计追踪体系的一部分。ISO 9001、CMMI、SOC2、各种内控流程都可能引用 Jira 里的 Issue 变更历史和附件作为证据链。
如果在迁移过程中,这些历史记录丢失、被篡改或归因错误,那后果就不是用户体验的问题了,那是合规风险和法律责任的问题。
1. 完整的 Issue 变更历史是否被丢弃
这是审计类数据中最核心的一项。
每一条 Issue 的变更历史(Change History),在 Jira 数据库里是以 changegroup 和 changeitem 两张表存储的。它记录了谁、在什么时间、把什么字段从什么值改成了什么值。这个数据量通常极大,一个 7 年的系统,Change History 可能会占总数据量的 40% 以上。
有些团队为了加快迁移速度、降低 Cloud 存储压力,会提出一个“很有诱惑力”的方案:只迁移近 2 年的变更历史,2 年之前的老历史直接丢弃。
我对这个建议的态度非常明确:如果你的公司不属于强监管行业,且业务负责人书面确认放弃历史审计追溯,那么你可以这么做。否则,绝对不要碰历史数据。
我在帮一家医疗器械公司做迁移时,他们有一批 5 年前的 Issue,被审计机构用来证明某个缺陷的修复过程满足 FDA 21 CFR Part 11 的要求。如果当时我们扔掉了这批 Issue 的 Change History,他们面临的后果是重新取证,时间成本和信誉损失远超迁移节省的那点存储开销。
所以我的梳理清单里,硬杠杠地保留着一项:评估 Change History 的合规保留年限,并和法务/合规部门书面确认。
2. 迁移后“时间失真”和“帐号失准”的合规风险
审计数据有效的两个基本前提:时间戳准确,归属人准确。
但 Jira 迁移对这两点的破坏是系统性的:
我在一个有 SOX 合规要求的项目里,采取了非常保守的迁移策略:迁移前先对 Change History 做快照,生成一份“证明书”,包含完整的时间戳、操作人、变更内容。迁移完成后,再抽样 1000 条数据和快照做逐条比对。任何偏离超过 1 秒的时间戳,都起票跟进。
你可能觉得这是过度谨慎,但我看到的是:在 SOX 审计中,IT 系统的变更控制是必审项。Jira 迁移本身就属于“重大系统变更”,它自己就会成为审计对象。如果你能在迁移后出示一份清晰的“数据完整性校验报告”,审计员对你的信任度会大幅提升。
3. 附件作为证据链的处理原则
前文“流动性数据”部分已经提到了附件的技术风险,我现在从审计角度补充另外一个维度:附件在合规语境里,不是“文件”,是“证据”。
在医药、汽车、金融等领域,附件上可能承载着测试报告截图、缺陷复现录屏、审批邮件存档。这些附件一旦丢失、文件名变乱码、或者文件哈希值发生变化,就被视同“证据灭失”。
关于附件证据力的保持,我在实操中给自己定了一条硬规矩:迁移前后对所有附件做哈希校验,并保留校验报告。
做法不复杂:导出一份所有附件的文件名、所属 Issue、存储路径和 SHA-256 哈希值。迁移完成后,用相同逻辑重新生成一份哈希值列表,做差异对比。任何差异必须被解释,是允许的格式转换(比如部分 Cloud 迁移工具会对图片做压缩),还是非预期的文件损坏。
这个动作工作量不算大,但它产生的那份《附件完整性校验报告》,在合规审计面前是我见过的最好用的“武器”。
4. 历史 Sprint 数据与 Agile Board 的迁移取舍
Sprint 数据属于某种“半审计半业务”的特殊数据。它不算严格的法律证据,但它对团队的研发效能度量、历史交接和绩效评估极其重要。
遗憾的是,Jira Cloud Migration Assistant 对 Sprint 数据的迁移支持一直不太完善。在 Server 到 Cloud 的迁移场景里,你大概率会面临以下取舍:
我现在的做法是:在迁移前,用 Jira REST API 把每个 Board 的 Sprint Report 导出成 PDF 或 CSV,作为静态历史档案保存。同时在 Cloud 上重建 Board 时,只恢复最近 6 个月的活跃 Sprint,超过 6 个月的 Sprint 数据不再激活,但保留在 Issues 的 Sprint 字段里以备查询。
这本质上是一次战略性的“主动放弃”,但它是经过信息保存和业务确认之后的放弃,和那些“不知道数据会丢所以丢了”的被动放弃有本质区别。

七、专业判断逻辑:梳理不是做加法,是做风险评估
前面花了大量篇幅讲三类数据“要梳理什么”,但有一个更根本的问题必须先回答:梳理到什么程度才算够?
如果无差别地对所有数据进行最细颗粒度的清理,那 Jira 迁移的成本会变得无限大。我曾经陷入过这种“完美主义的陷阱”,在第一、二次迁移时试图把所有问题都消灭,结果梳理阶段就花掉了项目总预算的 60%。上线后发现,有些我费了大力气清理的数据,用户根本不在乎。
后来我总结出一套“三层风险评估模型”,用来决定每一项梳理动作要做到多深。
1. 红线层:直接阻断迁移,必须 100% 清理
红线层问题有一个清晰的定义:只要存在,就会导致迁移工具报错、导入 job 中断或数据丢失的所有已知条件。
这类问题不在“商量”范围内,必须无条件清理。包括但不限于:
对红线层问题,梳理的目标就是“100% 识别,100% 修复”。不要存有任何侥幸心理,因为迁移工具是无情的。
2. 黄线层:不影响导入,但影响业务连续性,必须做影响评估
黄线层问题是那些“导得进,但用起来有问题”的问题。这包括大部分流动性数据问题:富文本失真、链接断裂、附件名乱码、部分 Sprint 数据丢失等。
对黄线层问题,我不追求 100% 修复。我的目标是:100% 识别,100% 披露,按优先级选择性修复。
识别是为了确保没有意外的“静默丢失”,披露是为了让业务方做出知情决策(informed decision)。至于修不修、修多少,取决于业务影响。
举例来说,如果一个项目只有 2% 的 Comment 存在 @Mention 失效,而该项目的用户明确表示“没关系,我们不需要历史通知”,那你就不该在这个问题上继续投入时间。
3. 绿线层:不影响业务,影响整洁度,属于迁移优化项
绿线层是那些“系统运行正常,但不整洁”的问题。比如僵尸字段过多、废弃的 Screen Scheme 没清理、无用的 Workflow 仍在库中。
这类问题在资源充足时做,资源紧张时可以战略放弃。但我要提醒一句:绿线层问题是负债,不是资产。你今天不处理它,它在未来每一次系统维护时都会消耗你额外的精力。迁移是清理负债最好的窗口,我通常建议“能做尽做,但不作为项目阻塞项”。
这套三层逻辑让我在后续的迁移项目中更从容了:我不再被“清理不完”的焦虑压倒,因为我知道哪些是必须清理的、哪些是可以披露后交由业务方决策的。

八、具体案例:同样规模,有人延期 6 周,有人提前 1 周上线
光讲理论还不够,我想把上述框架在两个真实案例中的表现做一个并列对比。这两家公司规模相近,都是在 2023 年执行 Jira Server 到 Cloud 的迁移,但结果截然相反。
案例 A:未做数据结构化梳理,延期 6 周
这家公司在迁移前采用的就是我之前批评过的“试迁移驱动”策略。他们的动作顺序如下:
复盘时,他们自己总结最大的问题是“不断试错,发现一个问题改一个,越改越发现新的问题,完全没有全局风险判断”。
案例 B:采用“三类数据梳理”框架,提前 1 周上线
第二家公司找到我时,我坚持要求:在运行第一次试迁移之前,先完成为期 3 周的数据梳理 Sprint。他们的 CTO 一开始非常抗拒,觉得这是在“浪费时间”,但最终因为我的坚持(以及展示了之前项目的失败数据)而同意执行。
我们严格按配置型、流动性、审计与附件的顺序做梳理:
3 周梳理结束之后,我们跑第一次试迁移,一次成功。没有 Workflow 报错,没有字段缺失,用户映射全部通过。接下来的 UAT 阶段只发现了 12 个小问题,且全部在黄线层范畴内,快速修复后切换。最终比原计划提前 1 周上线。
区别不在于技术能力,而在于是否把“数据梳理”当作一个独立的、必须前置完成的工程阶段来对待。第一家公司的管理员非常优秀,但他的工作被“不断救火”消耗殆尽。第二家公司的管理员不见得更强,但他的时间被投入在了正确的前置准备上。
所以我要强调的结论不是“梳理可以让迁移更顺利”,这太弱了。我想强调的是:结构化梳理是迁移成功率的唯一可预测性变量。工具版本、网络带宽、插件兼容性这些变量你控制不了,但梳理这 3 类数据,是你能完全掌控且能直接作用于结果的事情。

九、不同情况的行动建议与取舍
上述所有讨论都有一个隐含前提:你是做“全量迁移”。但现实中的 Jira 迁移,有很多变种。不同的迁移目的、系统规模、合规要求,决定了你在这 3 类数据梳理上的投入力度应该有所不同。
我根据过去处理过的场景,总结出三种典型情况,并给出针对性的
常见问题解答(FAQ)
1. 迁移前如何确认数据库和附件目录的完整性?
我准备把Jira从旧服务器迁到新机器,网上教程都只说备份数据库和data目录,但我上次迁移就踩了坑:备份文件虽然拷过去了,但恢复时发现个别附件损坏,某个自定义字段的配置在导出的SQL里丢失了。我想知道,怎么在动手迁移前就确认这些物理数据是完整的、可用的?有没有什么实战验证方法?
这个问题我吃过两次亏才彻底搞明白。第一次迁移时我直接停服打了tar包,结果在新环境恢复后发现附件数对不上,旧服务器上有3.2万个附件,新环境只显示3.1万个,差的那一千个恰好是刚上传还没落盘的文件。
第二次我学乖了,总结了三个验证步骤:第一步,停服后用Jira内置的备份功能(系统→备份)生成一个zip文件,这个包里包含了数据库dump和data索引,但它的最大问题是附件超过500MB就会失败(我遇到过),所以大附件场景建议手动操作。
第二步,手动备份时,先执行mysqldump --single-transaction --routines --triggers > jira_backup.sql,然后用mysqlcheck -o检查表完整性,输出里不能出现Error或Warning。
第三步,附件目录用du -sb记录总大小,再用find . -type f | wc -l数文件数,在新环境恢复后做一次对比。我的血泪教训是:如果原来Jira用了超过3年,附件目录里可能混有残留的临时文件,最好用fdupes去重一遍再打包,能省下至少10%的传输时间。
2. 迁移前为什么非要梳理工作流和自定义字段方案?
我们团队计划从Jira Server迁移到Data Center,我觉得直接把现有的项目、工作流、字段一股脑导入新环境就行,但同事说一定要先梳理逻辑配置。我不理解为什么?工作流方案、字段方案在旧环境能用,到新环境不也一样能用吗?梳理这个不是浪费时间吗?
说一个我亲身经历的真实案例:某互联网金融公司迁移Jira,原系统有87个工作流方案,其中12个是两年前为某个实验项目创建的,项目早已停止但方案没有被删除。迁移后新环境的Jira启动缓慢,加载项目列表需要30秒以上,后台错误日志显示系统每次都在尝试解析那些僵尸方案里的过渡条件。
我们花了3天时间才定位到原因。梳理工作流方案的实质是降低新系统的配置复杂度:你需要统计每个工作流方案的关联项目数,把对零项目的方案标记为“待归档”;
另外,我建议在迁移前做一个“字段合并”,例如旧系统里有“产品线”“业务线”“Line of Business”三个字段,实际80%的项目只用“产品线”,那就把另外两个字段的数据迁移到“产品线”里,再删除冗余字段。
这一步最好用Jira的“字段配置方案”中的“隐藏”功能测试一个月,确认没有团队抱怨再正式清理。我手头的数据显示,经过这种梳理后,新系统的响应性能平均提升20%-35%,而且后续的项目管理员维护成本也降低了。
3. 哪些历史数据应该舍弃而不是迁移?
我们公司的Jira用了6年,有400多个项目,其中至少一半已经两年以上没有活动了。老板说全量迁移,但我担心把那些僵尸Issue也带过去,新系统会变得又慢又乱。我该怎么跟老板解释哪些数据该扔?有没有具体的筛选标准?
所有实战过Jira迁移的人都告诉你“全量迁移是最大的谎言”。我见过一个案例:某电商公司全量迁移了120万个Issue,结果新环境里有效Bug只有30万个,其余90万全是测试数据、重复提交和已关闭的老需求。
迁移后每执行一次全局检索,数据库都要扫描那90万条垃圾数据,导致前台响应时间从1.2秒飙升到4.7秒。我的建议是使用JQL提前打标筛选:第一类,项目维度:统计近12个月内有任何Issue更新的项目,其余项目只迁移它们的Scheme(字段方案、工作流方案),Issue数据可以导出存档但不入新库。
第二类,Issue维度:执行resolution in (Unresolved) AND createdDate >= -365d保留活跃的未解决项;对于已解决的,只保留最近6个月的。第三类,附件维度:所有超过5年且状态为Closed的Issue的附件,记录路径到Excel,迁移时跳过。
我用这个方法帮一家公司从35万Issue筛到只迁8万,新环境数据库大小从55GB降到12GB,索引重建时间从6小时缩短到40分钟。核心话术是告诉老板:不清理脏数据,新系统一样会慢,而且迁移时长会增加3-5倍,停机窗口不够用。
4. 如何制定一个最小化中断的Jira迁移计划?
公司要求我们在一个周末(48小时内)完成Jira Server迁移,Team一直担心时间不够。我看网上教程都是讲怎么备份恢复,但没人讲具体的分阶段执行计划。比如是先迁移配置再迁数据,还是全量搬完再调试?有没有经过验证的流程能保证周一早上正常使用?
我主导过三次小窗口迁移(最长60小时),总结出一个“两阶段三步走”框架,可以稳定控制在40小时内。第一阶段(周五晚10点停服~周六晚8点):只迁移配置数据。把工作流方案、权限方案、字段配置、通知方案导出为XML,在新环境恢复。
这一步的核心是验证配置完整性,我会写一个测试脚本,自动创建10个不同类型的项目,跑通从创建到关闭的流程,检查权限是否遗漏。第二阶段(周六晚8点~周日下午6点):迁移业务数据。使用Jira自带的“项目导入”功能,按项目组分批导入,优先导入活跃项目。
这里的关键是附件处理:提前将附件目录用rsync同步到新服务器并比对MD5,比压缩传输快3倍。第三阶段(周日下午6点~周一早9点):切流和监控。修改DNS或负载均衡指向新服务器,然后进行全员灰度测试。
我习惯在周一早7点前跑一个全量SQL统计:Issue总数、项目数、用户数、最后24小时更新数,与旧系统快照比对,误差超过0.5%就立刻回滚。我最后一次迁移的数据:400个项目、28万Issue、15万附件,实际用时38小时,周一当天0用户报障。核心原则是“配置先跑通,数据分批入,指标不过夜”。
文章包含AI辅助创作:jira迁移前先梳理这3类数据,发布者:fiy,转载请注明出处:https://worktile.com/kb/p/3975325
微信扫一扫
支付宝扫一扫
读者评论
作为项目经理,看完这篇文章后背发凉。我们正在计划把100人的研发团队从Server迁到Cloud,之前一直盯着时间线和插件兼容性,根本没意识到数据梳理才是最大的坑。作者提到的‘死亡行军’延期6周、超支40多万的案例太真实了,如果事前不做三层数据梳理,迁移后才发现引用断裂和静默丢失,修复成本比延期还可怕。明天就拉着技术团队按文中的‘三态清理法’盘一遍自定义字段,至少能省下至少2周的回头路。
干了5年Jira运维,作者说的‘幽灵引用’和‘试迁移驱动’的误区我全踩过。去年一次迁移,我们跑了4轮试迁移都通过了,结果上线后Workflow走不通,排查3天才发现是旧插件残留的字段在Cloud里被静默丢弃了。文章里那组对比图我直接转发给老板了,‘三类数据梳理’对幽灵引用的识别率92%,而我们之前只靠试迁移完全是0%。现在终于知道为什么8成的迁移延期根因在脏数据。
最让我拍案的是作者对‘数据债务转移’的洞察。我们公司用了6年Jira Server,中间换过3次插件、合并了2次项目,Issue Key还重置过。之前总觉得数据能导过去就行,没想过Comment里的旧链接、离职人员的默认经办人配置全是炸弹。文中提到的‘配置型/流动性/审计与附件’三层分类,比任何官方的迁移指南都接地气。接下来我打算按这个框架手动做一个数据健康清单,宁可多花一周梳理,也不愿上线后出事故。