在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 权限:

  1. 在将要创建备份文件的计算机上打开本地安全策略应用程序 (secpol.msc)。
  1. 在左侧窗格中,展开“本地策略” ,然后单击“用户权限指派” 。
  1. 在右侧窗格中,双击“执行卷维护任务”。
  1. 单击“添加用户或组” ,添加用于备份的任何用户帐户。
  1. 单击“应用” ,然后关闭所有“本地安全策略” 对话框。

设置后,重启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浅析的更多相关文章

  1. 还原一直卡在ASYNC_IO_COMPLETION浅析

    下面在还原一个数据库(备份文件40多G大小,实际数据库大小300G),在还原过程中,出现一直等待ASYNC_IO_COMPLETION,如下测试截图所示,已经等待了72分钟了,但是还原比例依然为0% ...

  2. SQL Server 2012不支持从SQL Server 2000的备份进行还原

    错误: dbbackup failed: Unable to restore database 'ppt'Not valid backupThe database was backed up on a ...

  3. SQL Server 2012入门图解:建表、备份、还原

    一.建立你的第一个数据库和表   例:建立一个用于描述一个学校学生情况的数据库.把它命名为School.并且要在School数据库下建立保存学生信息的表Student.在可视化界面下,我们通常这样操作 ...

  4. 使用PowerShell 命令集进行SQL Server 2012 备份和还原

    最近心相不错,所以打算翻译一些英文文档做福利,原文在此,翻译有不足的地方还请各位兄弟指点. 讨论什么是DBA最重要的工作的时候,你最常听到就是一条就是DBA只要做好备份和恢复.事实如此,如果你不做备份 ...

  5. SQL Server 2012 The report server cannot open a connection to the report server database

    案例环境: 操作系统版本:    Windows Server 2012 R2 Standard 数据库版本  :    SQL SERVER 2012 SP2 案例介绍: 今天进入一台新安装的SQL ...

  6. SQL SERVER 2012 从Enterprise Evaluation Edtion 升级到 Standard Edtion SP1

    案例背景:公司从意大利购买了一套中控系统,前期我也没有参与其中(包括安装.实施都是第三方),直到最近项目负责人告诉我:前期谈判以为是数据库的License费用包含在合同中,现在经过确认SQL Serv ...

  7. Visual Basic 2012 借助DataGridView控件将Excel 2010数据导入到SQL server 2012

    (注:注释的颜色原本为绿色,在这里变为黑色,有点不便,但不会造成阅读影响.放入Visual Basic2012代码编辑器后会还原成绿色.) 摘  要:DataGridView控件作为数据传输的中介,只 ...

  8. SQL Server 2012 各版本功能比较

    有关不同版本的 SQL Server 2012 所支持的功能的详细信息. 功能名称 Enterprise 商业智能 Standard Web Express with Advanced Service ...

  9. SQL Server 2012:SQL Server体系结构——一个查询的生命周期(第1部分)

    为了缩小读取操作所涉及范围,本文首先着眼于简单的SELECT查询,然后引入执行更新操作有关的附加过程.最后你会读到,优化性能时SQLServer使用还原工具的相关术语和流程. 关系和存储引擎 如图所示 ...

随机推荐

  1. JVM的类加载

    一.基本类加载机制介绍 大体引用一下<深入理解Java虚拟机>一书中对类加载的定义:虚拟机将描述类的二进制字节流(即Class文件)加载到内存中,并对其进行验证.准备.解析.初始化,最终 ...

  2. spring-session用mysql实现session共享实践

    前段时间,写了篇<spring-session-data-redis解决session共享的问题>文章,介绍了spring-session使用redis存储实现session共享的内部机制 ...

  3. 【ASP.NET MVC系列】浅谈ASP.NET MVC 视图

    ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...

  4. Java——类和对象

    前言   Java语言是一种面向对象的语言.面向对象的思想是在七十年代的时候由IBM的SmallTalk语言最先推广.那什么是面向对象呢?面向对象指的是一种开发模式.早期的计算机编程使用的是面向过程的 ...

  5. MySQL的binlog恢复(Windows下)

    前言 在最近的工作中,由于自己粗(zuo)心(si)误update操作导致几百行的数据出现错误,在心急如焚的同时(那时候我竟然不知道除了备份之后还有binlog日志恢复)立马查资料学习binlog的恢 ...

  6. 【golang-GUI开发】项目的编译

    在上一篇文章里,我们讲到了安装therecipe/qt(https://www.cnblogs.com/apocelipes/p/9296754.html),现在我们来讲讲如何编译使用了thereci ...

  7. iOS多线程(上)——GCD详解(上)

    GCD(Grand central Dispatch)是Apple开发的一个多核编程的较新的解决方法.它主要用于优化应用程序以支持多核处理器以及其他对称多处理系统.下面我讲讲述关于GCD的点,通篇读完 ...

  8. Ubuntu 安装 JDK8 的两种方式

    ubuntu 安装jdk 的两种方式: 1:通过ppa(源) 方式安装. 2:通过官网下载安装包安装. 这里推荐第1种,因为可以通过 apt-get upgrade 方式方便获得jdk的升级 使用pp ...

  9. .NET Core 实践二:事件通知和异步处理

    首先让我们来先看一个例子: 这是一个简单的用户下单购买商品的业务模型,输入端是用户,相关物料有订单和货物,相关的内部服务有业务(订单).财务(支付).仓储(备货)和物流(运输). 从图中我们可以看到, ...

  10. BurpSuiteProxy安装使用

    第一步先安装jdk    https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.html  ...