Ray*_*and 14 sql-server backup sql-server-2012 sql-server-2014
对于 MySQL,我知道数据库是在 SQL 语句中逐表备份的,这会导致锁定,如果在备份时更新列,则最终可能会出现完整性问题。
据我了解,这不适用于 Microsoft SQL Server,但 SQL Server 是如何处理的?是否有一些内部冻结来保持数据库一致?
我还听说备份是单线程的,这意味着它只使用一个核心,假设您备份到单个文件。还假设您有一台多核机器,例如 16 核,或者至少比 1 多得多。
根据我的个人经验,我在备份时从未遇到过问题,既没有锁定也没有开销问题,但我的经验有限。这就是为什么我总是建议在服务器属性中打开备份压缩。
那么当备份作业正在运行时会发生什么?不同版本是否也有显着差异?例如 2008、2012 和 2014(不是许可证)。
Kin*_*hah 10
您的所有观点都包含在备份神话中 - 保罗兰德尔
30-01) 备份操作导致阻塞
否。备份操作不会锁定用户对象。备份确实会在 I/O 子系统上造成非常重的读取负载,因此看起来工作负载被阻塞了,但事实并非如此。它只是被放慢了速度。有一种特殊情况,即必须获取大容量日志范围的备份将获取可能阻止检查点操作的文件锁——但 DML 永远不会被阻止。
我还听说备份是单线程的,这意味着它只使用一个核心,假设您备份到单个文件。
完成对单个文件或设备的备份将使用 1 个编写器线程。因此,如果您要备份到多个文件/设备(即多个 .bak 文件),每个文件/设备将有一个编写器线程。
提高备份性能的最简单方法是允许备份操作并行化,这称为备份条带化。默认情况下,每个要读取的驱动器号或挂载点都有一个数据读取器线程,每个要写入的备份设备都有一个数据写入器线程。
查看
Paul 撰写的有关备份内部结构的文章非常出色,您必须阅读它。添加其他人所说的内容并强调您问题的特定部分
我还听说备份是单线程的,这意味着它只使用一个核心,假设您备份到单个文件。还假设您有一台多核机器,例如 16 核,或者至少比 1 多得多。
备份操作,can use parallelism但请记住,这不是由 SQL Server 中的优化器驱动的并行性,它由备份必须读取数据文件的位置以及备份写入数据文件的位置以及创建的备份文件的数量所涉及的磁盘数量驱动。
MAXDOP进行 SQL Server 备份时不能使用提示
您无法在 SSMS 中为简单的 TSQL 备份操作生成执行计划。
SQL Server 中由查询优化器驱动的并行性基本上适用于涉及的运算符(实际上它更复杂,但为了简单起见,您可以使用它),因为备份操作不涉及任何运算符,因此它不能使用由优化器驱动的并行性。
我在 Technet Wiki 上写了一篇关于备份和并行性的文章,其中我使用简单的示例来解释 SQL Server 备份期间的并行性。以下是结论
如果数据库文件在多个磁盘上,备份操作将在每个设备驱动器的线程上启动以读取数据。同样,如果在多个驱动器/挂载点上完成还原,备份操作将在每个驱动器/挂载点启动一个线程
即使您在同一驱动器上转储多个备份副本,我们也会为每个备份文件转储一个线程。
与备份相关的并行度与条带相关。每个条带都有自己的工作线程,这实际上是备份/恢复中唯一应该被视为并行操作的部分。
最大并行度对备份操作没有影响。
我从 Paul 和 Bob Dorr 那里得到了一些专家意见。
那么当备份作业正在运行时会发生什么?不同版本是否也有显着差异?例如 2008、2012 和 2014(不是许可证)。
我建议您阅读Bob Dorr 的这篇 blog.msdn 文章。他强调的一些要点是
当备份开始时,它会创建一系列缓冲区,这些缓冲区是从缓冲池外的内存中分配的。每个缓冲区的目标通常为 4MB,从而产生大约 4 到 8 个缓冲区。有关计算的详细信息位于:http : //support.microsoft.com/kb/904804/en-us
缓冲区在空闲队列和数据队列之间转换。读取器拉出一个空闲缓冲区,用数据填充它并将其放在数据队列中。写入者从数据队列中提取填充的数据缓冲区,处理缓冲区并将其返回到空闲列表。
每个备份设备都有一个写入器,每个都从数据队列中检索。因此,具有四(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
Run Code Online (Sandbox Code Playgroud)
我不知道各种版本的备份代码有任何重大变化,这些事情没有记录。我只知道SQL Server 2012 SP1 Cumulative Update 2,使用 TSQL 或 SMO 从 SQL Server 从 Windows Azure Blob 存储服务启用备份和还原中引入的增强功能。在这里阅读
基本上,SQL Server 会对磁盘上的所有页面进行脏拷贝。如果存在并发活动或以前存在非检查点活动,则这些页面可能不一致。
然后,SQL Server 还会复制事务日志的必要部分,以便将过时的页面更新到最新版本并使所有内容在还原时保持一致。
我无法谈论备份操作的多线程性。我希望它被并行化。您还能如何在 10GB/秒 IO 子系统上备份 10TB 数据库?