天天看点

PG7.3的dump文件恢复出错

今天遇到个Case。PG7.3的dump数据在PG8.1上恢复。结果报错。就像下面这样:

psql  mydb

...

ERROR:  invalid type name "tb1.id%TYPE"

CONTEXT:  compile of PL/pgSQL function "myfunc" near line 7

我没有那个dump文件,根据错误消息判断原因应该这样的:

函数myfunc的定义中引用了"tb1.id%TYPE",但在db.sql中表tb1的定义语句在函数myfunc定义的后面,导致创建myfunc函数的SQL语句执行失败。

我试图在我自己的环境(PG9.2)再现这个问题,结果dump文件中表定义真的可能出现在函数定义的后面,但是恢复时却成功了。后来发现原来PG9.2的pg_dump生成的dump文件开头有下面一个参数设置,

check_function_bodies = false

通过这个参数可以在恢复时忽略函数定义的检查,也就回避了函数定义对表定义(或其他定义)依赖的问题。再查一下手册,PG7.3中没有这个参数,所以可以确定PG7.3生成的dump文件中没有设置check_function_bodies,因此就有可能出现函数定义在恢复时失败的问题。