Postgresql

Postgresql - pg_largeobject 表中存在大對象但無法使用 lo_open 打開?

  • March 30, 2022

我在 postgresql 9.2 版中打開大對象時遇到問題,

select * from pg_largeobject where loid = '19423';

將返回如下​​數據:

loid oid;page no integer;data bytea
19423;0;"<Comment>ripple height</Comment><Units>meter</Units><Model>TRIM2</Model><Title>Results of TRIM model (Hartmut Kapitza): bottom temperature, bottom salinity, bed shear stress generated by currents. Results of WAM model (Heinz Guenther, Ralf Weisse): bed she (...)"

但是,當我嘗試打開

select lo_open(19423, x'40000'::int);

它返回錯誤:

ERROR: large object 19423 does not exist
SQL state: 42704

此查詢的結果:

select * from pg_largeobject_metadata where oid = 19423

為空:lomowner oid;洛馬替尼

$$ $$ Postgresql中的這種錯誤是什麼?我對此一無所知。數據是從 1 個 postgresql 轉儲 .sql 文件中恢復的。

使用以下命令從轉儲中恢復大對象:

COPY pg_largeobject (loid, pageno, data) FROM stdin;

問題是這還不夠,因為從 PostgreSQL 9.0 開始,它增加了對大對象的訪問權限,它們被儲存在兩個表中: pg_largeobject_metadata,每個對像一行和一個唯一索引 on oid,和pg_largeobject,每頁數據一行每個對象。

所以上述傾倒大對象的方式已經過時了,現在看起來,對於每個大對象:

BEGIN;
SELECT pg_catalog.lo_open('16401', 131072);
SELECT pg_catalog.lowrite(0, '\x23207e2f2e6261736872633a2....')
SELECT pg_catalog.lo_close(0);
COMMIT;

如何解決中缺少條目的問題pg_largeobject_metadata

因為oid是系統列,所以我認為您不能僅將其插入以手動創建缺少的條目。處理該問題的一種干淨方法是根據 的目前內容生成類似於上述的腳本pg_largeobject,然後 truncate pg_largeobject,然後播放腳本以正確方式重新導入數據。

備份數據庫時,請選中“使用 Oids”。當您再次恢復數據庫時,它將具有對象 ID(我想)這是我所做的並且已修復,我使用“使用 Oids”選項將其備份,當恢復時一切正常。:)

引用自:https://dba.stackexchange.com/questions/224220