我正在运行生产数据库,通常每分钟插入 50-100 次。我正在尝试使用在生产数据库中添加一个新列,
ALTER TABLE MyDB ADD [MyColumn] varchar(30)
GO
这个查询一直运行,直到我停止它才完成。我还能做什么?
我正在运行生产数据库,通常每分钟插入 50-100 次。我正在尝试使用在生产数据库中添加一个新列,
ALTER TABLE MyDB ADD [MyColumn] varchar(30)
GO
这个查询一直运行,直到我停止它才完成。我还能做什么?
添加这样的可空列通常是元数据操作。也就是说,只要它能够在添加列所需的短时间内在表上获得模式稳定性锁,它就会几乎立即完成。
如果您看到它需要很长时间,则原因很可能是其他会话阻止了该
ALTER TABLE
语句。还要意识到,当您运行该ALTER TABLE
语句时,当它等待获取模式稳定性锁时,它将阻止对该表的后续查询。您可能希望在运行语句之前查看为会话设置锁定超时。ALTER TABLE
如果阻止其他会话有问题,您可以等到一段时间的活动较少,然后运行该命令。或者,您可以将数据库置于单用户模式,更改表,然后将其放回多用户模式 - 当然这会阻止任何会话在此期间访问数据库。
要将数据库置于单用户模式并更改表,您将执行类似以下操作:
但是请注意,将数据库设置为像这样的单用户模式会导致任何正在进行的事务回滚,这取决于您的客户端软件的设计方式,可能会导致数据丢失。
ALTER DATABASE
一旦数据库恢复到多用户模式,就需要重新执行该语句时正在运行的任何事务。查看ALTER DATABASE的 Microsoft Docs 页面,特别是关于WITH ROLLBACK
控制服务器如何将数据库置于单用户模式的各种选项的部分。