问题概述
客户准备使用逻辑导入导出方式进行数据迁移,从3.1.0版本迁移到另一套3.1.0版本,执行gs_dumpall命令备份时报错
pw_dump: [port='17700'] [dbname='app_information_db'] [archiver (db)] [2025-06-22 00:17:10] query failed: ERROR: current transaction is aborted, commands ignored until end of transaction block, firstChar[Q]
pw_dump: [port='17700'] [dbname='app_information_db'] [archiver (db)] [2025-06-22 00:17:10] query was: SELECT pg_attrdef.tableoid, pg_attrdef.oid, pg_attrdef.adnum, pg_catalog.pg_get_expr_nocoll_b(adbin, adrelid)AS adsrc, adgencol AS generatedCol, pg_catalog.pg_get_expr(adbin_on_update, adrelid) AS adsrc_on_update FROM pg_catalog.pg_attribute inner join pg_catalog.pg_attrdef on attrelid = adrelid and adnum = attnum WHERE adrelid = '200982697'::pg_catalog.oid
问题原因
执行上面报错sql pg_catalog.pg_get_expr_nocoll_b,当执行内部sql SELECT pg_attrdef.tableoid, pg_attrdef.oid, pg_attrdef.adnum, pg_catalog.pg_get_expr_nocoll_b(adbin, adrelid)AS adsrc, adgencol AS generatedCol, pg_catalog.pg_get_expr(adbin_on_update, adrelid) AS adsrc_on_update FROM pg_catalog.pg_attribute inner join pg_catalog.pg_attrdef on attrelid = adrelid and adnum = attnum WHERE adrelid = '200982697'::pg_catalog.oid时报缺失函数pg_catalog.pg_get_expr_nocoll_b
经查看发现该环境里确实没有函数pg_catalog.pg_get_expr_nocoll_b。
正常的一套3.1.0版本是有pg_catalog.pg_get_expr_nocoll_b函数的,执行上面的sql也不会报错。
经和客户确认,该环境以前是从另外一套2.0.2版本的库通过物理备份方式恢复出来的,由于版本不一致导致恢复出来的这套环境缺失了函数pg_catalog.pg_get_expr_nocoll_b。物理备份恢复需要在同版本数据库之间才能使用,正是由于客户之前不规范的操作,导致了此次问题的出现。
解决方案
在当前 310库,用gs_probackup做物理备份;
将物理备份通过gs_restore导入到一套新的 202库中;
在 202库,使用gs_dumpall逻辑备份导出;
将逻辑备份导入到目标 310库。




