借助扩展事件查看SQL 2016备份和还原操作的内幕
当遇到备份或者还原操作占用较长时间时,很多人会问:
- 备份/还原是不是僵死了?要不要kill掉,再重来?
- 到底是哪一个部分的操作占用较长时间?
- 到底现在进行到什么阶段了?
在SQL 2016 之前,要回答这些问题会比较困难一些,或者借助某些不受支持的方式。SQL 2016开始引入了新扩展事件 backup_restore_progress_trace 来跟踪备份和还原操作。我们可以使用它们来观察备份和还原的更详细的信息。
备份
先创建一个XE Session观察备份:
CREATE EVENT SESSION [xe_backup] ON SERVER
ADD EVENT sqlserver.backup_restore_progress_trace(
ACTION(
sqlos.task_time,sqlserver.database_id,sqlserver.database_name,
sqlserver.nt_username,sqlserver.session_id,sqlserver.session_nt_username,
sqlserver.sql_text,sqlserver.username
)
)
ADD TARGET package0.event_file(SET filename=N'C:\Joe\xe\xeBackup.xel')
WITH (STARTUP_STATE=ON)
GO
ALTER EVENT SESSION [xe_backup] ON SERVER
STATE=START;
GO
完成备份后,再来分析我们捕获的信息:
BACKUP DATABASE [AdventureWorks2016CTP3] TO DISK = N'C:\SQL2016\MSSQL13.MSSQLSERVER\MSSQL\Backup\aw.bak'
WITH NOFORMAT, INIT, NAME = N'AdventureWorks2016CTP3-Full Database Backup',
SKIP, NOREWIND, NOUNLOAD, COMPRESSION, STATS = 10
GO
ALTER EVENT SESSION [xe_backup] ON SERVER
STATE=STOP;
GO
;WITH xevent AS (
SELECT timestamp,operation_type,database_name,trace_level,trace_message,event_sequence
FROM (
SELECT timestamp = xevent.value(N'(event/@timestamp)[1]', N'datetime2'),
operation_type = xevent.value(N'(event/data[@name="operation_type"]/text)[1]', N'nvarchar(32)'),
database_name = xevent.value(N'(event/data[@name="database_name"])[1]', N'nvarchar(128)'),
trace_message = xevent.value(N'(event/data[@name="trace_message"])[1]', N'nvarchar(max)'),
trace_level = xevent.value(N'(event/data[@name="trace_level"])[1]', N'nvarchar(max)'),
event_sequence = xevent.value(N'(event/action[@name="event_sequence"])[1]', N'int')
FROM ( SELECT xevent = CONVERT(XML, event_data)
FROM sys.fn_xe_file_target_read_file(N'c:\joe\xe\xeBackup_*.xel', NULL, NULL, NULL) )
AS y
) AS xevent )
SELECT database_name,timestamp,trace_level,trace_message,
Duration = COALESCE( DATEDIFF(MILLISECOND, xevent.timestamp,LEAD(xevent.timestamp, 1) OVER(ORDER BY event_sequence)),0)
FROM xevent
ORDER BY event_sequence;
我这里的查询结果总共56行,highlight部分主要操作的信息。Duration列表示此操作所有时间。
由结果可以看到备份的trace_level分为Information of major steps in the operation和Verbose I/O related information,前者表示备份操作的中的主要步骤,后者表示某个步骤IO详细情况:
由这些信息,我们能够知道此备份操作主要的步骤有哪些,哪些步骤最耗时间。
还原
还原我用的是上一个备份生成的文件,并且使用了REPLACE。
CREATE EVENT SESSION [xe_restore] ON SERVER
ADD EVENT sqlserver.backup_restore_progress_trace(
ACTION(package0.event_sequence,sqlos.task_time,sqlserver.database_id,sqlserver.database_name,
sqlserver.nt_username,sqlserver.server_instance_name,sqlserver.session_id,sqlserver.sql_text))
ADD TARGET package0.event_file(SET filename=N'C:\Joe\xe\xeRestore.xel')
WITH (STARTUP_STATE=ON)
GO
ALTER EVENT SESSION [xe_restore] ON SERVER
STATE=START
GO
USE [master]
RESTORE DATABASE [AdventureWorks2016CTP3] FROM DISK = N'C:\SQL2016\MSSQL13.MSSQLSERVER\MSSQL\Backup\aw.bak'
WITH FILE = 1, NOUNLOAD, REPLACE, STATS = 5
GO
观察XE的数据:
ALTER EVENT SESSION [xe_restore] ON SERVER
STATE=STOP
GO
;WITH xevent AS (
SELECT timestamp,operation_type,database_name,trace_level,trace_message,event_sequence
FROM (
SELECT timestamp = xevent.value(N'(event/@timestamp)[1]', N'datetime2'),
operation_type = xevent.value(N'(event/data[@name="operation_type"]/text)[1]', N'nvarchar(32)'),
database_name = xevent.value(N'(event/data[@name="database_name"])[1]', N'nvarchar(128)'),
trace_message = xevent.value(N'(event/data[@name="trace_message"])[1]', N'nvarchar(max)'),
trace_level = xevent.value(N'(event/data[@name="trace_level"])[1]', N'nvarchar(max)'),
event_sequence = xevent.value(N'(event/action[@name="event_sequence"])[1]', N'int')
FROM ( SELECT xevent = CONVERT(XML, event_data)
FROM sys.fn_xe_file_target_read_file(N'c:\joe\xe\xeRestore_*.xel', NULL, NULL, NULL) )
AS y
) AS xevent )
SELECT database_name,timestamp,trace_level,trace_message,
Duration = COALESCE( DATEDIFF(MILLISECOND, xevent.timestamp,LEAD(xevent.timestamp, 1) OVER(ORDER BY event_sequence)),0)
FROM xevent
ORDER BY event_sequence;
通过以上信息,我们能够知道还原数据库时的主要操有哪些,哪些步骤比较耗时。
现实情况中数据库还原,roll-forward之后应该还有一个undo(roll-back)操作来撤消未提交事务的修改。
总结
- 虽然是SQL 2016才引入这个新的XE事件,但是在其它版本上,理论是相通的,只是一些细节的差别。
- 本文使用的是一个小的示例库,现实中生产库的情况要复杂一些。
- XE是一大利器,可以帮我们验证很多理论细节。
借助扩展事件查看SQL 2016备份和还原操作的内幕的更多相关文章
- 通过top 5等待事件查看sql语句
设计的动态性能视图有:v$session_event,v$session,v$sqlarea,首先在v$session_event中可以找到event,然后通过其动态性能视图找到sid,可以在v$se ...
- SQL Server ->> 查看SQL Server备份历史
找到最近数据库备份的细节信息,包括备份设备名和地址,最后备份时间 ------------------------------------------------------------------- ...
- 查看SQL Server 备份信息
RESTORE HEADERONLY FROM DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQL2008\MSSQL\Back ...
- SQL Server 扩展事件(Extented Events)从入门到进阶(1)——从SQL Trace到Extented Events
由于工作需要,决定深入研究SQL Server的扩展事件(Extended Events/xEvents),经过资料搜索,发现国外大牛的系列文章,作为“学习”阶段,我先翻译这系列文章,后续在工作中的心 ...
- SQLServer中使用扩展事件获取Session级别的等待信息以及SQLServer 2016中Session级别等待信息的增强
本文出处:http://www.cnblogs.com/wy123/p/6835939.html 什么是等待 简单说明一下什么是等待:当应用程序对SQL Server发起一个Session请求的时候, ...
- SQL Server 扩展事件(Extented Events)从入门到进阶(4)——扩展事件引擎——基本概念
本文属于 SQL Server 扩展事件(Extented Events)从入门到进阶 系列 在第一二节中,我们创建了一些简单的.类似典型SQL Trace的扩展事件会话.在此过程中,介绍了很多扩展事 ...
- SQL Server 扩展事件(Extented Events)从入门到进阶(3)——通过界面操作Extented Event
本文属于 SQL Server扩展事件(Extended Events)从入门到进阶 系列 对于接纳扩展事件,其中一个最大的障碍就是要对XML和XQuery有一定的了解以便分析数据.我们可以使用T-S ...
- SQLSERVER2012里的扩展事件初尝试(上)
SQLSERVER2012里的扩展事件初尝试(上) SQLSERVER2012里的扩展事件初尝试(下) 周未看了这两篇文章: 扩展事件在Denali CTP3里的新UI(一) 扩展事件在Denali ...
- 使用SQL Server 扩展事件来创建死锁的时间跟踪
我们通过SQL Server 2012图形界面来部署一个扩展事件跟踪会话.然后可以生成SQL脚本,在2008或2008 R2版本下运行类似的跟踪. 步骤1: 通过“Object Explorer”连接 ...
随机推荐
- ThinkPHP 实现验证码渲染、校验、点击刷新
一.在控制器中写方法,生成验证码,代码如下: /** * 验证码生成 * expire 验证码的有效期(秒) * useImgBg 是否使用背景图片 默认为false * fontSize 验证码字体 ...
- *更新*无需root,一条命令强制全屏模式
未root的系统,必须通过pc端运行adb命令进行设置,因此请开启开发者选项中的adb调试模式,用usb连接电脑和手机,运行下面的代码强制开启全屏模式,立即生效:全屏沉浸: adb shell set ...
- [肯定不知道]PeopleSoft中PSADMIN你不知道的秘密
PeopleSoft psadmin工具是用于管理PS App server,process scheduler 和 web server节点的.可以使用一些设置菜单选项来管理或配置上面提到的任何组件 ...
- Mybatis Dynamic Query 简单筛选
在框架中,筛选描述类有两种(FilterDescriptor, FilterGroupDescriptor),这里我们主要举例来说明FilterDescriptor用法. FilterDescript ...
- 【D3】transition API
摘要: 动画类API 一.API 使用 1. 1 d3.ease 1.2 d3.timer Start a custom animation timer, invoking the specified ...
- 阿里云服务器Windows Server 2008/2012部署Office Web Server 2013
以前成功将Office Web Server 2013部署在了本地服务器上,此次是将Office Web Server 2013部署在阿里云服务器Windows Server 2008和2012上,中 ...
- javascript中的闭包(Closure)的学习
闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 下面是我在网上通过学习阮一峰老师的笔记,感觉总结很不错,特记录于此. 一.变量的作用域 要理解 ...
- HDU1036 Average is not Fast Enough!
Problem Description A relay is a race for two or more teams of runners. Each member of a team runs o ...
- H5微信通过百度地图API实现导航方式一
根据业务需求修改百度API,实现微信中的导航功能.因为源码中SearchInfoWindow_min.js有点小问题(部分小城市公交线路少,查不到路线时没有提示),所以这里在源码的基础上改了一点点.可 ...
- Linux 下 安装jdk 1.7
Linux 下 安装jdk 1.7 参考百度经验 http://jingyan.baidu.com/album/ce09321b7c111f2bff858fea.html?picindex=6 第一步 ...