2016-01-21 123 views
1

我有一张表,用于存储一些图像。最近我不得不运行一些测试,我必须删除所有表的行,然后再插入新的行,所以我不得不多次导入相同的图像。完成后,我注意到它占用了我的驱动器中的很多空间,所以我试着运行vacuumlo来回收这个空间,但没有发生任何事情。该程序已完成,无故障运行和一个消息,说vacuumlo不回收未使用的LOB占用的空间

或类似的东西“找到0对象”。我究竟做错了什么?

回答

1

docs say

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". 
+0

令人遗憾的是,AWS RDS目前尚未允许。但找到[这里](https://dba.stackexchange.com/q/174663/48347)我的解决方法,禁止。 – uprego