web-dev-qa-db-ja.com

Postgresダンプのインポート時にstandard_conforming_stringsをオフからオンに変換する

standard_conforming_stringsoffに設定されているPostgres 8.1インスタンスを持っています(==はスラッシュをエスケープ文字として扱います)。最近のPostgresバージョンには、デフォルトでこの設定onがあります(正当な理由による)。

ダンプを8.1から9.xにインポートする場合、9.x DBでこの設定をoffに設定できますが、したくないので、ダンプを適切な形式に変換したいと思います。これは100 GB以下のダンプです。

どうすればできますか? 8.1バージョンでこの設定を単に「オン」にすることはできますか? (それは既存のデータのエクスポートに影響しますか?それは既存のデータを破壊または変更しますか?

機能しないもの:9.x DBでstandard_conforming_stringsをoffに設定せずに、8.1によって生成されたデータを9.xにインポートするだけです。結果は破損したデータです。

3
Mate Varga

8.1インスタンスでテストすると、問題があるように見えません。次の3つの異なる例を参照してください。

データを作成

 SHOW standard_conforming_strings ;
 standard_conforming_strings 
 -----------------------------
  off

CREATE TABLE bla(t text);
INSERT INTO bla VALUES('abc''def');
INSERT INTO bla VALUES(E'abc\\def');

1。8.1 pg_dumpでの8.1データのダンプ

$ pg81/bin/pg_dump db

これは(無関係なものを削除した後)生成します:

コピーbla(t)FROM stdin; 
 abc'def 
 abc \\ def 
 \。

ここに standard_conforming_stringsはCOPY形式が独立しているため重要ではありません。このCOPYを実行しても、オンでもオフでも違いはありません。

2。--insertsオプションを使用した8.1 pg_dumpでの8.1データのダンプ

$ pg81/bin/pg_dump --inserts db

したがって、COPYは使用されません。ダンプには、興味深い部分が含まれています。

INSERT INTO bla VALUES ('abc''def');
INSERT INTO bla VALUES (E'abc\\def');

E'...'構文が使用され、standard_conforming_stringsは関係ありません。これらの文字列は、設定がオンであるかオフであるかにかかわらず、postgres> = 8.1のどのバージョンでも正しく解釈されます

3.8.1データのダンプと9.1 pg_dumpの--insertsオプション

$ pg91/bin/pg_dump --inserts db

今、ダンプはこれを偶然に始めています

SET standard_conforming_strings = off;

そしてデータセクションで:

INSERT INTO bla VALUES ('abc''def');
INSERT INTO bla VALUES ('abc\\def');

したがって、8.1のpg_dumpとは異なりますが、自動的に処理されますが、このダンプは何も調整せずに、どのバージョンのpostgres> = 8.1でも直接再ロードできます。

3
Daniel Vérité