

# Amazon RDS での Microsoft SQL Server 用のリードレプリカの使用
<a name="SQLServer.ReadReplicas"></a>

リードレプリカは通常、Amazon RDS の DB インスタンス間でレプリケーションを設定するために使用します。リードレプリカの概要については、「[DB インスタンスのリードレプリカの操作](USER_ReadRepl.md)」を参照してください。

このセクションでは、Amazon RDS for SQL Server でのリードレプリカの使用に関する特定の情報を確認することができます。
+ [データベース ユーザーとオブジェクトを SQL Server リードレプリカと同期する](SQLServer.ReadReplicas.ObjectSynchronization.md)
+ [SQL Server リードレプリカの問題のトラブルシューティング](SQLServer.ReadReplicas.Troubleshooting.md)

## SQL Server リードレプリカの設定
<a name="SQLServer.ReadReplicas.Configuration"></a>

DB インスタンスがレプリケーション用のソース DB インスタンスとして機能するには、ソース DB インスタンスで自動バックアップを有効にする必要があります。そのためには、バックアップ保持期間の値を 0 以外の値に設定します。このタイプのデプロイを設定すると、自動バックアップが有効になります。

SQL Server リードレプリカを作成する際、プライマリ DB インスタンスを停止する必要はありません。Amazon RDS では、サービスを中断することなく、ソース DB インスタンスとリードレプリカに必要なパラメータとアクセス許可を設定できます。ソース DB インスタンスのスナップショットが作成され、このスナップショットがリードレプリカになります。リードレプリカの削除時にも停止は発生しません。

1 つのソース DB インスタンスから最大 15 つのリードレプリカを作成できます。レプリケーションを効率的に実行するには、各リードレプリカにソース DB インスタンスと同程度のコンピューティングリソースとストレージリソースを設定することをお勧めします。ソースの DB インスタンスをスケールした場合は、リードレプリカもスケールする必要があります。

ソース DB インスタンスとそのすべてのリードレプリカの SQL Server DB エンジンバージョンは同じである必要があります。Amazon RDS では、メンテナンスウィンドウに関係なく、リードレプリカがアップグレードされた後すぐにプライマリがアップグレードされます。DB エンジンバージョンのアップグレードの詳細については、「[Microsoft SQL Server DB エンジンのアップグレード](USER_UpgradeDBInstance.SQLServer.md)」を参照してください。

リードレプリカでソースからの変更を受信して適用できるように、十分なコンピューティングリソースとストレージリソースが必要です。リードレプリカのコンピューティング、ネットワーク、またはストレージがリソースの容量に達すると、リードレプリカはソースからの変更の受信または適用を停止します。リードレプリカのストレージや CPU リソースは、そのソースや他のリードレプリカとは独立して変更することができます。

リードレプリカを作成する方法については、「[リードレプリカの作成](USER_ReadRepl.Create.md)」を参照してください。

## SQL Server でのリードレプリカの制限
<a name="SQLServer.ReadReplicas.Limitations"></a>

