OLE DB Driver for SQL Server 的高可用性支援、災害復原

適用於:SQL ServerAzure SQL 資料庫Azure SQL 受控執行個體Azure Synapse AnalyticsMicrosoft Fabric 中的 SQL 資料庫

下載 OLE DB 驅動程式

本文討論 Always On 可用性群組的 OLE DB Driver for SQL Server 支援。 如需 Always On 可用性群組的詳細資訊,請參閱可用性群組接聽程式、用戶端連接性及應用程式容錯移轉 (SQL Server)、建立及設定可用性群組 (SQL Server)、容錯移轉叢集和 Always On 可用性群組 (SQL Server) 和使用中次要:可讀取的次要複本 (Always On 可用性群組)。

您可以在連接字串中指定給定可用性群組的可用性群組接聽程式。 如果 OLE DB Driver for SQL Server 應用程式已連線到可用性群組中容錯移轉的資料庫,則原始連線會中斷,而且應用程式必須在容錯移轉後開啟新連線,才能繼續工作。

如果您未連線到可用性群組接聽程式,而且如果多個 IP 位址與主機名稱建立關聯,OLE DB Driver for SQL Server 會循序逐一查看與 DNS 項目建立關聯的所有 IP 位址。 如果 DNS 伺服器所傳回的第一個 IP 位址未繫結至任何網路介面卡 (NIC),這項作業可能會很費時。 在連線到可用性群組接聽程式時,OLE DB Driver for SQL Server 會嘗試平行建立與所有 IP 位址的連線,如果某個連線嘗試成功,驅動程式就會捨棄任何擱置的連線嘗試。

注意

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

連接 MultiSubnetFailover

當目標對象是 Azure SQL Database、Azure SQL 受控執行個體、Microsoft Fabric 中的 SQL 資料庫、Always On 可用性群組監聽器,或 SQL Server 故障轉移叢集實例時,請務必指定 MultiSubnetFailover=Yes。

當你的 連接字串 伺服器名稱解析為多個 IP 位址時,MultiSubnetFailover=Yes 會告訴 OLE DB Driver for SQL Server 同時開啟所有這些位址的連線,並使用第一個回應的位址。 沒有它,驅動程式會一次嘗試一個地址。 未回應的位址會卡住,直到作業系統的 TCP 連線逾時結束,這可能會在驅動程式到達回應位址前耗盡連線逾時。 在故障轉移後,驅動程式首先嘗試的位址可能已經不再服務資料庫,因此原本能成功連接另一個位址的連線會因逾時而失敗。

MultiSubnetFailover=是 ,改變客戶端找到服務資料庫副本的速度。 這不會改變伺服器故障切換所需的時間。

MultiSubnetFailover=Yes 在單一 IP 目標上是安全的。 當 DNS 解析到單一位址時,驅動程式會嘗試一次連線,因此設定在不需要時不會產生任何費用。

如需連接字串關鍵字的詳細資訊,請參閱在 OLE DB Driver for SQL Server 中使用連接字串關鍵字。

請使用下列指導方針,連接到可用性群組或容錯移轉叢集執行個體中的伺服器:

  • 將 MultiSubnetFailover 連線屬性設 為「是」。

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

  • 你不能用 TCP 以外的協定來使用 MultiSubnetFailover 。

  • 連接配置超過 64 個 IP 位址的 SQL Server 實例會導致連線失敗。

  • 你不能用 MultiSubnetFailover 搭配資料庫鏡像。 當伺服器回報資料庫被鏡像時,驅動程式會回傳錯誤訊息。 所有支援的 SQL Server 版本都已棄用資料庫鏡像。 請改用 Always On 可用性群組。

  • 驗證類型,包括 SQL Server 認證、Kerberos 認證或 Windows 認證,不會影響使用 MultiSubnetFailover 連線屬性的應用程式行為。

  • 你可以提高 連接逾時 值,以配合故障轉移時間並減少應用程式連線重試次數。 預設為 15 秒。 同樣的設定在你透過 IDBInitialize::Initialize時會命名為 Timeout,並且會映射到該DBPROP_INIT_TIMEOUT屬性。 對於啟用自動暫停的 Azure SQL Database 無伺服器,請使用 Connect 逾時至少 60 秒。 自動暫停的資料庫會在第一次連線嘗試時恢復,而該嘗試可能會因錯誤 40613 而失敗,而資料庫則會恢復,因此應用程式必須重新嘗試。 欲了解更多資訊,請參閱 自動暫停與自動繼續。

  • 不支援分散式交易。

