我是oracle dba,最近开始学习postgres数据库管理。在我们的一个postgres数据库中,pg_largeobject表的大小为30G,我想通过取消链接和清理数据库中任何表未使用的大对象来回收磁盘空间。为此,我想知道数据库中使用这些大对象的表。有任何查询或过程可以实现这一目标吗?
更新: 我尝试使用vacuumlo,但它返回0个要删除的对象。这意味着大对象不是孤立的,但是数据库中没有任何表引用pg_largeobject表中的大多数对象。那么为什么这些物体不是孤儿呢?
答案 0 :(得分:0)
通常,应用程序应取消链接不再需要的大对象,但在不需要的情况下,PostgreSQL附带了一个名为vacuumlo
的实用程序,可以完全满足您的要求。
说明:
vacuumlo是一个简单的实用程序,它将删除任何“孤立的” PostgreSQL数据库中的大型对象。一个孤立的大物体 (LO)被认为是其OID没有出现在任何oid中的任何LO 或lo数据库的数据列。
如果存在一个带有指向大对象的oid
的表,则可以通过此查询(PostgreSQL 9.0或更高版本)直接找到孤立的大对象:
select oid from pg_largeobject_metadata m where not exists
(select 1 from name_of_table where m.oid=name_of_oid_column);