我们有一个简单的表my_table
:
id (int) -> primary key
object_id (Large Object)
不幸的是,我们的一个承包商对表my_table
的object_id
列中的大型对象的id运行了lo_unlink
。
大对象ID还在表中,但是关联的大对象已经不存在了:
ERROR: large object 10268782 does not exist
SQL state: 42704
我们每天晚上用pg_dump
做备份。
如何用pg_restore
还原大对象?
实际上,我们不需要恢复所有的表,甚至不需要恢复具有LOB ID的表(因为ID仍然是定义的),而只需要从转储中重新加载大对象到数据库中。
pg_restore
有一个选项:
--data-only
Restore only the data, not the schema (data definitions). Table data, large objects, and sequence values are restored, if present in the archive.
,但我们不想恢复表数据或序列值。只有大物件。
谢谢
要仅从纯文本格式的非转储中恢复大对象,可以执行以下操作:
-
创建目录表;转储文件:
pg_restore --list --file=tocfile dumpfile
-
编辑
tocfile
,删除除BLOBS
外的所有行,例如4353; 0 0 BLOBS - BLOBS
-
现在只能恢复大的对象:
pg_restore --use-list=tocfile --dbname=proddb dumpfile
这将覆盖数据库中的所有大型对象。如果您只想恢复某些大型对象,则没有简单的方法。您可以通过使用--file=lobs.sql
而不是--dbname=proddb
来运行最终的pg_restore
来将SQL语句写入文件,这将创建一个包含所有大型对象的SQL脚本。您必须手动编辑该文件以提取所需的对象:^/