【问题标题】:Transfer data between databases with PostgreSQL使用 PostgreSQL 在数据库之间传输数据
【发布时间】:2011-03-04 06:05:14
【问题描述】:

我需要从另一个数据库传输一些数据。旧数据库称为 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

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

【问题讨论】:

    标签: sql postgresql insertion


    【解决方案1】:

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

    如果您来自 MySQL:MySQL (松散地)称为“databases”的是 PostgreSQL 中的“schemas”——某种命名空间。一个 PostgreSQL 数据库可以有许多模式,每个模式都有自己的表和视图,您可以使用 schema.table 语法从一个模式复制到另一个模式。

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

    如果您确实需要从不同的 PostgreSQL 数据库获取数据,另一个选项 - 在 Grant Johnson 的回答中提到 - 是 dblink,这是一个附加模块(在 contrib/ 中)。

    更新:

    Postgres 在 9.1 中引入了“外国数据包装器”(在提出问题后发布)。外部数据包装器允许通过Postgres FDW 创建foreign tables,这样就可以像访问本地表一样访问远程表(在不同的服务器和数据库上)。

    【讨论】:

    • 使用“SET search_path TO blah”设置 search_path 变量是一种在不伤害小指的情况下使用不同模式的好方法。您可以使用“ALTER USER user SET search_path TO blah”使您的更改永久化 - 喜欢它! ;-)
    • 使用 dblink 进行移动,请参阅 stackoverflow.com/questions/14797327/…
    • 对于未来的读者:现在的规范做法是使用postgres_fdw 扩展和外部表
    【解决方案2】:

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

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

    【讨论】:

    • 如果你有一个相当新的 Postgres 版本 (>=8.1) 你可以ALTER TABLE Nominations SET SCHEMA target
    • 模式只不过是命名空间,它们并没有真正提供隔离。不同的数据库可能在不同的计算机上运行,​​或者可能在同一台计算机上运行但具有不同的性能/内存设置,并且您可能有两个具有相同模式的数据库(我们确实有)。假设它们兼容,不同的数据库甚至可能是不同版本的 Postgres。
    【解决方案3】:

    如果这是一次性复制,则有三种选择:

    1. 使用 db_link(我认为它仍在贡献中)
    2. 让应用程序完成工作。
    3. 导出/导入

    如果这是一个持续的需求,答案是:

    1. 更改为同一数据库中的架构
    2. db_link

    【讨论】:

      【解决方案4】:

      我只需要做这件事,所以我想我会把食谱贴在这里。这假定两个数据库都在同一台服务器上。

      首先,将表从旧数据库复制到新数据库。在命令行:

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

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

      psql -U postgres -d <new_database>
      
      ALTER TABLE <old_table> OWNER TO <new_user>;
      
      \q
      

      此时,您在新数据库中复制的表仍然具有旧数据库中的名称 &lt;old_table&gt;。假设您想将数据移动到其他地方,例如 &lt;new_table&gt;,您可以使用常规 SQL 查询:

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

      完成!

      【讨论】:

      • 远程服务器怎么办?
      • @DevR,只需添加 -h
      • 请注意,在第一个命令中,如果您需要pg_dumppsql 的密码,它们都会立即为您提供提示。对我有用的是输入密码,按回车键,然后再次输入密码,然后再次按回车键。执行此操作时,提示本身看起来很混乱,但它确实有效。
      【解决方案5】:

      来自:hxxp://dbaspot.com/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;
      

      【讨论】:

      • 谢谢。这是不涉及任何扩展的最简单的解决方案。请注意,--column-inserts 会显着降低它的速度,因此如果已知目标数据库的表没有任何冲突,则可以将其删除。
      • 如果有人不清楚,后半部分是这样的:在另一个 DB 上创建表:psql -d [other_db] -c "CREATE TABLE temp1 (LIKE mytable);",然后插入到另一个 DB:cat out.sql | psql -d [other_db],然后插入到主表:psql -d [other_db] -c "INSERT INTO mytable (SELECT * FROM temp1);".
      • 我想指出这种方法是多么容易,如果你有简单的数据,没有二进制,blob等。
      【解决方案6】:

      这对我来说可以将一个表从我的本地主机远程复制到 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

      【讨论】:

      • 如果你在 localhost 中有不同的端口和用户名,命令是:pg_dump -C -t source_table -h localhost -p local_port -U local_user source_db | psql -h 目的地主机 -U 目的地用户 -p 目的地端口目的地数据库
      【解决方案7】:

      您不能像 SQL Server 那样执行跨数据库查询; PostgreSQL 不支持这个。

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

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

      【讨论】:

      • 实际上 Postgres 现在确实支持这一点,通过外部数据包装器。
      【解决方案8】:

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

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

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

      2. 那么PostgreSQL就可以在数据库A的postgresql.conf末尾通过以下一系列命令加入一些Perl模块:

        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;
        

      然后就可以调用数据库A里面的函数了:

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

      并且值“zzzzzz”将被添加到数据库B中的表“jm”中。

      【讨论】:

        【解决方案9】:
        1. 如果您的源数据库和目标数据库位于同一台本地计算机上,您可以使用:

        注意:- Sourcedb 已存在于您的数据库中。

        CREATE DATABASE targetdb WITH TEMPLATE sourcedb;
        

        此语句将 sourcedb 复制到 targetdb。

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

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

        pg_dump -U postgres -O sourcedb sourcedb.sql
        

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

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

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

        CREATE DATABASE targetdb;
        

        第四步:-在远程服务器上恢复转储文件

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

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

        应该这样做。

        【讨论】:

          【解决方案10】:

          我认为 pg_dump 实用程序的使用可能会受到 PostgreSQL 服务器管理员的限制。

          所以我使用\copy 元命令导出到 CSV 并导入到目标数据库。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-07-17
            • 2018-02-11
            • 1970-01-01
            • 1970-01-01
            • 2011-03-15
            相关资源
            最近更新 更多