故障排查

工具不开始导出

提示信息 含义
give --db-url, or set RT_DATABASE_URL 没有指定数据库。
--db-url is not a database URL URL 无法解析。请写成 postgresql://USER:PASSWORD@HOST:PORT/DATABASE,密码中的特殊字符要做百分号编码。
--db-url names a ... database 只能读取 PostgreSQL、MySQL 和 MariaDB。不支持运行在 Oracle 或 SQLite 上的 RT。
the following arguments are required: --instance 需要为这套 RT 安装取一个名字,见 导出。
No queue 'X' in RT --queue 指定的队列在 RT 中不存在。请给出队列的准确名称或 id。
this database has no RT tables URL 指向的不是 RT 的数据库。
this is an RT older than 4.4 请先用 RT 自带的升级工具把 RT 升级到 4.4 或更高版本。
... already exists: choose a new path --out 指向了一个已完成的导入包,或一个含有其他文件的目录。请换一个新路径。
--external-storage-path ... is not a directory RT 外部存储的路径不正确。
--timezone ... is not a time zone name 请使用 Asia/Bangkok、Europe/Berlin 这样的时区名称。

导出失败

出现 export failed: ... 且退出状态为 1,表示导出未能完成;提示信息会说明原因(密码绝不会显示)。常见原因:

  • 连接被拒绝、超时、认证失败。 检查主机、端口和账户,并确认运行工具的机器能访问数据库端口。在 MySQL 上,该账户必须允许从运行工具的机器连接('rt_export'@'%',或该机器的地址)。
  • 长时间导出中连接被断开。 再运行一次同样的命令,它会替换掉未完成的导入包。可以改从副本库导出,或把数据库的空闲超时调到足够长。
  • Permission denied for table ...:账户无法读取 RT 的某张表。请对所有 RT 表授予 SELECT 权限。

附件缺失

清单(manifest)会说明缺失的数量和原因:

  • files in RT's external storage, not read:请提供 --external-storage-path(Disk 后端),或先把文件从其他后端复制成 Disk 后端的目录布局。见 导出。
  • files missing from RT's external storage:给出的目录不是该后端的根目录,或者目录中缺少文件。每个文件位于 <root>/<3 hex>/<3 hex>/<rest of the SHA-256>。
  • files that could not be decoded:RT 中的内容已损坏。消息本身的记录仍会被迁移。

文本显示不正确

  • 旧消息中出现乱码(ภาษา):RT 保存这些内容时所用的字符集,与消息部分声明的字符集不一致。工具会先按 UTF-8 尝试,再按声明的字符集尝试,除此之外没有其他依据。
  • 在 MySQL 上,所有非拉丁字符都变成 ?:数据库里存的本来就是问号,这是 RT 曾经向 latin1 表写入数据造成的。请在 RT 中核实,工具无法恢复这些字符。
  • 导入包中的纯文本出现反斜杠(\*、\#):这是 Markdown 防止字符被解析为格式标记的写法。Specivo 显示的仍是原始文本。
  • 某个数字变成了不该有的链接,或者反过来:参见 引用 中的规则。单独的 #123 只有在加上 --link-hash-numbers 时才会生成链接。

状态或优先级与 RT 中显示的不一致

  • 工具会列出 RT 数据库中没有任何生命周期描述的状态,并按名称归类。请用 --status-category-map 指定它们。在 RT 4.4 上,除 RT 默认生命周期以外的所有生命周期都属于这种情况。
  • 优先级名称来自 RT 5.0 和 6.0 的数据库设置,或 RT 的默认值(Low、Medium、High)。只在 RT_SiteConfig.pm 中设置的名称无法读取,此时数字会保留在每个工作项的 extra 中。

Specivo 报告警告

警告 处理方式
工作项上的 external_ref 引用或链接指向了同一 RT 另一个导入包中的工单。请用 --continue-import 把那个导入包也加载进来。
用户没有邮箱地址 在 RT 中没有邮箱的用户,在 Specivo 中会得到一个占位地址。
账户未激活 RT 中的非特权用户和已禁用用户,导入后处于锁定状态。
登录名已被占用 Specivo 会加上后缀,并把它列出来。

再运行一次

导出不会修改 RT,重复导出始终是安全的。只要 --instance 相同,重复加载同一个导入包不会重复创建已存在的内容。