建立資料庫鏡像工作階段的初始連接
為了建立鏡像資料庫的初始連接,用戶端必須提供連接字串,以便至少提供伺服器執行個體的名稱。這個必要的伺服器名稱應該可識別目前的主體伺服器執行個體,而此名稱就稱為「初始夥伴名稱」。
此外,如果在第一次連接嘗試期間初始夥伴無法使用,連接字串也可以提供另一個伺服器執行個體的名稱 (應該可識別目前的鏡像伺服器執行個體) 以便使用。第二個名稱就稱為「容錯移轉夥伴名稱」。
連接字串還必須提供資料庫名稱。這是讓資料存取提供者進行容錯移轉嘗試必要的名稱。
接收到連接字串時,資料存取提供者就會將初始夥伴名稱和容錯移轉夥伴名稱 (如果有提供的話) 儲存在用戶端的動態記憶體快取中 (若為 Managed 程式碼,此快取的範圍是應用程式定義域)。快取之後,資料存取提供者就不會再更新該初始夥伴名稱。當用戶端提供容錯移轉夥伴名稱時,資料存取提供者也會暫時儲存此容錯移轉夥伴名稱,以便在提供者無法使用初始夥伴名稱連接時使用。
資料庫鏡像工作階段無法防止用戶端特有的伺服器存取問題發生,例如用戶端電腦無法與網路進行通訊。鏡像資料庫的連接嘗試可能也會由於各種與資料存取提供者不相關的原因而失敗。例如,連接嘗試可能會因為主體伺服器執行個體非使用中 (當資料庫正在容錯移轉時發生) 或網路錯誤而失敗。
嘗試連接時,資料存取提供者會使用初始夥伴名稱開始。如果指定的伺服器執行個體可以使用,而且它是目前的主體伺服器執行個體,則連接嘗試通常會成功。
[!附註]
如果鏡像工作階段已暫停,用戶端通常會連接至主體伺服器並下載夥伴名稱。不過,在繼續進行鏡像以前,用戶端無法使用資料庫。
如果該嘗試沒有用,資料存取提供者就會嘗試容錯移轉夥伴名稱 (如果可用的話)。如果任何一個夥伴名稱可正確識別目前的主體伺服器,資料存取提供者通常就可以順利開啟初始連接。完成此連接後,資料存取提供者會下載目前鏡像伺服器的伺服器執行個體名稱。這個名稱會當做容錯移轉夥伴名稱儲存在快取中,並覆寫用戶端提供的容錯移轉夥伴名稱 (如果有的話)。之後,.NET Framework Data Provider for SQL Server 就不會更新容錯移轉夥伴名稱。相較之下,每當後續連接或連接重設傳回不同的夥伴名稱時,SQL Server Native Client 就會更新快取。
下圖說明用戶端連接到名稱為 Db_1 之鏡像資料庫的初始夥伴 Partner_A。此圖將顯示用戶端提供的初始夥伴名稱可正確識別目前主體伺服器 Partner_A。初始連接嘗試成功,而且資料存取提供者將鏡像伺服器的名稱 (目前是 Partner_B) 當做容錯移轉夥伴名稱儲存在本機快取中。最後,用戶端連接到 Db_1 資料庫的主體副本。
例如,初始連接嘗試可能會由於網路錯誤或非使用中的伺服器執行個體而失敗。由於初始夥伴無法使用,資料存取提供者若嘗試連接到容錯移轉夥伴,則用戶端必須在連接字串中提供容錯移轉夥伴名稱。
在該情況下,如果容錯移轉夥伴名稱無法使用,原始的連接嘗試就會繼續進行,直到網路連接逾時或傳回錯誤為止 (只適用於非鏡像資料庫)。
如果連接字串中已提供容錯移轉夥伴名稱,資料存取提供者的行為就會根據用戶端的網路通訊協定和作業系統而定,如下所示:
若為 TCP/IP,如果用戶端正在執行 Microsoft Windows XP 或更新版本,連接嘗試就會由資料庫鏡像專用的連接重試演算法進行管制。「連接重試演算法」會判斷指定連接嘗試中針對開啟連接所分配的最大時間 (「重試時間」)。如需詳細資訊,請參閱<搭配 SQL Server Native Client 使用連接字串關鍵字>。
若為其他網路通訊協定以及非執行 Microsoft Windows XP 或更新版本的用戶端
如果發生錯誤或初始夥伴無法使用,初始連接嘗試就會等候直到資料存取提供者的網路連接逾時期限到期,或者登入逾時期限到期為止。一般而言,這項等候是按照 20 至 30 秒的順序進行。之後,如果資料存取提供者尚未逾時,它就會嘗試連接至容錯移轉夥伴。如果連接逾時期限在連接成功之前到期,或容錯移轉夥伴無法使用,連接嘗試就會失敗。如果容錯移轉夥伴在登入逾時期限內可以使用,而且它目前是主體伺服器,則連接嘗試通常會成功。
鏡像資料庫的連接字串
用戶端提供的連接字串,包含資料存取提供者用來連接資料庫的資訊。本章節將討論使用 SQL Server Native Client ODBC 驅動程式連接來連接至鏡像資料庫時,特別相關的關鍵字。如需有關所有連接字串關鍵字的詳細資訊,請參閱<搭配 SQL Server Native Client 使用連接字串關鍵字>。
Network 屬性
連接字串應該包含 Network 屬性,以便指定網路通訊協定。這項屬性可確保在連接至不同的夥伴時,會持續使用指定的網路通訊協定。連接至鏡像資料庫的最佳通訊協定是 TCP/IP。為了確保用戶端會針對夥伴的每個連接要求 TCP/IP,連接字串提供了下列屬性:
Network=dbmssocn;
重要事項 |
---|
我們建議將 TCP/IP 保持在用戶端通訊協定清單的頂端。不過,如果連接字串指定了 Network 屬性,這就會覆寫清單順序。 |
此外,為了確保用戶端會針對夥伴的每個連接要求具名管道,連接字串提供了下列屬性:
Network=dbnmpntw;
重要事項 |
---|
由於具名管道不會使用 TCP/IP 重試演算法,所以在許多情況下,具名管道連接嘗試可能會在連接至鏡像資料庫之前逾時。 |
Server 屬性
連接字串必須包含 Server 屬性,以便提供初始夥伴名稱 (應該可識別目前的主體伺服器執行個體)。
識別伺服器執行個體最簡單的方式就是指定名稱:<server_name>[\<SQL_Server_instance_name>]。例如:
Server=Partner_A;
或
Server=Partner_A\Instance_2;
不過,使用伺服器名稱時,用戶端必須執行 DNS 查閱來取得伺服器的 IP 位址,並執行 SQL Server Browser 查詢來取得夥伴所在之伺服器的通訊埠編號。您可以透過在 Server 屬性中指定夥伴的 IP 位址和通訊埠編號 (而非指定伺服器名稱),略過這些查閱和查詢。這項建議是為了在連接至該夥伴時將外部延遲的可能性降至最低。
[!附註]
如果連接字串指定了具名執行個體的名稱而非通訊埠,SQL Server Browser 查詢就是必要項目。
若要指定 IP 位址和通訊埠,Server 屬性會採用下列格式:Server=<ip_address>,<port>,例如:
Server=123.34.45.56,4724;
[!附註]
此 IP 位址可以是 IP 第 4 版 (IPv4) 或 IP 第 6 版 (IPv6)。
Database 屬性
此外,連接字串必須指定 Database 屬性,以便提供鏡像資料庫的名稱。如果用戶端嘗試連接的資料庫無法使用,就會產生例外狀況。
例如,為了明確連接到主體伺服器 Partner_A 的 AdventureWorks2008R2 資料庫,用戶端會使用下列連接字串:
" Server=Partner_A; Database=AdventureWorks2008R2 "
[!附註]
此字串省略了驗證資訊。如需整合式驗證之關鍵字的詳細資訊,請參閱<搭配 SQL Server Native Client 使用連接字串關鍵字>。
重要事項 |
---|
將通訊協定前置詞和 Server 屬性結合在一起 (Server=tcp:<servername>) 與 Network 屬性不相容,而且在兩個位置指定通訊協定可能會導致錯誤發生。因此,我們建議連接字串應該使用 Network 屬性來指定通訊協定,並且在 Server 屬性中僅指定伺服器名稱 ("Network=dbmssocn; Server=<servername>")。 |
Failover Partner 屬性
除了初始夥伴名稱以外,用戶端也可以指定容錯移轉夥伴名稱 (應該可識別目前的鏡像伺服器執行個體)。容錯移轉夥伴是由 Failover Partner 屬性的其中一個關鍵字指定的。這個屬性的關鍵字會因您所使用的 API 而不同。下表將列出這些關鍵字:
API |
Failover Partner 屬性的關鍵字 |
---|---|
OLE DB 提供者 |
FailoverPartner |
ODBC 驅動程式 |
Failover_Partner |
ActiveX Data Objects (ADO) |
Failover Partner |
如需有關這些 API 之關鍵字的詳細資訊,請參閱<搭配 SQL Server Native Client 使用連接字串關鍵字>。
識別伺服器執行個體最簡單的方式就是指定系統名稱:<server_name>[\<SQL_Server_instance_name>]。
此外,您可以在 Failover Partner 屬性中提供 IP 位址和通訊埠編號。如果第一次連接至資料庫時,初始連接嘗試失敗,連接至容錯移轉夥伴的嘗試將不再仰賴 DNS 和 SQL Server Browser。建立連接後,就會以容錯移轉夥伴名稱覆寫容錯移轉夥伴名稱,因此當容錯移轉發生時,重新導向的連接就會需要 DNS 和 SQL Server Browser。
[!附註]
只有提供初始夥伴名稱時,除了重新連接的相關動作或程式碼以外,應用程式開發人員不需要採取任何動作或寫入任何程式碼。
[!附註]
Managed 程式碼應用程式開發人員要在 SqlConnection 物件的 ConnectionString 中提供容錯移轉夥伴名稱。如需使用此連接字串的詳細資訊,請參閱 ADO.NET 文件中的<.NET Framework Data Provider 對於 SQL Server 的資料庫鏡像支援>,其是 Microsoft .NET Framework SDK 的一部份。
連接字串範例
例如,若要使用 TCP/IP 明確連接到 Partner_A 或 Partner_B 的 AdventureWorks2008R2 資料庫,使用 ODBC 驅動程式的用戶端應用程式可能會提供下列連接字串:
"Server=Partner_A; Failover_Partner=Partner_B; Database=AdventureWorks2008R2; Network=dbmssocn"
或者,用戶端可能會使用 IP 位址和通訊埠編號來識別初始夥伴 Partner_A。例如,如果 IP 位址是 250.65.43.21 而通訊埠編號是 4734,連接字串就會是:
"Server=250.65.43.21,4734; Failover_Partner=Partner_B; Database=AdventureWorks2008R2; Network=dbmssocn"