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

273

Estoy tratando de copiar una tabla completa de una base de datos a otra en Postgres. ¿Alguna sugerencia?

nada
fuente
1
Si está de acuerdo con la instalación de DBeaver, tiene una forma realmente simple de transferir entre dos bases de datos a las que está conectado. Simplemente haga clic con el botón derecho en la tabla de origen y seleccione Exportar datos, seleccione una tabla o tablas de base de datos y establezca el destino como la base de datos de destino.
rovyko

Respuestas:

311

Extraiga la tabla y canalícela directamente a la base de datos de destino:

pg_dump -t table_to_copy source_db | psql target_db

Nota: Si la otra base de datos ya tiene la tabla configurada, debe usar el -aindicador para importar datos solamente, de lo contrario, puede ver errores extraños como "Sin memoria":

pg_dump -a -t my_table my_db | psql target_db
thomax
fuente
55
¿Cómo funcionará esto para enlaces remotos-db? Por ejemplo, necesito volcar desde una ubicación diferente.
curlyreggie
17
@curlyreggie no ha intentado esto, pero no veo ninguna razón por la que no funcionaría. Intente agregar datos específicos del usuario y del servidor al comando, asípg_dump -U remote_user -h remote_server -t table_to_copy source_db | psql target_db
thomax
2
Puede intentar esto: "pg_dump -U remote_user -h remote_server -t table_to_copy source_db | psql target_db -U remote_user -h remote_server"
Hua Zhang
18
tenga en cuenta que si la otra base de datos ya tiene la tabla configurada, debe usar el -aindicador solo para datos . es decir pg_dump -a -t my_table my_db | psql target_db. Mientras estoy aquí, si su base de datos está en un servidor, me resulta más fácil volcar la base de datos en un archivo y luego scp ese archivo a la base de datos, luego enviar el contenido del archivo a psql. Por ejemplo, pg_dump -a -t my_table my_db > my_file.sqly después de poner eso en su servidor ->psql my_other_db < my_file.sql
Nick Brady
3
@EamonnKenny para volcar una mesa de mayúsculas y minúsculas, hacer: pg_dump -t '"tableToCopy"' source_db | psql target_db. Tenga en cuenta que las comillas simples Y dobles rodean el nombre de la tabla
gilad mayani
105

También puede usar la funcionalidad de copia de seguridad en pgAdmin II. Solo sigue estos pasos:

  • En pgAdmin, haga clic derecho en la tabla que desea mover, seleccione "Copia de seguridad"
  • Elija el directorio para el archivo de salida y establezca Formato en "sin formato"
  • Haga clic en la pestaña "Opciones de volcado # 1", marque "Solo datos" o "Solo esquema" (dependiendo de lo que esté haciendo)
  • En la sección Consultas, haga clic en "Usar inserciones de columna" y "Comandos de inserción de usuario".
  • Haga clic en el botón "Copia de seguridad". Esto genera un archivo .backup
  • Abra este nuevo archivo con el bloc de notas. Verá los scripts de inserción necesarios para la tabla / datos. Copie y pegue estos en la nueva página sql de la base de datos en pgAdmin. Ejecutar como pgScript - Consulta-> Ejecutar como pgScript F6

Funciona bien y puede hacer varias tablas a la vez.

a2ron44
fuente
1
Esta es una buena solución basada en GUI para mover datos entre bases de datos. ¡Gracias!
kgx
3
Puede seleccionar varias tablas en la Objectssección. En OSX, haga clic en el botón SQL u obtenga a SQL Editortravés del Toolsmenú para pegar el SQL copiado del archivo de copia de seguridad.
Aleck Landgraf
funciona, gracias. Aunque muy lento en las mesas grandes ... ¿hay una mejor manera de hacerlo para acelerarlo? (como ignorar claves foráneas o algo así)
TimoSolo
3
@Timothy Aquí está la página de documentación de postgres sobre cómo acelerar la copia de seguridad y la restauración
laurie
vieja respuesta, pero sigue siendo relevante, funciona muy bien, sólo que no se olvide de establecer disparadores Deshabilitar al exportar toda la base de datos
norbertas.gaulia
75

¡Usar dblink sería más conveniente!

truncate table tableA;

insert into tableA
select *
from dblink('dbname=postgres hostaddr=xxx.xxx.xxx.xxx dbname=mydb user=postgres',
            'select a,b from tableA')
       as t1(a text,b text);
tinychen
fuente
12
¿Por qué dos dbname en dos tiempos ..? ¿Cuál es la fuente y el destino?
arulraj.net
1
La tabla A en la que estamos insertando es el destino, y la tabla A en dbLink es el origen.
aggietech
si quiero usar dblink bun no conozco la estructura de la tabla fuente de origen.
Ossarotte
31

