PostgreSQL:如何定期将许多表从一个数据库复制到另一个数据库

时间:2014-11-17 11:38:05

标签: postgresql cross-database

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

是否有快速方法来创建组合来自新数据库和旧数据库的数据的表?类似的东西:

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

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

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

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

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

我没有任何偏好如何做到这一点(Pentaho-Kettle,命令脚本,sql脚本等),只要它可以有效地自动化。

谢谢!

1 个答案:

答案 0 :(得分:0)

我相信我可能找到了办法。当然,建议和意见非常受欢迎。我的想法类似于此处的建议:I want to restore the database with a different schema(不是在最多的投票答案中)。

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

备份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,但我理解其他系统上的语法也应该相同。