

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

# Microsoft SQL Server 異地同步備份部署限制、備註和建議
<a name="USER_SQLServerMultiAZ.Recommendations"></a>

下列是對 RDS for SQL Server 資料庫執行個體使用多可用區部署的一些限制：
+ 不支援跨區域的多可用區域。
+ 不支援停止多可用區部署中的 RDS for SQL Server 資料庫執行個體。
+ 您無法設定次要資料庫執行個體來接受資料庫讀取活動。
+ 多可用區域搭配 Always On 可用區 (AG) 支援記憶體內最佳化。
+ 具有 Always On 可用性群組 (AG) 的異地同步備份不支援可用性群組接聽程式的 Kerberos 驗證。這是因為接聽程式沒有服務委託人名稱 (SPN)。
+ 具有區塊層級複寫的異地同步備份目前僅支援 SQL Server Web Edition 執行個體。
+ 在 SQL Server 異地同步備份部署中的 SQL Server 資料庫執行個體上，您無法重新命名資料庫。如果您需要在這類執行個體上重新命名資料庫，請先對資料庫執行個體關閉多可用區域，再重新命名資料庫。最後，對資料庫執行個體重新開啟多可用區域。
+ 您只能還原使用完整還原模型備份的多可用區域資料庫執行個體。
+ 多可用區域部署有 10,000 個 SQL Server Agent 任務的限制。

  如果您需要更高的限制，請聯絡 請求提高限制 支援。開啟 [AWS 支援 中心](https://console.aws.amazon.com/support/home#/)頁面，如有必要請登入，然後選擇 **Create case** (建立案例)。選擇 **Service limit increase (提高服務限制)**。填妥並提交表格。
+ 在 SQL Server 多可用區域部署中的 SQL Server 資料庫執行個體上，不可以有離線資料庫。
+ 磁碟區指標不適用於使用區塊層級複寫的執行個體次要主機。

下列是對 RDS for SQL Server 資料庫執行個體使用多可用區域部署的一些相關備註：
+ Amazon RDS 公開 Always On AG [可用性群組接聽程式端點](https://docs.microsoft.com/en-us/sql/database-engine/availability-groups/windows/listeners-client-connectivity-application-failover)。此端點會出現在主控台，而且由 `DescribeDBInstances` API 作業在端點欄位中傳回。
+ Amazon RDS 支援[可用性群組多重子網路容錯移轉](https://docs.microsoft.com/en-us/sql/database-engine/availability-groups/windows/listeners-client-connectivity-application-failover)。
+ 若要對虛擬私有雲端 (VPC) 中的 SQL Server 資料庫執行個體使用 SQL Server 多可用區域，首先請建立在至少兩個不同可用區域中有子網路的資料庫子網路群組。然後，將該資料庫子網路群組指派給 SQL Server 資料庫執行個體的主要複本。
+ 當資料庫執行個體修改為異地同步備份部署時，其在修改期間的狀態為 **modifying** (修改中)。Amazon RDS 會建立待命執行個體，並建立主要資料庫執行個體的備份。在程序完成之後，主要資料庫執行個體的狀態會變成 **available (可用)**。
+ 異地同步備份部署會在相同節點上維護所有資料庫。如果主要主機上的資料庫容錯移轉，您的所有 SQL Server 資料庫會以一個不可分割的單位容錯移轉至您的待命主機。Amazon RDS 會佈建運作狀態良好的新主機，並取代狀況不良的主機。
+ 具有 DBM、AGs異地同步備份支援單一待命複本。
+ 在多可用區域部署中，RDS for SQL Server 會建立 SQL Server 登入，以允許 Always On AG 或資料庫鏡像。RDS 會使用下列模式建立登入：`db_<dbiResourceId>_node1_login`、`db_<dbiResourceId>_node2_login` 和 `db_<dbiResourceId>_witness_login`。
+ RDS for SQL Server 會建立 SQL Server 登入以允許存取僅供讀取複本。RDS 會使用下列模式建立登入：`db_<readreplica_dbiResourceId>_node_login`。
+ 由於同步資料複寫，相較於標準資料庫執行個體部署 (在單一可用區域中)，您可能會發現延遲增加情形。
+ 容錯移轉時間會受到完成復原程序所需的時間影響。大型交易會增加此容錯移轉時間。
+ 於 SQL Server 異地同步備份部署中，透過容錯移轉重新啟動只會重新啟動主要資料庫執行個體。在容錯移轉之後，主要資料庫執行個體會成為新的次要資料庫執行個體。多可用區域執行個體的參數可能無法更新。若要在無容錯移轉的情況下重新啟動，主要和次要資料庫執行個體會在重新啟動後更新參數。若資料庫執行個體沒有回應，建議您重新開機，不要進行容錯移轉。

下表比較如何使用資料庫鏡像 (DBM) 或 Always On 可用性群組 (AGs) 與區塊層級複寫，在 RDS for SQL Server 多可用區部署中複寫伺服器層級物件的方式。


**依物件類型的複寫行為**  

| 物件 | 資料庫鏡像 / Always On AGs | 區塊層級複寫 | 
| --- | --- | --- | 
| 登入 | 是 — 由 Amazon RDS 複寫。DEFAULT\_DATABASE 屬性不會複寫。在 DBM 或 Always On AG 執行個體上建立或變更登入DEFAULT\_DATABASE時，請勿使用 。 | 是 — 包括 DEFAULT\_DATABASE（無限制）。 | 
| 資料庫使用者和許可 | 是 — 透過 SQL Server 原生複寫 （存放在使用者資料庫中） 進行複寫。 | 是。 | 
| 使用者定義的伺服器角色 | Always On AGs：是 — 已複寫。DBM：否 — 未複寫。 | 是。 | 
| 連結伺服器 | 否 — 存放在master資料庫中，位於 AG 或鏡像之外。在啟用異地同步備份之前建立連結的伺服器，或在容錯移轉後手動重新建立。 | 是 — 複寫整個磁碟區，包括系統資料庫。 | 
| SQL Server 稽核 | 部分 — 複寫資料庫稽核規格 （在使用者資料庫中）。伺服器稽核和伺服器稽核規格不會複寫。您必須使用 AUDIT\_GUID 參數在次要 上手動建立這些項目，以符合主要參數。 | 是 — 所有稽核物件都會在磁碟區層級複寫。 | 
| tempdb 組態 | 選用 — 啟用與下列預存程序的同步。<pre>EXECUTE msdb.dbo.rds_set_system_database_sync_objects<br />    @object_types = 'TempDbFile';</pre> 永遠不會複寫暫時物件和資料。 | 是 — 在磁碟區層級複寫組態。 | 
| SQL Server 代理程式任務 | 選用 — 啟用與下列預存程序的同步。<pre>EXECUTE msdb.dbo.rds_set_system_database_sync_objects<br />    @object_types = 'SQLAgentJob';</pre> 只會複寫支援類別中的 T-SQL 任務步驟。SSIS、SSRS、Replication、PowerShell 和 Database Mail 步驟類型不會複寫。 | 是 — 所有任務都會在磁碟區層級複寫。 | 
| CDC （變更資料擷取） | 部分 — 複寫 CDC 中繼資料和變更資料表 （在使用者資料庫中）。擷取和清除任務 （在 中msdb) 不會直接複寫。容錯移轉後，Amazon RDS 會使用先前記錄的參數，在新的主要節點上捨棄並重新建立它們。使用 在次要 上rds\_set\_configuration預設 CDC 參數。 | 是 — 所有 CDC 物件都會在磁碟區層級複寫。 | 
| 資源管理員 | 是 — 由 Amazon RDS 複寫。若要驗證同步，請執行下列查詢。<pre>SELECT * FROM msdb.dbo.rds_fn_server_object_last_sync_time();</pre>  | 是。 | 
| 資料庫擁有者 | 否 — 在次要執行個體上，資料庫擁有者設定為 NT AUTHORITY\\SYSTEM。容錯移轉之後，請使用 msdb.dbo.rds\_changedbowner\_to\_rdsa 重設擁有權。 | 是 — 保留擁有者。 | 
| msdb 許可 | 否 — RDS for SQL Server 不會將msdb資料庫許可複寫至次要執行個體。您必須手動重新建立它們。 | 是 — 在磁碟區層級複寫。 | 

下列是對 RDS for Microsoft SQL Server 資料庫執行個體使用異地同步備份部署的一些建議：
+ 針對生產階段或生產前階段所用的資料庫，建議您使用下列選項：
  + 針對高可用性的異地同步備份部署
  + 「佈建 IOPS」可取得快速一致的績效
  + 「最佳化記憶體」而非「一般用途」
+ 您無法為次要執行個體選取可用區域 (AZ)，因此，當您部署應用程式主機時，請將此納入考量。您的資料庫可能容錯移轉至其他 AZ，而且應用程式主機和資料庫可能不是在相同的 AZ 中。因此，我們建議您在指定 AWS 區域的所有 AZs 之間平衡應用程式主機。
+ 為了獲得最佳效能，請勿在大型資料載入操作期間啟用資料庫鏡像、 Always On AGs或區塊層級複寫。如果要盡快載入您的資料，請在將您的資料庫執行個體轉換為異地同步備份部署之前完成載入資料。
+ 存取 SQL Server 資料庫的應用程式應該具有例外處理能力可捕捉連接錯誤。下列程式碼範例示範捕捉通訊錯誤的 try/catch 區塊。在這個範例中，如果連線成功，`break` 陳述式會結束 `while` 迴圈，但如果擲回例外狀況，則重試最多 10 次。

  ```
  int RetryMaxAttempts = 10;
  int RetryIntervalPeriodInSeconds = 1;
  int iRetryCount = 0;
  while (iRetryCount < RetryMaxAttempts)
  {
     using (SqlConnection connection = new SqlConnection(DatabaseConnString))
     {
        using (SqlCommand command = connection.CreateCommand())
        {
           command.CommandText = "INSERT INTO SOME_TABLE VALUES ('SomeValue');";
           try
           {
              connection.Open();
              command.ExecuteNonQuery();
              break;
           }
           catch (Exception ex) 
           {
              Logger(ex.Message);
              iRetryCount++;
           }
           finally {
              connection.Close();
           }
        }
     }
     Thread.Sleep(RetryIntervalPeriodInSeconds * 1000);
  }
  ```
+ 使用 DBM 或 AGs 處理多可用區域執行個體時，請勿使用 `Set Partner Off`命令。使用區塊層級複寫的執行個體不支援此命令。例如，請勿執行以下操作。

  ```
  --Don't do this
  ALTER DATABASE db1 SET PARTNER off
  ```
+ 請勿將復原模式設為 `simple`。例如，請勿執行以下操作。

  ```
  --Don't do this
  ALTER DATABASE db1 SET RECOVERY simple
  ```
+ 在多可用區域資料庫執行個體上建立新的登入時，請勿使用 `DEFAULT_DATABASE` 參數，除非使用區塊層級複寫以獲得高可用性，因為這些設定無法套用至待命鏡像。例如，請勿執行以下操作。

  ```
  --Don't do this
  CREATE LOGIN [test_dba] WITH PASSWORD=foo, DEFAULT_DATABASE=[db2]
  ```

  也請勿執行以下操作。

  ```
  --Don't do this
  ALTER LOGIN [test_dba] WITH DEFAULT_DATABASE=[db3]
  ```