Postgresql

pg_restore 不恢復 blob

  • November 11, 2015

我有一個包含許多大對象的數據庫。表具有引用這些大對象的列 OID。我每天使用以下命令轉儲數據庫,包括所有大型對象:

pg_dump --format=c --file=/var/backups/pgsql/db-neos.pgdump \
 --compress=6 --blobs neos

然後我在另一台機器上用命令恢復它:

createdb neos
pg_restore -d neos /mnt/db-neos.pgdump

但是,雖然所有表都正確創建,但大對象卻沒有。

相反,pg_restore 會顯示一條錯誤消息:

pg_restore: [compress_io] decompressione dei dati fallita: (null)
(english: could not uncompress data) 

幾個月前我遇到了同樣的問題,我已經設法用 bash 腳本解決了這個問題。這段程式碼負責備份大型對象,並將其保存到本地文件夾 ( /path/to/destination/lo/folder/),文件名 = oid(文件名很重要,以便使用相同的 oid 恢復 lo):

echo -e "going to export largeobjects belonging to community $i..." && sleep 2
psql -U <username> -X -c "SELECT file_oid FROM <my_table>" \
   --single-transaction \
   --set AUTOCOMMIT=off \
   --set ON_ERROR_STOP=on \
   --no-align \
   -t \
   --field-separator ' ' \
   --quiet \
   -d <my_source_db> \
| while read file_oid ; do
   echo "Exporting largeobject OID: $file_oid"
   ${PSQL} -d <my_source_db> -c "SELECT lo_export($file_oid, '/path/to/destination/lo/folder/$file_oid');"
done

然後為了恢復它們,我編寫了另一段程式碼:

echo "going to import largeobjects belonging to community $i..." && sleep 2
LOBJECTS=/path/to/destination/lo/folder/*
for f in $LOBJECTS
do
   echo "Processing $f file..."
   filename=$(basename "$f")
   oid=${filename}

   psql -U <username> -d <my_source_db> -c"
   -- check if largeobject is already present, if it is delete it
   SELECT lo_unlink(${oid});"

   psql -U <username> -d <my_source_db> -c"
   -- import largeobjects
   SELECT lo_import('$f', ${oid});
   "
done

那裡可能存在一個更簡單的解決方案,但當時我無法找到它,這就是使用這種方法的原因。我希望你會更幸運並找到更清潔的解決方案。我會關注這篇文章,以防我也能學到一些有用的東西:)

我發現了問題:轉儲文件已損壞,因此在導入大對象時,pg_restore 失敗並顯示消息:

pg_restore: ripristino del large object con OID 19659
pg_restore: ripristino del large object con OID 19660
pg_restore: [compress_io] decompressione dei dati fallita: (null)

並在到達文件末尾後停止。

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