我们拥有一个庞大的 MS SQL Server 生产环境,其中有数千个表急需索引调整和修剪。有没有关于在生产之外测试拟议更改的最佳方法的建议?
显然,我们可以(并且确实)建立一个 DEV 数据库服务器,我们可以在其中进行更改,但该 DEV 副本不会反映对表的实际需求。我们还有一个使用事务日志传送的生产镜像,但镜像始终是只读的(除非您将它们故障转移到主服务器),因此我们无法在那里测试索引更改。
有没有办法将事务日志发送到非只读镜像的实例? 显然这可能会遇到问题,尤其是在测试环境中进行架构更改时。即使只有索引更改,也可能出现查询超时和其他不一致的行为。
但这正是我们想要做的:给定一组索引更改,在实际负载下,实际查询的表现如何?它们更快吗?它们会失败吗?
几个测试查询是不够的。我们运行各种夜间、每周和每月的处理作业,这些作业对数据库的影响很大。我们还有许多外部脚本和服务,它们以我们并不总是预料到的方式查询和更新数据库。
考虑到所需更改的范围,我非常犹豫是否在未经验证的情况下进行任何实时生产索引更改。
您可以在生产服务器上跟踪流量,并在恢复到测试服务器的备份上重放流量。如果您仅使用只读查询,则这些不需要极其协调。
检查数据库实验助手或旧版RML 实用程序,以帮助您捕获跟踪、将其转换为重放并在正确的时间点恢复生产数据库的协调备份。
日志传送不会帮到你。一旦你执行恢复操作使数据库可读/写,你将无法恢复任何新的日志备份。
除非……您可以计时,以便在完成测试后(无论您如何定义该时间跨度),从完整备份重新启动日志传送。
另一个选择是事务复制。由于它在(基本上)逻辑层面上工作,因此它允许您拥有不同的索引方案。但是,从管理的角度来看,我真的不喜欢复制,所以这将是我的最后手段。
我认为,您应该向管理层展示性能测试环境的必要性。要么重新设计当前的日志传送,以便允许定期进行完全恢复,要么为此目的添加新环境(因此呈现给管理层)。
我认为您不应该将日志发送到开发服务器,而应该在开发副本上保存并重现生产工作负载并比较执行情况。