Amazon RDS の SQL Server リードレプリカには、次の制限が適用されます。
+ リードレプリカは、SQL Server Enterprise Edition (EE) エンジンでのみ使用することができます。
+ リードレプリカは、SQL Server バージョン 2016 – 2022 で使用できます。
+ 1 つのソース DB インスタンスから最大 15 つのリードレプリカを作成できます。ソース DB インスタンスのリードレプリカが 5 つを超えると、レプリケーションで遅延が発生する場合があります。
+ リードレプリカは、4 つ以上の vCPU を持つ DB インスタンスクラスで実行されている DB インスタンスでのみ使用できます。
+ リードレプリカは、インスタンスクラスタイプと可用性モードに応じて最大 100 のデータベースをサポートします。データベースをリードレプリカに自動的にレプリケートするには、ソース DB インスタンスでデータベースを作成する必要があります。レプリケートするデータベースを個別に選択することはできません。詳細については、「[Microsoft SQL Server DB インスタンスの制限](CHAP_SQLServer.md#SQLServer.Concepts.General.FeatureSupport.Limits)」を参照してください。
+ リードレプリカからデータベースを削除することはできません。データベースを削除するには、`rds_drop_database` ストアドプロシージャを使用してソース DB インスタンスから削除します。詳細については、「[Amazon RDS for Microsoft SQL Server DB インスタンスのデータベースの削除](Appendix.SQLServer.CommonDBATasks.DropMirrorDB.md)」を参照してください。
+ ソース DB インスタンスが透過的なデータ暗号化 (TDE) を使用してデータを暗号化すると、リードレプリカも TDE を自動的に設定します。

  ソース DB インスタンスが KMS キーを使用してデータを暗号化すると、同じリージョンのリードレプリカは同じ KMS キーを使用します。クロスリージョンリードレプリカの場合、リードレプリカの作成時にリードレプリカのリージョンから KMS キーを指定する必要があります。リードレプリカの KMS キーを変更することはできません。
+ リードレプリカは、作成元のアベイラビリティーゾーンに関係なく、ソース DB インスタンスと同じタイムゾーンと照合順序を持ちます。
+ Amazon RDS for SQL Server では、次の機能はサポートされていません。
  + リードレプリカのバックアップ保持
  + リードレプリカからのポイントインタイムリカバリ
  + リードレプリカの手動スナップショット
  + マルチ AZ リードレプリカ
  + リードレプリカのリードレプリカの作成
  + リードレプリカへのユーザーログインの同期
+ Amazon RDS for SQL Server は、ソース DB インスタンスとそのリードレプリカの間の高いレプリカラグを軽減するために介入することはありません。ソース DB インスタンスとそのリードレプリカのサイズが、コンピューティング能力とストレージの観点から、運用負荷に合わせて適切に設定されていることを確認してください。
+ AWS GovCloud (米国東部) と AWS GovCloud (米国西部) リージョンの間ではレプリケーションできますが、AWS GovCloud (US) Regions との間ではレプリケーションできません。

## RDS for SQL Server レプリカのオプションに関する考慮事項
<a name="SQLServer.ReadReplicas.limitations.options"></a>

RDS for SQL Server レプリカを作成する前に、次の要件、制限、推奨事項を確認してください。
+ SQL Server レプリカがソース DB インスタンスと同じリージョンにある場合は、そのレプリカがソース DB インスタンスと同じオプショングループに属していることを確認してください。出典オプショングループまたは出典オプショングループメンバーシップへの変更はレプリカに反映されます。これらの変更は、レプリカのメンテナンスウィンドウに関係なく、出典 DB インスタンスに適用された後すぐにレプリカに適用されます。

  オプショングループの詳細については、「[オプショングループを使用する](USER_WorkingWithOptionGroups.md)」を参照してください。
+ SQL Server クロスリージョンレプリカを作成する場合、Amazon RDS により、そのための専有オプショングループが作成されます。

  SQL Server クロスリージョンレプリカを、その専有オプショングループから削除することはできません。他の DB インスタンスで、SQL Server クロスリージョンレプリカの専有オプショングループを使用することはできません。

  以下のオプションは、レプリケートオプションです。SQL Server クロスリージョンレプリカにレプリケートオプションを追加するには、そのオプションをソース DB インスタンスのオプショングループに追加します。オプションは、すべての出典 DB インスタンスのレプリカにもインストールされます。
  + `TDE`

  以下のオプションは、レプリケートされないオプションです。専用オプショングループから、レプリケートされないオプションを追加または削除できます。
  + `MSDTC`
  + `SQLSERVER_AUDIT`
  + クロスリージョンリードレプリカで `SQLSERVER_AUDIT` オプションを有効にするには、クロスリージョンリードレプリカの専用オプショングループとソースインスタンスのオプショングループに `SQLSERVER_AUDIT` オプションを追加します。SQL Server クロスリージョンリードレプリカのソースインスタンスに `SQLSERVER_AUDIT` オプションを追加することで、ソースインスタンスのクロスリージョンリードレプリカごとにサーバーレベル監査オブジェクトとサーバーレベルの監査仕様を作成できます。クロスリージョンリードレプリカにアクセスして、完成した監査ログを Amazon S3 バケットにアップロードできるようにするには、専用オプショングループに `SQLSERVER_AUDIT` オプションを追加し、オプション設定を行います。監査ファイルのターゲットとして使用している Amazon S3 バケットは、クロスリージョンリードレプリカと同じリージョンにある必要があります。各クロスリージョンリードレプリカの `SQLSERVER_AUDIT` オプションのオプション設定を個別に変更して、それぞれがそれぞれのリージョンの Amazon S3 バケットにアクセスできるようにします。

  次のオプションは、リードレプリカではサポートされていません。
  + `SSRS`
  + `SSAS`
  + `SSIS`

  次のオプションは、クロスリージョンリードレプリカで一部サポートされています。
  + `SQLSERVER_BACKUP_RESTORE`
  + SQL Server クロスリージョンレプリカのソース DB インスタンスには `SQLSERVER_BACKUP_RESTORE` オプションがありますが、すべてのクロスリージョンレプリカを削除するまで、ソース DB インスタンスでネイティブ復元を実行できません。クロスリージョンレプリカの作成中は、既存のネイティブリストアタスクはすべてキャンセルされます。`SQLSERVER_BACKUP_RESTORE` オプションを専用のオプショングループに追加することはできません。

    ネイティブバックアップと復元の詳細については、「[ネイティブバックアップと復元を使用した SQL Server データベースのインポートとエクスポート](SQLServer.Procedural.Importing.md)」を参照してください。

  SQL Server クロスリージョンリードレプリカを昇格するとき、昇格されたレプリカは、オプションの管理を含め、その他の SQL Server DB インスタンスと同じように動作します。オプショングループの詳細については、「[オプショングループを使用する](USER_WorkingWithOptionGroups.md)」を参照してください。

# データベース ユーザーとオブジェクトを SQL Server リードレプリカと同期する
<a name="SQLServer.ReadReplicas.ObjectSynchronization"></a>

新しく作成されたリードレプリカには、リードレプリカの作成時にプライマリ DB インスタンスに存在するログイン、カスタムサーバーロール、SQL エージェントジョブ、またはその他のサーバーレベルのオブジェクトが存在することが期待されます。ただし、リードレプリカの作成後にプライマリ DB インスタンスで作成されたサーバーレベルのオブジェクトは自動的にレプリケートされないため、リードレプリカで手動で作成する必要があります。

データベースユーザーは、プライマリ DB インスタンスからリードレプリカに自動的にレプリケートされます。リードレプリカデータベースは読み取り専用モードであるため、データベースユーザーのセキュリティ識別子 (SID) をデータベースで更新することはできません。そのため、リードレプリカに SQL ログインを作成するときは、そのログインの SID がプライマリ DB インスタンスの対応する SQL ログインの SID と一致していることを確認することが不可欠です。SQL ログインの SID を同期しないと、リードレプリカのデータベースにアクセスできなくなります。SQL Server は Active Directory から SID を取得するため、Windows Active Directory (AD) 認証ログインでこの問題は発生しません。

**プライマリ DB インスタンスからの SQL ログインをリードレプリカに同期するには**

1. プライマリ DB インスタンスに接続します。

1. プライマリ DB インスタンスに新しい SQL ログインを作成します。

   ```
   USE [master]
   GO
   CREATE LOGIN TestLogin1
   WITH PASSWORD = 'REPLACE WITH PASSWORD';
   ```
**注記**  
セキュリティ上のベストプラクティスとして、ここに示されているプロンプト以外のパスワードを指定してください。

1. データベースに SQL ログイン用の新しいデータベースユーザーを作成します。

   ```
   USE [REPLACE WITH YOUR DB NAME]
   GO
   CREATE USER TestLogin1 FOR LOGIN TestLogin1;
   GO
   ```

1. プライマリ DB インスタンスで新しく作成された SQL ログインの SID を確認します。

   ```
   SELECT name, sid FROM sys.server_principals WHERE name =  'TestLogin1';
   ```

1. リードレプリカに接続します。新しい SQL ログインを作成します。

   ```
   CREATE LOGIN TestLogin1 WITH PASSWORD = 'REPLACE WITH PASSWORD', SID=REPLACE WITH sid FROM STEP #4;
   ```

**または、リードレプリカデータベースにアクセスできる場合は、孤立したユーザーを次のように修正できます。**

1. リードレプリカに接続します。

1. データベース内で孤立したユーザーを特定します。

   ```
   USE [REPLACE WITH YOUR DB NAME]
   GO
   EXEC sp_change_users_login 'Report';
   GO
   ```

1. 孤立したデータベースユーザーに SQL ログインを作成します。

   ```
   CREATE LOGIN TestLogin1 WITH PASSWORD = 'REPLACE WITH PASSWORD', SID=REPLACE WITH sid FROM STEP #2;
   ```

   例:

   ```
   CREATE LOGIN TestLogin1 WITH PASSWORD = 'TestPa$$word#1', SID=0x1A2B3C4D5E6F7G8H9I0J1K2L3M4N5O6P;
   ```
**注記**  
セキュリティ上のベストプラクティスとして、ここに示されているプロンプト以外のパスワードを指定してください。

# SQL Server リードレプリカの問題のトラブルシューティング
<a name="SQLServer.ReadReplicas.Troubleshooting"></a>

Amazon CloudWatch のレプリケーションのラグをモニタリングするには、Amazon RDS `ReplicaLag` メトリクスを表示します。レプリケーションのラグタイムについては、「[リードレプリケーションのモニタリング](USER_ReadRepl.Monitoring.md)」を参照してください。

レプリケーションラグが長すぎる場合は、次のクエリを使用してラグに関する情報を取得できます。

```
SELECT AR.replica_server_name
     , DB_NAME (ARS.database_id) 'database_name'
     , AR.availability_mode_desc
     , ARS.synchronization_health_desc
     , ARS.last_hardened_lsn
     , ARS.last_redone_lsn
     , ARS.secondary_lag_seconds
FROM sys.dm_hadr_database_replica_states ARS
INNER JOIN sys.availability_replicas AR ON ARS.replica_id = AR.replica_id
--WHERE DB_NAME(ARS.database_id) = 'database_name'
ORDER BY AR.replica_server_name;
```