备份内部-在运行备份作业时会发生什么-就SQL Server中的锁定和性能开销而言?


13

对于MySQL,我知道数据库是在SQL语句中逐表备份的,这会导致锁定,如果在备份时更新列,则可能会遇到完整性问题。

据我了解,这不适用于Microsoft SQL Server,但是SQL Server如何处理呢?是否有一些内部冻结来保持数据库一致?

我还听说备份是单线程的,这意味着它仅使用一个核心,假设您备份到单个文件。还要假设您有一台多核计算机,例如16个核,或者至少有一个比一个大得多的核。

从我的个人经验来看,备份时我从来没有遇到过问题,既没有锁定也没有开销问题,但是我的经验有限。这就是为什么我总是建议在服务器属性中打开备份压缩的原因。

那么当备份作业运行时会发生什么呢?而且不同版本之间也存在显着差异吗?例如2008、2012和2014(不是许可)。


4
Paul Randall的这篇文章为有关备份的信息提供了一个很好的起点technet.microsoft.com/en-us/magazine/2009.07.sqlbackup.aspx
James Anderson

Answers:


9

您的所有观点都涵盖在备用神话中-Paul Randal

30-01)备份操作导致阻塞

否。备份操作不会锁定用户对象。备份的确在I / O子系统上造成了非常重的读取负载,因此看起来工作负载已被阻止,但实际上并非如此。它只是被放慢了。在一种特殊情况下,必须提取大容量日志范围的备份将获得文件锁定,这可能会阻止检查点操作-但DML从未被阻止。

我还听说备份是单线程的,这意味着它仅使用一个核心,假设您备份到单个文件。

对单个文件或设备进行备份时,将使用1个编写器线程。因此,如果要备份到多个文件/设备(即多个.bak文件),则每个文件/设备将只有一个写线程。

提高备份性能的最简单方法是允许备份操作并行化,这称为备份条带化。默认情况下,每个要读取的驱动器号或安装点都有一个数据读取器线程,每个要写入的备份设备都有一个数据写入器线程。

校验

  1. SQL Server 2008 Microsoft认证大师(MCM)准备视频,尤其是Backup Internals。
  2. 备份内部知识和如何跟踪备份与还原吞吐量(第1部分)-作者:Jonathan Kehayias
  3. 备份内部知识和如何跟踪备份与还原吞吐量(第2部分)-作者:Jonathan Kehayias

7

Paul撰写的有关备份内部的文章非常出色,您必须阅读。添加他人的意见并强调您问题的特定部分

我还听说备份是单线程的,这意味着它仅使用一个核心,假设您备份到单个文件。还要假设您有一台多核计算机,例如16个核,或者至少有一个比一个大得多的核。

备份操作,can use parallelism但请记住,这不是 SQL Server中Optimizer驱动并行性,它不是由备份要读取的数据文件,备份要写入的数据文件和创建的备份文件数量所涉及的磁盘数量驱动的。

MAXDOP进行SQL Server备份时无法使用提示

您无法在SSMS中为简单的TSQL备份操作生成执行计划。

由于备份操作不涉及任何运算符,因此SQL Server中查询优化器驱动的并行性基本上是针对所涉及的运算符的(实际上它更为复杂,但为简单起见,您可以采用此方式),因为备份操作不涉及任何运算符,因此它无法使用优化器驱动的并行度。

我在Technet Wiki上写了一篇有关备份和并行性的文章,其中使用简单的示例解释了SQL Server备份期间的并行性。以下是结论

  1. 如果数据库文件位于多个磁盘上,则将在每个设备驱动器的线程上启动备份操作以读取数据。同样,如果在多个驱动器/安装点上完成还原,则备份操作将为每个驱动器/安装点启动一个线程

  2. 即使您将备份的多个副本转储到同一驱动器上,我们也会为每个备份文件转储一个线程。

  3. 与备份关联的并行性与条带有关。每个条带都有其自己的工作线程,这实际上是备份/还原中应视为并行操作的唯一部分。

  4. 最大并行度对备份操作没有影响。

我从Paul和Bob Dorr那里得到了一些专家意见。

那么当备份作业运行时会发生什么呢?而且不同版本之间也存在显着差异吗?例如2008、2012和2014(不是许可)。

我建议您阅读Bob Dorr 撰写的blog.msdn文章。他强调的一些重点是

  1. 备份启动时,它将创建一系列缓冲区,这些缓冲区是从缓冲池外部的内存分配的。每个缓冲区的目标通常为4MB,导致大约4到8个缓冲区。有关计算的详细信息位于:http : //support.microsoft.com/kb/904804/en-us

  2. 缓冲区在空闲队列和数据队列之间转换。读取器拉出一个空闲缓冲区,将其填充数据并将其放置在数据队列中。编写器从数据队列中提取已填充的数据缓冲区,处理该缓冲区并将其返回到空闲列表。

  3. 每个备份设备都有一个写入器,每个写入器都从数据队列中检索。因此,具有磁盘规格的四(4)的备份命令将具有四个写入器和一个读取器。读取器使用异步I / O,因此可以与写入器保持同步。

您可以启用trace flags 3213 and 3605,两者都未记录,因此请在测试环境中使用它,并查看在SQL Server错误日志中转储了哪些有趣的消息。将会出现类似下面的内容

Memory limit: 249MB
BufferCount:                7
Sets Of Buffers:            1
MaxTransferSize:            1024 KB
Min MaxTransferSize:        64 KB
Total buffer space:         7 MB
Tabular data device count:  1
Fulltext data device count: 0
Filestream device count:    0
TXF device count:           0
Filesystem i/o alignment:   512
Media Buffer count:            7
Media Buffer size:          1024KB

我不知道各种版本的备份代码有任何重大变化,此类情况未记录在案。我只知道SQL Server 2012 SP1 Cumulative Update 2,使用TSQL或SMO从SQL Server的Windows Azure Blob存储服务启用备份和还原中引入的增强功能。在这里阅读


4

基本上,SQL Server对磁盘上的所有页面进行脏拷贝。如果存在并发活动或以前采用非检查点活动,则这些页面可能不一致。

然后,SQL Server还将事务日志的必要部分复制到将过期页面带到最新版本并使恢复时所有内容保持一致所需的必要部分。

我不能说备份操作的多线程性。我希望它可以并行化。您还如何在10GB /秒IO子系统上备份10TB数据库?


谢谢usr的回答,但是有些事情还不清楚。如果在备份作业期间将恢复模型设置为简单或运行诸如truncate之类的语句,会发生什么情况。难道不是SQL Server无法将其置于一致状态?
RayofCommand

备份期间的有效日志模型已满。即使您希望简单,SQL Server也需要能够前滚所有内容。截断表是已记录的事务处理,在那里没有问题。DDL是事务性的。
usr
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.