【问题标题】:Postgresql : Merge 2 similar databasesPostgresql:合并2个相似的数据库
【发布时间】:2012-03-18 22:41:06
【问题描述】:

我需要将两个数据库(Database1 和 Database2)合并到 Postgresql 中的一个通用数据库中。

数据库1

表1

Id - 值(Id 为主键)

1 - 一个
2 - aa
3 - aaa
4 - 啊啊

数据库2

表1

Id 值(Id 为主键)

2 - bb
5 - bbbbb

我希望我的输出为

输出数据库

表1

Id 值(Id 为主键)

1 - 一个
2 - bb
3 - aaa
4 - 啊啊
5 - bbbbb

我怎样才能做到这一点?

【问题讨论】:

  • 您如何决定合并数据库中的 id 应该是什么 - 这有关系吗?是否有引用这些表的外键,如果有,你想做什么?

标签: database postgresql merge


【解决方案1】:

首先,将表加载到同一个数据库中的两个不同架构中。

CREATE SCHEMA db1;
CREATE TABLE db1.table1 (id INT PRIMARY KEY, value VARCHAR(10));
-- load the contents of Table1 @ Database1 into db1.table1

CREATE SCHEMA db2;
CREATE TABLE db2.table1 (id INT PRIMARY KEY, value VARCHAR(10));
-- load the contents of Table1 @ Database2 into db2.table1

然后您可以合并两者,将 db2 优先于 db1。

SELECT
  DISTINCT ON (id)
  id,
  value
FROM (
  SELECT
    *,
    1 AS db
  FROM
    db1.table1

  UNION

  SELECT
    *,
    2 AS db
  FROM
    db2.table1) AS mix
ORDER BY
  id,
  db DESC;

【讨论】:

    【解决方案2】:

    不是我的想法,而是我过去读过的一个。

    The source: Move table to new database

    pg_dump -d db1 -t table1 |psql db2
    
    then psql and do
    
    insert into table2 (select * from table1);
    

    【讨论】:

      【解决方案3】:

      我使用migrate_pkey_sequence() 定义的here 函数将多个表(具有相同架构但来自不同数据库的不同值)的主键迁移到不同的范围,以便我可以合并表。

      这是我合并两个数据库d1d2的大致顺序,每个数据库都有一个表example

      1. d1d2 转储到各自的文件d1.sql.gzd2.sql.gz。这是我用来转储的命令:

        $ pg_dump --no-owner | gzip > d1.sql.gz
        
      2. 在本地 PostgreSQL 服务器上创建一个新的空数据库。

      3. 加载d1.sql.gz
      4. 迁移d1.example 使用:

        # SELECT migrate_pkey_sequence('example', 'id', 'example_id_seq', 1);
        INFO:  00000: UPDATE example SET id = nextval('example_id_seq') + 0
        INFO:  00000: ALTER SEQUENCE example_id_seq RESTART WITH 1
        INFO:  00000: UPDATE example SET id = DEFAULT
         migrate_pkey_sequence
        -----------------------
                             4
        (1 row)
        
      5. 记录打印的值(本例中为 4)。这将是下一个序列的开始。

      6. 以与上述相同的方式转储到文件d1-new.sql.gz
      7. 使用 d2.sql.gz 重复步骤 2 到 4,但使用步骤 5 中的值作为 migrate_pkey_sequence() 的参数:

        # SELECT migrate_pkey_sequence('example', 'id', 'example_id_seq', 4);
        
      8. 转储到文件d2-new-without-schema.sql.gz 而不保存架构并禁用触发器。这是我使用的命令:

        $ pg_dump --no-owner --data-only --disable-triggers | \
          gzip > d2-new-without-schema.sql.gz
        
      9. 创建一个新的空数据库。

      10. 按顺序加载d1-new.sql.gzd2-new-without-schema.sql.gz。如果一切都按预期工作,则主键应该是不相交且不冲突的。

      11. 如果要将数据库加载到远程服务器,请转储数据库。

      【讨论】:

        【解决方案4】:

        我已经能够使用 pg_dump 和 pg_restore 轻松合并 2 个 postgres 数据库。

        就我而言,这很容易,因为我使用 UUID 标识符,所以没有重复的键。

        导出(仅数据,不包括一些架构和表):

        pg_dump --dbname=database_1 --username=${POSTGRES_USER} --no-owner --format=tar --data-only --exclude-schema=hdb_views --exclude-schema=hdb_catalog --exclude-table=app_configuration --exclude-table=migrations --file=/database_1.data-only.dump

        导入(必要时更改角色):

        pg_restore --username=$POSTGRES_USER --role=$POSTGRES_USER --no-owner --exit-on-error --verbose --dbname=database_2 /database_1.data-only.dump

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-11-02
          • 1970-01-01
          • 2015-08-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多