我有两个数据库在同一个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脚本等),只要它可以有效地自动化。
谢谢!
答案 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,但我理解其他系统上的语法也应该相同。