

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 Amazon RDS 中的 Microsoft SQL Server 的僅供讀取複本
<a name="SQLServer.ReadReplicas"></a>

您通常會使用僅供讀取複本來設定 Amazon RDS 資料庫執行個體間的複寫。如需僅供讀取複本的一般資訊，請參閱 [使用資料庫執行個體僅供讀取複本](USER_ReadRepl.md)。

在此章節，您可以找到在 Amazon RDS 上使用 SQL Server 僅供讀取複本的特定資訊。
+ [使用 SQL Server 僅供讀取複本同步資料庫使用者和物件](SQLServer.ReadReplicas.ObjectSynchronization.md)
+ [對 SQL Server 僅供讀取複本問題進行故障診斷](SQLServer.ReadReplicas.Troubleshooting.md)

## 設定 SQL Server 僅供讀取複本
<a name="SQLServer.ReadReplicas.Configuration"></a>

當您將資料庫執行個體作為來源執行個體以進行複寫之前，您必須在來源資料庫執行個體上啟用自動備份。若要這麼做，請將備份保留期設定為 0 以外的值。設定此類型的部署也會強制啟用自動備份。

建立 SQL Server 僅供讀取複本不需要停止使用主要資料庫執行個體。Amazon RDS 會為來源資料庫執行個體和僅供讀取複本設定必要的參數和權限，而不會中斷任何服務。將拍攝來源資料庫執行個體的快照，而此快照會變成僅供讀取複本。在您刪除僅供讀取複本不會發生中斷情況。

單一來源資料庫執行個體可建立至多 15 個僅供讀取複本。若希望複寫作業順利運作，建議您將每個僅供讀取複本的運算和儲存資源數量設定為與來源資料庫執行個體相同。若您擴展來源資料庫執行個體，也要擴展僅供讀取複本。

