0

我有两个数据库在同一个 PostgreSQL 9.3 服务器上运行(在 Windows 上运行)。这两个数据库具有完全相同的结构:相同的表、相同的键、相同的约束等;唯一的区别是数据会定期从一个移动到另一个。可以把它想象成一个包含客户和订单信息的数据库,其中每周与客户相关的数据(例如,2 年)从一个转移到另一个。

有没有一种快速的方法来创建组合新旧数据库中的数据的表?就像是:

select * from NewDatabase.MyTable
UNION
select * from OldDatabase.MyTable

在数据库的 170 个表中的大约 25 个上运行。

我看到的两个关键问题是:

1) PostgreSQL 并不真正允许跨数据库查询。外部数据包装器或数据库链接(如此处所述:可能使用 postgres 执行跨数据库查询?)使用起来非常麻烦,因为(如果我理解正确的话)我必须预先声明我希望访问的表的整个结构。

2)我需要找到一种方法来自动化它,以便我可以为我需要的 25 个表中的每一个自动编码,并且它每周运行一次。

只要它可以有效地自动化,我对如何完成(Pentaho-Kettle、命令脚本、sql 脚本等)没有任何偏好。

谢谢!

4

1 回答 1

0

我相信我可能已经找到了方法。当然,我们非常欢迎您提出建议和意见。我的想法类似于这里的建议:我想用不同的模式恢复数据库(虽然不是投票最多的答案)。

因为我只对公共模式中的表感兴趣,所以我做了以下事情:

备份 database1 的公共模式

"C:\Program Files\PostgreSQL\9.3\bin\pg_dump.exe" --host MYSQLHOST --port 5432 --username "JohnDoe"  --format custom --section pre-data --section data --section post-data --verbose -n "public" --file "\\mypath\db1.backup" "db1"

重命名 db2 的公共模式并创建一个新的空公共模式:

ALTER SCHEMA public RENAME TO public_db2 ;
CREATE SCHEMA public ;

将 db1 的公共模式的备份恢复到 db2 中新创建的(和空的)公共模式中:

"C:\Program Files\PostgreSQL\9.3\bin\pg_restore.exe" --host MYSQLHOST --port 5432 --username "JohnDoe" --dbname "db2"   --section pre-data --section data --section post-data --schema public --verbose "\\mypath\db1.backup"

重命名了 db2 中新导入的公共模式:

ALTER SCHEMA public RENAME TO public_db1 ;

我上面的语法创建了一个二进制(并自动压缩)备份文件。如果您有文本格式的备份文件,则不能只恢复一个模式。我还没有设法自动化的唯一部分是 shell 命令提示我输入密码。

我使用 Windows,但我知道其他系统上的语法也应该相同。

于 2014-11-17T19:14:59.907 回答