Estoy tratando de copiar una tabla completa de una base de datos a otra en Postgres. ¿Alguna sugerencia?
Estoy tratando de copiar una tabla completa de una base de datos a otra en Postgres. ¿Alguna sugerencia?
Respuestas:
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 -a
indicador 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
pg_dump -U remote_user -h remote_server -t table_to_copy source_db | psql target_db
-a
indicador 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.sql
y después de poner eso en su servidor ->psql my_other_db < my_file.sql
pg_dump -t '"tableToCopy"' source_db | psql target_db
. Tenga en cuenta que las comillas simples Y dobles rodean el nombre de la tabla
También puede usar la funcionalidad de copia de seguridad en pgAdmin II. Solo sigue estos pasos:
Funciona bien y puede hacer varias tablas a la vez.
Objects
sección. En OSX, haga clic en el botón SQL u obtenga a SQL Editor
través del Tools
menú para pegar el SQL copiado del archivo de copia de seguridad.
¡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);
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" )
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!
pg_dump -t '<table_name>' --schema-only
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
);
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...)
Use pg_dump para volcar los datos de la tabla y luego restaurarlo con psql.
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.
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>
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
export PGPASSWORD=<passw>
antes de ejecutar el comando
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.
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"
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.
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
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);
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>
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.
Si ejecuta pgAdmin (Backup:, pg_dump
Restore:) pg_restore
desde Windows, intentará generar el archivo de forma predeterminada c:\Windows\System32
y 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.
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.