多くの大きなオブジェクトを含むデータベースがあります。テーブルには、これらの大きなオブジェクトを参照する列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/
)with filename = 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)
そして、それはファイルの終わりに達した後に停止しました。