在线架构修改

时间:2016-01-26 06:06:58

标签: sql-server tsql

我在SQL Server上有一个名为BigData的表。 BigData由应用程序连续修改,即使一秒钟也无法脱机。另一个要求是,除了访问它的应用程序之外,该表不能由其他一些进程独占锁定。问题是;如何将BigData的其中一列从Bigint更改为int?有什么建议?

2 个答案:

答案 0 :(得分:4)

我最近在PayPal采访中也有一个与此非常类似的问题。这种情况在银行或电子商务公司很常见,该公司有一个不断使用的实时数据库。

我给出的答案是:

  1. 根据BigData表创建一个新表,除了该列具有新类型外,该表看起来完全相同。
  2. 创建一个触发器,每次对旧表进行更新或插入时都会触发该触发器。触发器将适当地更新/插入新表
  3. 开始将旧表中的所有记录复制到新表中,这些记录的时间早于触发器生效的时间。当触发器覆盖新记录时,此步骤将重叠。
  4. 将所有旧记录成功复制到新表后,我们可以预期新表现在包含所有旧记录,以及自我们开始迁移过程以来插入/更新的所有新记录。
  5. 执行此操作后,新旧表应具有相同的内容,并且两者都应与正在运行的应用程序同步。现在,可以删除旧表,并且可以将新表重命名为旧表。可能需要短暂停机(比如说几分钟)来实现这一目标,但这应该是可以接受的。

答案 1 :(得分:1)

在可能长时间运行的复制旧数据的过程中避免锁定问题的解决方案是批量处理,每批次之间有延迟,以允许其他正常使用过程在每个批次之间的延迟中锁定表。正如@TimBiegeleisen还提到的,如果有一个标识列也是主键,这可能很简单,因为那时我们可以计算从旧表中复制行的偏移量,并且我们可以更有效地分割批次按照身份的顺序。即使没有身份,它仍然是一种可行的方法,至少如果有主键的话。