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服务,避免序列被使用:
- 将大写序列临时重命名为小写:
ALTER SEQUENCE "jira.AO_0201F0_STATS_EVENT_PARAM_ID_SEQ" RENAME TO AO_0201F0_STATS_EVENT_PARAM_ID_seq; - 完成迁移后,再改回原大写名称:
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
相关产品推荐
相关产品推荐

