comando inválido psql \ N mientras restaura sql

137

Estoy tratando de restaurar mi archivo de volcado, pero causó un error:

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

¿Hay alguna solución? Busqué, pero no obtuve una respuesta clara.

Vivek Vikranth
fuente

Respuestas:

198

Postgres usa "\ N" como símbolo sustituto del valor NULL. Pero todos los comandos psql comienzan con el símbolo de barra invertida "\". Por lo tanto, puede recibir estos mensajes, cuando probablemente la instrucción copy falla, pero continúa la carga del volcado. Este mensaje es solo falsa alarma. Debe buscar una línea antes por la razón por la cual falla la declaración COPY.

Es posible cambiar psql al modo "detener en el primer error" y encontrar el error:

psql -v ON_ERROR_STOP=1
Pavel Stehule
fuente
77
Sí, es un error muy, muy fácil de cometer, ya que el número de estos errores de comando no válidos puede ser extremadamente grande, ocultando por completo el primer error al principio.
crowmagnumb
55
Es bastante malo de PostgreSQL dar una advertencia tan engañosa, ¡su respuesta me ahorró mucho tiempo!
Tregoreg
50
@Tregoreg: sí, no es amigable: puede ejecutar psql en modo "detener en el primer error". Simplifica los diagnósticos "psql -v ON_ERROR_STOP = 1"
Pavel Stehule
2
Puede suceder cuando, por ejemplo, create table...falla en el inicio, pero la carga continúa.
JaakL
1
Vine aquí por el mismo error. Lo que descubrí fue hacer: (pg_restore ... | psql ...) 2>&1 | less
THK
33

Voy al mismo mensaje de error cuando intento restaurar desde un volcado binario. Simplemente solía pg_restorerestaurar mi volcado y evitar completamente los \Nerrores, p. Ej.

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

Explicación de los interruptores:

-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
fuente
También uso de CPU mucho menor, ¿no?
catbadger
15

Sé que esta es una publicación anterior, pero encontré otra solución: postgis no estaba instalado en mi nueva versión, lo que me causó el mismo error en pg_dump

So4ne
fuente
1
¡Qué salvavidas!
matmat
8

También me he encontrado con este error en el pasado. Pavel es correcto, generalmente es una señal de que algo en el script creado por pg_restore está fallando. Debido a todos los errores "/ N", no está viendo el problema real en la parte superior de la salida. Yo sugiero:

  1. insertando una sola mesa pequeña (p. ej. pg_restore --table=orders full_database.dump > orders.dump)
  2. si no tiene uno pequeño, elimine un montón de registros del script de restauración; solo me aseguré de que ./ fuera la última fila que se cargó (por ejemplo, abrir orders.dumpy eliminar un montón de registros)
  3. mire la salida estándar, y una vez que encuentre el problema, siempre puede soltar la tabla y volver a cargar

En mi caso, todavía no tenía instalada la extensión "hstore", por lo que el script fallaba en la parte superior. Instalé hstore en la base de datos de destino y volví a trabajar.

oraserrata
fuente
"Todavía no tenía instalada la extensión" hstore "", TNX.
Arash Fatahzade
7

Puede generar su volcado utilizando sentencias INSERTS, con el parámetro --inserts.

João Neves Filho
fuente
2
Esto funciona para mi! pg_dump --inserts $ DATABASE> $ FILENAME
Abel
4

Instale postgresql- (su versión) -postgis-scripts

Geets
fuente
4

Hoy me pasó lo mismo. Manejé el problema volcando con el comando --inserts.

Lo que hago es:

1) pg_dump con insertos:

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

2) psql (restaure su archivo volcado)

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

Nota-1) Asegúrese de que agregar el archivo de salida aumentará la velocidad de importación.

Nota-2) No olvide crear una tabla con exactamente el mismo nombre y columnas antes de importar con psql.

Ekrem Gurdal
fuente
2

En mi experiencia reciente, es posible obtener este error cuando el problema real no tiene nada que ver con caracteres de escape o líneas nuevas. En mi caso, había creado un volcado de la base de datos A con
pg_dump -a -t table_name > dump.sql
e intentaba restaurarlo a la base de datos B con
psql < dump.sql(después de actualizar los entornos adecuados, por supuesto)
Lo que finalmente descubrí fue que el volcado, aunque era data-only(la -aopción , para que la estructura de la tabla no sea parte explícita del volcado), era específica del esquema. Eso significaba que sin modificar manualmente el volcado, no podría usar un volcado generado schema1.table_namepara rellenar schema2.table_name. Modificar manualmente el volcado fue fácil, el esquema se especifica en las primeras 15 líneas más o menos.

Tyrone Hinderson
fuente
1

La mayoría de las veces, la solución es instalar el postgres-contribpaquete.

Farsheed
fuente
0

Para mí, usando postgreSQL 10 en SUSE 12, resolví el invalid command \Nerror aumentando el espacio en disco. La falta de espacio en disco me estaba causando el error. Puede ver si no tiene espacio en el disco si observa el sistema de archivos al que irán sus datos en la df -hsalida. Si el sistema de archivos / montaje se usa al 100%, después de hacer algo como psql -f db.out postgres(ver https://www.postgresql.org/docs/current/static/app-pg-dumpall.html ) probablemente necesite aumentar el espacio disponible en el disco .

montañista
fuente
0

Tuve el mismo problema, creé una nueva base de datos y invalid command \Ncomencé a restaurar con psql. Lo resolví estableciendo el mismo espacio de tabla con la base de datos anterior.

Por ejemplo, la copia de seguridad de la base de datos anterior tenía un espacio de tabla "pg_default", definí el mismo espacio de tabla para la nueva base de datos, ¡y el error anterior desapareció!

John Makridis
fuente
0

Seguí todos estos ejemplos y todos fallaron con el error del que estamos hablando:

Copie una tabla de una base de datos a otra en Postgres

Lo que funcionó fue la sintaxis con -C , mira aquí:

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

Además, si hay diferentes esquemas entre los dos, creo que es necesario alterar el esquema de un dB para que coincida con los otros para que funcionen las copias de la tabla, por ejemplo:

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