Postgresql
Postgresql - pg_largeobject 表中存在大對象但無法使用 lo_open 打開?
我在 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
,然後 truncatepg_largeobject
,然後播放腳本以正確方式重新導入數據。
備份數據庫時,請選中“使用 Oids”。當您再次恢復數據庫時,它將具有對象 ID(我想)這是我所做的並且已修復,我使用“使用 Oids”選項將其備份,當恢復時一切正常。:)