当遇到备份或者还原操作占用较长时间时,很多人会问:

  1. 备份/还原是不是僵死了?要不要kill掉,再重来?
  2. 到底是哪一个部分的操作占用较长时间?
  3. 到底现在进行到什么阶段了

在SQL 2016 之前,要回答这些问题会比较困难一些,或者借助某些不受支持的方式。SQL 2016开始引入了新扩展事件 backup_restore_progress_trace 来跟踪备份和还原操作。我们可以使用它们来观察备份和还原的更详细的信息。

备份

先创建一个XE Session观察备份:

  1. CREATE EVENT SESSION [xe_backup] ON SERVER
  2. ADD EVENT sqlserver.backup_restore_progress_trace(
  3. ACTION(
  4. sqlos.task_time,sqlserver.database_id,sqlserver.database_name,
  5. sqlserver.nt_username,sqlserver.session_id,sqlserver.session_nt_username,
  6. sqlserver.sql_text,sqlserver.username
  7. )
  8. )
  9. ADD TARGET package0.event_file(SET filename=N'C:\Joe\xe\xeBackup.xel')
  10. WITH (STARTUP_STATE=ON)
  11. GO
  12. ALTER EVENT SESSION [xe_backup] ON SERVER
  13. STATE=START;
  14. GO

完成备份后,再来分析我们捕获的信息:

  1. BACKUP DATABASE [AdventureWorks2016CTP3] TO DISK = N'C:\SQL2016\MSSQL13.MSSQLSERVER\MSSQL\Backup\aw.bak'
  2. WITH NOFORMAT, INIT, NAME = N'AdventureWorks2016CTP3-Full Database Backup',
  3. SKIP, NOREWIND, NOUNLOAD, COMPRESSION, STATS = 10
  4. GO
  5. ALTER EVENT SESSION [xe_backup] ON SERVER
  6. STATE=STOP;
  7. GO
  8. ;WITH xevent AS (
  9. SELECT timestamp,operation_type,database_name,trace_level,trace_message,event_sequence
  10. FROM (
  11. SELECT timestamp = xevent.value(N'(event/@timestamp)[1]', N'datetime2'),
  12. operation_type = xevent.value(N'(event/data[@name="operation_type"]/text)[1]', N'nvarchar(32)'),
  13. database_name = xevent.value(N'(event/data[@name="database_name"])[1]', N'nvarchar(128)'),
  14. trace_message = xevent.value(N'(event/data[@name="trace_message"])[1]', N'nvarchar(max)'),
  15. trace_level = xevent.value(N'(event/data[@name="trace_level"])[1]', N'nvarchar(max)'),
  16. event_sequence = xevent.value(N'(event/action[@name="event_sequence"])[1]', N'int')
  17. FROM ( SELECT xevent = CONVERT(XML, event_data)
  18. FROM sys.fn_xe_file_target_read_file(N'c:\joe\xe\xeBackup_*.xel', NULL, NULL, NULL) )
  19. AS y
  20. ) AS xevent )
  21. SELECT database_name,timestamp,trace_level,trace_message,
  22. Duration = COALESCE( DATEDIFF(MILLISECOND, xevent.timestamp,LEAD(xevent.timestamp, 1) OVER(ORDER BY event_sequence)),0)
  23. FROM xevent
  24. ORDER BY event_sequence;

我这里的查询结果总共56行,highlight部分主要操作的信息。Duration列表示此操作所有时间。

由结果可以看到备份的trace_level分为Information of major steps in the operation和Verbose I/O related information,前者表示备份操作的中的主要步骤,后者表示某个步骤IO详细情况:

由这些信息,我们能够知道此备份操作主要的步骤有哪些,哪些步骤最耗时间

还原

