高可用性/災害復原的 SQL Server Native Client 支援
適用於: SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse Analytics Analytics Platform System (PDW)
重要
SQL Server Native Client (SNAC) 未隨附:
- SQL Server 2022 (16.x) 及更新版本
- SQL Server Management Studio 19 和更新版本
不建議使用 SQL Server Native Client (SQLNCLI 或 SQLNCLI11) 和舊版 Microsoft OLE DB Provider for SQL Server (SQLOLEDB) 進行新的應用程式開發。
針對新專案,請使用下列其中一個驅動程式:
針對 SQL Server 資料庫引擎 (2012 到 2019 版) 的隨附元件 SQLNCLI,請參閱支援生命週期例外狀況。
本主題討論 Always On 可用性群組的 SQL Server Native Client 支援(已在 SQL Server 2012 (11.x) 中新增。 如需 Always On 可用性群組的詳細資訊,請參閱可用性群組接聽程式、用戶端連接性及應用程式容錯移轉 (SQL Server)、建立及設定可用性群組 (SQL Server)、容錯移轉叢集和 Always On 可用性群組 (SQL Server) 和使用中次要:可讀取的次要複本 (Always On 可用性群組)。
您可以在連接字串中指定給定可用性群組的可用性群組接聽程式。 如果 SQL Server Native Client 應用程式連線到可用性群組中故障轉移的資料庫,原始連接就會中斷,而且應用程式必須開啟新的連線,才能在故障轉移之後繼續工作。
如果您未連線到可用性群組接聽程式,而且如果多個IP位址與主機名相關聯,SQL Server Native Client 會循序逐一查看與 DNS 專案相關聯的所有IP位址。 如果 DNS 伺服器所傳回的第一個 IP 位址未繫結至任何網路介面卡 (NIC),這項作業可能會很費時。 連接到可用性群組接聽程式時,SQL Server Native Client 會嘗試平行建立與所有IP位址的連線,如果連線嘗試成功,驅動程式將會捨棄任何擱置的連線嘗試。
注意
增加連接逾時並實作連接重試邏輯可提高應用程式連接到可用性群組的機率。 此外,因為連接可能會由於可用性群組容錯移轉而失敗,所以您應該實作連接重試邏輯,並重試失敗的連接,直到重新連接為止。
使用 MultiSubnetFailover 進行連接
連接到 SQL Server 2012 可用性群組接聽程式或 SQL Server 2012 故障轉移叢集實例時,請一律指定 MultiSubnetFailover=Yes 。 MultiSubnetFailover 可為 SQL Server 2012 中的所有可用性群組和故障轉移叢集實例啟用更快速的故障轉移,並大幅減少單一和多重子網 Always On 拓撲的故障轉移時間。 在多重子網路容錯移轉期間,用戶端會平行嘗試連接。 在子網故障轉移期間,SQL Server Native Client 會積極重試 TCP 連線。
MultiSubnetFailover 連線屬性表示應用程式正在可用性群組或故障轉移叢集實例中部署,而且 SQL Server Native Client 會嘗試連線到主要 SQL Server 實例上的資料庫,方法是嘗試連線到所有 IP 位址。 為連接指定 MultiSubnetFailover=Yes 時,用戶端會重試 TCP 連接,其速度比作業系統的預設 TCP 重新傳輸間隔更快。 這種方式可在容錯移轉 Always On 可用性群組或 Always On 容錯移轉叢集執行個體之後更快重新連線,且同時適用於單一和多重子網路可用性群組和容錯移轉叢集執行個體。
如需 連接字串 關鍵詞的詳細資訊,請參閱搭配 SQL Server Native Client 使用連接字串關鍵詞。
當連接到可用性群組接聽程式或容錯移轉叢集執行個體以外的某個項目時,指定 MultiSubnetFailover=Yes 將會產生負面效能影響,而且不支援這樣的處理方式。
請使用下列指導方針,連接到可用性群組或容錯移轉叢集執行個體中的伺服器:
如果在連接到單一子網路或多重子網路時使用 MultiSubnetFailover 連接屬性,則會提高兩者的效能。
若要連接到可用性群組,在連接字串中指定可用性群組的可用性群組接聽程式做為伺服器。
連線到設定超過 64 個 IP 位址的 SQL Server 執行個體會導致連線失敗。
根據驗證的類型,使用 MultiSubnetFailover 連線屬性的應用程式,其行為不會受到影響:SQL Server 驗證、Kerberos 驗證或 Windows 驗證。
您可以增加 loginTimeout 的值,以容納容錯移轉時間並減少應用程式連接重試次數。
不支援分散式工作階段。
如果唯讀路由不在作用中,在下列狀況下,連接到可用性群組中的次要複本位置將會失敗:
如果未設定次要複本位置接受連接。
如果應用程式使用 ApplicationIntent=ReadWrite,而且已針對唯讀存取設定次要複本位置。
如果設定主要複本拒絕唯讀工作負載,而且連接字串包含 ApplicationIntent=ReadOnly,則連接會失敗。
從資料庫鏡像升級到使用多子重網路叢集
如果連接字串中有 MultiSubnetFailover 和 Failover_Partner 連接關鍵字,則會發生連接錯誤。 如果使用 MultiSubnetFailover,且 SQL Server 傳回容錯移轉夥伴回應,指出其為資料庫鏡像配對的一部分,也會發生錯誤。
如果您將目前使用資料庫鏡像的 SQL Server Native Client 應用程式升級至多重子網案例,您應該移除Failover_Partner連線屬性,並將它取代為設定為 [是],並將 連接字串 中的伺服器名稱取代為可用性群組接聽程式。 如果連接字串使用 Failover_Partner 和 MultiSubnetFailover=Yes,驅動程式會發生錯誤。 不過,如果連接字串使用 Failover_Partner 和 MultiSubnetFailover=No (或 ApplicationIntent=ReadWrite),應用程式就會使用資料庫鏡像。
如果可用性群組中的主要資料庫使用資料庫鏡像,而且如果在連接到主要資料庫 (而不是可用性群組接聽程式) 的連接字串中使用 MultiSubnetFailover=Yes,驅動程式會傳回錯誤。
指定應用程式意圖
您可以在連接字串中指定關鍵字 ApplicationIntent
。 可指派的值為 ReadWrite
(預設) 或 ReadOnly
。
若設定 ApplicationIntent=ReadOnly
,用戶端會在連線時要求讀取工作負載。 伺服器會在連線期間以及在 USE
資料庫陳述式期間,強制執行此意圖。
ApplicationIntent
關鍵字不適用於舊版唯讀資料庫。
ReadOnly 的目標
當連線選擇 ReadOnly
時,連線會指派給可能已因為資料庫存在的下列任何特殊設定:
Always On。 資料庫可在目標可用性群組資料庫允許或不允許讀取工作負載。 此選擇是透過使用
PRIMARY_ROLE
與SECONDARY_ROLE
Transact-SQL 陳述式的ALLOW_CONNECTIONS
子句來控制的。
如果沒有任何那些特殊目標可用,則會從一般資料庫讀取。
ApplicationIntentApplicationIntent
關鍵字可啟用「唯讀路由」 。
唯讀路由
唯讀路由功能可確保資料庫之唯讀複本的可用性。 若要啟用唯讀路由,必須符合下列所有條件:
您必須連線到 Always On 可用性群組接聽程式。
ApplicationIntent
連接字串關鍵字必須設為ReadOnly
。資料庫管理員必須設定可用性群組,以啟用唯讀路由。
每個都使用唯讀路由的多個連線,可能不會都連線到相同的唯讀複本。 資料庫同步處理的變更或伺服器路由組態的變更,可能會導致用戶端連接至不同的唯讀複本。
您可以「不」將可用性群組接聽程式傳遞給 Server
連接字串關鍵字,藉此確認所有唯讀要求都連線到同一個唯讀複本。 請改為指定唯讀執行個體的名稱。
唯讀路由連線到主要複本的時間可能會比較長。 這是因為唯讀路由會先連線到主要複本,再尋找最適合的可讀取次要複本。 由於有多個步驟,因此您應將 login
逾時增加為至少 30 秒。
ODBC
已新增兩個 ODBC 連接字串 關鍵詞,以支援 SQL Server Native Client 中的 Always On 可用性群組:
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。
ApplicationIntent 和 MultiSubnetFailover 關鍵詞的功能將會在使用 SQL Server Native Client 驅動程式的 ODBC 數據源管理員中公開,從 SQL Server 2012 (11.x) 開始。
SQL Server Native Client ODBC 應用程式可以使用三個函式的其中一個來建立連線:
函式 | 描述 |
---|---|
SQLBrowseConnect | SQLBrowseConnect 所傳回的伺服器清單不會包含 VNN。 您只會看到伺服器清單,而沒有任何指示伺服器是否為獨立伺服器,或 Windows Server 故障轉移叢集 (WSFC) 叢集中的主要或輔助伺服器,其中包含已針對 AlwaysOn 可用性群組啟用的兩個或多個 SQL Server 實例。 如果您連線到伺服器併發生失敗,可能是因為您已連線到伺服器,而 ApplicationIntent 設定與伺服器組態不相容。 因為 SQLBrowseConnect 無法辨識 Windows Server 故障轉移叢集 (WSFC) 叢集中的伺服器,其中包含已針對 Always On 可用性群組啟用的兩個或多個 SQL Server 實例,SQLBrowseConnect 會忽略 MultiSubnetFailover 連接字串 關鍵詞。 |
SQLConnect | SQLConnect 透過 數據源名稱 (DSN) 或連線屬性支援 ApplicationIntent 和 MultiSubnetFailover 。 |
SQLDriverConnect | SQLDriverConnect 透過 連接字串 關鍵詞、連線屬性或 DSN 支援 ApplicationIntent 和 MultiSubnetFailover。 |
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::SetProperties,其傳入值為 "ReadWrite" 或 "ReadOnly" 的 SSPROP_INIT_APPLICATIONINTENT 屬性,或是值包含 "ApplicationIntent=ReadOnly" 或 "ApplicationIntent=ReadWrite" 的 DBPROP_INIT_PROVIDERSTRING 屬性。
您可以在 [資料連結屬性] 對話方塊中,[全部] 索引標籤的 [應用程式的意圖屬性] 欄位內指定應用程式意圖。
當建立隱含連接時,隱含連接將會使用父連接的應用程式意圖設定。 同樣地,從相同資料來源建立的多個工作階段將會繼承資料來源的應用程式意圖設定。
另請參閱
SQL Server Native Client 功能
搭配 SQL Server Native Client 使用連接字串關鍵字