PostgreSQL - 将列类型从 oid 改为 bytea 并保留数据

3
现在我正在开发一个应用程序,它使用hibernate + postgresql来持久化数据。我们需要存储多个可序列化的HashMaps,因此LOB(oid)被用于此目的。但由于postgresql中oid删除的一些问题,我们决定将这些数据存储为bytea而不是oid。所以问题是如何在保留旧数据的情况下将列类型从oid改为bytea?如果有人能提供一个适用于这种数据转换的工作脚本/解决方案,那就太好了。
谢谢您提前。

你尝试过使用 vacuumlolo 模块吗?它们应该在大多数情况下提供 LO 数据的自动管理。 - A.H.
是的,我们尝试过vacuumlo,但遇到了一个问题:由于我们在数据库上有高读写负载,vacuumlo无法完成对正在运行的数据库的清理,并失败了。 - Vladimir
很奇怪,因为与lo中的lo_manage触发器一起,这种管理应该在原始事务本身中发生 - 至少大部分时间是如此。当然,仅使用vacuumlo是不够的。 - A.H.
2个回答

3
我曾经遇到过同样的问题。所以我用创建缓冲列的方式进行了四个请求。
ALTER TABLE attachment add column content_bytea bytea
UPDATE attachment SET content_bytea = lo_get(content)
ALTER TABLE attachment drop column content
ALTER TABLE attachment rename column content_bytea to content

1

对于可序列化哈希映射,lobs可能不是正确的解决方案,除非您需要使用偏移量进行查找。Bytea更加干净。问题在于,您可能需要一些停机时间来切换事物。

我可能会创建一个新列并将数据复制过去,然后取消链接,最后删除旧列。然后运行适当的vacuum作业。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接