我在SQL Server上有一个名为BigData的表。 BigData由应用程序连续修改,即使一秒钟也无法脱机。另一个要求是,除了访问它的应用程序之外,该表不能由其他一些进程独占锁定。问题是;如何将BigData的其中一列从Bigint更改为int?有什么建议?
答案 0 :(得分:4)
我最近在PayPal采访中也有一个与此非常类似的问题。这种情况在银行或电子商务公司很常见,该公司有一个不断使用的实时数据库。
我给出的答案是:
BigData
表创建一个新表,除了该列具有新类型外,该表看起来完全相同。执行此操作后,新旧表应具有相同的内容,并且两者都应与正在运行的应用程序同步。现在,可以删除旧表,并且可以将新表重命名为旧表。可能需要短暂停机(比如说几分钟)来实现这一目标,但这应该是可以接受的。
答案 1 :(得分:1)
在可能长时间运行的复制旧数据的过程中避免锁定问题的解决方案是批量处理,每批次之间有延迟,以允许其他正常使用过程在每个批次之间的延迟中锁定表。正如@TimBiegeleisen还提到的,如果有一个标识列也是主键,这可能很简单,因为那时我们可以计算从旧表中复制行的偏移量,并且我们可以更有效地分割批次按照身份的顺序。即使没有身份,它仍然是一种可行的方法,至少如果有主键的话。