連續可用性代碼
當計畫性維護、非計畫性停機以及資料庫負載不平衡時,您的應用程式可實現連續可用性。應用程式最佳實務、簡單組態和 Oracle Autonomous Database 的組合可確保您的應用程式持續可供使用。
將計畫性維護活動隱藏起來的最佳方法是,在該工作負載位置的維護時段之前,明確地從每個資料庫工作負載位置清空工作。Oracle 的連線集區和中間層 (包括 WebLogic 伺服器、Oracle Universal Connection Pool (UCP)、OCI 階段作業集區和 ODP.NET 未受管理的提供者) 都感知「快速應用程式通知 (FAN)」,因此在資料庫服務排定搬移之前會收到通知,以允許在維護之前順利清空工作。FAN 通知會自動觸發關閉閒置連線、在新服務位置開啟新連線,並允許在即將關閉的服務位置完成作用中工作的可配置時間。主要協力廠商 JDBC 中間層 (例如 IBM WebSphere) 在設定 UCP 時允許相同的行為。對於無法使用 UCP 的 JDBC 型應用程式,Oracle 提供了使用 Oracle Drivers 和連線測試的解決方案。
為了隱藏元件或通訊失敗導致的非計畫性中斷,Oracle 提供:
-
通知。FAN 是隱藏停機的第一步。FAN 會通知用戶端,並在發生中斷時將其中斷目前的網路等待。這樣可以避免在長時間的網路等待下停止應用程式。重要的是,FAN 也會在再次提供服務時呼叫重新平衡階段作業。
-
復原。通知從屬端之後,「通透應用程式連續性 (TAC)」或「應用程式連續性 (AC)」會重新建立與新工作負載位置 (執行資料庫之 Real Application Clusters (RAC) 組態中的其他資料庫執行處理) 的連線,並盡可能重新執行進行中 (未確認) 的工作。在新位置上重新執行進行中的工作後,應用程式通常會繼續執行,而不會知道發生任何失敗。
TAC 或 AC 也會在計畫性維護期間,針對配置之清空間隔期間不會清空 (完成目前的資料庫作業) 的階段作業執行。
相關主題
使用資料庫服務連線
資料庫服務為基礎架構提供透明度:FAN、連線資料、通透應用程式連續性 (TAC)、應用程式連續性 (AC)、切換、用戶群組以及其他許多功能和作業都是根據服務的使用預測。
Autonomous Database on Dedicated Exadata Infrastructure 提供數對預先定義的資料庫服務供您選擇,如自治式資料庫的預先定義資料庫服務名稱中所述。所有提供 FAN 與清空,且這兩個交易處理配對預設都已啟用 TAC。API 可用來變更所有預先定義服務的 TAC 或 AC 設定值 (請參閱啟用容錯移轉的服務屬性 )。
設定高可用性的連線字串
Oracle 建議在連線至 Oracle Autonomous Database 時,使用下方顯示的「連線字串」組態。Oracle 提供之 tnsnames.ora
檔案中內嵌的連線字串會以此方式設定。請勿在用戶端上使用「簡易連線命名」,因為這類連線沒有高可用性功能。
針對所有 Oracle 從屬端版本 12.2 或更新版本使用此 TNS:
alias = (DESCRIPTION = (CONNECT_TIMEOUT= 120)(RETRY_COUNT=20)(RETRY_DELAY=3)(TRANSPORT_CONNECT_TIMEOUT=3) (ADDRESS_LIST = (LOAD_BALANCE=on) (ADDRESS = (PROTOCOL = TCP)(HOST=scan-host)(PORT=1521))) (CONNECT_DATA=(SERVICE_NAME = service-name)))
使用 Oracle 驅動程式版本 12.1 或更舊版本的 JDBC 連線使用下列項目
alias = (DESCRIPTION = (CONNECT_TIMEOUT= 15)(RETRY_COUNT=20)(RETRY_DELAY=3) (ADDRESS_LIST = (LOAD_BALANCE=on) (ADDRESS = (PROTOCOL = TCP)(HOST=scan-host)(PORT=1521))) (CONNECT_DATA=(SERVICE_NAME = service-name)))
使用快速應用程式通知 (FAN)
FAN 會在服務中斷或恢復時,立即通知應用程式。若無 FAN,應用程式可能會在硬體和網路故障後於 TCP/IP 逾時上當機,且在資源恢復時省略重新平衡。所有 Oracle 集區和所有 Oracle 應用程式伺服器都使用 FAN。協力廠商 JAVA 應用程式伺服器可以使用 UCP 來啟用 FAN。
不需要變更應用程式即可使用 FAN。這些僅是配置變更。
針對計劃維護期間的持續服務,請使用 FAN 搭配:
- Oracle 集區或
- 具有協力廠商 JDBC 應用程式伺服器的 UCP
- 最新的 Oracle 從屬端驅動程式
針對非計畫性停機期間的連續服務,請使用 FAN 搭配:
- 通透應用程式連續性或
- 應用程式連續性
FAN 涵蓋範圍
FAN 事件與下列項目整合:
- Oracle Fusion Middleware 和 Oracle WebLogic Server
- Oracle Data Guard 中介
- 適用於 JDBC 精簡型和 Oracle Call Interface (OCI) 介面的 Oracle JDBC Universal Connection Pool 或 Driver
- 未受管理和受管理提供者的 ODP.NET 連線集區
- Oracle Tuxedo
- SQL*Plus
- 適用於 Python、Node.js 和 PHP 等語言的 Oracle Database 驅動程式
- 全域資料服務
- 使用 Oracle JDBC Universal Connection Pool 的第三方 JDBC 應用程式伺服器
- 監聽器
在用戶端中啟用 FAN
使用設定高可用性的連線字串中顯示的 TNS 別名。此連線字串是用來在使用 Oracle Database 12c 或更新版本的從屬端驅動程式時,在從屬端自動設定 Oracle Notification Service (ONS) 訂閱以接收 FAN 事件。ONS 提供資料庫層和從屬端層之間的安全通訊路徑,可讓從屬端收到服務可用性 (元件停止或啟動) 的通知,以及程式實際執行負載平衡建議,以在正常作業期間獲得更好的工作位置。
視用戶端而定,在應用程式組態特性中啟用 FAN 的方式如下:
-
通用連線集區或 JDBC 精簡型驅動程式 (啟動 12.2)
設定特性
FastConnectionFailoverEnabled
。 -
WebLogic 適用於 Oracle 的 Active GridLink
預設會啟用 RAC FAN 和「快速連線容錯移轉」。
-
Oracle WebLogic Server,IBM WebSphere,IBM Liberty,Apache Tomcat,Red Hat WildFly (JBoss),JDBC 應用程式
使用「通用連線集區」作為連線集區取代項目。
-
ODP.Net 從屬端 (受管理和未受管理的提供者)
如果使用 ODP.Net 12.1 或更舊版本,請在連線字串中設定
"HA events = true;pooling=true"
。 -
Oracle Call Interface (OCI) 從屬端和以 OCI 為基礎的驅動程式
沒有原生設定值的 Oracle Call Interface (OCI) 從屬端可以使用
oraacces.xml
檔案,並將events
設為true
。Python、Node.js 和 PHP 具有原生選項。在 Python 和 Node.js 中,您可以在建立連線集區時設定事件模式。在 PHP 中,編輯
php.ini
,新增項目oci8.events=on
。 -
SQL*Plus
預設會啟用 FAN。
預先定義的資料庫服務提供使用 TLS 公事包式認證的 TCPS 連線。視應用程式類型 (JDBC 或 Oracle Call Interface) 而定,公事包組態必須遵循特定規則,如設定 FAN 的從屬端 (包括選擇性公事包) 中所述。
使用建議的課堂練習允許清空
應用程式使用最佳作法是簽出需要連線的時間,然後在目前動作完成時將連線存回集區。這對於達到良好的效能、在執行時期重新平衡工作,以及在維護時段期間清空工作非常重要。
Oracle 建議您使用 FAN 感知的 Oracle 連線集區來隱藏計畫性維護。當您的應用程式使用具有 FAN 的 Oracle 集區並傳回要求之間的集區連線時,使用者不會受到任何影響。您不需要進行任何應用程式變更,即可使用 FAN。當 Oracle 連線集區收到 FAN 事件的計畫性停機時間時,它會標示要清空之執行處理的所有連線。立即關閉存入的連線,讓連線不會重複使用。當使用中連線返回關閉集區時。這可讓所有連線在一段時間內正常關閉。
如果您使用協力廠商的 Java 型應用程式伺服器,則達到清空和容錯移轉的最有效方法就是以 UCP 取代集區資料來源。許多應用程式伺服器都支援此方法,包括 Oracle WebLogic Server、IBM WebSphere、IBM Liberty、Apache Tomcat、Red Hat WildFly (JBoss)、Spring、Hibernate 等。來自 Oracle 和其他供應商 (如 IBM) 的白皮書說明如何將 UCP 與這些應用程式伺服器搭配使用。使用 UCP 作為資料來源可讓 UCP 功能 (例如快速連線容錯移轉、程式實際執行負載平衡、應用程式連續性和通透應用程式連續性) 與完整認證搭配使用。
啟用通透應用程式連續性 (TAC) 或應用程式連續性 (AC)
TAC 會通透地追蹤和記錄階段作業與交易狀態,以便在可復原的中斷之後復原資料庫階段作業。預先定義資料庫服務的兩組交易處理預設會啟用 TAC。
AC 可自訂,讓您選擇重新執行副作用,或在容錯移轉時新增 TAC 不允許的複雜回呼。如果您是使用 Oracle 12c 驅動程式 (JDBC-thin 或 Oracle Call Interface),或是想要使用副作用或回呼來自訂,或是讓應用程式使用狀態 (例如階段作業持續時間暫存表格) 且不清除要求,請使用 AC。
使用通透應用程式連續性的步驟
-
如果您需要在正在使用的資料庫服務中啟用「通透應用程式連續性」,請參閱啟用容錯移轉的服務屬性。
-
使用下列其中一個支援的用戶端。
Oracle 強烈建議您使用最新的從屬端驅動程式。Oracle Database 19c 用戶端驅動程式及更新版本提供 TAC 的完整支援。
- Oracle JDBC 重新執行驅動程式 18c 或更新版本。這是 Oracle Database 18c 隨附的 JDBC 驅動程式功能,可供應用程式連續性使用。
- Oracle Universal Connection Pool (UCP) 18c 或更新版本與 Oracle JDBC 重新執行驅動程式 18c 或更新版本。
- 使用 UCP 搭配 Oracle JDBC 重新執行驅動程式 18c 或更新版本的 Oracle WebLogic Server Active GridLink 或協力廠商 JDBC 應用程式伺服器。
- 使用 Oracle JDBC 重新執行驅動程式 18c 或更新版本之 Java 連線集區或獨立 Java 應用程式。
- Oracle Call Interface 階段作業集區 19c 或更新版本。
- SQL*Plus 19c (19.3) 或更新版本
- ODP.NET 集區化、未受管理的驅動程式 18c 或更新版本 (
"Pooling=true"
在 12.2 和更新版本中預設)。 - 使用 19c OCI 驅動程式或更新版本的 Oracle Call Interface 型應用程式。
-
返回「連線集區」的連線。
如果應用程式使用連線,則您不需要對應用程式進行任何變更來識別要求界限:
- 從 Oracle 連線集區或
- 從 Oracle JDBC 重新執行驅動程式 18c 或更新版本
- 從使用 19c 或更新版本的 Oracle Call Interface 應用程式
使用連線集區時,應用程式應在完成每個要求時,將連線傳回集區。Oracle 建議應用程式僅在需要時取出連線。在不使用時保留連線並不是良好的實行範例。使用所列驅動程式的「通透應用程式連續性」也會偵測可在何處新增界限並建立其本身的界限。
-
使用
FAILOVER_RESTORE
啟用「通透應用程式連續性」會自動回復預設階段作業狀態。如果您發現除了標準集之外還需要預先設定階段作業狀態,可以註冊回呼或 UCP 標籤來回復這些狀態。如果您發現需要複雜的階段作業狀態 (例如暫時表格或
SYS_CONTEXT
),請回復,然後使用提供此彈性的「應用程式連續性」。 -
在應用程式中啟用可變使用
可變函數是可在每次執行時傳回新值的函數。
SYSDATE
、SYSTIMESTAMP
、SYS_GUID
以及
提供保留原始結果的支援。應用程式連續性 19c 和更新版本會自動sequence.NEXTVAL
KEEP
的 SQL 可變表格。如果您的應用程式使用或敏感於可變函數,則 DBA 必須發出GRANT KEEP
權限。授予KEEP
權限時,重新執行會在重新執行時套用原始函數結果。舉例而言:SQL> GRANT [KEEP DATE TIME | KEEP SYSGUID] … TO USER
SQL> GRANT KEEP SEQUENCE mySequence TO myUser ON sequence.object
-
停用副作用
副作用是外部動作,例如傳送郵件、傳輸檔案或使用 TCP。「通透應用程式連續性」會偵測副作用,而且不會重新執行。如果您想要重新執行副作用,請使用「應用程式連續性」來提供此額外彈性。
使用應用程式連續性的步驟
-
如果您需要在正在使用的資料庫服務中啟用「應用程式連續性」,請參閱啟用容錯移轉的服務屬性。
-
使用下列其中一個支援的用戶端。
- Oracle JDBC 重新執行驅動程式 12c 或更新版本。這是 Oracle Database 12c 隨附的 JDBC 驅動程式功能,可供應用程式連續性使用。
- Oracle Universal Connection Pool (UCP) 12c 或更新版本與 Oracle JDBC 重新執行驅動程式 12c 或更新版本。
- 使用 UCP 搭配 Oracle JDBC 重新執行驅動程式 12c 或更新版本的 Oracle WebLogic Server Active GridLink 和第三方 JDBC 應用程式伺服器。
- 使用 Oracle JDBC 重新執行驅動程式 12c 或更新版本搭配「要求邊界」或「集區資料來源」的 Java 連線集區或獨立 Java 應用程式。
- 使用 Oracle Call Interface 階段作業集區 12c 版次 2 或更新版本的應用程式與語言驅動程式。
- SQL*Plus 19.3 或更新版本。
- ODP.NET 集區化、未受管理的驅動程式 12c 版本 2 或更新版本 (12.2 和更新版本中預設為
"Pooling=true";"Application Continuity=true"
)
-
返回「連線集區」的連線。
如果應用程式使用支援要求界限的 Oracle 連線集區或第三方 JDBC 集區,則您不需要對應用程式進行任何變更來識別要求界限。最佳做法是使用 Oracle 集區,並在要求之間傳回該集區的連線。Oracle 建議應用程式僅在需要時取出連線。在不使用時保持連線不佳做法,而且會防止透明的計畫性維護。
-
使用
FAILOVER_RESTORE
大多數通用狀態都會自動回復為
FAILOVER_RESTORE=LEVEL1
。如果您的應用程式會預先設定除了標準集之外的階段作業狀態,則您必須註冊回呼或 UCP 標籤,才能還原這些狀態。在服務上設定FAILOVER_RESTORE=LEVEL1
並使用:- Java 的連線初始化回呼或 Oracle Call Interface 的 (資料夾) TAF 回呼
- 通用連線集區或 WebLogic 伺服器連線標籤
-
在應用程式中啟用可變使用
可變函數是可在每次執行時傳回新值的函數。
SYSDATE
、SYSTIMESTAMP
、SYS_GUID
以及
提供保留原始結果的支援。應用程式連續性 19c 和更新版本會自動sequence.NEXTVAL
KEEP
的 SQL 可變表格,因此不需要任何動作。如果您需要可變的 PL/SQL,則 DBA 必須發出GRANT KEEP
權限。授予KEEP
權限時,重新執行會在重新執行時套用原始函數結果。舉例而言:SQL> GRANT [KEEP DATE TIME | KEEP SYSGUID] … TO USER
SQL> GRANT KEEP SEQUENCE mySequence TO myUser ON sequence.object
-
決定您是否要重新執行副作用
副作用是外部動作,例如傳送郵件、傳輸檔案或使用 TCP。使用「應用程式連續性」時,會重新執行副作用,除非應用程式另有指定。如果要求的外部動作不應該重新執行,則該要求可以使用未啟用「應用程式連續性」的連線,或者可以使用
disableReplay()
API for Java 或OCIRequestDisableReplay()
for Oracle Call Interface 來停用該要求的重新執行。如果您不想重新執行所有副作用,請使用「通透應用程式連續性」。