使用PostgreSQL在数据库之间传输数据

时间:2010-06-15 23:46:54

标签: sql postgresql insertion

我需要从另一个数据库传输一些数据。旧数据库名为paw1.movi​​esDB,新数据库名为paw1。每个表的模式如下。

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

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

如何将数据从旧数据库复制到新数据库?

9 个答案:

答案 0 :(得分:68)

我只是必须这样做,所以我想我会在这里发布食谱。这假设两个数据库都在同一台服务器上。

首先,将表从旧数据库复制到新数据库(因为显然您无法在数据库之间移动数据)。在命令行:

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

# Just adding extra space here so scrollbar doesn't hide the command

接下来,将复制的表的权限授予新数据库的用户。登录psql:

psql -U postgres -d <new_database>

ALTER TABLE <old_table> OWNER TO <new_user>;

\q

最后,将数据从旧表复制到新表。以新用户身份登录,然后:

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

完成!

答案 1 :(得分:34)

数据库在PostgreSQL中被隔离;当您连接到只连接到一个数据库的PostgreSQL服务器时,您无法使用SQL查询将数据从一个数据库复制到另一个数据库。

如果你来自MySQL:MySQL调用(松散地)“数据库”在PostgreSQL中是“ schemas ” - 这些命名空间。 PostgreSQL数据库可以有许多模式,每个模式都有其表和视图,您可以使用schema.table语法从一个模式复制到另一个模式。

如果你真的有两个不同的PostgreSQL数据库,那么将数据从一个数据库传输到另一个数据库的常用方法是将表(带有pg_dump -t)导出到一个文件,然后将它们导入到另一个数据库中(使用{ {1}})。

如果你真的需要从不同的PostgreSQL数据库中获取数据,那么Grant Johnson的答案中提到的另一个选项是dblink,这是一个额外的模块(在psql中)。

答案 2 :(得分:19)

这对我有用,可以将我的localhost远程复制到Heroku的postgresql:

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

这会为您创建表格。

另一个方向(从Heroku到本地) pg_dump -C -t source_table -h source_host -U source_user -p source_port source_db | psql -h localhost destination_db

答案 3 :(得分:10)

发件人:hxxp://dbaspot.c om / postgresql / 348627-pg_dump -t-give-where-condition.html(注意:链接现已断开

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

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

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

另一种在遥控器中有用的方法

  # export a table csv and import in another database
  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;

答案 4 :(得分:8)

复制它有三个选项,如果这是一次性的:

  1. 使用db_link(我认为它仍然在contrib中)
  2. 让应用程序完成工作。
  3. 导出/导入
  4. 如果这是一项持续的需求,答案是:

    1. 更改为同一个数据库中的模式
    2. db_link

答案 5 :(得分:3)

  1. 如果源数据库和目标数据库位于同一台本地计算机上,则可以使用:

注意:-数据库中已经存在Sourcedb。

CREATE DATABASE targetdb WITH TEMPLATE sourcedb;

此语句将源数据库复制到目标数据库。

  1. 如果源数据库和目标数据库位于不同的服务器上,则可以使用以下步骤:

步骤1:-将源数据库转储到文件中。

pg_dump -U postgres -O sourcedb sourcedb.sql

注意:-这里的postgres是用户名,因此请相应地更改名称。

步骤2:-将转储文件复制到远程服务器。

步骤3:-在远程服务器中创建新数据库

CREATE DATABASE targetdb;

步骤4:-在远程服务器上还原转储文件

psql -U postgres -d targetdb -f sourcedb.sql

(pg_dump是一个独立的应用程序(即,您在shell /命令行中运行的某个程序),而不是Postgres / SQL命令。)

这应该做到。

答案 6 :(得分:0)

就像leonbloy建议的那样,在数据库中使用两个模式是可行的方法。假设架构(旧数据库)和目标架构(新数据库),您可以尝试这样的事情(您应该考虑列名,类型等):

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

答案 7 :(得分:0)

您无法执行SQL Server等跨数据库查询; PostgreSQL不支持此功能。

PostgreSQL的DbLink扩展用于将一个数据库连接到另一个数据库。您已安装并配置DbLink以执行跨数据库查询。

我已经创建了一个在PostgreSQL中执行跨数据库查询的分步脚本和示例。请访问这个 发布: PostgreSQL [Video]: Cross Database Queries using the DbLink Extension

答案 8 :(得分:0)

实际上,有可能将表数据从一个PostgreSQL数据库发送到另一个。我使用过程语言plperlu(不安全的Perl过程语言)。

描述(全部在Linux服务器上完成):

  1. 在数据库中创建plperlu语言A

  2. 然后PostgreSQL可以通过postgresql.conf末尾的一系列以下命令加入一些Perl模块,用于数据库A:

    plperl.on_init='use DBI;'
    plperl.on_init='use DBD::Pg;'
    
  3. 您在A中构建一个函数,如下所示:

    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;
    
  4. 然后你可以调用数据库A中的函数:

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

    价值&#34; zzzzzz&#34;将被添加到表格&#34; jm&#34;在数据库B中。