在 SQL Server 2005 及更高版本中,ALTER INDEX ... REORGANIZE 命令替换 DBCC INDEXDEFRAG 并且始终在线。同样在 2005 年以后的企业版中,您可以使用 ALTER INDEX ... REBUILD ... WITH (ONLINE=ON) 进行在线索引重建。在操作的开始和结束时需要几个非常短期的表锁,所以它不像 REORGANIZE 那样在线(而且大多数在线索引重建并不是一个很好的营销术语:-)。您甚至可以使用 CREATE INDEX ... WITH DROP_EXISTING 并指定 ONLINE=ON 将索引移动到新文件组。
如果您有复制/高可用性解决方案,那么使用它来避免停机是显而易见的选择,在另一台服务器工作时升级一台服务器,然后切换并升级下一台服务器。
如果您没有这样的结构,您可以在同一台服务器上进行小型复制设置,其中每个数据库有两个副本,并在另一个正在工作时升级一个,然后将旧的同步回来。这仍需要一些停机时间,但少于 4 小时。
避免保持两个数据库同步的第三个选项是获取数据库的副本,并且在维护一个数据库时,副本和使用它的应用程序处于只读模式。完成后,您只需将应用程序切换到升级的数据库并再次开始写入数据库。
最后一个选项当然需要应用程序支持并且有意义(有些应用程序的只读模式没有意义。)
如果您使用的是 SQL Server,那么您始终可以从 SQL Server 2000 开始在线删除索引碎片。命令 DBCC INDEXDEFRAG 始终执行联机重组。我专门写它作为 DBCC DBREINDEX 的在线替代品。
在 SQL Server 2005 及更高版本中,ALTER INDEX ... REORGANIZE 命令替换 DBCC INDEXDEFRAG 并且始终在线。同样在 2005 年以后的企业版中,您可以使用 ALTER INDEX ... REBUILD ... WITH (ONLINE=ON) 进行在线索引重建。在操作的开始和结束时需要几个非常短期的表锁,所以它不像 REORGANIZE 那样在线(而且大多数在线索引重建并不是一个很好的营销术语:-)。您甚至可以使用 CREATE INDEX ... WITH DROP_EXISTING 并指定 ONLINE=ON 将索引移动到新文件组。
谢谢
一般维护任务
如果您有数据库复制,大多数维护任务都可以在不使网站或应用程序脱机的情况下完成。您将从副本集中删除一个数据库,应用您需要的内容,然后将其再次连接到您的副本集中。当它关闭时,其他数据库将保持解决方案运行。
更改数据库架构
当您需要更新数据库架构时,如果更改破坏了旧版本,您将被迫关闭解决方案几分钟(或进入只读状态) 。如果您的新架构只是创建表或字段,它不会影响旧版本1,因此可以在线完成这种架构更改2并为您的应用程序使用蓝绿部署以实现高可用性。
如果您的新架构重命名或删除现有字段,为了实现 100% 的正常运行时间,您需要执行以下步骤:
重命名字段
删除字段
注 1:一些 ORM 工具,如 .NET 实体框架,将每个架构更改与迁移 ID 相关联。因此,当您部署新的架构版本时,旧应用程序将立即中断。如果禁用此检查也是可以避免的。
注意 2:如果您的新模式添加了唯一约束、检查或外键,如果您有数千行,alter table 命令可能需要一些大量时间。当 alter table 正在处理时,即使对于 select,该 table 也会被锁定,这可能会导致一些查询超时,具体取决于您的数据有多大。
您可用的选项很大程度上取决于您使用的数据库引擎。您将需要首先采取任何必要的操作来启用数据库的在线备份,最好在备份进行时允许写入。这通常需要对事务进行线性日志记录,这还应该使您能够通过前滚事务日志将数据库恢复到特定时间点。
表和索引重组可能有点棘手,但希望您的数据库引擎在重组对象时至少允许对对象进行只读访问。如果没有,您可能需要想出一种方法让您的应用程序临时使用表的只读克隆。如果您的 DBMS 提供的在线维护方式很少,您将不得不在应用程序层进行权衡,以便将其重定向到数据的部分或完整副本。
不管成本如何,数据库复制几乎总是一个复杂的管理功能。更糟糕的是双向复制,理论上这将使您的应用程序能够更改辅助数据库上的数据,即使主数据库因维护而停机。复制并非不可能,但它确实需要大量的计划和测试才能在生产中可靠地运行。