如果唯讀路由傳送未作用,則在下列狀況下,連線至可用性群組中的次要複本位置將會失敗:

  1. 如果未將次要複本所在位置設定為接受連線。
  2. 若應用程式使用 ApplicationIntent=ReadWrite ,且次要副本位置設定為唯讀存取。

若主副本被設定為拒絕唯讀工作負載,且連接字串包含 ApplicationIntent=ReadOnly 時,連線即告失敗。

從資料庫鏡像升級

若連接字串同時包含 MultiSubnetFailover 與 Failover_Partner 關鍵字,則會發生連線錯誤。 如果你使用 MultiSubnetFailover,且 SQL Server 回傳故障轉移夥伴回應,表示它是資料庫鏡像對的一部分,也會發生錯誤。

如果你將目前使用資料庫鏡像的 OLE DB Driver for SQL Server 應用程式升級為多子網路情境,移除 Failover_Partner 連線屬性,改為設定為「是」的 MultiSubnetFailover。 將 連接字串 中的伺服器名稱替換為可用性群組監聽器。 如果連接字串使用 Failover_Partner 且 MultiSubnetFailover =Yes,驅動程式會產生錯誤。 然而,若連接字串使用 Failover_Partner 且 MultiSubnetFailover=No(或 ApplicationIntent=ReadWrite),則該應用程式使用資料庫鏡像。

如果您在可用性群組中的主要副本使用資料庫鏡像,且在連接主要副本而非可用性群組監聽器的 連接字串 中使用 MultiSubnetFailover=Yes,驅動程式會回傳錯誤。

程式化地設定 MultiSubnetFailover

同等的連接屬性如下:

  • SSPROP_INIT_MULTISUBNETFAILOVER
  • DBPROP_INIT_PROVIDERSTRING

OLE DB Driver for SQL Server 應用程式可使用以下方法之一來設定多子網路故障轉移選項:

  • IDBInitialize::Initialize
    使用先前設定的屬性集合來初始化資料來源並建立資料來源物件。 請將 MultiSubnetFailover 指定為提供者屬性,或作為擴展屬性字串的一部分。
  • IDataInitialize::GetDataSource
    會接收一個輸入 連接字串,該字串可包含 MultiSubnetFailover 關鍵字。
  • IDBProperties::SetProperties
    要設定 MultiSubnetFailover 屬性值,請呼叫 IDBProperties::SetProperties 傳入 SSPROP_INIT_MULTISUBNETFAILOVER 屬性,值為 VARIANT_TRUE 或 VARIANT_FALSE,或 DBPROP_INIT_PROVIDERSTRING 屬性,包含 MultiSubnetFailover=Yes 或 MultiSubnetFailover=No。

範例

DBPROP rgPropMultisubnet;

rgPropMultisubnet.dwPropertyID = SSPROP_INIT_MULTISUBNETFAILOVER;
rgPropMultisubnet.dwOptions = DBPROPOPTIONS_REQUIRED;
rgPropMultisubnet.dwStatus = DBPROPSTATUS_OK;
rgPropMultisubnet.colid = DB_NULLID;
V_VT(&(rgPropMultisubnet.vValue)) = VT_BOOL;
V_BOOL(&(rgPropMultisubnet.vValue)) = VARIANT_TRUE;

DBPROPSET PropSet;

