共用方式為


高可用性、災害復原的 SQL Server Native Client 支援

本主題討論 AlwaysOn 可用性群組的 SQL Server Native Client 支援(已在 SQL Server 2012 中新增)。 如需 AlwaysOn 可用性群組的詳細資訊,請參閱可用性群組接聽程式、用戶端連線和應用程式故障轉移(SQL Server)可用性群組的建立和設定(SQL Server)故障轉移叢集和 AlwaysOn 可用性群組(SQL Server)使用中次要:可讀取的次要複本(AlwaysOn 可用性群組)。

您可以在連接字串中指定指定可用性群組的可用性群組接聽程式。 如果 SQL Server Native Client 應用程式連線到可用性群組中故障轉移的資料庫,原始連接就會中斷,而且應用程式必須開啟新的連線,才能在故障轉移之後繼續工作。

如果您未連線到可用性群組接聽程式,而且如果多個IP位址與主機名相關聯,SQL Server Native Client 會循序逐一查看與 DNS 專案相關聯的所有IP位址。 如果 DNS 伺服器傳回的第一個 IP 位址未系結至任何網路介面卡 (NIC),這很耗時。 連接到可用性群組接聽程式時,SQL Server Native Client 會嘗試平行建立與所有IP位址的連線,如果連線嘗試成功,驅動程式將會捨棄任何擱置的連線嘗試。

備註

增加連線逾時並實作連線重試邏輯會增加應用程式連線到可用性群組的機率。 此外,因為連線可能會因為可用性群組故障轉移而失敗,所以您應該實作連線重試邏輯,重試失敗的連線,直到連線重新連線為止。

使用 MultiSubnetFailover 連線

一律指定 MultiSubnetFailover=Yes 連接到 SQL Server 2012 可用性群組接聽程式或 SQL Server 2012 故障轉移叢集實例時。 MultiSubnetFailover 可加快 SQL Server 2012 中所有可用性群組和故障轉移叢集實例的故障轉移速度,並大幅減少單一和多重子網 AlwaysOn 拓撲的故障轉移時間。 在多重子網故障轉移期間,用戶端會平行嘗試連線。 在子網故障轉移期間,SQL Server Native Client 會積極重試 TCP 連線。

連接 MultiSubnetFailover 屬性表示應用程式正在可用性群組或故障轉移叢集實例中部署,而且 SQL Server Native Client 會嘗試連線到主要 SQL Server 實例上的資料庫,方法是嘗試連線到所有 IP 位址。 當針對連線指定時 MultiSubnetFailover=Yes ,用戶端會重試 TCP 連線的嘗試速度會比作系統的預設 TCP 重新傳輸間隔更快。 這可在 AlwaysOn 可用性群組或 AlwaysOn 故障轉移叢集實例的故障轉移之後,更快速地重新連線,並同時適用於單一和多重子網可用性群組和故障轉移叢集實例。

如需連接字串關鍵詞的詳細資訊,請參閱 搭配 SQL Server Native Client 使用連接字串關鍵詞

MultiSubnetFailover=Yes指定連線到可用性群組接聽程式或故障轉移叢集實例以外的專案時,可能會導致負面影響,且不受支援。

使用下列指導方針連線到可用性群組或故障轉移叢集實例中的伺服器:

  • 連接到單一子網或多重子網時, MultiSubnetFailover 請使用連線屬性;這兩者都會改善效能。

  • 若要連線到可用性群組,請將可用性群組的可用性群組接聽程式指定為連接字串中的伺服器。

  • 線上到設定超過 64 個 IP 位址的 SQL Server 實例會導致連線失敗。

  • 使用 MultiSubnetFailover 連接屬性的應用程式行為不會根據驗證類型而受到影響:SQL Server 驗證、Kerberos 驗證或 Windows 驗證。

  • 您可以增加的值 loginTimeout 以因應故障轉移時間,並減少應用程式連線重試嘗試。

  • 不支持分散式交易。

