Sql server 逐步从SQL Server迁移到PostgreSQL

Sql server 逐步从SQL Server迁移到PostgreSQL,sql-server,postgresql,database-migration,Sql Server,Postgresql,Database Migration,该公司有许多运行在SQL Server上的应用程序。数据库有点乱 目标是逐渐从SQL Server转移到PostgreSQL(不可选择另一个SQL Server实例) 理想的情况是,新的应用程序可以连接到PostgreSQL,创建新的表结构,但仍然能够使用来自旧SQL Server的数据/与之交互(连接到两个数据库服务器的应用程序不是一个选项) 外部数据包装器似乎不是一种选择,因为这项技术非常不成熟,而且在PostgreSQL中,外部表是只读的 另一个疯狂的想法是从SQL Server实例连接到

该公司有许多运行在SQL Server上的应用程序。数据库有点乱

目标是逐渐从SQL Server转移到PostgreSQL(不可选择另一个SQL Server实例)

理想的情况是,新的应用程序可以连接到PostgreSQL,创建新的表结构,但仍然能够使用来自旧SQL Server的数据/与之交互(连接到两个数据库服务器的应用程序不是一个选项)

外部数据包装器似乎不是一种选择,因为这项技术非常不成熟,而且在PostgreSQL中,外部表是只读的

另一个疯狂的想法是从SQL Server实例连接到PostgreSQL,新的应用程序将连接到SQL Server,但使用PostgreSQL的外部数据库。那个外国数据库(我猜)可以访问主机的数据库对象。开发人员有时会将所有新应用程序从SQL Server切换到PostgreSQL

当然也有可能尝试同步数据


哪一个是最好的选择?

这根本不是问题。您可以将数据全部或部分移动到PostgreSQL。您可以使用Java、Python或其他支持的语言在PostgreSQL内部编写存储函数,并创建使用这些函数的视图。每次执行时,您的函数都必须连接到MSSQL。视图名称和结构必须表示不同数据库中的MSSQL表。这种情况下的唯一更新有点棘手,需要触发器和更多代码。通过这种方式,您可以将PostgreSQL连接到任何其他SQL/NoSQL数据库供应商。它工作得很好,但只比PostgreSQL中的所有数据都慢。我相信在某些情况下,从应用程序连接到两个供应商可能更简单,但这是您的选择:您有选择

您所建议的一切都会带来痛苦和迁移失败。如果您尝试使用这种方法,人们会抱怨PostgreSQL是多么糟糕、缓慢和不可靠。对于那些希望保留SQL Server的人来说,这将是一个伟大的政治举动,但并不是迁移到PostgreSQL的好方法

较新的Pg版本即将推出读/写外部数据包装器,但它最初只支持其他PostgreSQL服务器。由于需要翻译sqlstates和错误消息、搜索条件等,支持MS SQL将困难得多,因此任何包装器无疑都会非常有限,性能也不太好。正如您所说,FDW支持在这一点上无论如何都太不成熟了

尝试这样的混合动力车会让你失去很多东西:

  • 没有外键完整性强制

  • 每一侧的数据类型的行为可能不是100%相同,因此数据可以在一侧正常,而在另一侧则不正常。想想时间戳/日期

  • 高效的联接需要一个非常复杂的外部数据包装器——因此通常会发生的情况是,整个表将被获取,然后在本地联接。表演会很糟糕

  • 当您除了最琐碎的任务外,还做任何事情时,编写查询都会成为一场噩梦。函数名不同,等等

  • 您失去或削弱了许多ACID属性和/或必须使用两阶段提交,这对性能很不利

说真的,别这样

同步DBs可能更糟糕——除非是单向的,否则它将导致更新丢失、删除的行重新出现,甚至更糟。双向同步非常困难

开始准备移动应用程序,让它们能够在两台服务器上运行,但一次只能运行一台。一旦你准备好在Pg上运行应用程序,就开始使用迁移的实时数据副本进行一些负载测试和可靠性测试。然后考虑迁移,但是如果你发现最后一刻的问题迫使你推迟,你应该有计划如何扭转迁移


如果你正在向应用程序添加全新的部分,如果它们根本不与数据库中的其他数据交互,那么将它们放在Pg中可能是合理的。不过,这是不太可能的,当你告诉你的系统管理员你现在需要一个跨两个独立数据库的原子快照时,他们仍然会讨厌你。

有趣的是,我工作的公司也进行了完全相同的迁移(实际上,我们仍在逐步淘汰最后几个MS SQL部分)。我们采取的基本方法是将数据库功能划分为不同的区域或应用程序

  • 任何全新的或大量重写的应用程序都完全在Postgres中。这并不一定意味着应用程序层(在我们的例子中是PHP)只连接到Postgres,因为整个库或共享模块可能保留在“遗留”模式上
  • 核心业务数据(如核心配置)最初保留在MS SQL中,由一个脚本定期导出数据并将其导入只读Postgres目标。在发现CSV/TSV这一看似更简单的选项过于复杂,无法在两个平台之间转换之后,我们使用了一个简单的XML序列化。我们在反向执行该过程时也遇到了问题,因为导入过程比Postgres更容易在MS SQL上产生破坏性的独占锁
  • 只能在一个位置写入的数据(例如管理面板)可以同时插入/更新到旧数据库和新数据库中。显然,这会带来人为创建不一致的风险,但好处是两个副本都是相同的最新版本。它还需要注意自动生成的值,例如使用
    SET IDENTITY\u INSERT
    强制输入匹配的ID
转换单个查询相对容易,主要问题在于CamelCase表和列名:SQL Server不区分大小写,但保留大小写,而Postgres区分大小写,但将不带引号的标识符折叠为小写。因此,
selectfooidfrom…
不仅会查找名为
FooID
的列,还会返回一个fie