如何识别在 postgres 中使用大对象的表?

Rav*_*ala 5 database postgresql

我是一名 oracle dba,最近开始学习 postgres 数据库管理。在我们的一个 postgres 数据库中,pg_largeobject 表有 30G,我想通过取消链接和清理数据库中任何表未使用的大对象来回收磁盘空间。为此,我想知道数据库中正在使用这些大对象的表。是否有任何查询或程序可以实现此目的?

更新:我尝试使用vacuumlo,但它返回0个要删除的对象。这意味着大对象不是孤立的,但数据库中没有任何表引用 pg_largeobject 表中的大多数对象。那么为什么这些对象不是孤立对象呢?

Dan*_*ité 4

通常,应用程序应该取消链接不再需要的大对象,但在不这样做的情况下,PostgreSQL 附带了一个名为的实用程序,vacuumlo它可以完全满足您的要求。

\n\n

描述:

\n\n
\n

vacuumlo 是一个简单的实用程序,它将从 PostgreSQL 数据库中删除任何 \xe2\x80\x9corphaned\xe2\x80\x9d\n 大对象。孤立大对象 (LO) 被视为 OID 未出现在数据库的任何 oid 或 lo 数据列中的任何 LO。

\n
\n\n
\n\n

如果有一个表指向oid大对象,则可以使用此查询直接找到孤立的大对象(PostgreSQL 9.0 或更高版本):

\n\n
select oid from pg_largeobject_metadata m where not exists\n (select 1 from name_of_table  where m.oid=name_of_oid_column);\n
Run Code Online (Sandbox Code Playgroud)\n