SQL Server 2012还原一直卡在ASYNC_IO_COMPLETION浅析
栏目: 数据库 · SQL Server · 发布时间: 6年前
内容简介:在SQL Server 2012(11.0.7001.0)下面在还原一个数据库(备份文件40多G大小,实际数据库大小300G),在还原过程中,出现一直等待ASYNC_IO_COMPLETION,如下测试截图所示,已经等待了72分钟了,但是还原比例依然为0%
在SQL Server 2012(11.0.7001.0)下面在还原一个数据库(备份文件40多G大小,实际数据库大小300G),在还原过程中,出现一直等待ASYNC_IO_COMPLETION,如下测试截图所示,已经等待了72分钟了,但是还原比例依然为0%
SELECT r.session_id , r.command , r.start_time, r.status, r.wait_type, CONVERT(NUMERIC(6, 2), r.percent_complete) AS [Percent Complete(%)] , CONVERT(VARCHAR(20), DATEADD(ms, r.estimated_completion_time, GETDATE()), 20) AS [ETA Completion Time] , CONVERT(NUMERIC(10, 2), r.total_elapsed_time / 1000.0 / 60.0) AS [Elapsed Min] , CONVERT(NUMERIC(10, 2), r.estimated_completion_time / 1000.0 / 60.0) AS [ETA Min] , CONVERT(NUMERIC(10, 2), r.estimated_completion_time / 1000.0 / 60.0 / 60.0) AS [ETA Hours] , CONVERT(VARCHAR(1000), ( SELECT SUBSTRING(text, r.statement_start_offset / 2, CASE WHEN r.statement_end_offset = -1 THEN 1000 ELSE ( r.statement_end_offset - r.statement_start_offset ) / 2 END) FROM sys.dm_exec_sql_text(sql_handle) )) AS CommandText FROM sys.dm_exec_requests r WHERE command IN ( 'RESTORE DATABASE', 'BACKUP DATABASE','RESTORE LOG' );
当然,这里是实验,如果还要继续等待的话,相信这个时间会更长。这个是比较让人奇怪的现象。后面查了一下这个跟 即时文件初始化 (Instant File Initialization (IFI))有关。关于这个概念,可以参考官方文档 数据库文件初始化 ,摘抄部分内容如下所示:
数据库文件初始化
初始化数据和日志文件以覆盖之前删除的文件遗留在磁盘上的任何现有数据。 执行以下其中一项操作时,应首先通过零填充(用零填充)数据和日志文件来初始化这些文件:
· 创建数据库。
· 向现有数据库添加数据或日志文件。
· 增大现有文件的大小(包括自动增长操作)。
· 还原数据库或文件组。
文件初始化会导致这些操作花费更多时间。 但是,首次将数据写入文件后,操作系统就不必用零来填充文件
即时文件初始化 (IFI)
在 SQL Server 中,可以在瞬间对数据文件进行初始化,以避免零填充操作。即时文件初始化可以快速执行上述文件操作。 即时文件初始化功能将回收使用的磁盘空间,而无需使用零填充空间。 相反,新数据写入文件时会覆盖磁盘内容。 日志文件不能立即初始化。
备注
只有在 Microsoft Windows XP Professional 或 Windows Server 2003 或更高版本中才可以使用即时文件初始化功能。
重要
只有在数据文件中才可以使用即时文件初始化功能。 创建日志文件或其大小增长时,将始终零填充该文件。
即时文件初始化功能仅在向 SQL Server 服务启动帐户授予了 SE_MANAGE_VOLUME_NAME 之后才可用。 Windows Administrator 组的成员拥有此权限,并可以通过将其他用户添加到 执行卷维护任务 安全策略中来为其授予此权限。
重要
某些功能使用(如 透明数据加密 (TDE) )可以阻止即时文件初始化。
因为这个案例中,启动SQL Server的服务启动账号为NT Service\MSSQLSERVER,所以没有权限即时文件初始化的,如果将启动SQL Server的服务启动账号改为具有管理员权限的域账号,就不会出现这种情况。另外,如果一定要以NT Service\MSSQLSERVER为启动账号
要向一个帐户授予 Perform volume maintenance tasks 权限:
- 在将要创建备份文件的计算机上打开 本地安全策略 应用程序 (secpol.msc) 。
- 在左侧窗格中,展开 “ 本地策略 ” ,然后单击 “ 用户权限指派 ” 。
- 在右侧窗格中,双击 “ 执行卷维护任务 ” 。
- 单击 “ 添加用户或组 ” ,添加用于备份的任何用户帐户。
- 单击 “ 应用 ” ,然后关闭所有 “ 本地安全策略 ” 对话框 。
设置后,重启 SQL Server 服务,然后还原数据库就会正常化,此时的等待事件为 BACKUPTHREAD ,而不是 ASYNC_IO_COMPLETION, 如果版本是SQL Server 2012 SP4或以上版本,可以通过下面 SQL 查看识别是否启用了即时文件初始化
SELECT servicename , startup_type , instant_file_initialization_enabled FROM sys.dm_server_services;
另外,从SQL Server 2016 (13.x) 开始,可在安装期间授予服务帐户此权限。 如果使用命令提示符安装,请添加 /SQLSVCINSTANTFILEINIT 参数,或选中安装向导中 “ 授予 SQL Server 数据库引擎服务执行卷维护任务权限 ” 复选框。
参考资料:
https://docs.microsoft.com/zh-cn/sql/relational-databases/databases/database-instant-file-initialization?view=sql-server-2017
以上所述就是小编给大家介绍的《SQL Server 2012还原一直卡在ASYNC_IO_COMPLETION浅析》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 深度备份还原工具 V1.0 正式发布 — 备份还原,安全可靠
- 使用 nltk 词形还原
- Antsword流量分析与还原
- Redis安全以及备份还原
- Oracle RMAN备份与还原
- 学习bootstrap和jquery框架还原网页
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。