Usando psql, en un host Linux que tiene conectividad a ambos servidores

( export PGPASSWORD=password1 
  psql -U user1 -h host1 database1 \
  -c "copy (select field1,field2 from table1) to stdout with csv" ) \
| 
( export PGPASSWORD=password2 
  psql -U user2 -h host2 database2 \ 
   -c "copy table2 (field1, field2) from stdin csv" )
Alexey Sviridov
fuente
No es necesario exportar, PGPASSWORD=password1 psql -U ...¡ni siquiera necesita subcapas explícitas! Por lo general, primero debe hacer un par de cosas para configurar, por lo que puede ser necesario utilizar subcapas de todos modos. Además, las contraseñas no se exportarán a procesos posteriores. ¡Gracias!
Expiación limitada el
1
@LimitedAtonement En realidad, no es necesario exportar y subcapas. Es solo una parte de una secuencia de comandos más complicada, e incluso no lo intenté sin exportación y subconjuntos, así que lo proporciono como es para ser honesto y proporciono una solución trabajada
Alexey Sviridov
La tabla debe existir en la base de datos de destino. Para crearlo, intentepg_dump -t '<table_name>' --schema-only
fjsj
24

Primero instala dblink

Entonces, harías algo como:

INSERT INTO t2 select * from 
dblink('host=1.2.3.4
 user=*****
 password=******
 dbname=D1', 'select * t1') tt(
       id int,
  col_1 character varying,
  col_2 character varying,
  col_3 int,
  col_4 varchar 
);
Felipe Augusto
fuente
1
Esta respuesta es excelente porque permite filtrar filas copiadas (agregue la cláusula WHERE en el segundo argumento dblink). Sin embargo, uno tiene que ser explícito acerca de los nombres de columna (Postgres 9.4) con algo como: INSERT INTO l_tbl (l_col1, l_col2, l_col3) SELECT * FROM dblink('dbname=r_db hostaddr=r_ip password=r_pass user=r_usr', 'select r_col1, r_col2, r_col3 from r_tbl where r_col1 between ''2015-10-29'' AND ''2015-10-30'' ') AS t1(col1 MACADDR, col2 TIMESTAMP, col3 NUMERIC(7,1));(l medios locales, r es remota escapar comillas simples Proporcionar tipos col...)
hamx0r
14

Use pg_dump para volcar los datos de la tabla y luego restaurarlo con psql.

Pablo Santa Cruz
fuente
2
Luego use otra base de datos para conectarse, una función que tiene suficientes permisos. postgresql.org/docs/8.4/static/app-pgdump.html
Frank Heikens
¿Qué estoy haciendo mal? pg_dump -t "nombre de tabla" dbName --role "postgres"> db.sql "postgres" sería el usuario al que estoy tratando de establecer el rol. Todavía me da "Acceso denegado".
nix
¿Tiene permisos para escribir el archivo db.sql?
pcent
¿Cómo verifico qué permisos tengo?
nix
Este hilo es antiguo, pero para cualquier persona que tenga el problema, intente usar el menú 'Herramientas -> Copia de seguridad' en PgAdminIII, que parece solucionar los problemas de permisos.
John
13

Si tiene ambos servidores remotos, puede seguir esto:

pg_dump -U Username -h DatabaseEndPoint -a -t TableToCopy SourceDatabase | psql -h DatabaseEndPoint -p portNumber -U Username -W TargetDatabase

Copiará la tabla mencionada de la base de datos fuente en la misma tabla con nombre de la base de datos de destino, si ya tiene un esquema existente.

Piyush S. Wanare
fuente
9

Podrías hacer lo siguiente:

pg_dump -h <host ip address> -U <host db user name> -t <host table> > <host database> | psql -h localhost -d <local database> -U <local db user>

Gowtham Balusamy
fuente
2
le gustaría decir algo al respecto
Muhammad Omer Aslam
eso es legítimo 😂 me posees
Muhammad Omer Aslam
8

Esto es lo que funcionó para mí. Primer volcado a un archivo:

pg_dump -h localhost -U myuser -C -t my_table -d first_db>/tmp/table_dump

luego cargue el archivo volcado:

psql -U myuser -d second_db</tmp/table_dump
max
fuente
para la carga de volcado también se necesita "-h localhost"
DTukans
6

Para mover una tabla de la base de datos A a la base de datos B en su configuración local, use el siguiente comando:

pg_dump -h localhost -U owner-name -p 5432 -C -t table-name database1 | psql -U owner-name -h localhost -p 5432 database2
usuario5542464
fuente
Lo intenté. Esto no funciona porque solo puede darle la primera contraseña.
max
1
@max que puedes hacer export PGPASSWORD=<passw>antes de ejecutar el comando
lukaszzenko
4

