快捷搜索:
来自 网络数据库 2019-11-06 06:46 的文章
当前位置: 67677新澳门手机版 > 网络数据库 > 正文

2016备份和还原操作的内幕

当遇到备份或然恢复生机操作占用较长时间时,非常多个人会问:

  1. 备份/还原是还是不是僵死了?要不要kill掉,再重来?
  2. 到底是哪二个有些的操作占用较长期?
  3. 毕竟未来进展到什么样阶段了

在SQL 二零一四以前,要回答那几个主题材料会相比较艰难一些,或许依赖某个不受援救的不二秘技。SQL 二〇一五初叶引进了新增添事件 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:JoexexeBackup.xel')
WITH (STARTUP_STATE=ON)
GO
ALTER EVENT SESSION [xe_backup] ON SERVER 
STATE=START;
GO

完了备份后,再来剖判我们捕获的新闻:

BACKUP DATABASE [AdventureWorks2016CTP3] TO  DISK = N'C:SQL2016MSSQL13.MSSQLSERVERMSSQLBackupaw.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:joexexeBackup_*.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详细的情况:

图片 1

图片 2

图片 3

由这个音信,咱们能够驾驭此备份操作首要的步骤有怎么样,哪些步骤最耗时间

还原

东山再起本身用的是上三个备份生成的文书,何况接收了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:JoexexeRestore.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:SQL2016MSSQL13.MSSQLSERVERMSSQLBackupaw.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:joexexeRestore_*.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;

图片 4
图片 5
图片 6

透过以上信息,大家能够领会回复数据库时的尤为重要操有怎样,哪些步骤比较耗费时间

现况中数据库还原,roll-forward之后应该还会有一个undo(roll-back)操作来撤除未提交业务的改革。

总结

  1. 纵然是SQL 二〇一四才引进那一个新的XE事件,可是在别的版本上,理论是近似的,只是局地细节的差别。
  2. 正文使用的是三个小的示例库,现实中分娩库的气象要复杂一些。
  3. XE是一大利器,能够帮我们作证比非常多辩驳细节。

本文由67677新澳门手机版发布于网络数据库,转载请注明出处:2016备份和还原操作的内幕

关键词: