2010-06-15 18 views
34

Necesito transferir algunos datos de otra base de datos. La base de datos anterior se llama paw1.moviesDB y la nueva base de datos es paw1. El esquema de cada tabla es el siguiente.Transferir datos entre bases de datos con PostgreSQL

Awards (name of the table)(new DB) 
Id [PK] Serial   Award 

Nominations (name of the table) (old DB) 
Id [PK] Serial   nominations 

¿Cómo copio los datos de la base de datos anterior a la nueva base de datos?

Respuesta

30

Las bases de datos están aisladas en PostgreSQL; cuando se conecta a un servidor PostgreSQL se conecta a una sola base de datos, no puede copiar datos de una base de datos a otra usando una consulta SQL.

Si viene de MySQL: MySQL lo llama (sin apretar) "bases de datos" son "schemas" en PostgreSQL - tipo de espacios de nombres. Una base de datos PostgreSQL puede tener muchos esquemas, cada uno con sus tablas y vistas, y puede copiar de un esquema a otro con la sintaxis schema.table. Si realmente tiene dos bases de datos PostgreSQL distintas, la forma más común de transferir datos de una a otra sería exportar sus tablas (con pg_dump -t) a un archivo e importarlas a la otra base de datos (con psql).

Si realmente necesita obtener datos de una base de datos PostgreSQL distinta, otra opción mencionada en la respuesta de Grant Johnson es dblink, que es un módulo adicional (en contrib/).

+0

Ajuste La variable search_path con "SET search_path TO blah" es una buena manera de trabajar con diferentes esquemas sin dañar sus meñiques.Puede hacer que sus cambios sean permanentes con "ALTER USER user SET SET search_path TO blah" - ¡me encanta! ;-) –

+1

Haciendo el movimiento usando dblink, mira http://stackoverflow.com/questions/14797327/copy-data-between-two-tables-in-postgresql-using-dblink-sql –

0

Al igual que leonbloy, el uso de dos esquemas en una base de datos es el camino a seguir. Supongamos que una fuente esquema (antigua DB) y un objetivo esquema (nueva base de datos), puede intentar algo como esto (debe tener en cuenta los nombres de columnas, tipos, etc.):

INSERT INTO target.Awards SELECT * FROM source.Nominations; 
+1

Si tienes una versión decentemente reciente de Postgres (> = 8.1) puede hacer 'ALTER TABLE Nominations SET SCHEMA target' – b0fh

+0

Los esquemas no son más que espacios de nombres, y realmente no proporcionan aislamiento. Una base de datos diferente podría estar ejecutándose en una computadora diferente, o quizás en la misma, pero con diferentes configuraciones de rendimiento/memoria, y es posible que tenga dos bases de datos que tengan los mismos esquemas (que nosotros tenemos). Una base de datos diferente podría incluso ser una versión diferente de Postgres, suponiendo que sean compatibles. – sudo

8

hay tres opciones para copiarlo si esto es un fuera:

  1. Utilice un db_link (creo que todavía está en contrib)
  2. tener la aplicación haga el trabajo.
  3. de exportación/importación

Si esto es una necesidad en curso, las respuestas son:

  1. Cambio de esquemas en el mismo DB
  2. db_link
57

sólo tenía que haz esto exactamente así que pensé en publicar la receta aquí. Esto supone que ambas bases de datos están en el mismo servidor.

Primero, copie la tabla del antiguo db al nuevo db (porque aparentemente no puede mover datos entre las bases de datos). En la línea de comandos:

pg_dump -U postgres -t <old_table> <old_database> | psql -U postgres -d <new_database> 

permisos A continuación, la subvención de la tabla copiada al usuario de la nueva base de datos.Inicie sesión en psql:

psql -U postgres -d <new_database> 

ALTER TABLE <old_table> OWNER TO <new_user>; 

\q 

Finalmente, copie los datos de la tabla anterior a la nueva tabla. Inicie sesión como el nuevo usuario y luego:

INSERT INTO <new_table> (field1, field2, field3) 
SELECT field1, field2, field3 from <old_table>; 

¡Hecho!

+3

cómo hacerlo para el servidor remoto? –

+1

@DevR, solo agregue -h rdo

6

Desde: hxxp: //dbaspot.c om/postgresql/348627-pg_dump-t-dar-donde-condition.html (NOTA: el enlace se ha roto)

# create tmp db with the data 
psql mydb 
CREATE TABLE temp1 (LIKE mytable); 
INSERT INTO temp1 SELECT * FROM mytable WHERE myconditions; 
\q 

