![SQL Server 的推荐磁盘/分区设置](https://linux22.com/image/484385/SQL%20Server%20%E7%9A%84%E6%8E%A8%E8%8D%90%E7%A3%81%E7%9B%98%2F%E5%88%86%E5%8C%BA%E8%AE%BE%E7%BD%AE.png)
我正在寻找有关为 SQL Server 设置磁盘/分区的最佳方法的一些建议。以下是我主要关心的一些问题:
应如何分离 SQL 文件(数据文件、日志、临时文件)?
对大量 HDD 进行 RAID 并对空间进行分区,还是创建多个 RAID,每个 RAID 使用较少的磁盘,哪个更好?
数据和日志文件是否应该位于不同的 RAID 类型上?
默认数据库(master、msdb 等...)是否应位于 C: 上,或者是否应与其他数据/日志文件位于同一位置?
答案1
这是一篇很好的博客文章:http://sqlserveradvisor.blogspot.com/2009/03/sql-server-disk-configuration.html
磁盘对齐白皮书:http://msdn.microsoft.com/en-us/library/dd758814.aspx
简而言之,您的操作系统应该在 RAID 1 上,您的数据文件在 RAID 10 上(最好),日志文件在 RAID 1 上。
SQL 性能文章:http://www.sql-server-performance.com/faq/raid_1_raid_5_p1.aspx
PDF 十大最佳性能技巧:http://www.stlssug.org/docs/Best_Practices_for_Performance.pdf
另外,出于性能原因,请记住将 TEMPDB 放在单独的磁盘上。我相信 Paul Randal 会很快告诉你为什么。
MS 解释了 tempdb 的原因:http://msdn.microsoft.com/en-us/library/ms175527.aspx
答案2
这是一个很大的“视情况而定”的问题。
我无法回答您如何创建单独的 RAID 阵列的问题,因为我不是存储专家,但我可以帮助您解决其余问题。
您需要考虑的第一件事是各种数据库的工作负载 - OLTP(读/写)或 DSS/DW(主要为读)。对于读/写工作负载,您应该考虑 RAID 1 或 RAID 10(RAID 1+0),因为它们提供冗余和出色的读/写性能。对于主要为读的工作负载,您可以使用 RAID 5。RAID 5 不应用于读/写工作负载的原因是您需要在写入时付出性能代价。
事务日志,就其本质而言是读/写的(或大部分是写的,取决于您是否将事务日志用于任何目的 - 例如日志备份或复制),因此永远不应放在 RAID 5 上。
这意味着对于某些数据库和工作负载,您可能将数据文件放在 RAID 5 上,将日志文件放在 RAID 1/10 上,而对于其他数据库,您可能将所有内容放在 RAID 1/10 上。更进一步说,如果您有一个分区数据库,它可能包含一些主要读取的数据和一些读/写数据,甚至可能在同一个表中。这可以分成单独的文件组,然后将每个文件组放在适当的 RAID 级别上。
实际数据库的分离再次取决于工作负载和底层 IO 子系统的功能 - 例如,在单个 RAID 阵列上存储内容可能需要比在 SAN 上更高程度的分离。
Tempdb 本身就是一个特殊情况,因为它通常是一个负载很重的数据库,应该与其他数据库分开存储。系统数据库不应被大量使用,只要有冗余,就可以放在任何地方。
以下是我协助撰写的白皮书的链接,希望对您有所帮助:物理数据库存储设计。还要确保您的 IO 子系统可以处理预期的工作负载 - 请参阅此白皮书:部署前 I/O 最佳实践。最后,请确保使用正确的 RAID 条带大小(在较新的系统上通常为 64K 或更高)、正确的 NTFS 分配单元大小(通常为 64K),并且在 Windows Server 2008 之前的系统上,您正确设置了磁盘分区偏移量。有关这些内容的信息以及有关它们的更多信息的指针以及为什么要以这种方式配置它们,请参阅此博客文章:您的磁盘分区偏移、RAID 条带大小和 NTFS 分配单元是否设置正确?。
底线:了解您的工作量和 IO 子系统功能,然后相应地实施。
我希望这对你有帮助。
PS 就 tempdb 而言,关于如何配置它,存在很多问题,而且存在各种相互矛盾的信息。我写了一篇关于 tempdb 数据文件配置的综合博客文章,网址为关于 TF 1118 的误解。
答案3
对于我设置的服务器,简短的回答一直是
记录在单独的物理磁盘、raid 1 或 10(条带化 + 镜像)上
数据库位于自己的磁盘上,根据性能需求通常为 RAID5
突袭控制器上有大量缓存
最好将操作系统和 Windows 页面文件放在单独的阵列上,通常只是一个镜像 (Raid 1)。这样可以将所有写入操作分开,这样繁重的性能就不会拖累一切。
我过去的经验是,数据库写入 + 日志写入 + 页面文件写入会使 Raid5 阵列陷入瘫痪,性能会急剧下降。问题是,在测试、开发等情况下,您的性能会很好。但是当您投入生产并且使用量猛增时,这个问题就会“突如其来”地出现,用户投诉也会猛增。
答案4
这里有比我优秀的 MSSQL 人员,但总的来说,我建议如下;
C 上的操作系统和代码 - 这应该是本地磁盘,应该是 RAID1 阵列对 - 我们为此使用了 2 个 2.5 英寸 SAS 146GB 10krpm 磁盘,但您可以使用 2 个 SATA 7.2 磁盘。数据应该放在一个非常快(10krpm 或更高)的 RAID 1/10、5/50/6/60 阵列上,大小随您所需 - 我们将我们的数据保存在 FC SAN LUN 上,通常保存在“第 2 层”/10krpm 磁盘组上。日志应该保存在一个单独的非常快(15krpm)的小型(10GB 或更少?)RAID 1 阵列对上 - 我们将我们的数据保存在 FC SAN LUN 上,通常保存在非常小的“第 1 层”/15krpm 磁盘组或“第 0 层”/ssd 组上。
无论哪种方式,您都希望将其中的每一块放在单独的主轴/阵列上以提高性能 - 当然它们都可以在单个磁盘上运行,但我想您正在寻找性能和成本的平衡。
我们将 master/tempdb 与常规数据库一起存储,但您可以将其分成单独的数据阵列 LUN。
希望这可以帮助。