來源資料庫執行個體及其所有僅供讀取複本的 SQL Server 資料庫引擎版本必須相同。Amazon RDS 升級僅供讀取複本後會立即升級主要執行個體，無論維護時段為何。如需有關升級資料庫引擎版本的詳細資訊，請參閱[Microsoft SQL Server 資料庫引擎的升級](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 版使用。
+ 單一來源資料庫執行個體可建立至多 15 個僅供讀取複本。當您的來源資料庫執行個體有超過 5 個僅供讀取複本時，複寫可能會延遲。
+ 僅供讀取複本只適用於資料庫執行個體執行於資料庫執行個體類別具有四個或以上的虛擬 vCPU。
+ 僅供讀取複本最多支援 100 個資料庫，具體取決於執行個體類別類型和可用性模式。您必須在來源資料庫執行個體上建立資料庫，以自動將其複寫至僅供讀取複本。您無法選擇個別資料庫進行複寫。如需詳細資訊，請參閱 [Microsoft SQL Server 資料庫執行個體的限制](CHAP_SQLServer.md#SQLServer.Concepts.General.FeatureSupport.Limits)。
+ 您無法從僅供讀取複本捨棄資料庫。若要捨棄資料庫，請使用 `rds_drop_database` 預存程序從來源資料庫執行個體加以捨棄。如需詳細資訊，請參閱 [在 Amazon RDS for Microsoft SQL Server 資料庫執行個體中捨棄資料庫](Appendix.SQLServer.CommonDBATasks.DropMirrorDB.md)。
+ 如果來源資料庫執行個體使用透明資料加密 (TDE) 來加密資料，僅供讀取複本也會自動設定 TDE。

  如果來源資料庫執行個體使用 KMS 金鑰加密資料，則相同區域中的僅供讀取複本也會使用相同的 KMS 金鑰。對於跨區域僅供讀取複本，您必須在建立僅供讀取複本時，指定來自僅供讀取複本所屬區域的 KMS 金鑰。您無法變更僅供讀取複本的 KMS 金鑰。
+ 僅供讀取複本具有與來源資料庫執行個體相同的時區和定序，無論其建立所在的可用區域為何。
+ SQL Server 的 Amazon RDS 不支援下列項目：
  + 僅供讀取複本的備份保留
  + 從僅供讀取複本進行的時間點復原
  + 僅供讀取複本的手動快照
  + 異地同步備份僅供讀取複本
  + 建立僅供讀取複本的僅供讀取複本
  + 使用者登入至僅供讀取複本的同步處理
+ SQL Server 的 Amazon RDS 來源資料庫執行個體與僅供讀取複本之間不會相互干涉，以降低複寫時的高延遲。確保資料庫執行個體及僅供讀取複本都依照運算能力和儲存適當的調整大小，以搭配工作負載。
+ 您可以在 AWS GovCloud (US-East) 和 AWS GovCloud (US-West) 區域之間進行複寫，但不能複寫入 AWS GovCloud (US) Regions 或在其之外進行複寫。

## RDS for SQL Server 複本的選項考量
<a name="SQLServer.ReadReplicas.limitations.options"></a>

建立 RDS for SQL Server 複本之前，請先考慮下列要求、限制和建議：
+ 如果 SQL Server 複本與其來源資料庫執行個體位於相同的區域，請確定它與來源資料庫執行個體屬於相同的選項群組。修改來源選項群組或來源選項群組成員參數到複本。套用至來源資料庫執行個體後變更會立即套用至複本，不論複本是否在維護視窗。

  如需選項群組的詳細資訊，請參閱[使用選項群組](USER_WorkingWithOptionGroups.md)。
+ 當您建立 SQL Server 跨區域複本時，Amazon RDS 會為此複本建立專用選項群組。

  您無法從專用選項群組中移除 SQL Server 跨區域複本。其他資料庫執行個體都不能使用 SQL Server 跨區域複本的專用選項群組。

  下列選項是複寫選項：若要將複寫選項新增至 SQL Server 跨區域複本，請將其新增至來源資料庫執行個體的選項群組。選項也安裝在所有來源資料庫執行個體的複本上。
  + `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 跨區域複本的來源資料庫執行個體可以具有 `SQLSERVER_BACKUP_RESTORE` 選項，但您無法在來源資料庫執行個體上執行原生還原，直到刪除其所有跨區域複本為止。建立跨區域複本期間，將會取消任何現有的原生還原任務。您無法將 `SQLSERVER_BACKUP_RESTORE` 選項新增至專用選項群組。

    如需原生備份和還原的詳細資訊，請參閱 [使用原生備份和還原，匯入和匯出 SQL Server 資料庫](SQLServer.Procedural.Importing.md)。

  當您提升 SQL Server 跨區域僅供讀取複本時，提升的複本就像其他 SQL Server 資料庫執行個體一樣運作，包括管理其選項。如需選項群組的詳細資訊，請參閱[使用選項群組](USER_WorkingWithOptionGroups.md)。

# 使用 SQL Server 僅供讀取複本同步資料庫使用者和物件
<a name="SQLServer.ReadReplicas.ObjectSynchronization"></a>

建立僅供讀取複本時，主要資料庫執行個體中存在的任何登入、自訂伺服器角色、SQL 代理程式任務或其他伺服器層級物件都應該會呈現在新建立的僅供讀取複本中。不過，建立僅供讀取複本後，在主要資料庫執行個體中建立的任何伺服器層級物件都不會自動複寫，而且您必須在僅供讀取複本中手動建立這些物件。

資料庫使用者會自動從主要資料庫執行個體複寫到僅供讀取複本。由於僅供讀取複本資料庫處於唯讀模式，因此無法在資料庫中更新資料庫使用者的安全性識別碼 (SID)。因此，在僅供讀取複本中建立 SQL 登入時，務必確保該登入的 SID 符合主要資料庫執行個體中對應 SQL 登入的 SID。如果您未同步 SQL 登入的 SID，它們將無法存取僅供讀取複本中的資料庫。Windows Active Directory (AD) 驗證的登入不會遇到這個問題，因為 SQL Server 會從 Active Directory 取得 SID。

**將主要資料庫執行個體中的 SQL 登入同步至僅供讀取複本**

1. 連線至主要資料庫執行個體。

1. 在主要資料庫執行個體中建立新的 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. 檢查主要資料庫執行個體中新建立之 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;
```