web-dev-qa-db-ja.com

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) 
2
eppesuig

私は数か月前に同じ問題に直面しており、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

そこにはもっと簡単な解決策があるかもしれませんが、私はそれを見つけることができなかったので、これがこのアプローチを使用した理由です。私はあなたがより幸運でよりクリーンな解決策を見つけることを願っています。私も何か役立つものを学ぶことができる場合に備えて、この投稿をフォローします:)

1
lese

問題が見つかりました:ダンプファイルが破損しているため、ラージオブジェクトのインポート中に、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)

そして、それはファイルの終わりに達した後に停止しました。

0
eppesuig