You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure PostgreSQL单服务器迁移Jira数据库至灵活服务器报错求助

问题:pgcopydb迁移Jira PostgreSQL数据库时序列大小写匹配错误

我正尝试将运行在Azure PostgreSQL单服务器上的Jira数据库迁移至新的灵活服务器,迁移过程中遇到pgcopydb报错:

pgcopydb failed with the errors: 2023-06-23 08:07:11 32 
ERROR pgsql.c:1892 Postgres result status is PGRES_FATAL_ERROR 2023-06-23 08:07:11 32 ERROR pgsql.c:1543 [SOURCE] 
ERROR: relation "jira.ao_0201f0_stats_event_param_id_seq" does not exist 2023-06-23 08:07:11 32 
ERROR pgsql.c:1548 SQL query: select has_sequence_privilege($1, $2); 2023-06-23 08:07:11 32 
ERROR pgsql.c:1549 SQL params: 'jira.AO_0201F0_STATS_EVENT_PARAM_ID_seq', 'select' 2023-06-23 08:07:11 32 
ERROR pgsql.c:1303 Failed to query privileges for sequence "jira.AO_0201F0_STATS_EVENT_PARAM_ID_seq" 2023-06-23 08:07:11 32 
ERROR cli_clone_follow.c:433 Failed to clone source database, see above for details 2023-06-23 08:07:11 28 
ERROR cli_clone_follow.c:696 clone process 32 has terminated [6]

我的数据库中存在报错提及的序列,但为大写形式(实际是jira.AO_0201F0_STATS_EVENT_PARAM_ID_SEQ)。为何会出现此问题?我在其他环境执行相同迁移操作未遇到异常。我曾尝试创建小写序列,但不认可该解决方案,是否有其他可行办法?


原因分析

  • PostgreSQL标识符大小写规则:未用双引号包裹的标识符会被自动转为小写存储和匹配;但如果创建对象时用了双引号(Jira创建AO系列表/序列时可能会这么做),对象名会保留大小写,此时必须用双引号才能正确引用。
  • pgcopydb逻辑缺陷:查询序列权限时,pgcopydb没有对带大小写的序列名添加双引号,导致PostgreSQL将参数中的序列名转为小写去匹配,而实际存在的是大写序列,因此触发“relation不存在”的错误。
  • 环境差异原因:其他环境未报错,大概率是因为那些环境中的序列创建时未使用双引号(自动转为小写),或者使用的pgcopydb版本不同,大小写处理逻辑有差异。

可行解决方案

方案1:修改pgcopydb权限查询逻辑(临时修复)

找到pgcopydb代码中执行has_sequence_privilege的位置(对应报错中的pgsql.c:1548行),将参数中的序列名用双引号包裹,修改后的SQL应为:

select has_sequence_privilege('"' || $1 || '"', $2);

重新编译pgcopydb后使用该版本执行迁移。

方案2:临时重命名序列(不影响原数据)

操作前先停止Jira服务,避免序列被使用:

  1. 将大写序列临时重命名为小写:
    ALTER SEQUENCE "jira.AO_0201F0_STATS_EVENT_PARAM_ID_SEQ" RENAME TO AO_0201F0_STATS_EVENT_PARAM_ID_seq;
    
  2. 完成迁移后,再改回原大写名称:
    ALTER SEQUENCE jira.AO_0201F0_STATS_EVENT_PARAM_ID_seq RENAME TO "AO_0201F0_STATS_EVENT_PARAM_ID_SEQ";
    

方案3:替换迁移工具

使用PostgreSQL官方工具pg_dump和pg_restore,它们能正确处理带双引号的大小写标识符:

# 导出源数据库
pg_dump -h <源服务器地址> -U <用户名> -d <数据库名> -F c -f jira_db.dump

# 导入到目标灵活服务器
pg_restore -h <目标服务器地址> -U <用户名> -d <目标数据库名> jira_db.dump

生产环境也可以使用Azure数据库迁移服务(DMS),该服务会自动处理标识符大小写问题,无需手动干预。

内容的提问来源于stack exchange,提问作者apasic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 08:57:52