本主題討論 Microsoft Drivers for PHP for SQL Server 在高可用性和災害復原方面的支援 (於 3.0 版新增)。
從 Microsoft Drivers for PHP for SQL Server 3.0 版開始,您可以在連線字串中將高可用性和災難復原可用性群組的可用性群組接聽器,或容錯移轉叢集執行個體指定為伺服器。
當目標對象為 Azure SQL Database、Azure SQL 受控執行個體、Microsoft Fabric 中的 SQL 資料庫、可用性群組監聽器或故障轉移叢集實例時,設定 MultiSubnetFailover=True。 驅動程式會並行嘗試連線到所有已解析出的 IP 位址,並使用第一個成功建立的 TCP 連線。 若應用程式連線到會進行容錯移轉的資料庫,原有連線會中斷,而應用程式必須開啟新的連線,才能在容錯移轉後繼續運作。
當 DNS 解析到一個地址時, MultiSubnetFailover=True 不會產生額外的平行連線嘗試,因此在單一 IP 目標上是安全的。
驅動程式無論如何都接受 True、 1 或 Yes,並將選項傳給底層的 ODBC 驅動程式。 他們會將其他值視為 False ,且不會報告錯誤,因此拼錯的值會默默停用該選項。
MultiSubnetFailover 具有以下限制:
你不能用它在 TCP 以外的協定上。
連線到已設定超過 64 個 IP 位址的 SQL Server 執行個體時會失敗。
您無法將其與資料庫鏡像搭配使用。 當連線字串也使用 Failover_Partner,或是連線到主要複本而非可用性群組接聽程式時,請勿設定此項。 欲了解更多資訊,請參閱 從資料庫鏡像升級為使用多子網路叢集。
對於已啟用自動暫停的 Azure SQL Database serverless,如果設定 LoginTimeout,請使用至少 60 秒。 自動暫停的資料庫會在第一次連線嘗試時恢復,而該嘗試可能在資料庫恢復時出現錯誤 40613 失敗,因此應用程式必須重新嘗試。 欲了解更多資訊,請參閱 自動暫停與自動繼續。
欲了解更多關於 Always On 可用性群組的資訊,請參閱 「什麼是 Always On 可用性群組?」。
透明網路 IP 解析 (TNIR)
透明網路 IP 解析(TNIR)是 ODBC 驅動程式的舊版多 IP 後援機制,由 TransparentNetworkIPResolution 連線選項控制,且預設為啟用。
依照前一節中的指引,為其中列出的目標設定 MultiSubnetFailover=True。 當 MultiSubnetFailover = True 時,驅動程式會嘗試平行地對所有已解析的 IP 位址進行 TCP 連線。 TransparentNetworkIPResolution 選項不會影響連線序列,所以你不需要設定它,也不需要把它納入 連接字串 裡。
如需 TNIR 與 MultiSubnetFailover 互動的完整參考資訊,請參閱「搭配 ODBC 驅動程式使用透明網路 IP 解析」。
從資料庫鏡像升級為使用多子網路叢集
如果連接字串中有 MultiSubnetFailover 和 Failover_Partner 連接關鍵字,則會發生連接錯誤。 如果使用 MultiSubnetFailover,且 SQL Server 傳回容錯移轉夥伴回應,指出其為資料庫鏡像配對的一部分,也會發生錯誤。
當將目前使用資料庫鏡像的 PHP 應用程式升級至多子網路情境時,請移除 Failover_Partner 連線屬性,並改用設為 True 的 MultiSubnetFailover 取代。 將 連接字串 中的伺服器名稱替換為可用性群組監聽器。 如果連線字串使用 Failover_Partner 且 MultiSubnetFailover=True,驅動程式會產生錯誤。 然而,如果連線字串使用 Failover_Partner 且 MultiSubnetFailover=False(或 ApplicationIntent=ReadWrite),則應用程式會使用資料庫鏡像。
如果您在可用性群組中的主要複本上使用資料庫鏡像,且在連線到主要複本而非可用性群組接聽程式的連線字串中使用 MultiSubnetFailover=True,驅動程式會傳回錯誤。
指定應用程式意圖
您可以在連接字串中指定關鍵字 ApplicationIntent。 可指派的值為 ReadWrite (預設) 或 ReadOnly。
若設定 ApplicationIntent=ReadOnly,用戶端會在連線時要求讀取工作負載。 伺服器會在連線期間以及在 USE 資料庫陳述式期間,強制執行此意圖。
ApplicationIntent 關鍵字不適用於舊版唯讀資料庫。
ReadOnly 的目標
當連線選擇 ReadOnly 時,該連線會被指派至資料庫中可能存在的下列任一特殊組態:
Always On。 資料庫可在目標可用性群組資料庫允許或不允許讀取工作負載。 此選擇是透過使用
ALLOW_CONNECTIONS與PRIMARY_ROLETransact-SQL 陳述式的SECONDARY_ROLE子句來控制的。
如果沒有任何那些特殊目標可用,則會從一般資料庫讀取。
ApplicationIntent 關鍵字可啟用唯讀路由。
唯讀路由
唯讀路由功能可確保資料庫之唯讀複本的可用性。 若要啟用唯讀路由,必須符合下列所有條件:
您必須連線到 Always On 可用性群組接聽程式。
ApplicationIntent連接字串關鍵字必須設為ReadOnly。資料庫管理員必須設定可用性群組,以啟用唯讀路由。
多個各自使用唯讀路由的連線,不一定都會連線到相同的唯讀複本。 資料庫同步處理的變更或伺服器路由組態的變更,可能會導致用戶端連接至不同的唯讀複本。
您可以藉由不將可用性群組接聽程式傳遞至 連接字串關鍵字,確保所有唯讀要求都連線到同一個唯讀複本。 請改為指定唯讀執行個體的名稱。
唯讀路由所需時間可能比連線到主要複本更長。 這是因為唯讀路由會先連線到主要複本,再尋找最適合的可讀取次要複本。 由於有多個步驟,因此您應將 login 逾時增加為至少 30 秒。