Intenté algunas de las soluciones aquí y fueron realmente útiles. En mi experiencia, la mejor solución es usar la línea de comando psql , pero a veces no tengo ganas de usar la línea de comando psql. Así que aquí hay otra solución para pgAdminIII

create table table1 as(
 select t1.* 
 from dblink(
   'dbname=dbSource user=user1 password=passwordUser1',
   'select * from table1'  
  ) as t1(
    fieldName1 as bigserial,
    fieldName2 as text,
    fieldName3 as double precision 
  )
 )

El problema con este método es que se debe escribir el nombre de los campos y sus tipos de la tabla que desea copiar.

Eloy A
fuente
4

pg_dump no funciona siempre

Dado que tiene la misma tabla ddl en ambos dbs, podría piratearla desde stdout y stdin de la siguiente manera:

 # grab the list of cols straight from bash

 psql -d "$src_db" -t -c \
 "SELECT column_name 
 FROM information_schema.columns 
 WHERE 1=1 
 AND table_name='"$table_to_copy"'"
 # ^^^ filter autogenerated cols if needed     

 psql -d "$src_db" -c  \
 "copy ( SELECT col_1 , col2 FROM table_to_copy) TO STDOUT" |\
 psql -d "$tgt_db" -c "\copy table_to_copy (col_1 , col2) FROM STDIN"
Yordan Georgiev
fuente
3

Igual que las respuestas de user5542464 y Piyush S. Wanare pero divididas en dos pasos:

pg_dump -U Username -h DatabaseEndPoint -a -t TableToCopy SourceDatabase > dump
cat dump | psql -h DatabaseEndPoint -p portNumber -U Username -W TargetDatabase

de lo contrario, la tubería solicita las dos contraseñas al mismo tiempo.

Adobe
fuente
¿Existe la posibilidad de que pueda mencionar el nombre de la tabla de la base de datos de destino?
Piyush S. Wanare
2

Debe usar DbLink para copiar los datos de una tabla en otra tabla en una base de datos diferente. Debe instalar y configurar la extensión DbLink para ejecutar consultas cruzadas de bases de datos.

Ya he creado una publicación detallada sobre este tema. Por favor visite este enlace

Anvesh
fuente
2

Revisa este script de Python

python db_copy_table.py "host=192.168.1.1 port=5432 user=admin password=admin dbname=mydb" "host=localhost port=5432 user=admin password=admin dbname=mydb" alarmrules -w "WHERE id=19" -v
Source number of rows = 2
INSERT INTO alarmrules (id,login,notifybyemail,notifybysms) VALUES (19,'mister1',true,false);
INSERT INTO alarmrules (id,login,notifybyemail,notifybysms) VALUES (19,'mister2',true,false);
themadmax
fuente
1

Si las dos bases de datos (desde y hacia) están protegidas con contraseña, en ese escenario, el terminal no solicitará la contraseña para ambas bases de datos, la solicitud de contraseña aparecerá solo una vez. Entonces, para solucionar esto, pase la contraseña junto con los comandos.

PGPASSWORD=<password> pg_dump -h <hostIpAddress> -U <hostDbUserName> -t <hostTable> > <hostDatabase> | PGPASSWORD=<pwd> psql -h <toHostIpAddress> -d <toDatabase> -U <toDbUser>
Dante
fuente
1

Estaba usando DataGrip (Por Intellij Idea). y fue muy fácil copiar datos de una tabla (en una base de datos diferente a otra).

Primero, asegúrese de estar conectado con ambos DataSources en Data Grip.

Seleccione la Tabla de origen y presione F5 o (Haga clic con el botón derecho -> Seleccionar Copiar tabla en).

Esto le mostrará una lista de todas las tablas (también puede buscar usando un nombre de tabla en la ventana emergente). Simplemente seleccione su objetivo y presione OK.

DataGrip se encargará de todo lo demás por usted.

Desarrollo
fuente
2
Tenga en cuenta que DataGrip no es gratis .
Rahmat Ali
0

Si ejecuta pgAdmin (Backup:, pg_dumpRestore:) pg_restoredesde Windows, intentará generar el archivo de forma predeterminada c:\Windows\System32y es por eso que obtendrá un error de permiso / acceso denegado y no porque el usuario postgres no esté lo suficientemente elevado. Ejecute pgAdmin como administrador o simplemente elija una ubicación para la salida que no sean las carpetas del sistema de Windows.

Imre
fuente
0

Como alternativa, también puede exponer sus tablas remotas como tablas locales utilizando la extensión de contenedor de datos ajenos. Luego puede insertar en sus tablas seleccionando de las tablas en la base de datos remota. El único inconveniente es que no es muy rápido.

ThatDataGuy
fuente