vacuumlo

PostgreSQL大对象的清理

旧时模样 提交于 2019-11-30 09:42:38
系统使用了一款开源的cas单点登录系统,存储大对象的方式是lo,通常lo的性能会比bytea要好一点,开发告知会定期清理用户数据,但是实际上发现系统并没有删除用户数据所关联的大对象数据。故需要写个脚本定期清理一下。 一、开发背景 DB: PostgreSQL 9.3.0 cas=# select oid,rolname from pg_authid where oid in (10,327299); oid | rolname -----+---------- 10 | postgres 327299| usr_cas (1 row) cas=# select lomowner,count(1) from pg_largeobject_metadata group by 1; lomowner | count ----------+-------- 10 | 292408 327299 | 382123 (2 row) 二、清理 需要清理两部分,postgres用户的大对象与usr_cas用户的大对象,前者是用postgres连接时创建的,需要全部删除,后者存在部分用户数据已删但大对象没删的数据,也需要删除。 1.lo_unlink删除 删除通常使用自带的lo_unlink()函数,于是使用了以下命令,但爆出问题 out of shared memory cas=# select