还原我用的是上一个备份生成的文件,并且使用了REPLACE。

  1. CREATE EVENT SESSION [xe_restore] ON SERVER
  2. ADD EVENT sqlserver.backup_restore_progress_trace(
  3. ACTION(package0.event_sequence,sqlos.task_time,sqlserver.database_id,sqlserver.database_name,
  4. sqlserver.nt_username,sqlserver.server_instance_name,sqlserver.session_id,sqlserver.sql_text))
  5. ADD TARGET package0.event_file(SET filename=N'C:\Joe\xe\xeRestore.xel')
  6. WITH (STARTUP_STATE=ON)
  7. GO
  8. ALTER EVENT SESSION [xe_restore] ON SERVER
  9. STATE=START
  10. GO
  11. USE [master]
  12. RESTORE DATABASE [AdventureWorks2016CTP3] FROM DISK = N'C:\SQL2016\MSSQL13.MSSQLSERVER\MSSQL\Backup\aw.bak'
  13. WITH FILE = 1, NOUNLOAD, REPLACE, STATS = 5
  14. GO

观察XE的数据:

  1. ALTER EVENT SESSION [xe_restore] ON SERVER
  2. STATE=STOP
  3. GO
  4. ;WITH xevent AS (
  5. SELECT timestamp,operation_type,database_name,trace_level,trace_message,event_sequence
  6. FROM (
  7. SELECT timestamp = xevent.value(N'(event/@timestamp)[1]', N'datetime2'),
  8. operation_type = xevent.value(N'(event/data[@name="operation_type"]/text)[1]', N'nvarchar(32)'),
  9. database_name = xevent.value(N'(event/data[@name="database_name"])[1]', N'nvarchar(128)'),
  10. trace_message = xevent.value(N'(event/data[@name="trace_message"])[1]', N'nvarchar(max)'),
  11. trace_level = xevent.value(N'(event/data[@name="trace_level"])[1]', N'nvarchar(max)'),
  12. event_sequence = xevent.value(N'(event/action[@name="event_sequence"])[1]', N'int')
  13. FROM ( SELECT xevent = CONVERT(XML, event_data)
  14. FROM sys.fn_xe_file_target_read_file(N'c:\joe\xe\xeRestore_*.xel', NULL, NULL, NULL) )
  15. AS y
  16. ) AS xevent )
  17. SELECT database_name,timestamp,trace_level,trace_message,
  18. Duration = COALESCE( DATEDIFF(MILLISECOND, xevent.timestamp,LEAD(xevent.timestamp, 1) OVER(ORDER BY event_sequence)),0)
  19. FROM xevent
  20. ORDER BY event_sequence;





通过以上信息,我们能够知道还原数据库时的主要操有哪些,哪些步骤比较耗时

现实情况中数据库还原,roll-forward之后应该还有一个undo(roll-back)操作来撤消未提交事务的修改。

总结

  1. 虽然是SQL 2016才引入这个新的XE事件,但是在其它版本上,理论是相通的,只是一些细节的差别。
  2. 本文使用的是一个小的示例库,现实中生产库的情况要复杂一些。
  3. XE是一大利器,可以帮我们验证很多理论细节。

