聯合立方體維護與疑難排解
使用下列準則來維護或疑難排解 Essbase 同盟立方體。
本主題假設您已建立同盟分割區,並已複查先前主題中詳細的資訊。
模型與測試聯合立方體
設計 Essbase 聯合立方體時,請遵循這些設計和測試準則,以針對效能進行疑難排解或監控的階段方法。
-
在測試環境中開始聯合立方體專案。
-
從具有下列特性的 Essbase ASO 或 BSO 立方體模型開始:
-
沒有許多層級
-
沒有許多共用成員或屬性
-
-
建立同盟分割區時,請在不允許對執行處理進行查詢時排定離線作業。
-
使用 MaxL alter 應用程式
disable commands和 (或)disable connects(防止任何新的使用者活動) 逐步中斷現用 Essbase 使用者階段作業的連線,接著使用 alter systemlogout session和 (或)kill request(如果您需要終止任何不需要完成的作用中階段作業)。請注意, MaxL 無法終止任何可能在 Autonomous AI Lakehouse 中執行的要求。如果您在應用程式中停用命令,請記得在建立 同盟分割區之後重新啟用命令。若要終止在 Autonomous AI Lakehouse 中以 SQL 階段作業身分執行的要求,則需要執行其他步驟。請參閱取消聯合立方體上的長時間執行 SQL 。
- 執行逾時調整:
- 客戶網路上的 HTTPS 代理主機 - 調整客戶網路逾時
- 負載平衡器 - 將負載平衡器逾時增加至 1260 秒 (21 分鐘)
- 將 HTTPD 逾時增加至 21 分鐘
/etc/httpd/conf.d/00_base.conf:ProxyTimeout 1260/etc/httpd/conf.d/00_base.conf:Timeout 1260 - APS/JAPI 逾時:
- 在 Essbase Web 介面的主控台頁面上,選取組態,並記下 olap.server.netSocketTimeOut 的值。200 毫秒的值表示每 5 個這些特性會產生 1 秒的等待時間。
- 若要將 APS/JAPI 逾時限制設為 30 分鐘,請將
olap.server.netRetryCount設為 9000。
- 建立聯合分割區。
- 回復步驟 3 中的逾時調整。
- 使用 alter 應用程式啟用命令和 (或) connects (若先前停用這些命令),讓使用者回到系統上。
- 對於同盟立方體的報表,請調整 QRYGOVEXECTIME 大於對同盟分割區執行查詢的預期時間。請注意,QRYGOVEXECTIME 無法終止任何可能在 Autonomous AI Lakehouse 中執行的要求。
- 完成開發環境測試與調整後,請使用上述步驟 1 到步驟 7 來實行生產環境。
附註:
如果在建立同盟分割區時看到「無法儲存大綱」錯誤,請等待階段作業完成再重新整理瀏覽器。如果已建立同盟分割區,請在 SQL Developer 中進行驗證。如果在 SQL Developer 中進行驗證,則可以開始使用聯合立方體。否則,必須修正模型,並且如上面的步驟 3 中所述,需要進行逾時調整。聯合立方結構的描述資料注意事項
編輯非 Essbase 管理的聯合立方體大綱時,請小心。如果您新增或重新命名成員,請確定 Autonomous AI Lakehouse 中的事實表格中也會顯示中繼資料變更。
本主題不適用於具有 Essbase 受管理資料儲存的聯合立方體。
如果 Essbase 大綱與 Autonomous AI Lakehouse 中的事實表格不同步,則聯合立方體將變成無效或無法正確運作。若要修正此問題,您必須刪除同盟分割區、變更大綱和事實表格,然後重新建立同盟分割區。
如果聯合立方體變成無效,您可能會遇到以 Essbase Error(1040235): Remote warning from federated partition 為開頭的錯誤。
下列類型的 Essbase 大綱變更會導致 (非 Essbase 管理的) 聯合立方體變成無效:
-
新增、重新命名或移除維度
-
新增、重新命名或移除旋轉維度中儲存的成員
-
將任何成員從已儲存變更為動態
對於上方未提及的其他 Essbase 大綱變更類型 (例如,新增或重新命名非旋轉維度成員),則應該對事實表格中受影響的資料列進行對應的變更。否則,聯合立方體可能無法正確運作。
如果您事先知道 Essbase 大綱中繼資料將會變更,則最好先移除同盟分割區、進行大綱變更、更新事實表格,然後重新建立同盟分割區。
不過,如果 Essbase 中繼資料變更並導致同盟分割區變為無效,請採取以下動作:
取消聯合立方體上的長時間執行 SQL
您可以取消在 Essbase 聯合立方體上執行的 SQL 階段作業。如果計算時間太長,或聯合立方體需要備份或復原,則可能需要取消 SQL。
如果在聯合立方體上執行的 Essbase 計算、資料載入或彙總產生長時間執行的 SQL 陳述式,即使階段作業是在 Autonomous AI Lakehouse 上執行,還是可以取消階段作業。
透過 Essbase 取消 SQL 階段作業之前,必須先完成步驟的簡短工作流程,才能在 Essbase 中啟用 SQL 階段作業控管員。
具備下列存取權類型的使用者會參與準備步驟。
| 使用者類型 | 工作流程中的角色 |
|---|---|
| 資料庫管理員 |
瞭解 Autonomous AI Lakehouse 的管理員綱要名稱和密碼。可在 Autonomous AI Lakehouse 上建立預存 PL/SQL 程序,並將權限授予其他使用者。 |
| 資料庫使用者 又稱為聯合分割區使用者 |
知道 Autonomous AI Lakehouse 綱要名稱和密碼 -- 用來建立 Oracle Database 之 Essbase 連線的綱要和密碼 (建立聯合分割區前的必要先決條件 )。 |
| Essbase 應用程式管理員 |
Essbase 應用程式的管理員 / 擁有者,用於聯合立方體。 |
必須完成下列步驟工作流程,才能啟用 SQL Session Governor :
-
資料庫管理員:在 Autonomous AI Lakehouse 中建立下列 PL/SQL 預存程序,並將 EXECUTE 權限授予 DB 使用者:
附註:
預存程序是在「資料庫」使用者綱要上建立。-
ESS_SESSION_SET_MODULE (jagent_id in VARCHAR2,app_name in VARCHAR2, db_name in VARCHAR2, req_id in VARCHAR2)
使用下列陳述式來建立程序:
CREATE OR REPLACE NONEDITIONABLE PROCEDURE "ESS_SESSION_SET_MODULE" (jagent_id in VARCHAR2, app_name in VARCHAR2, db_name in VARCHAR2, req_id in VARCHAR2) AS ess_jagentid VARCHAR2(256); ess_appname VARCHAR2(256); ess_dbname VARCHAR2(256); ess_reqid VARCHAR2(256); hash_str VARCHAR2(100); BEGIN IF jagent_id is not NULL AND app_name is not NULL AND db_name is not NULL AND req_id is not NULL THEN -- add prefixes to identify essbase sessions ess_jagentid := CONCAT('ess_jagentid_', jagent_id); ess_appname := CONCAT('ess_appname_', app_name); ess_dbname := CONCAT('ess_dbname_', db_name); ess_reqid := CONCAT('ess_reqid_', req_id); -- ess_jagentid is stored in client_info dbms_application_info.set_client_info(ess_jagentid); -- create hash out of CONCAT(ess_jagentid, ess_appname, ess_dbname) -- the hash identifies the fed partition -- store the hash as the module -- store the ess_reqid as the action SELECT TO_CHAR(ORA_HASH(CONCAT(CONCAT(ess_jagentid, ess_appname), ess_dbname))) INTO hash_str from dual; dbms_application_info.set_module(module_name => hash_str, action_name => ess_reqid); ELSIF jagent_id is NULL AND app_name is NULL AND db_name is NULL AND req_id is NULL THEN -- reset session dbms_application_info.set_module(null,null); dbms_application_info.set_client_info(null); END IF; END ESS_SESSION_SET_MODULE; -
ESS_SESSION_CANCEL (jagent_id in VARCHAR2, app_name in VARCHAR2, db_name in VARCHAR2, req_id in VARCHAR2)
使用下列陳述式來建立程序:
CREATE OR REPLACE NONEDITIONABLE PROCEDURE "ESS_SESSION_CANCEL" (jagent_id in VARCHAR2, app_name in VARCHAR2, db_name in VARCHAR2, req_id in VARCHAR2) AS ess_jagentid VARCHAR2(256); ess_appname VARCHAR2(256); ess_dbname VARCHAR2(256); ess_reqid VARCHAR2(256); uname VARCHAR2(100); hash_str VARCHAR2(100); sessionid VARCHAR2(100); killcmd VARCHAR2(1000); XCP_MARKED_FOR_TERMINATION exception; pragma exception_init (XCP_MARKED_FOR_TERMINATION, -00031); BEGIN -- add prefixes to identify Essbase sessions ess_jagentid := CONCAT('ess_jagentid_', jagent_id); ess_appname := CONCAT('ess_appname_', app_name); ess_dbname := CONCAT('ess_dbname_', db_name); ess_reqid := CONCAT('ess_reqid_', req_id); -- create hash out of CONCAT(ess_jagentid, ess_appname, ess_dbname) -- the hash identifies the federated partition SELECT TO_CHAR(ORA_HASH(CONCAT(CONCAT(ess_jagentid, ess_appname), ess_dbname))) INTO hash_str from dual; uname := SYS_CONTEXT('USERENV', 'SESSION_USER'); IF jagent_id is not NULL AND app_name is not NULL AND db_name is not NULL AND req_id is not NULL THEN -- valid jagent_id, app_name, db_name, req_id -- kill sessions associated with the given federated cube and request id FOR r IN (select sid,serial# from v$session where username=uname AND module=hash_str AND action=ess_reqid) LOOP BEGIN sessionid := DBMS_ASSERT.ENQUOTE_LITERAL(r.sid || ',' || r.serial#); killcmd:='ALTER SYSTEM KILL SESSION ' || sessionid || ' IMMEDIATE'; EXECUTE IMMEDIATE killcmd; EXCEPTION WHEN XCP_MARKED_FOR_TERMINATION THEN -- ignore - the session could not be terminated immediately, but is marked for termination. NULL; END; END LOOP; ELSIF jagent_id is not NULL AND app_name is not NULL AND db_name is not NULL AND req_id is NULL THEN -- null req_id -- kill all sessions for the given federated cube - invoked at app startup FOR r IN (select sid,serial# from v$session where username=uname AND module=hash_str) LOOP BEGIN sessionid := DBMS_ASSERT.ENQUOTE_LITERAL(r.sid || ',' || r.serial#); killcmd:='ALTER SYSTEM KILL SESSION ' || sessionid || ' IMMEDIATE'; EXECUTE IMMEDIATE killcmd; EXCEPTION WHEN XCP_MARKED_FOR_TERMINATION THEN -- ignore - the session could not be terminated immediately, but is marked for termination. NULL; END; END LOOP; END IF; EXCEPTION WHEN OTHERS THEN RAISE; END ESS_SESSION_CANCEL; -
將上方預存程序的 EXECUTE 權限授與 DB 使用者。
GRANT EXECUTE on ESS_SESSION_SET_MODULE TO "DB User"; GRANT EXECUTE on ESS_SESSION_CANCEL TO "DB User"; CREATE OR REPLACE SYNONYM "DB User".ESS_SESSION_SET_MODULE FOR ESS_SESSION_SET_MODULE; CREATE OR REPLACE SYNONYM "DB User".ESS_SESSION_CANCEL FOR ESS_SESSION_CANCEL;
-
-
資料庫使用者:在您的 Autonomous AI Lakehouse 綱要中,確認您有權存取下列同義字下的預存程序:
- 文章 RSS
- 中文 _ ENGLISH
-
滿足這些先決條件後,長期執行 Federated cube 的 SQL 要求便可取消,與其他 Essbase 要求相同。您可以從主控台的階段作業區域,在 Essbase Web 介面中取消要求。如果您使用 MaxL ,可以使用更改系統
kill request敘述句來取消要求。如需有關階段作業終止的準則,請參閱模型與測試同盟分割區立方體。
資料庫連線詳細資訊變更時該怎麼做
如果 Essbase 用於聯合立方體的 Autonomous AI Lakehouse 連線詳細資訊已變更,您必須刪除並重新建立聯合分割區,並從資料庫綱要清除關聯的物件和中繼資料表格。
本主題不適用於具有 Essbase 受管理資料儲存的聯合立方體。
若在建立後發生下列任一事件,則需要刪除並重新建立聯合分割區:
-
Autonomous AI Lakehouse 連接埠變更
-
connection 名稱變更
-
連線使用公事包,而且您從一個服務名稱切換至另一個服務名稱 (以變更效能或並行)
-
大綱更新變更了事實表格的成員對應,導致同盟分割區變為不同步。請參閱聯合立方體的描述資料注意事項瞭解詳細資訊。
如果您事先知道連線詳細資訊將會變更,則最好在變更前移除同盟分割區,並在變更後重新建立同盟分割區。不過,如果連線變更並導致聯合立方體變成無效,請採取下列步驟。
刪除同盟分割區
移除同盟分割區以及與其關聯的連線 (若未使用),如移除同盟分割區中所述。
清除同盟分割區相關物件和中繼資料表格
從 Autonomous AI Lakehouse 的使用者綱要中,刪除任何 Essbase 產生的表格,以及無法與聯合分割區一起移除的其他物件。
-
以 opc 使用者身分透過 SSH 連線至 Essbase 伺服器主機。
ssh -i MPOCI_KEY.pem opc@100.xxx.xxx.xxx -
變更為 Oracle 使用者 (然後前往其本位目錄)。
sudo su - oracle -
瀏覽至應用程式目錄。
cd /u01/data/essbase/app -
使用 Essbase 應用程式和立方體名稱,識別您同盟分割區物件和中繼資料的唯一首碼。
-
取得應用程式名稱 (AppName)。名稱有大小寫之別,因此會擷取完全相符的大小寫。在此範例中,AppName = Sample。
ls Sample -
瀏覽至立方體目錄並取得立方體名稱 (DbName)。名稱有大小寫之別,因此會擷取完全相符的大小寫。在此範例中,DbName = Basic。
cd /Sample ls Basic -
使用 SQL Developer 或其他工具,以聯合立方體 (或已) 所連線之綱要的使用者身分連線至 Autonomous AI Database 。
-
在 SQL Developer 中,執行 SELECT 敘述句以取得 OTL_ID 和 OTL_STATUS 的值。
SELECT 敘述句格式為:
SELECT OTL_ID, OTL_STATUS, TRC_HOST FROM ESSAV_OTL_MTD_VERSION where APPNAME ='<AppName>';範例
以您的 AppName 取代
Sample。SELECT OTL_ID, OTL_STATUS, TRC_HOST FROM ESSAV_OTL_MTD_VERSION WHERE APPNAME='Sample';上述查詢應該傳回 OTL_ID 的值;例如,
987附註:
如果傳回任何 OTL_STATUS 為ACTIVE的列,您應該先嘗試從 TRC_HOST 實例刪除應用程式,然後再繼續下一個步驟。 -
將 Prefix 建置為:
ESSAV_<OTL_ID>_範例:
<Prefix> = ESSAV_987_
-
-
執行 SELECT 敘述句來建立與聯合立方體關聯的物件清單。以下是您將在下一個步驟中清除的物件。
SELECT 敘述句格式為:
SELECT * FROM user_OBJECTS WHERE OBJECT_NAME LIKE '<Prefix>%' ESCAPE '\';範例:
SELECT * FROM user_OBJECTS WHERE OBJECT_NAME LIKE 'ESSAV_987_%' ESCAPE '\'; -
執行預存的 PL/SQL 程序,以清除與 Prefix 相關聯的所有分析視觀表、套裝程式、階層、表格及其他物件。
範例
以您的 Prefix 取代
ESSAV_987_。SET SERVEROUTPUT ON; declare prefix_str varchar2(70) := 'ESSAV_987_'; BEGIN FOR c IN ( SELECT ANALYTIC_VIEW_NAME FROM user_analytic_views WHERE ANALYTIC_VIEW_NAME like prefix_str || '%' ) LOOP EXECUTE IMMEDIATE 'DROP ANALYTIC VIEW "' || c.ANALYTIC_VIEW_NAME || '" '; DBMS_OUTPUT.PUT_LINE('ANALYTIC VIEW ' || c.ANALYTIC_VIEW_NAME || ' dropped successfully.'); END LOOP; FOR c IN ( SELECT distinct OBJECT_NAME FROM USER_PROCEDURES WHERE OBJECT_TYPE='PACKAGE' and OBJECT_NAME like prefix_str || '%' ) LOOP EXECUTE IMMEDIATE 'DROP PACKAGE "' || c.OBJECT_NAME || '" '; DBMS_OUTPUT.PUT_LINE('PACKAGE ' || c.OBJECT_NAME || ' dropped successfully.'); END LOOP; FOR c IN ( SELECT distinct HIER_NAME FROM USER_HIERARCHIES WHERE HIER_NAME like prefix_str || '%' ) LOOP EXECUTE IMMEDIATE 'DROP HIERARCHY "' || c.HIER_NAME || '" '; DBMS_OUTPUT.PUT_LINE('HIERARCHY ' || c.HIER_NAME || ' dropped successfully.'); END LOOP; FOR c IN ( SELECT distinct DIMENSION_NAME FROM USER_ATTRIBUTE_DIM_TABLES_AE WHERE DIMENSION_NAME like prefix_str || '%' ) LOOP EXECUTE IMMEDIATE 'DROP ATTRIBUTE DIMENSION "' || c.DIMENSION_NAME || '" '; DBMS_OUTPUT.PUT_LINE('ATTRIBUTE DIMENSION ' || c.DIMENSION_NAME || ' dropped successfully.'); END LOOP; FOR c IN ( SELECT distinct VIEW_NAME FROM USER_VIEWS WHERE VIEW_NAME like prefix_str || '%' ) LOOP EXECUTE IMMEDIATE 'DROP VIEW "' || c.VIEW_NAME || '" '; DBMS_OUTPUT.PUT_LINE('VIEW ' || c.VIEW_NAME || ' dropped successfully.'); END LOOP; FOR c IN ( SELECT distinct TABLE_NAME FROM USER_TABLES WHERE TABLE_NAME like prefix_str || '%' ) LOOP EXECUTE IMMEDIATE 'DROP TABLE "' || c.TABLE_NAME || '" purge'; DBMS_OUTPUT.PUT_LINE('TABLE ' || c.TABLE_NAME || ' dropped successfully.'); END LOOP; FOR c IN ( SELECT distinct TYPE_NAME FROM USER_TYPES WHERE TYPE_NAME like prefix_str || '%' ) LOOP EXECUTE IMMEDIATE 'DROP TYPE "' || c.TYPE_NAME || '" FORCE'; DBMS_OUTPUT.PUT_LINE('TYPE ' || c.TYPE_NAME || ' dropped successfully.'); END LOOP; END; / -
刪除並更新關聯的中繼資料相關表格。
-
執行預存的 PL/SQL 程序以刪除與 OTL_ID 關聯的描述資料相關表格。
範例
以您的 OTL_ID 取代
987。SET SERVEROUTPUT ON; BEGIN FOR c IN ( SELECT distinct TABLE_NAME FROM USER_TABLES WHERE TABLE_NAME like 'ESSAV_MTD_987_%' ) LOOP EXECUTE IMMEDIATE 'DROP TABLE "' || c.TABLE_NAME || '" purge'; DBMS_OUTPUT.PUT_LINE('TABLE ' || c.TABLE_NAME || ' dropped successfully.'); END LOOP; END; / -
執行 UPDATE 敘述句,將 ESSAV_OTL_MTD_VERSION 表格設為非作用中狀態。
範例
以您的 AppName 取代
Sample。UPDATE "ESSAV_OTL_MTD_VERSION" SET "OTL_STATUS" = 'INACTIVE' where APPNAME ='Sample'; commit;
-
附註:
由於只有一個 Essbase 例項應使用 Autonomous AI Database 架構,因此在執行清除任務時,您不應指定 ESSBASE_INSTANCE_UNIQUE_ID。請參考聯合立方體的限制。重新建立連線和同盟分割區
-
重新建立與 Autonomous AI Lakehouse 的連線。這可以是全域連線 (位於 Essbase Web 介面中的主要來源圖示底下),或在專為該應用程式定義的來源中。依照連線中的指示進行。請務必測試並儲存該連線。
-
重新建立聯合分割區 (如建立聯合分割區中所述)。
-
如果您持續看到如
Essbase Error(1350012): Attempt to connect to OCI failed的連線錯誤,請檢查 https://support.oracle.com/rs?type=doc&id=2925030.1 。
備份和回復聯合立方體
同盟分割區並不會隨 Essbase 應用程式一起移轉。準備將您的同盟立方體移至另一個伺服器或移轉至另一個 Essbase 版本時,您需要刪除同盟分割區,然後在新環境中重新建立。
若要備份聯合立方結構,
-
備份應用程式時不包含資料,但包含您可能需要的所有項目 (例如,組態特性、篩選條件、變數、計算命令檔和其他使用者自建物件)。若要這麼做,請使用 LcmExport (或 Essbase Web 介面中的匯出 LCM 工作)。
-
備份事實表格。請參閱備份和還原 Autonomous Database 。
-
依照移除聯合分割區中的步驟,從立方結構刪除同盟分割區定義。
若要從備份回復聯合立方結構,
-
使用 LcmImport (或 Essbase Web 介面中的 Import LCM 工作) 重新建立應用程式。
-
必要時,請還原 Autonomous AI Lakehouse 上的事實資料表。
-
Re-create the connection to Autonomous AI Lakehouse. 建議使用新的連線名稱以避免發生錯誤。
-
重新建立同盟分割區。