如果唯讀路由無效,連線到可用性群組中的次要復本位置將會在下列情況下失敗:

  1. 如果未將次要複本位置設定為接受連線。

  2. 如果應用程式使用 ApplicationIntent=ReadWrite (如下所述),且次要複本位置已設定為唯讀存取。

如果主要複本設定為拒絕只讀工作負載,且連接字串包含 ApplicationIntent=ReadOnly,連線將會失敗。

從資料庫鏡像升級為使用多重子網叢集

如果 MultiSubnetFailover 連接字串中有和 Failover_Partner 連接關鍵詞,就會發生連線錯誤。 如果使用 MultiSubnetFailover ,而且 SQL Server 會傳回故障轉移夥伴回應,指出它是資料庫鏡像組的一部分,也會發生錯誤。

如果您將目前使用資料庫鏡像的 SQL Server Native Client 應用程式升級至多重子網案例,您應該移除 Failover_Partner 連接屬性,並將它取代為 MultiSubnetFailover 設定 Yes 為 ,並將連接字串中的伺服器名稱取代為可用性群組接聽程式。 如果連接字串使用 Failover_PartnerMultiSubnetFailover=Yes,驅動程式將會產生錯誤。 不過,如果連接字串使用 Failover_PartnerMultiSubnetFailover=No (或 ApplicationIntent=ReadWrite),應用程式將會使用資料庫鏡像。

如果在可用性群組的主資料庫上使用資料庫鏡像,而且 MultiSubnetFailover=Yes 是在連接到主資料庫的連接字串中使用,而不是可用性群組接聽程式時,驅動程式會傳回錯誤。

指定應用程式意圖

當 為 時 ApplicationIntent=ReadOnly,用戶端會在連線到已啟用 AlwaysOn 的資料庫時要求讀取工作負載。 伺服器會在連接時間和USE資料庫語句期間強制執行意圖,但僅限於已啟用Always On的資料庫。

關鍵詞 ApplicationIntent 不適用於舊版唯讀資料庫。

