我们有一个由第三方提供的旧版只读 sql-server 价格数据库,每月更新一次。
它基本上是三个非常大的查找表。
有许多应用程序可以访问此数据库。
由于价格的性质,它们都会发生变化,因此差异化是没有用的。
我们想要做的是自动化这个目前的手动任务。
我们如何在最大程度减少停机时间的同时替换数据?
(谷歌搜索这类问题会引起很多噪音 - 如果它被重复多次,请道歉。)
我们有一个由第三方提供的旧版只读 sql-server 价格数据库,每月更新一次。
它基本上是三个非常大的查找表。
有许多应用程序可以访问此数据库。
由于价格的性质,它们都会发生变化,因此差异化是没有用的。
我们想要做的是自动化这个目前的手动任务。
我们如何在最大程度减少停机时间的同时替换数据?
(谷歌搜索这类问题会引起很多噪音 - 如果它被重复多次,请道歉。)
其他几个选项,几乎为零入侵(截断/重新填充仍会显着干扰正常运行时间,具体取决于重新填充所需的时间):
在同一台服务器上拥有两个数据库副本(例如,db1 和 db2)。然后是您的应用程序连接到的中央数据库,它仅托管视图和/或同义词(可能在存储过程中)。假设 db1 当前处于活动状态,在月底,您备份刷新的生产数据库,使用替换恢复它,恢复为 db2,然后将视图和同义词更改为指向 db2。
同样,有两个数据库副本,但名称相同且位于不同的服务器上。然后在刷新时遵循相同的过程,当新副本准备好时,更改 DNS 或连接字符串以指向另一台服务器。
类似的过程,但每个表的两个副本在不同的模式(或分区和切换)中。我不会过多地讨论这个选项,因为我已经写过它并发布了后续内容,但基本前提是相同的 - 你在不影响用户的后台位置完成所有工作,然后您切换新数据,这是一种元数据操作,当它在事务序列中轮到它时,它应该几乎是即时的。在我以前的工作中,我们每 x 分钟执行一次(取决于数据),这从来都不是问题。
如果大部分价格已更改并且所有价格都显示在新文件中,那么最好的方法可能是使用 TRUNCATE 删除所有表。重新插入新文件中的所有数据。你可以用脚本来做。备注所有需要的数据必须在新的导入文件中呈现。