Lệnh psql không hợp lệ \ N trong khi khôi phục sql


137

Tôi đang cố gắng khôi phục tệp kết xuất của mình, nhưng nó đã gây ra lỗi:

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

Có một giải pháp? Tôi đã tìm kiếm, nhưng tôi không nhận được câu trả lời rõ ràng.

Câu trả lời:


198

Postgres sử dụng "\ N" làm biểu tượng thay thế cho giá trị NULL. Nhưng tất cả các lệnh psql bắt đầu bằng ký hiệu dấu gạch chéo ngược "\". Vì vậy, bạn có thể nhận được thông báo này, khi có thể sao chép câu lệnh thất bại, nhưng quá trình tải kết xuất vẫn tiếp tục. Thông báo này chỉ là báo động sai. Bạn phải tìm kiếm một dòng trước vì lý do tại sao câu lệnh COPY không thành công.

Có thể chuyển chế độ psql sang chế độ "dừng ở lỗi đầu tiên" và tìm lỗi:

psql -v ON_ERROR_STOP=1

7
Có, một lỗi rất, rất dễ mắc phải vì số lượng các lỗi lệnh không hợp lệ này có thể cực kỳ lớn che khuất hoàn toàn lỗi đầu tiên xảy ra sớm.
crowmagnumb 16/12/13

5
PostgreSQL khá là xấu khi đưa ra một cảnh báo sai lệch như vậy, câu trả lời của bạn đã giúp tôi tiết kiệm rất nhiều thời gian!
Tregoreg

50
@Tregoreg - vâng, nó không thân thiện - bạn có thể chạy psql ở chế độ "dừng ở lỗi đầu tiên". Nó đơn giản hóa chẩn đoán "psql -v ON_ERROR_STOP = 1"
Pavel Stehule

2
Có thể xảy ra khi ví dụ create table...thất bại khi bắt đầu, nhưng tải vẫn tiếp tục.
JaakL

1
Tôi đến đây vì cùng một lỗi. Những gì tôi đã tìm ra là để làm: (pg_restore ... | psql ...) 2>&1 | less
THK

33

Tôi đi cùng một thông báo lỗi khi cố gắng khôi phục từ một kết xuất nhị phân. Tôi chỉ đơn giản được sử dụng pg_restoređể khôi phục kết xuất của mình và tránh hoàn toàn các \Nlỗi, ví dụ:

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

Giải thích về thiết bị chuyển mạch:

-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


sử dụng cpu thấp hơn nhiều, phải không?
catbadger

15

Tôi biết đây là một bài viết cũ nhưng tôi đã gặp một giải pháp khác: postgis chưa được cài đặt trên phiên bản mới của tôi, điều này gây ra lỗi tương tự cho tôi trên pg_dump


1
Thật là một sự cứu rỗi!
matmat

8

Tôi đã gặp phải lỗi này trong quá khứ. Pavel là chính xác, nó thường là một dấu hiệu cho thấy một cái gì đó trong kịch bản được tạo bởi pg_restore đang thất bại. Do tất cả các lỗi "/ N", bạn không thấy vấn đề thực sự ở đầu sản phẩm. Tôi đề nghị:

  1. chèn một bảng nhỏ, đơn lẻ (ví dụ pg_restore --table=orders full_database.dump > orders.dump:)
  2. nếu bạn không có một cái nhỏ, thì hãy xóa một loạt các bản ghi ra khỏi tập lệnh khôi phục - Tôi chỉ đảm bảo ./ là hàng cuối cùng được tải (ví dụ: mở orders.dumpvà xóa một loạt các bản ghi)
  3. xem đầu ra tiêu chuẩn và một khi bạn tìm thấy vấn đề, bạn luôn có thể thả bảng và tải lại

Trong trường hợp của tôi, tôi chưa cài đặt tiện ích mở rộng "hstore", vì vậy tập lệnh bị lỗi ở đầu trang. Tôi đã cài đặt hstore trên cơ sở dữ liệu đích và tôi đã quay lại công việc.


"Tôi chưa cài đặt tiện ích mở rộng" hstore "", TNX.
Arash Fatahzade

7

Bạn có thể tạo kết xuất của mình bằng cách sử dụng các câu lệnh INSERTS, với tham số --inserts.


2
Điều này làm việc cho tôi! pg_dump - chèn $ DATABASE> $ FILENAME
Abel


4

Điều tương tự đã xảy ra với tôi ngày hôm nay. Tôi đã xử lý vấn đề bằng cách bán phá giá bằng lệnh --inserts.

Những gì tôi làm là:

1) pg_dump với chèn:

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

2) psql (khôi phục tập tin kết xuất của bạn)

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

Lưu ý-1) Đảm bảo rằng việc thêm tệp đầu ra sẽ tăng tốc độ nhập.

Lưu ý-2) Đừng quên tạo bảng có cùng tên và cột trước khi nhập bằng psql.


2

Theo kinh nghiệm gần đây của tôi, có thể gặp lỗi này khi vấn đề thực sự không liên quan đến các ký tự thoát hoặc dòng mới. Trong trường hợp của tôi, tôi đã tạo một kết xuất từ ​​cơ sở dữ liệu A với
pg_dump -a -t table_name > dump.sql
và đang cố gắng khôi phục nó vào cơ sở dữ liệu B với
psql < dump.sql(sau khi cập nhật các vv env thích hợp, tất nhiên)
Điều cuối cùng tôi đã tìm ra là kết xuất đó, mặc dù đó là data-only( -atùy chọn , do đó, cấu trúc bảng không rõ ràng là một phần của kết xuất), là đặc trưng cho lược đồ. Điều đó có nghĩa là nếu không sửa đổi thủ công kết xuất, tôi không thể sử dụng kết xuất được tạo từ schema1.table_nameđể cư trú schema2.table_name. Sửa đổi thủ công kết xuất dễ dàng, lược đồ được chỉ định trong 15 dòng đầu tiên hoặc lâu hơn.


1

Hầu hết các lần, giải pháp là cài đặt postgres-contribgói.


0

Đối với tôi sử dụng postgreSQL 10 trên SUSE 12, tôi đã khắc phục invalid command \Nlỗi bằng cách tăng dung lượng đĩa. Thiếu không gian đĩa đã gây ra lỗi cho tôi. Bạn có thể biết nếu bạn hết dung lượng đĩa nếu bạn nhìn vào hệ thống tệp mà dữ liệu của bạn sẽ xuất hiện ở df -hđầu ra. Nếu hệ thống tệp / mount được sử dụng 100%, sau khi thực hiện một số thứ như psql -f db.out postgres(xem https://www.postgresql.org/docs/civerse/static/app-pg-dumpall.html ) bạn có thể cần tăng dung lượng đĩa trống .


0

Tôi gặp vấn đề tương tự, tôi đã tạo một cơ sở dữ liệu mới và đã invalid command \Nkhôi phục bằng psql. Tôi đã giải quyết nó bằng cách đặt cùng một vùng bảng với cơ sở dữ liệu cũ.

Ví dụ, sao lưu cơ sở dữ liệu cũ có không gian bảng "pg_default", tôi đã xác định cùng một không gian bảng cho cơ sở dữ liệu mới và lỗi trên đã biến mất!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.