資料庫可以允許或不允許目標 AlwaysOn 資料庫上的讀取工作負載。 (這是使用 ALLOW_CONNECTIONSSECONDARY_ROLETransact-SQL 語句的 PRIMARY_ROLE 子句來完成的。

ApplicationIntent關鍵詞是用來啟用只讀路由。

唯讀路由機制

唯讀路由是一項功能,可確保資料庫唯讀複本的可用性。 若要啟用唯讀路由:

  1. 您必須連線到 AlwaysOn 可用性群組可用性群組接聽程式。

  2. ApplicationIntent連線字串關鍵字型必須設定為 ReadOnly

  3. 可用性群組必須由資料庫管理員設定,才能啟用只讀路由。

使用唯讀路由的多個連線可能不會全部連線到相同的唯讀複本。 資料庫同步處理變更或伺服器路由組態中的變更,可能會導致用戶端連線到不同的唯讀複本。 為了確保所有唯讀要求都連線到相同的唯讀複本,請勿將可用性群組接聽程式傳遞至 Server 連接字串關鍵詞。 請改為指定唯讀實例的名稱。

只讀路由可能需要比連線到主要複本的時間長,因為唯讀路由會先連線到主要複本,然後尋找最佳的可讀取次要複本。 因此,您應該增加登入逾時。

ODBC

已新增兩個 ODBC 連接字串關鍵詞,以支援 SQL Server Native Client 中的 AlwaysOn 可用性群組:

  • ApplicationIntent

  • MultiSubnetFailover

如需 SQL Server Native Client 中 ODBC 連接字串關鍵詞的詳細資訊,請參閱 搭配 SQL Server Native Client 使用連接字串關鍵詞

對等的連接屬性如下:

  • SQL_COPT_SS_APPLICATION_INTENT

  • SQL_COPT_SS_MULTISUBNET_FAILOVER

如需 SQL Server Native Client 中 ODBC 連接屬性的詳細資訊,請參閱 SQLSetConnectAttr

MultiSubnetFailover 關鍵詞的功能ApplicationIntent將會在使用 SQL Server Native Client 驅動程式的 ODBC 數據源管理員中公開,從 SQL Server 2012 開始。

SQL Server Native Client ODBC 應用程式可以使用三個函式的其中一個來建立連線:

功能 說明
SQLBrowseConnect SQLBrowseConnect 傳回的伺服器清單不會包含 VNN。 您只會看到伺服器清單,而沒有任何指示伺服器是否為獨立伺服器,或 Windows Server 故障轉移叢集 (WSFC) 叢集中的主要或輔助伺服器,其中包含已針對 AlwaysOn 可用性群組啟用的兩個或多個 SQL Server 實例。 如果您連線到伺服器併發生失敗,可能是因為您已連線到伺服器,而 ApplicationIntent 設定與伺服器組態不相容。

因為 SQLBrowseConnect 無法辨識 Windows Server 故障轉移叢集 (WSFC) 叢集中的伺服器,其中包含已針對 AlwaysOn 可用性群組啟用的兩個或多個 SQL Server 實例, SQLBrowseConnect 因此會 MultiSubnetFailover 忽略連接字元串關鍵詞。
SQLConnect SQLConnect 支援 ApplicationIntentMultiSubnetFailover 透過數據來源名稱 (DSN) 或連接屬性。
SQLDriverConnect SQLDriverConnect 支援 ApplicationIntentMultiSubnetFailover 透過連接字串關鍵字、連接屬性或 DSN。

OLE DB

SQL Server Native Client 中的 OLE DB 不支持 MultiSubnetFailover 關鍵詞。

SQL Server Native Client 中的 OLE DB 將支援應用程式意圖。 應用程式意圖對於 OLE DB 應用程式的行為會與 ODBC 應用程式相同(請參閱上圖)。

已新增一個 OLE DB 連接字串關鍵詞,以支援 SQL Server Native Client 中的 Always On 可用性群組:

  • Application Intent

如需 SQL Server Native Client 中連接字串關鍵詞的詳細資訊,請參閱 搭配 SQL Server Native Client 使用連接字元串關鍵詞

對等的連接屬性如下:

  • SSPROP_INIT_APPLICATIONINTENT

  • DBPROP_INIT_PROVIDERSTRING

SQL Server Native Client OLE DB 應用程式可以使用其中一種方法來指定應用程式意圖:

IDBInitialize::Initialize
IDBInitialize::Initialize 會使用先前設定的屬性集來初始化數據源,並建立數據源物件。 將應用程式意圖指定為提供者屬性,或指定為擴充屬性字串的一部分。

IDataInitialize::GetDataSource
IDataInitialize::GetDataSource 會採用可包含 關鍵詞的 Application Intent 輸入連接字串。

IDBProperties::GetProperties
IDBProperties::GetProperties 會擷取目前在數據源上設定的屬性值。 您可以透過 DBPROP_INIT_PROVIDERSTRING 屬性和 SSPROP_INIT_APPLICATIONINTENT 屬性來擷取 Application Intent 值。

IDBProperties::SetProperties
若要設定 ApplicationIntent 屬性值,請呼叫 IDBProperties::SetPropertiesSSPROP_INIT_APPLICATIONINTENT 值 「ReadWrite或」或 「ReadOnlyDBPROP_INIT_PROVIDERSTRING 屬性值包含」ApplicationIntent=ReadOnly 或 「ApplicationIntent=ReadWrite的傳入屬性」。

您可以在 [ 資料連結屬性 ] 對話方塊之 [所有] 索引標籤的 [應用程式意圖屬性] 欄位中指定應用程式意圖。

建立隱含連接時,隱含連接將會使用父連接的應用程式意圖設定。 同樣地,從相同數據源建立的多個會話將會繼承數據源的應用程式意圖設定。

另請參閱

SQL Server Native Client 功能
搭配 SQL Server Native Client 使用連接字串關鍵詞