高速データベース復旧を管理するManage accelerated database recovery

適用対象:Applies to: はいSQL Server 2019 (15.x)SQL Server 2019 (15.x)yesSQL Server 2019 (15.x)SQL Server 2019 (15.x)適用対象:Applies to: はいSQL Server 2019 (15.x)SQL Server 2019 (15.x)yesSQL Server 2019 (15.x)SQL Server 2019 (15.x)

ADR の有効化と制御Enabling and controlling ADR

SQL Server 2019 (15.x)SQL Server 2019 (15.x) では ADR は既定でオフになっており、DDL 構文を使用して制御できます。ADR is off by default in SQL Server 2019 (15.x)SQL Server 2019 (15.x), and can be controlled using DDL syntax:

ALTER DATABASE [DB] SET ACCELERATED_DATABASE_RECOVERY = {ON | OFF}
[(PERSISTENT_VERSION_STORE_FILEGROUP = { filegroup name }) ];

この構文を使用してこの機能のオン/オフを制御し、永続的なバージョン ストア (PVS) データに特定のファイルグループを指定します。Use this syntax to control whether the feature is on or off, and designate a specific filegroup for the persistent version store (PVS) data. ファイル グループが指定されていない場合、PVS はプライマリ ファイル グループに格納されます。If no filegroup is specified, the PVS will be stored in the PRIMARY filegroup.

永続的なバージョン ストア ファイルグループの管理Managing the persistent version store Filegroup

ADR 機能は変更をバージョン管理することを基盤としており、さまざまなバージョンのデータ要素が PVS に保管されます。The ADR feature is based on having changes versioned, with different versions of a data element kept in the PVS. PVS の場所の見つけ方と PVS に含まれるデータ サイズの管理方法には注意点があります。There are considerations to locating where the PVS is located and in how to manage the size of the data in the PVS.

ファイルグループを指定せずに ADR を有効にするにはTo enable ADR without specifying a filegroup

ALTER DATABASE [MyDatabase] SET ACCELERATED_DATABASE_RECOVERY = ON;
GO

この場合、PVS ファイルグループが指定されていないとき、PRIMARY ファイルグループで PVS データが保持されます。In this case, when the PVS filegroup is not specified, the PRIMARY filegroup holds the PVS data.

ADR を有効にし、PVS を [VersionStoreFG] ファイルグループに格納するように指定するにはTo enable ADR and specify that the PVS should be stored in the [VersionStoreFG] filegroup

このスクリプトを実行する前に、ファイルグループを作成します。Before running this script, create the filegroup.

ALTER DATABASE [MyDatabase] SET ACCELERATED_DATABASE_RECOVERY = ON
(PERSISTENT_VERSION_STORE_FILEGROUP = [VersionStoreFG])

ADR 機能を無効にするにはTo disable the ADR feature

ALTER DATABASE [MyDatabase] SET ACCELERATED_DATABASE_RECOVERY = OFF;
GO

ADR 機能が無効になった後でも、論理的に元に戻すときに必要となる永続的なバージョン ストアにバージョンが格納されます。Even after the ADR feature is disabled, there will be versions stored in the persistent version store that are still needed by the system for logical revert.

PVS の場所を別のファイルグループに変更するChange the location of the PVS to a different filegroup

さまざまな理由から、PVS の場所を別のファイルグループに移さなければならないことがあります。You may need to move the location of the PVS to a different filegroup for a variety of reasons. たとえば、PVS でもっとたくさんの領域が必要になったり、高速のストレージが必要になったりすることがあります。For example, PVS may require more space, or faster storage.

PVS の場所の変更は、3 つの手順からなるプロセスです。Changing the location of the PVS is a three-step process.

  1. ADR 機能をオフにします。Turn the ADR feature off.

    ALTER DATABASE [MyDatabase] SET ACCELERATED_DATABASE_RECOVERY = OFF;
    GO
    
  2. PVS に格納されているすべてのバージョンを解放できるようになるまで待ちます。Wait until all of the versions stored in the PVS can be freed

    ADR をオンにし、永続的なバージョン ストアに新しい場所を指定するには、まず、PVS の前の場所からバージョン情報がすべて削除されていることを確認する必要があります。In order to be able to turn on ADR with a new location for the persistent version store, you must first make sure that all of the version information has been purged from the previous PVS location. その消去を強制するには、次のコマンドを実行します。In order to force that cleanup to happen, run the command:

    EXEC sys.sp_persistent_version_cleanup [database name]
    

    sys.sp_persistent_version_cleanup ストアド プロシージャは同期型です。つまり、現行の PVS からすべてのバージョン情報が消去されるまで完了となりません。sys.sp_persistent_version_cleanup stored procedure is synchronous, meaning that it will not complete until all version information is cleaned up from the current PVS. 完了したら、DMV sys.dm_persistent_version_store_stats を問い合わせ、persistent_version_store_size_kb の値を調べることでバージョン情報が確かに削除されていることを確認できます。Once it completes, you can verify that the version information is indeed removed by querying the DMV sys.dm_persistent_version_store_stats and examining the value of persistent_version_store_size_kb.

    SELECT DB_Name(database_id), persistent_version_store_size_kb 
    FROM sys.dm_tran_persistent_version_store_stats where database_id = [MyDatabaseID]
    

    persistent_version_store_size_kb の値が 0 のとき、ADR 機能を再度有効にし、PVS を新しいファイルグループに置くように構成できます。When the value of persistent_version_store_size_kb is 0, you can re-enable the ADR feature, configuring the PVS to be located in the new filegroup.

  3. PVS の新しい場所を指定して ADR をオンにするTurn on ADR specifying the new location for PVS

    ALTER DATABASE [MyDatabase] SET ACCELERATED_DATABASE_RECOVERY = ON
    (PERSISTENT_VERSION_STORE_FILEGROUP = [VersionStoreFG])
    

