Postgresql
pg_restore 不恢復 blob
我有一個包含許多大對象的數據庫。表具有引用這些大對象的列 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)
並在到達文件末尾後停止。