psql perintah tidak valid \ N saat mengembalikan sql

137

Saya mencoba mengembalikan file dump saya, tetapi menyebabkan kesalahan:

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

Apakah ada solusinya? Saya mencari, tetapi saya tidak mendapatkan jawaban yang jelas.

Vivek Vikranth
sumber

Jawaban:

198

Postgres menggunakan "\ N" sebagai simbol pengganti untuk nilai NULL. Tetapi semua perintah psql dimulai dengan simbol backslash "\". Jadi Anda bisa mendapatkan pesan ini, ketika mungkin pernyataan salin gagal, tetapi pemuatan dump berlanjut. Pesan ini hanya alarm palsu. Anda harus mencari baris sebelumnya untuk alasan mengapa pernyataan COPY gagal.

Dimungkinkan untuk beralih psql ke mode "stop on first error" dan untuk menemukan kesalahan:

psql -v ON_ERROR_STOP=1
Pavel Stehule
sumber
7
Ya, kesalahan yang sangat, sangat mudah dilakukan karena jumlah kesalahan perintah yang tidak valid ini bisa sangat besar benar-benar mengaburkan kesalahan pertama yang diketuk sejak awal.
crowmagnumb
5
Sangat jahat dari PostgreSQL untuk memberikan peringatan yang menyesatkan, jawaban Anda menghemat banyak waktu!
Tregoreg
50
@ Trgoreg - ya, itu tidak ramah - Anda dapat menjalankan psql dalam mode "stop on first error". Ini menyederhanakan diagnostik "psql -v ON_ERROR_STOP = 1"
Pavel Stehule
2
Dapat terjadi ketika mis create table...gagal di awal, tetapi memuat berlanjut.
JaakL
1
Saya datang ke sini karena kesalahan yang sama. Apa yang saya tahu adalah melakukan: (pg_restore ... | psql ...) 2>&1 | less
THK
33

Saya pergi pesan kesalahan yang sama ketika mencoba untuk memulihkan dari dump biner. Saya hanya digunakan pg_restoreuntuk mengembalikan dump saya dan sepenuhnya menghindari \Nkesalahan, misalnya

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

Penjelasan sakelar:

-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

Steve K.
sumber
penggunaan cpu juga jauh lebih rendah, bukan?
catbadger
15

Saya tahu ini adalah posting lama tapi saya menemukan solusi lain: postgis tidak diinstal pada versi baru saya, yang menyebabkan saya kesalahan yang sama pada pg_dump

So4ne
sumber
1
Sungguh penyelamat hidup!
matmat
8

Saya telah mengalami kesalahan ini di masa lalu juga. Pavel benar, biasanya merupakan tanda bahwa sesuatu dalam skrip yang dibuat oleh pg_restore gagal. Karena semua kesalahan "/ N", Anda tidak melihat masalah sebenarnya di bagian paling atas dari output. Saya menyarankan:

  1. menyisipkan tabel tunggal, kecil (misalnya, pg_restore --table=orders full_database.dump > orders.dump)
  2. jika Anda tidak memiliki yang kecil, maka hapus banyak catatan dari skrip pemulihan - Saya baru saja memastikan ./ adalah baris terakhir yang akan dimuat (misalnya, buka orders.dumpdan hapus banyak catatan)
  3. perhatikan output standar, dan setelah Anda menemukan masalah, Anda selalu dapat menjatuhkan tabel dan memuat ulang

Dalam kasus saya, saya belum menginstal ekstensi "hstore", jadi skripnya gagal di bagian paling atas. Saya menginstal hstore pada database tujuan, dan saya kembali berbisnis.

oraserrata
sumber
"Saya belum menginstal ekstensi" hstore ", TNX.
Arash Fatahzade
7

Anda dapat menghasilkan dump Anda menggunakan pernyataan INSERTS, dengan parameter --inserts.

João Neves Filho
sumber
2
Ini bekerja untuk saya! pg_dump --inserts $ DATABASE> $ FILENAME
Abel
4

Instal postgresql- (versi Anda) -postgis-skrip

Geets
sumber
4

Hal yang sama terjadi pada saya hari ini. Saya menangani masalah dengan membuang dengan perintah --inserts.

Apa yang saya lakukan adalah:

1) pg_dump dengan sisipan:

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

2) psql (pulihkan file yang Anda buang)

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

Catatan-1) Pastikan bahwa menambahkan outputfile akan meningkatkan kecepatan impor.

Catatan-2) Jangan lupa untuk membuat tabel dengan nama dan kolom yang sama persis sebelum mengimpor dengan psql.

Ekrem Gurdal
sumber
2

Dalam pengalaman saya baru-baru ini, dimungkinkan untuk mendapatkan kesalahan ini ketika masalah sebenarnya tidak ada hubungannya dengan karakter melarikan diri atau baris baru. Dalam kasus saya, saya telah membuat dump dari database A dengan
pg_dump -a -t table_name > dump.sql
dan sedang mencoba mengembalikannya ke database B dengan
psql < dump.sql(setelah memperbarui vars env yang tepat, tentu saja)
Apa yang akhirnya saya tahu adalah dump itu, meskipun itu data-only( -aopsi) , sehingga struktur tabel tidak secara eksplisit bagian dari dump), adalah skema khusus. Itu berarti bahwa tanpa secara manual memodifikasi dump, saya tidak bisa menggunakan dump yang dihasilkan dari schema1.table_nameuntuk mengisi schema2.table_name. Memodifikasi dump secara manual dengan mudah, skema ditentukan dalam 15 baris pertama atau lebih.

Tyrone Hinderson
sumber
1

Seringkali, solusinya adalah menginstal postgres-contribpaket.

Farsheed
sumber
0

Bagi saya menggunakan postgreSQL 10 pada SUSE 12, saya menyelesaikan invalid command \Nkesalahan dengan menambah ruang disk. Kurangnya ruang disk menyebabkan kesalahan bagi saya. Anda dapat mengetahui apakah Anda kehabisan ruang disk jika Anda melihat sistem file data Anda akan di df -houtput. Jika sistem file / mount digunakan 100%, setelah melakukan sesuatu seperti psql -f db.out postgres(lihat https://www.postgresql.org/docs/current/static/app-pg-dumpall.html ) Anda mungkin perlu menambah ruang disk yang tersedia .

pendaki gunung
sumber
0

Saya memiliki masalah yang sama, saya membuat database baru dan invalid command \Nmemulihkan dengan psql. Saya memecahkannya dengan mengatur tablespace yang sama dengan database lama.

Sebagai contoh, backup database lama memiliki tablespace "pg_default", saya mendefinisikan tablespace yang sama ke database baru, dan kesalahan di atas telah hilang!

John Makridis
sumber
0

Saya mengikuti semua contoh ini dan mereka semua gagal dengan kesalahan yang kita bicarakan:

Salin sebuah tabel dari satu basis data ke basis data lain di Postgres

Apa yang berhasil adalah sintaks dengan -C , lihat di sini:

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

Juga jika ada Skema yang berbeda di antara keduanya, saya menemukan mengubah skema satu dB untuk mencocokkan yang lain diperlukan agar salinan Tabel berfungsi, misalnya:

DROP SCHEMA public;
ALTER SCHEMA originalDBSchema RENAME TO public;
Jeremy Thompson
sumber