トラブルシューティングTroubleshooting

注意

このセクションは Azure SQL Database にも適用されます。This section also applies to Azure SQL Database.

sys.dm_tran_persistent_version_store_stats を問い合わせ、PVS のサイズを確認します。Query sys.dm_tran_persistent_version_store_stats to check PVS sizes.

% of DB のサイズを確認します。Check % of DB size. また、一般的なサイズとの違いにもご注意ください。Also note the difference from typical size.

PVS は、ベースラインより大幅に大きいか、データベース サイズの 50% に近くなっている場合に大きいと見なされます。PVS is considered large if it's significantly larger than baseline or if it is close to 50% of the size of the database.

  1. oldest_active_transaction_id を取得し、トランザクション ID に基づいて sys.dm_tran_database_transactions を問い合わせることでこのトランザクションが本当に長時間アクティブになっているのかを確認します。Retrieve oldest_active_transaction_id and check whether this transaction has been active for a really long time by querying sys.dm_tran_database_transactions based on the transaction ID.

    アクティブなトランザクションがあると、PVS を消去できません。Active transactions prevent cleaning up PVS.

  2. データベースが可用性グループに含まれる場合、secondary_low_water_mark を確認してください。If the database is part of an availability group, check the secondary_low_water_mark. これは sys.dm_hadr_database_replica_states によって報告される low_water_mark_for_ghosts と同じです。This is the same as the low_water_mark_for_ghosts reported by sys.dm_hadr_database_replica_states. sys.dm_hadr_database_replica_states を問い合わせ、いずれかのレプリカでこの値が隠されていないか確認します。これも PVS の消去を妨げるためです。Query sys.dm_hadr_database_replica_states to see whether one of the replicas is holding this value behind, since this will also prevent PVS cleanup.

  3. min_transaction_timestamp (あるいは、オンライン PVS の消去が妨げられている場合は online_index_min_transaction_timestamp) を確認し、それに基づいて列 transaction_sequence_numsys.dm_tran_active_snapshot_database_transactions を確認し、古いスナップショット トランザクションが PVS の消去を妨げているセッションを見つけます。Check min_transaction_timestamp (or online_index_min_transaction_timestamp if the online PVS is holding up) and based on that check sys.dm_tran_active_snapshot_database_transactions for the column transaction_sequence_num to find the session that has the old snapshot transaction holding up PVS cleanup.

  4. 上記のいずれも該当しない場合、中止となったトランザクションによって消去が妨げられていることになります。If none of the above applies, then it means that the cleanup is held by aborted transactions. aborted_version_cleaner_last_start_timeaborted_version_cleaner_last_end_time を確認し、中止となったトランザクションの消去が完了しているかを確認します。Check the last time the aborted_version_cleaner_last_start_time and aborted_version_cleaner_last_end_time to see if the aborted transaction cleanup has completed. 中止となったトランザクションの消去が完了した後は、oldest_aborted_transaction_id の値が上位に移動するはずです。The oldest_aborted_transaction_id should be moving higher after the aborted transaction cleanup completes.

  5. 中止となったトランザクションが最近、正常に完了しなかった場合、エラー ログを確認し、VersionCleaner の問題を報告しているメッセージがないか確認します。If the aborted transaction hasn’t completed successfully recently, check the error log for messages reporting VersionCleaner issues.

トラブルシューティングの支援として、以下のサンプル クエリをお使いください。Use the sample query below as a troubleshooting aid:

SELECT pvss.persistent_version_store_size_kb / 1024. / 1024 AS persistent_version_store_size_gb,
       pvss.online_index_version_store_size_kb / 1024. / 1024 AS online_index_version_store_size_gb,
       pvss.current_aborted_transaction_count,
       pvss.aborted_version_cleaner_start_time,
       pvss.aborted_version_cleaner_end_time,
       dt.database_transaction_begin_time AS oldest_transaction_begin_time,
       asdt.session_id AS active_transaction_session_id,
       asdt.elapsed_time_seconds AS active_transaction_elapsed_time_seconds
FROM sys.dm_tran_persistent_version_store_stats AS pvss
LEFT JOIN sys.dm_tran_database_transactions AS dt
ON pvss.oldest_active_transaction_id = dt.transaction_id
   AND
   pvss.database_id = dt.database_id
LEFT JOIN sys.dm_tran_active_snapshot_database_transactions AS asdt
ON pvss.min_transaction_timestamp = asdt.transaction_sequence_num
   OR
   pvss.online_index_min_transaction_timestamp = asdt.transaction_sequence_num
WHERE pvss.database_id = DB_ID();