我们有一个由第三方提供的传统readonly sql-server价格数据库,每月刷新一次。
它基本上是三个非常大的查找表。
有许多应用程序可以访问此数据库。
由于价格的性质,它们都会发生变化,因此差异无效。
我们想要做的是自动执行当前的手动任务。
我们如何在最小化停机时间的同时更换数据?
(谷歌搜索这个问题带来了很多噪音 - 如果多次复制就道歉。)
答案 0 :(得分:2)
其他几个选项,实际上几乎没有入侵(截断/重新填充仍然会大大影响正常运行时间,具体取决于重新填充所需的时间):
在同一台服务器上(例如,db1和db2)拥有两个数据库副本。然后是应用程序连接到的中央数据库,它只托管视图和/或同义词(可能在存储过程中)。假设db1当前处于活动状态,在月末,您备份刷新的生产数据库,使用replace恢复它,恢复为db2,然后将视图和同义词更改为指向db2。
同样,拥有两个数据库副本,但名称相同且位于不同的服务器上。然后在刷新时按照相同的过程,当新副本准备就绪时,将DNS或连接字符串更改为指向另一个服务器。
类似的过程,但每个表的两个副本在不同的模式(或分区和切换)中。我不会过多地考虑这个选项,如I've written about it和posted a follow-up,但基本前提是相同的 - 你在不影响用户的后台进行所有工作,然后你切换新数据,这是一个元数据操作,当它在事务序列中转向时应该接近瞬时。在我以前的工作中,我们每x分钟做一次(取决于数据),这从来都不是问题。
答案 1 :(得分:1)
如果大多数价格都已更改且所有价格都显示在新文件中,则最好的方法是删除所有TRUNCATE表格。要从新文件中再次插入所有数据。你可以用脚本来做。 备注所有必需的数据必须在新的导入文件中显示。