借助扩展事件查看SQL 2016备份和还原操作的内幕的更多相关文章

  1. 通过top 5等待事件查看sql语句

    设计的动态性能视图有:v$session_event,v$session,v$sqlarea,首先在v$session_event中可以找到event,然后通过其动态性能视图找到sid,可以在v$se ...

  2. SQL Server ->> 查看SQL Server备份历史

    找到最近数据库备份的细节信息,包括备份设备名和地址,最后备份时间 ------------------------------------------------------------------- ...

  3. 查看SQL Server 备份信息

    RESTORE HEADERONLY FROM DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQL2008\MSSQL\Back ...

  4. SQL Server 扩展事件(Extented Events)从入门到进阶(1)——从SQL Trace到Extented Events

    由于工作需要,决定深入研究SQL Server的扩展事件(Extended Events/xEvents),经过资料搜索,发现国外大牛的系列文章,作为“学习”阶段,我先翻译这系列文章,后续在工作中的心 ...

  5. SQLServer中使用扩展事件获取Session级别的等待信息以及SQLServer 2016中Session级别等待信息的增强

    本文出处:http://www.cnblogs.com/wy123/p/6835939.html 什么是等待 简单说明一下什么是等待:当应用程序对SQL Server发起一个Session请求的时候, ...

  6. SQL Server 扩展事件(Extented Events)从入门到进阶(4)——扩展事件引擎——基本概念

    本文属于 SQL Server 扩展事件(Extented Events)从入门到进阶 系列 在第一二节中,我们创建了一些简单的.类似典型SQL Trace的扩展事件会话.在此过程中,介绍了很多扩展事 ...

  7. SQL Server 扩展事件(Extented Events)从入门到进阶(3)——通过界面操作Extented Event

    本文属于 SQL Server扩展事件(Extended Events)从入门到进阶 系列 对于接纳扩展事件,其中一个最大的障碍就是要对XML和XQuery有一定的了解以便分析数据.我们可以使用T-S ...

  8. SQLSERVER2012里的扩展事件初尝试(上)

    SQLSERVER2012里的扩展事件初尝试(上) SQLSERVER2012里的扩展事件初尝试(下) 周未看了这两篇文章: 扩展事件在Denali CTP3里的新UI(一) 扩展事件在Denali ...

  9. 使用SQL Server 扩展事件来创建死锁的时间跟踪

    我们通过SQL Server 2012图形界面来部署一个扩展事件跟踪会话.然后可以生成SQL脚本,在2008或2008 R2版本下运行类似的跟踪. 步骤1: 通过“Object Explorer”连接 ...

随机推荐

  1. GCD使用汇总

    本文目录 dispatch_queue_t.dispatch_block_t dispatch_sync.dispatch_async dispatch_set_target_queue.dispat ...

  2. Python运维开发基础-概述-简介

    Python基础知识分为以下几块 1.Python概述 2.基础语法 3.数据结构 4.Python进阶 5.实训案例 一.Python概述 1.Python简介 2.Hello World 3.搭建 ...

  3. CSS预编译与PostCSS以及Webpack构建CSS综合方案

    CSS全称Cascading Style Sheets(层叠样式表),用来为HTML添加样式,本质上是一种标记类语言.CSS前期发展非常迅速,1994年哈肯·维姆·莱首次提出CSS,1996年12月W ...

  4. 在Linux下安装Oracle12c

    其实,对于oracle数据库和oracle实例的安装,借用图形化安装还是比较容易的,只是有个别地方需要特别注意外,其余的默认安装即可: 1.安装前的准备: 启动SSH工具: 先启动倒数第三个(想用图像 ...

  5. Ambari安装之部署 (Metrics Collector和 Metrics Monitor) Install Pending ...问题

    问题的由来 我这里,是因为,拿这个Ambari Metrics服务在做试验!所以先删除它,再添加它,出现了安装被挂起的问题.... Am bari里如何删除某指定的服务(图文详解) 问题详细描述如下: ...

  6. MySQL系列(一)--基础知识大总结

    MySQL系列(一)---基础知识大总结 前言:本文主要为mysql基础知识的大总结,mysql的基础知识很多,这里只是作为简单的介绍,但是具体的细节还是需要自行搜索.当然本文还有很多遗漏的地方,后续 ...

  7. if __name__ == '__main__' 如何正确理解

    今天有个初学Python 的朋友问我这个问题,他说在网上好多回答他都不太理解.所以这里我来做说一下,希望能把这个问题说明白. 先举一个例子:假设我们有一个add.py文件,里面的代码是这样: def ...

  8. mysql中csv文件的导入导出

    导出例子: select *from testinto outfile 'D:test.csv'fields terminated by ',' optionally enclosed by '&qu ...

  9. HDOJ2005-第几天?

    Problem Description 给定一个日期,输出这个日期是该年的第几天.   Input 输入数据有多组,每组占一行,数据格式为YYYY/MM/DD组成,具体参见sample input , ...

  10. <EffectiveJava>读书笔记--02泛型数组

    1, java中可以申明泛型类型的数组引用; 2, 但是不能实例化一个泛型数组对象; 3, 针对第二点, 可以曲线救国, 实例化一个Object数组, 再进行类型强转; 见代码如下: public c ...