瀚高数据库
目录
环境
症状
问题原因
解决方案
环境
系统平台:Linux x86-64 Red Hat Enterprise Linux 7
版本:6.0
症状
迁移数据还原数据库时报错
ERROR: tables declared WITH OIDS are not supported
问题原因
Postgresql12后取消了OIDS=TRUE的用法。
解决方案
修改脚本中的语句
脚本中出现OIDS=TRUE的情况有两种,一种是
set default_with_oids= true;
这种情况下删除这这行语句即可,也可以无视,新版本默认default_with_oids= true,报错后不会影响数据。
另一种是
create table test(id int,name varchar(100)) with(OIDS=true);
这种sql语句需要将“with(OIDS=true)”从语句中删除。否则的话创建报的操作将失效。
参考资料:
postgresql11的描述:
WITH ( storage_parameter [= value] [, … ] )
这个子句为一个表或索引指定可选的存储参数,详见存储参数。一个表的WITH子句还可以包括OIDS=TRUE(或者只包括OIDS)来指定新表的行应该具有被分配的 OID(对象标识符),或者包括OIDS=FALSE来指定新表的行不具有 OID。如果没有指定OIDS,默认设置取决于default_with_oids配置参数(如果新表是从任何具有 OID 的表继承而来,那么即使该命令要求OIDS=FALSE也会强制使用OIDS=TRUE)。
如果指定或者蕴含了OIDS=FALSE,新表就不会存储 OID 并且对插入其中的一个新行不会分配 OID。这通常值得考虑,因为它将减少 OID 消耗并且因而推迟 32 为 OID 计数器的回卷。一旦计数器回卷,OID 就不再能被假定为唯一,这就使它们不那么有用了。另外,从一个表中排除 OID 可以减少存储该表所需的磁盘空间,减少的量是每行减少 4 字节(在大部分机器上),这也略微提高了性能。
要在表被创建后从中移除 OID,使用ALTER TABLE.
postgresql12的描述:
WITH ( storage_parameter [= value] [, … ] )
这个子句为一个表或索引指定可选的存储参数,详见存储参数 。 为了向后兼容性,表的WITH子句还可以包括OIDS=FALSE以便指定新表的行不应包含 OIDs (对象标识符),OIDS=TRUE不再受支持。