我最近向 SQL Server 添加了更多 CPU 核心,并且按照最佳实践建议,我将 tempDB 文件分成相同数量的核心 (8)。
除了最佳实践,我还扩大了新 tempdb 文件的大小,限制了自动增长并缩小了原始文件以匹配新文件的大小。
问题是,由于我从单核到 8 核,所有 tempdb 数据都保留在第一个文件中,这不允许我缩小。现在我有一个比其他文件大的 tempdb 文件,我想更改它。
我怀疑要解决这个问题需要中断。
有没有办法在不中断的情况下做到这一点?
这个问题值得解决吗?我知道最佳实践是怎么说的,但是除了丑陋之外,这个实例真的会导致任何实际问题吗?
EMPTYFILE 只是将所有页面转移到其他文件,因此您随后可以执行 ALTER DATABASE ... REMOVE FILE。这似乎不是我们想要的。
我不会担心这个,只是让它在下次重新启动时自行排序。请记住,tempdb 是根据 sys.master_files 所说的内容重新创建的。这是 tempdb 关于文件的数量、位置、大小等的“模板”。
您可以使用 ALTER DATABASE ... MODIFY FILE 调整 sys.master_files 中的大小。如果您需要帮助,只需使用 SSMS、tempdb、属性,并将任何 tempdb 文件的大小调整为更大的大小。然后编写命令脚本并根据自己的喜好进行调整。(不在 GUI 中指定较小大小的原因是它会生成一个 DBCC SHRINKFILE,它只(尝试)解决 tempdb 的当前大小而不对模板做任何事情。完全有可能指定一个小于使用 ALTER DATABASE for tempdb 的当前大小,因为它只会影响“模板”而不影响当前大小。
因此,由于我不知道您正在处理的 tempdb 的大小,因此我将举一个例子。
确保为文件组中的所有文件设置自动增长。
因此,为了使文件大小相同,我会像其他文件一样将 tempdev 缩小到 30000MB。我会分批进行,这样收缩就可以停止并重新开始,而不会浪费到目前为止的工作。
如果我被某个页面阻止了,我会尝试查看是否有任何我可以发布的内容。
然后我会再次开始收缩。
如果它仍然被页面阻塞,那么我会设置初始文件大小,以便在下一次 sql 服务重新启动后文件大小相同。