pg_largeobject巨大,但没有表具有OID列类型



postrgresql-noob,PG 9.4.x,无法访问应用程序代码、开发人员、任何了解它的人

用户数据库CT有427GB的pg_largeobject(PGLOB(表,其次是500ish MB。

根据这篇文章(Postgresql内部使用PGLOB吗?(一位声誉良好的成员表示,Postgresql内部不使用PGLOB。

我已经查看了数据库中所有用户表的模式,没有一个是OID(或lo(类型的,OID是PGLOB行用于将blob块集合绑定回引用表行的值。我认为这意味着我不能使用vacuumlo(vacuumlo(来删除孤立的PGLOB行,因为该实用程序在用户表中搜索用户对象中的这两种数据类型。

我已经确定了一个具有整数字段类型的表,该表的int值与PGLOB中的LOID值相匹配。这似乎表明开发人员以某种方式使用存储在用户表行中的整数值将他们的Blob放入PGLOB中。

问:最后一句话可能吗?

A( 如果不是,是什么将所有这些数据添加到PGLOB表中?

B( 如果可能的话,有没有一种方法可以用程序搜索所有表中可能表示PGLOB中行的整数值?

需要:我迫切需要减小PGLOB表的大小,因为我们的磁盘空间已经用完了。不,我们不能为每个管理员向现有磁盘添加空间。因此,我需要以某种方式确定PGLOB中是否有LOID值作为整数类型字段不存在于任何用户表中,然后运行lo_unlink来删除这些行。这可以让我在表格中获得更多可用的8K页面。

顺便说一句,我还在PGLOB上运行了pg_freespace,它发现PGLOB中的大多数页面都没有足够的空间来插入另一个blob块。

感谢您的帮助!

不是一个真正的答案,但要大声思考:

正如您所发现的,所有大型对象都存储在一个表中。您引用的oid字段是添加到表中的内容,这样您就可以在pg_largeobject中有一个指向特定LOoid的指针。也就是说,没有什么可以强迫你将信息存储在表中,你可以在pg_largeobject中创建LO。从外观上看,只是猜测,开发人员将oid存储为integer,目的是执行integer::oid以根据需要取回特定的LO。我会查看该表中存储的其他信息,看看是否有助于确定LO的用途?

此外,您可以将integer::oid值与pg_catalog中的oid(loid(连接起来,看看该表是否涵盖了所有值?

我能够对数据库中的所有用户表进行详细分析,找到包含不带小数的数字数据的所有列,然后使用NOT EXISTS子句从pg_largeobject中对每个与用户表中相应字段匹配的pglob.loid表进行查询。

我从PGLOB表中找到了25794个可以删除的LOID,总共340万行。

select distinct loid
into OrphanedBLOBs
from pg_largeobject l
where NOT exists (select * from tbl1 cn where cn.noteid = l.loid)
and not  exists (select * from tbl1 d where d.document = l.loid)
and not  exists (select * from tbl1 d where d.reportid = l.loid)

我使用该表为每个loid执行lo_unlink(loid(。

最新更新