PropSet.rgProperties = &rgPropMultisubnet;
PropSet.cProperties = 1;
PropSet.guidPropertySet = DBPROPSET_SQLSERVERDBINIT;
IDBProperties* pIDBProperties = NULL;
hr = pIDBInitialize->QueryInterface(IID_IDBProperties, (void **)&pIDBProperties);
pIDBProperties->SetProperties(1, &PropSet);

指定應用程式意圖

您可以在連接字串中指定關鍵字 ApplicationIntent。 可指派的值為 ReadWrite (預設) 或 ReadOnly。

若設定 ApplicationIntent=ReadOnly,用戶端會在連線時要求讀取工作負載。 伺服器會在連線期間以及在 USE 資料庫陳述式期間,強制執行此意圖。

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

ReadOnly 的目標

當連線選擇 ReadOnly 時,連線會指派給可能已因為資料庫存在的下列任何特殊設定:

  • Always On。 資料庫可在目標可用性群組資料庫允許或不允許讀取工作負載。 此選擇是透過使用 ALLOW_CONNECTIONS 與 PRIMARY_ROLE Transact-SQL 陳述式的 SECONDARY_ROLE 子句來控制的。

  • 異地複寫

  • 讀取縮放

如果沒有任何那些特殊目標可用,則會從一般資料庫讀取。

ApplicationIntentApplicationIntent 關鍵字可啟用「唯讀路由」 。

唯讀路由

唯讀路由功能可確保資料庫之唯讀複本的可用性。 若要啟用唯讀路由,必須符合下列所有條件:

  • 您必須連線到 Always On 可用性群組接聽程式。

  • ApplicationIntent 連接字串關鍵字必須設為 ReadOnly。

  • 資料庫管理員必須設定可用性群組,以啟用唯讀路由。

每個都使用唯讀路由的多個連線,可能不會都連線到相同的唯讀複本。 資料庫同步處理的變更或伺服器路由組態的變更,可能會導致用戶端連接至不同的唯讀複本。

您可以「不」將可用性群組接聽程式傳遞給 連接字串關鍵字,藉此確認所有唯讀要求都連線到同一個唯讀複本。 請改為指定唯讀執行個體的名稱。

唯讀路由連線到主要複本的時間可能會比較長。 這是因為唯讀路由會先連線到主要複本,再尋找最適合的可讀取次要複本。 由於有多個步驟,因此您應將 login 逾時增加為至少 30 秒。

應用程式意圖

OLE DB Driver for SQL Server 支援 ApplicationIntent 連接字串 關鍵字。 如需連接字串關鍵字的詳細資訊,請參閱在 OLE DB Driver for SQL Server 中使用連接字串關鍵字。

Set ApplicationIntent 以程式化方式

同等的連接屬性如下:

  • SSPROP_INIT_APPLICATIONINTENT
  • DBPROP_INIT_PROVIDERSTRING

OLE DB Driver for SQL Server 應用程式可使用以下方法之一來指定應用程式意圖:

  • IDBInitialize::Initialize
    使用先前設定的屬性集合來初始化資料來源並建立資料來源物件。 將應用程式意圖指定為提供者屬性或是擴充屬性字串的一部分。
  • IDataInitialize::GetDataSource
    會接收一個可包含 Application Intent 關鍵字的輸入 連接字串。
  • IDBProperties::SetProperties
    要設定 ApplicationIntent 屬性值,請呼叫 IDBProperties::SetProperties ,將 SSPROP_INIT_APPLICATIONINTENT 屬性帶入 ReadWrite 或 ReadOnly 值,或 DBPROP_INIT_PROVIDERSTRING 屬性,包含 ApplicationIntent=ReadOnly 或 ApplicationIntent=ReadWrite。

你可以在資料連結屬性對話框的「全部」標籤的應用意圖屬性欄位中指定應用程式意圖。

當你建立隱式連線時,隱含連線會使用父連線的應用程式意圖設定。 同樣地,從同一資料來源建立的多個會話會繼承該資料來源的應用程式意圖設定。