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

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體Azure Synapse AnalyticsAnalytics Platform System (PDW)

下載 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 進行連接

當連線到 SQL Server Always On 可用性群組接聽程式或 SQL Server 容錯移轉叢集執行個體時,一律指定 MultiSubnetFailover=YesMultiSubnetFailover 可讓所有 Always On 可用性群組和 SQL Server 中的容錯移轉叢集執行個體容錯移轉得更快,並大幅縮短單一和多重子網路 Always On 拓撲的容錯移轉時間。 在多重子網路容錯移轉期間,用戶端會平行嘗試連接。 在子網路容錯移轉期間,OLE DB Driver for SQL Server 將會重試 TCP 連線。

MultiSubnetFailover 連線屬性表示正在可用性群組或容錯移轉叢集執行個體中部署應用程式,OLE DB Driver for SQL Server 將會嘗試連線到所有 IP 位址,以試著連線到主要 SQL Server 執行個體上的資料庫。 為連接指定 MultiSubnetFailover=Yes 時,用戶端會重試 TCP 連接,其速度比作業系統的預設 TCP 重新傳輸間隔更快。 在 Always On 可用性群組或容錯移轉叢集執行個體容錯移轉後,這可加快重新連線的速度,且同時適用於單一和多重子網路可用性群組和容錯移轉叢集執行個體。

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

當連接到可用性群組接聽程式或容錯移轉叢集執行個體以外的某個項目時,指定 MultiSubnetFailover=Yes 將會產生負面效能影響,而且不支援這樣的處理方式。

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

  • 如果在連接到單一子網路或多重子網路時使用 MultiSubnetFailover 連接屬性,則會提高兩者的效能。

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

  • 連線到設定超過 64 個 IP 位址的 SQL Server 執行個體會導致連線失敗。

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

  • 您可以增加 loginTimeout 的值,以容納容錯移轉時間並減少應用程式連接重試次數。

  • 不支援分散式工作階段。

如果唯讀路由不在作用中,在下列狀況下,連接到可用性群組中的次要複本位置將會失敗:

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

  2. 如果應用程式使用 ApplicationIntent=ReadWrite,而且已針對唯讀存取設定次要複本位置。

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

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

如果連接字串中有 MultiSubnetFailoverFailover_Partner 連接關鍵字,則會發生連接錯誤。 如果使用 MultiSubnetFailover,且 SQL Server 傳回容錯移轉夥伴回應,指出其為資料庫鏡像配對的一部分,也會發生錯誤。

如果您將目前使用資料庫鏡像的 OLE DB Driver for SQL Server 應用程式升級為多重子網路案例,則應移除 Failover_Partner 連線屬性,並取代成設定為 YesMultiSubnetFailover,然後將連接字串中的伺服器名稱取代為可用性群組接聽程式。 如果連接字串使用 Failover_PartnerMultiSubnetFailover=Yes,驅動程式會發生錯誤。 不過,如果連接字串使用 Failover_PartnerMultiSubnetFailover=No (或 ApplicationIntent=ReadWrite),應用程式就會使用資料庫鏡像。

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

指定應用程式意圖

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

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

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

ReadOnly 的目標

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

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

  • 異地複寫

  • 讀取縮放

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

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

唯讀路由

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

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

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

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

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

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

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

OLE DB

OLE DB Driver for SQL Server 同時支援 ApplicationIntentMultiSubnetFailover 關鍵字。

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

  • ApplicationIntent
  • MultiSubnetFailover

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

應用程式的意圖

同等的連接屬性如下:

  • SSPROP_INIT_APPLICATIONINTENT

  • DBPROP_INIT_PROVIDERSTRING

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

  • IDBInitialize::Initialize
    IDBInitialize::Initialize 會使用之前設定的屬性集合來初始化資料來源及建立資料來源物件。 將應用程式意圖指定為提供者屬性或是擴充屬性字串的一部分。

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

  • IDBProperties::SetProperties
    若要設定 ApplicationIntent 屬性值,請呼叫 IDBProperties::SetProperties,其傳入值為 "ReadWrite" 或 "ReadOnly" 的 SSPROP_INIT_APPLICATIONINTENT 屬性,或是值包含 "ApplicationIntent=ReadOnly" 或 "ApplicationIntent=ReadWrite" 的 DBPROP_INIT_PROVIDERSTRING 屬性。

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

當建立隱含連接時,隱含連接將會使用父連接的應用程式意圖設定。 同樣地,從相同資料來源建立的多個工作階段將會繼承資料來源的應用程式意圖設定。

MultiSubnetFailover

同等的連接屬性如下:

  • SSPROP_INIT_MULTISUBNETFAILOVER

  • DBPROP_INIT_PROVIDERSTRING

OLE DB Driver for SQL Server 應用程式可以使用下列其中一種方法,設定 MultiSubnetFailover 選項:

  • IDBInitialize::Initialize
    IDBInitialize::Initialize 會使用之前設定的屬性集合來初始化資料來源及建立資料來源物件。 將應用程式意圖指定為提供者屬性或是擴充屬性字串的一部分。

  • IDataInitialize::GetDataSource
    IDataInitialize::GetDataSource 會採用可包含 MultiSubnetFailover 關鍵字的輸入連接字串。

  • IDBProperties::SetProperties
    若要設定 MultiSubnetFailover 屬性值,請以值 VARIANT_TRUEVARIANT_FALSEDBPROP_INIT_PROVIDERSTRING 屬性 (其值包含 "MultiSubnetFailover=Yes" 或 "MultiSubnetFailover=No"),呼叫傳入 SSPROP_INIT_MULTISUBNETFAILOVER 屬性的 IDBProperties::SetProperties

範例

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);

另請參閱

OLE DB Driver for SQL Server 功能
利用 OLE DB Driver for SQL Server 使用連接字串關鍵字