# export the data 
pg_dump --data-only --column-inserts -t temp1 mtdb > out.sql 
psql mydb 
DROP TABLE temp1; 
\q 

# import temp1 somewhere 
cat out.sql | psql -d [other_db] 
psql other_db 
INSERT INTO mytable (SELECT * FROM temp1); 
DROP TABLE temp1; 

Otro método útil en los mandos a distancia

psql-remote> COPY elements TO '/tmp/elements.csv' DELIMITER ',' CSV HEADER; 
    $ scp host.com:/tmp/elements.csv /tmp/elements.csv 
    psql-local> COPY elements FROM '/tmp/elements.csv' DELIMITER ',' CSV; 
+1

Gracias. Esta es la solución más simple que no implica ninguna extensión. Tenga en cuenta que '--column-insertrts' lo ralentiza significativamente, por lo que puede eliminarlo si se sabe que la tabla de la base de datos de destino no tiene ningún conflicto. – sudo

+1

En caso de que no esté claro para nadie, la segunda mitad es esta: cree la tabla en la otra base de datos: 'psql -d [other_db] -c" CREATE TABLE temp1 (LIKE mytable); "', luego inserte en su otra base de datos : 'cat out.sql | psql -d [other_db] ', luego inserte en la tabla principal:' psql -d [other_db] -c "INSERT INTO mytable (SELECT * FROM temp1);" '. – sudo

17

Esto funcionó para mí para copiar una tabla remota desde mi localhost a PostgreSQL de Heroku:

pg_dump -C -t source_table -h localhost source_db | psql -h destination_host -U destination_user -p destination_port destination_db

Esto crea la tabla para usted.

Por la otra dirección (de Heroku a lo local) pg_dump -C -t source_table -h source_host -U source_user -p source_port source_db | psql -h localhost destination_db

+0

En caso de que tenga un puerto y nombre de usuario diferente en el host local, el comando es: pg_dump -C -t tabla_origen -h host local -p puerto_puerto_U_user_or_or_origen_db | psql -h destination_host -U destination_user -p destination_port destination_db – Fil

0

No es posible realizar una consulta entre bases de datos como SQL Server; PostgreSQL no es compatible con esto.

La extensión DbLink de PostgreSQL se utiliza para conectar una base de datos a otra base de datos. Ha instalado y configurado DbLink para ejecutar una consulta entre bases de datos.

Ya he creado un script paso a paso y un ejemplo para ejecutar la consulta de bases de datos cruzadas en PostgreSQL. Visite la mensaje: PostgreSQL [Video]: Cross Database Queries using the DbLink Extension

0

En realidad, hay cierta posibilidad de enviar una tabla de datos de una base de datos PostgreSQL a otro. Utilizo el lenguaje de procedimiento plperlu (lenguaje de procedimiento de Perl inseguro) para ello.

Descripción (todo estaba hecho en un servidor Linux):

  1. Crear lenguaje plperlu en su base de datos Un

  2. Entonces PostgreSQL puede unirse a algunos módulos de Perl a través de la serie de los siguientes comandos al final de postgresql.conf de la base de datos a:

    plperl.on_init='use DBI;' 
    plperl.on_init='use DBD::Pg;' 
    
  3. Se construye una función en a de la siguiente:

    CREATE OR REPLACE FUNCTION send_data(VARCHAR) 
    RETURNS character varying AS 
    $BODY$ 
    my $command = $_[0] || die 'No SQL command!'; 
    my $connection_string = 
    "dbi:Pg:dbname=your_dbase;host=192.168.1.2;port=5432;"; 
    $dbh = DBI->connect($connection_string,'user','pass', 
    {AutoCommit=>0,RaiseError=>1,PrintError=>1,pg_enable_utf8=>1,} 
    ); 
    my $sql = $dbh-> prepare($command); 
    eval { $sql-> execute() }; 
    my $error = $dbh-> state; 
    $sql-> finish; 
    if ($error) { $dbh-> rollback() } else { $dbh-> commit() } 
    $dbh-> disconnect(); 
    $BODY$ 
    LANGUAGE plperlu VOLATILE; 
    

Y a continuación, puede llamar a la función dentro de la base de datos A:

SELECT send_data('INSERT INTO jm (jm) VALUES (''zzzzzz'')'); 

y el valor "zzzzzz" se añadirá a la tabla "JM" en la base de datos B.

Cuestiones relacionadas