SQLの復元中にpsqlが無効なコマンド\ N


137

ダンプファイルを復元しようとしていますが、エラーが発生しました。

psql:psit.sql:27485: invalid command \N

解決策はありますか?検索したのですが、はっきりとした答えが得られませんでした。

回答:


198

PostgresはNULL値の代替記号として「\ N」を使用します。ただし、すべてのpsqlコマンドはバックスラッシュ「\」記号で始まります。したがって、おそらくcopyステートメントが失敗しても、ダンプのロードは続行されるときに、このメッセージを受け取ることができます。このメッセージは単なる誤報です。COPYステートメントが失敗する理由のため、前に行を検索する必要があります。

psqlを「最初のエラーで停止」モードに切り替えてエラーを見つけることができます。

psql -v ON_ERROR_STOP=1

7
はい、これらの無効なコマンドエラーの数は非常に多く、最初のエラーヒットを早い段階で完全に覆い隠す可能性があるため、非常に簡単な間違いです。
crowmagnumb 2013

5
そのような誤解を招く警告を与えることはPostgreSQLからかなり悪いです、あなたの答えは私に多くの時間を節約しました!
Tregoreg 14

50
@Tregoreg-はい、フレンドリーではありません-「最初のエラーで停止」モードでpsqlを実行できます。診断を簡素化します "psql -v ON_ERROR_STOP = 1"
Pavel Stehule

2
たとえばcreate table...、最初に失敗したが、読み込みは継続する場合に発生する可能性があります。
JaakL 2017年

1
私は同じエラーのためにここに来ました。私は何を考え出したことはやっていた: (pg_restore ... | psql ...) 2>&1 | less
THK

33

バイナリダンプから復元しようとすると、同じエラーメッセージが表示されます。私は単にpg_restoreダンプを復元して\Nエラーを完全に回避するために使用しました、例えば

pg_restore -c -F t -f your.backup.tar

スイッチの説明:

-f, --file=FILENAME output file name -F, --format=c|d|t backup file format (should be automatic) -c, --clean clean (drop) database objects before recreating


また、CPU使用率がはるかに低いですね。
catbadger

15

私はこれが古い投稿であることを知っていますが、別の解決策を見つけました:新しいバージョンにpostgisがインストールされていなかったため、pg_dumpで同じエラーが発生しました


1
なんと命の恩人!
matmat

8

私も過去にこのエラーに遭遇しました。Pavelは正しいです。これは通常、pg_restoreによって作成されたスクリプトの何かが失敗している兆候です。すべての「/ N」エラーのため、出力の一番上に実際の問題が表示されていません。私は提案します:

  1. 単一の小さなテーブルを挿入する(例えば、 pg_restore --table=orders full_database.dump > orders.dump
  2. 小さいレコードがない場合は、復元スクリプトから一連のレコードを削除します-./がロードされる最後の行であることを確認しました(たとえば、open orders.dump一連のレコードをて削除します)
  3. 標準出力を監視し、問題を見つけたら、いつでもテーブルをドロップしてリロードできます

私の場合、「hstore」拡張機能がまだインストールされていないため、スクリプトが一番上で失敗していました。宛先データベースにhstoreをインストールし、業務を再開しました。


「私はまだ「hstore」拡張機能をインストールしていませんでした」、TNX。
Arash Fatahzade

7

--insertsパラメーターを指定したINSERTSステートメントを使用して、ダンプを生成できます。


2
これは私にとってはうまくいきます!pg_dump-$ DATABASE> $ FILENAMEを挿入します
Abel

4

postgresql-(お使いのバージョン)-postgis-scriptsをインストールします


4

今日も同じことが起こりました。--insertsコマンドでダンプして問題を処理しました。

私がしていることは:

1)挿入付きのpg_dump:

pg_dump dbname --username=usernamehere --password --no-owner --no-privileges --data-only --inserts -t 'schema."Table"' > filename.sql

2)psql(ダンプされたファイルを復元します)

psql "dbname=dbnamehere options=--search_path=schemaname" --host hostnamehere --username=usernamehere -f filename.sql >& outputfile.txt

注-1)出力ファイルを追加するとインポートの速度が上がることを確認してください。

注2)psqlでインポートする前に、完全に同じ名前と列でテーブルを作成することを忘れないでください。


2

私の最近の経験では、実際の問題がエスケープ文字や改行と関係がない場合に、このエラーが発生する可能性があります。私の場合、私は、データベースAからダンプを作成した
pg_dump -a -t table_name > dump.sql
としてデータベースBに復元しようとしていた
psql < dump.sql(適切なのenvを更新した後はもちろん、varsは)
私は最終的に考え出したそれは何だったのに、というダンプたdata-only-aオプション、テーブル構造が明示的にダンプの一部にならないようにするため)はスキーマ固有でした。つまり、ダンプを手動で変更しなければ、から生成されたダンプを使用してデータschema1.table_nameを取り込むことができませんでしたschema2.table_name。ダンプを手動で変更するのは簡単でした。スキーマは最初の15行程度で指定されています。


1

ほとんどの場合、解決策はpostgres-contribパッケージをインストールすることです。


0

SUSE 12でpostgreSQL 10を使用invalid command \Nしている場合、ディスク領域を増やすことでエラーを解決しました。ディスク容量の不足が原因でエラーが発生しました。データのdf -h出力先のファイルシステムを確認すると、ディスク領域が不足しているかどうかを確認できます。ファイルシステム/マウントが100%使用されている場合、次のようなことを行った後psql -f db.out postgreshttps://www.postgresql.org/docs/current/static/app-pg-dumpall.htmlを参照)、使用可能なディスク領域を増やす必要がある可能性があります。 。


0

同じ問題があり、新しいデータベースを作成し、invalid command \Npsqlで復元しました。古いデータベースと同じテーブルスペースを設定することで解決しました。

たとえば、古いデータベースのバックアップにはテーブルスペース「pg_default」があり、新しいデータベースに同じテーブルスペースを定義したところ、上記のエラーが発生しました。


0

私はこれらすべての例をたどりましたが、それらはすべて私たちが話しているエラーで失敗しました:

Postgresのデータベース間でテーブルをコピーする

機能したのは-Cを使用した構文でした。ここを参照してください。

pg_dump -C -t tableName "postgres://$User:$Password@$Host:$Port/$DBName" | psql "postgres://$User:$Password@$Host:$Port/$DBName"

また、2つのスキーマが異なる場合、テーブルのコピーが機能するためには、1 dBのスキーマを他のスキーマと一致させるよう変更する必要があります。たとえば、

DROP SCHEMA public;
ALTER SCHEMA originalDBSchema RENAME TO public;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.