从 PostgreSQL 数据库中删除所有大对象
Delete all Large Objects from PostgreSQL database
我正在尝试从 PostgreSQL 数据库中删除所有大对象。
我们使用大型图像数据集。最初,这些在 postgres 中存储为大对象,连同它们的元数据。我正在将这些数据库转换为仅存储对图像的文件系统引用,以便更好地管理数据库与图像数据有时会发生冲突的磁盘需求。
导出所有大对象、创建对它们的引用并进行测试后,我准备删除大对象。
我尝试编写一个函数来删除所有这些,但无济于事。这似乎可行,但由于并非范围内的每个数字都对应于一个大对象,因此它倒下了。
CREATE OR REPLACE FUNCTION "DeleteLOs"() RETURNS INTEGER AS
$$
DECLARE
BEGIN
FOR i IN 1620762..1801116 LOOP
SELECT lo_unlink(i);
END LOOP;
RETURN 0;
END;
$$
LANGUAGE plpgsql;
理想情况下,我可以将这样的函数与一个查询配对,以确保我得到所有这些,而不是指定一个可能不完整的范围:
SELECT DISTINCT loid FROM pg_largeobject
要删除数据库中 所有 个现有大对象:
SELECT lo_unlink(l.oid) FROM pg_largeobject_metadata l;
关于 dba.SE 的相关回答有更多详细信息:
Erwin Brandstetter 的回答是这样实现的:
SELECT lo_unlink(l.oid) FROM pg_largeobject_metadata l;
vacuum full
cluster
我正在尝试从 PostgreSQL 数据库中删除所有大对象。
我们使用大型图像数据集。最初,这些在 postgres 中存储为大对象,连同它们的元数据。我正在将这些数据库转换为仅存储对图像的文件系统引用,以便更好地管理数据库与图像数据有时会发生冲突的磁盘需求。
导出所有大对象、创建对它们的引用并进行测试后,我准备删除大对象。
我尝试编写一个函数来删除所有这些,但无济于事。这似乎可行,但由于并非范围内的每个数字都对应于一个大对象,因此它倒下了。
CREATE OR REPLACE FUNCTION "DeleteLOs"() RETURNS INTEGER AS
$$
DECLARE
BEGIN
FOR i IN 1620762..1801116 LOOP
SELECT lo_unlink(i);
END LOOP;
RETURN 0;
END;
$$
LANGUAGE plpgsql;
理想情况下,我可以将这样的函数与一个查询配对,以确保我得到所有这些,而不是指定一个可能不完整的范围:
SELECT DISTINCT loid FROM pg_largeobject
要删除数据库中 所有 个现有大对象:
SELECT lo_unlink(l.oid) FROM pg_largeobject_metadata l;
关于 dba.SE 的相关回答有更多详细信息:
Erwin Brandstetter 的回答是这样实现的:
SELECT lo_unlink(l.oid) FROM pg_largeobject_metadata l;
vacuum full
cluster