我有一张表,用于存储一些图像。最近我不得不运行一些测试,我必须删除所有表的行,然后再插入新的行,所以我不得不多次导入相同的图像。完成后,我注意到它占用了我的驱动器中的很多空间,所以我试着运行vacuumlo
来回收这个空间,但没有发生任何事情。该程序已完成,无故障运行和一个消息,说vacuumlo不回收未使用的LOB占用的空间
或类似的东西“找到0对象”。我究竟做错了什么?
我有一张表,用于存储一些图像。最近我不得不运行一些测试,我必须删除所有表的行,然后再插入新的行,所以我不得不多次导入相同的图像。完成后,我注意到它占用了我的驱动器中的很多空间,所以我试着运行vacuumlo
来回收这个空间,但没有发生任何事情。该程序已完成,无故障运行和一个消息,说vacuumlo不回收未使用的LOB占用的空间
或类似的东西“找到0对象”。我究竟做错了什么?
vacuumlo是一个简单的实用程序,从PostgreSQL数据库中删除任何 “孤立” 大对象。一个孤立的大对象(LO)被认为是其OID不出现在数据库的任何oid 或lo数据列中的任何LO。
你可以手动检查orineins,加入pg_largeobject
对你所有的lo表格。例如:让我们创建几个LO表并用数据填充它们:
b=# create table l_o (n text, o oid);
CREATE TABLE
b=# create table lo (n text, p oid);
CREATE TABLE
b=# insert into l_o values('one',lo_import ('/tmp/wheel.PNG'));
INSERT 0 1
b=# insert into l_o values('two',lo_import ('/tmp/wheel.PNG'));
INSERT 0 1
b=# insert into l_o values('three',lo_import ('/tmp/wheel.PNG'));
INSERT 0 1
b=# insert into lo values('one',lo_import ('/tmp/wheel.PNG'));
INSERT 0 1
b=# insert into l_o values('two',lo_import ('/tmp/wheel.PNG'));
INSERT 0 1
现在检查orphains:
b=# with l_o as (select o,'l_o' tname from l_o union all select p,'lo' from lo)
b-# select distinct loid, o, tname
b-# from pg_largeobject left outer join l_o on l_o.o = loid;
loid | o | tname
-------+-------+-------
34530 | 34530 | lo
34528 | 34528 | l_o
34527 | 34527 | l_o
34529 | 34529 | l_o
34531 | 34531 | l_o
(5 rows)
无。现在用vacuumlo
:
b=# \! vacuumlo -v -n b
Connected to database "b"
Test run: no large objects will be removed!
Checking o in public.l_o
Checking p in public.lo
Would remove 0 large objects from database "b".
相同。现在,重现你的情况 - 降,重建和填充一个表上:
b=# drop table lo;
DROP TABLE
b=# create table lo (n text, p oid);
CREATE TABLE
b=# insert into lo values('one',lo_import ('/tmp/wheel.PNG'));
INSERT 0 1
空运行:
b=# \! vacuumlo -v -n b
Connected to database "b"
Test run: no large objects will be removed!
Checking o in public.l_o
Checking p in public.lo
Would remove 1 large objects from database "b".
检查pg_largeobject
:
b=# with l_o as (select o,'l_o' tname from l_o union all select p,'lo' from lo)
select distinct loid, o, tname
from pg_largeobject left outer join l_o on l_o.o = loid;
loid | o | tname
-------+-------+-------
34528 | 34528 | l_o
34531 | 34531 | l_o
34550 | 34550 | lo
34527 | 34527 | l_o
34529 | 34529 | l_o
34530 | |
(6 rows)
是 - 一个orphain(以下简称 “罗”表格有一行,滴下并重新填充成一行orphain)
run vacuumlo
修复它:
b=# \! vacuumlo -v b
Connected to database "b"
Checking o in public.l_o
Checking p in public.lo
Successfully removed 1 large objects from database "b".
检查结果:
b=# with l_o as (select o,'l_o' tname from l_o union all select p,'lo' from lo)
select distinct loid, o, tname
from pg_largeobject left outer join l_o on l_o.o = loid;
loid | o | tname
-------+-------+-------
34528 | 34528 | l_o
34531 | 34531 | l_o
34550 | 34550 | lo
34527 | 34527 | l_o
34529 | 34529 | l_o
(5 rows)
是 - 全部清除。并且现在使用vacuumlo
进行检查:
b=# \! vacuumlo -v -n b
Connected to database "b"
Test run: no large objects will be removed!
Checking o in public.l_o
Checking p in public.lo
Would remove 0 large objects from database "b".
令人遗憾的是,AWS RDS目前尚未允许。但找到[这里](https://dba.stackexchange.com/q/174663/48347)我的解决方法,禁止。 – uprego