web-dev-qa-db-ja.com

PREEMPTIVE_OS_WRITEFILEGATHER IFIをオンにしてデータベースの復元を待機

Azure VM Windows Server 2012 R2とSQL Server 2014 Enterprise Editionを使用しています。IFIを有効にしています(SQL ServerユーザーNTSERVICE\MSSQLSERVERを「ボリュームメンテナンスタスクの実行」に追加))。

Cドライブ(SSD)上のファイルを含む3 GBのデータベースを復元しようとしましたが、完了するまでに約40分かかりました。復元の進行状況を確認すると、約20分後に100%完了しました。

復元中、復元のためにPREEMPTIVE_OS_WRITEFILEGATHERが常に表示されていました。

3 GBデータベースの場合、40分では長すぎます。

ファイルはCドライブにあり(良好ではありません)、Cドライブ上にあった残りのアクティビティすべてに影響があります。これは、復元に影響を与える可能性があります。

それが長くかかる原因となっているものを見つけるために他に探すことができるものはありますか?

編集:私はこれまでに以下を確認しました:

1-EXEC xp_cmdshell "whoami /priv"でチェックし、SeManageVolumePrivilege Perform volume maintenance tasks Enabledを取得したので、SQLサーバーユーザーは権限を持っています

2-以下の回答の後に、念のためにsqlserviceを再起動しました

3-トレースフラグ3004,3605 ONを使用して新しいデータベースを作成することを確認しました。MDFではなく、ldfのゼロ化のみをログに記録しています-したがって、IFIはONです

4
Horia

wBobはまさにその通りです。サービスの再起動が必要です。私は彼の答えを強化して、IFIが実際に有効であることをverifyするスクリプトを提供したいと思いました。

これにより、ローカルポリシーを有効にするためにサービスを開始する必要があるかどうかが決まります。

USE MASTER;

SET NOCOUNT ON

-- *** WARNING: Undocumented commands used in this script !!! *** --
--Exit if a database named DummyTestDB exists
IF DB_ID('DummyTestDB') IS NOT NULL
BEGIN
    RAISERROR (
            'A database named DummyTestDB already exists, exiting script'
            ,20
            ,1
            )
    WITH LOG
END

--Temptable to hold output from sp_readerrorlog
IF OBJECT_ID('tempdb..#SqlLogs') IS NOT NULL
    DROP TABLE #SqlLogs
GO

CREATE TABLE #SqlLogs (
    LogDate DATETIME2(0)
    ,ProcessInfo VARCHAR(20)
    ,TEXT VARCHAR(MAX)
    )

--Turn on trace flags 3004 and 3605
DBCC TRACEON (
        3004
        ,3605
        ,- 1
        )
WITH NO_INFOMSGS

--Create a dummy database to see the output in the SQL Server Errorlog
CREATE DATABASE DummyTestDB
GO

--Turn off trace flags 3004 and 3605
DBCC TRACEOFF (
        3004
        ,3605
        ,- 1
        )
WITH NO_INFOMSGS

--Remove the DummyDB
DROP DATABASE DummyTestDB;

--Now go check the output in the SQL Server Error Log File
--This can take a while if you have a large errorlog file
INSERT INTO #SqlLogs (
    LogDate
    ,ProcessInfo
    ,TEXT
    )
EXEC sp_readerrorlog 0
    ,1
    ,'Zeroing'

IF EXISTS (
        SELECT *
        FROM #SqlLogs
        WHERE TEXT LIKE 'Zeroing completed%'
            AND TEXT LIKE '%DummyTestDB.mdf%'
            AND LogDate > DATEADD(HOUR, - 1, LogDate)
        )
BEGIN
    PRINT 'We do NOT have instant file initialization.'
    PRINT 'Grant the SQL Server services account the ''Perform Volume Maintenance Tasks'' security policy.'
END
ELSE
BEGIN
    PRINT 'We have instant file initialization.'
END
4

サービスを再起動しましたか?ファイルの即時初期化は、SQL Serverサービスの再起動後にのみ有効になります。

2
wBob