聯合立方體維護與疑難排解

使用下列準則來維護或疑難排解 Essbase 同盟立方體

本主題假設您已建立同盟分割區,並已複查先前主題中詳細的資訊。

模型與測試聯合立方體

設計 Essbase 聯合立方體時,請遵循這些設計和測試準則,以針對效能進行疑難排解或監控的階段方法。

  • 在測試環境中開始聯合立方體專案。

  • 從具有下列特性的 Essbase ASO 或 BSO 立方體模型開始:

    • 沒有許多層級

    • 沒有許多共用成員或屬性

  1. 建立同盟分割區時,請在不允許對執行處理進行查詢時排定離線作業。

  2. 使用 MaxL alter 應用程式 disable commands 和 (或) disable connects (防止任何新的使用者活動) 逐步中斷現用 Essbase 使用者階段作業的連線,接著使用 alter system logout session 和 (或) kill request (如果您需要終止任何不需要完成的作用中階段作業)。請注意, MaxL 無法終止任何可能在 Autonomous AI Lakehouse 中執行的要求。如果您在應用程式中停用命令,請記得在建立 同盟分割區之後重新啟用命令。

    若要終止在 Autonomous AI Lakehouse 中以 SQL 階段作業身分執行的要求,則需要執行其他步驟。請參閱取消聯合立方體上的長時間執行 SQL

  3. 執行逾時調整:
    • 客戶網路上的 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。
  4. 建立聯合分割區
  5. 回復步驟 3 中的逾時調整。
  6. 使用 alter 應用程式啟用命令和 (或) connects (若先前停用這些命令),讓使用者回到系統上。
  7. 對於同盟立方體的報表,請調整 QRYGOVEXECTIME 大於對同盟分割區執行查詢的預期時間。請注意,QRYGOVEXECTIME 無法終止任何可能在 Autonomous AI Lakehouse 中執行的要求。
  8. 完成開發環境測試與調整後,請使用上述步驟 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 中繼資料變更並導致同盟分割區變為無效,請採取以下動作:

  1. 移除同盟分割區以及與其關聯的連線 (若未使用),如移除同盟分割區中所述。

    Autonomous AI Lakehouse 的使用者架構中,手動刪除任何 Essbase 產生的表格,以及無法與聯合分割區一起移除的其他物件。

  2. 確定 Essbase 立方體已完成大綱變更。

  3. 再次建立事實表格。請參閱建立事實表格

  4. 重新建立與 Autonomous AI Lakehouse 的連線。這可以是全域連線 (位於 Essbase Web 介面中的主要來源圖示底下),或在專為該應用程式定義的來源中。依照建立聯合立方體連線中的指示進行。

  5. 重新建立聯合分割區 (如建立聯合分割區中所述)。

取消聯合立方體上的長時間執行 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

  1. 資料庫管理員:在 Autonomous AI Lakehouse 中建立下列 PL/SQL 預存程序,並將 EXECUTE 權限授予 DB 使用者

    附註:

    預存程序是在「資料庫」使用者綱要上建立。
    1. 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;
      
    2. 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;
      
    3. 將上方預存程序的 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;
  2. 資料庫使用者:在您的 Autonomous AI Lakehouse 綱要中,確認您有權存取下列同義字下的預存程序:

    • 文章 RSS
    • 中文 _ ENGLISH
  3. 滿足這些先決條件後,長期執行 Federated cube 的 SQL 要求便可取消,與其他 Essbase 要求相同。您可以從主控台階段作業區域,在 Essbase Web 介面中取消要求。如果您使用 MaxL ,可以使用更改系統 kill request 敘述句來取消要求。如需有關階段作業終止的準則,請參閱模型與測試同盟分割區立方體

資料庫連線詳細資訊變更時該怎麼做

如果 Essbase 用於聯合立方體Autonomous AI Lakehouse 連線詳細資訊已變更,您必須刪除並重新建立聯合分割區,並從資料庫綱要清除關聯的物件和中繼資料表格。

本主題不適用於具有 Essbase 受管理資料儲存的聯合立方體

若在建立後發生下列任一事件,則需要刪除並重新建立聯合分割區

  • Autonomous AI Lakehouse 連接埠變更

  • connection 名稱變更

  • 連線使用公事包,而且您從一個服務名稱切換至另一個服務名稱 (以變更效能或並行)

  • 大綱更新變更了事實表格的成員對應,導致同盟分割區變為不同步。請參閱聯合立方體的描述資料注意事項瞭解詳細資訊。

如果您事先知道連線詳細資訊將會變更,則最好在變更前移除同盟分割區,並在變更後重新建立同盟分割區。不過,如果連線變更並導致聯合立方體變成無效,請採取下列步驟。

刪除同盟分割區

移除同盟分割區以及與其關聯的連線 (若未使用),如移除同盟分割區中所述。

清除同盟分割區相關物件和中繼資料表格

Autonomous AI Lakehouse 的使用者綱要中,刪除任何 Essbase 產生的表格,以及無法與聯合分割區一起移除的其他物件。

  1. opc 使用者身分透過 SSH 連線至 Essbase 伺服器主機。

    ssh -i MPOCI_KEY.pem opc@100.xxx.xxx.xxx
  2. 變更為 Oracle 使用者 (然後前往其本位目錄)。

    sudo su - oracle
  3. 瀏覽至應用程式目錄。

    cd /u01/data/essbase/app
  4. 使用 Essbase 應用程式和立方體名稱,識別您同盟分割區物件和中繼資料的唯一首碼。

    1. 取得應用程式名稱 (AppName)。名稱有大小寫之別,因此會擷取完全相符的大小寫。在此範例中,AppName = Sample。

      ls
      Sample
    2. 瀏覽至立方體目錄並取得立方體名稱 (DbName)。名稱有大小寫之別,因此會擷取完全相符的大小寫。在此範例中,DbName = Basic。

      cd /Sample
      ls
      Basic
    3. 使用 SQL Developer 或其他工具,以聯合立方體 (或已) 所連線之綱要的使用者身分連線至 Autonomous AI Database

    4. 在 SQL Developer 中,執行 SELECT 敘述句以取得 OTL_IDOTL_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 實例刪除應用程式,然後再繼續下一個步驟。
    5. Prefix 建置為:

      ESSAV_<OTL_ID>_

      範例:

      <Prefix> = ESSAV_987_
  5. 執行 SELECT 敘述句來建立與聯合立方體關聯的物件清單。以下是您將在下一個步驟中清除的物件。

    SELECT 敘述句格式為:

    SELECT * FROM user_OBJECTS WHERE OBJECT_NAME LIKE '<Prefix>%' ESCAPE '\';

    範例:

    SELECT * FROM user_OBJECTS WHERE OBJECT_NAME LIKE 'ESSAV_987_%' ESCAPE '\';
  6. 執行預存的 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;
    /
    
  7. 刪除並更新關聯的中繼資料相關表格。

    1. 執行預存的 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;
      /
      
    2. 執行 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。請參考聯合立方體的限制

重新建立連線和同盟分割區

  1. 重新建立與 Autonomous AI Lakehouse 的連線。這可以是全域連線 (位於 Essbase Web 介面中的主要來源圖示底下),或在專為該應用程式定義的來源中。依照連線中的指示進行。請務必測試並儲存該連線。

  2. 重新建立聯合分割區 (如建立聯合分割區中所述)。

  3. 如果您持續看到如 Essbase Error(1350012): Attempt to connect to OCI failed 的連線錯誤,請檢查 https://support.oracle.com/rs?type=doc&id=2925030.1

備份和回復聯合立方體

同盟分割區並不會隨 Essbase 應用程式一起移轉。準備將您的同盟立方體移至另一個伺服器或移轉至另一個 Essbase 版本時,您需要刪除同盟分割區,然後在新環境中重新建立。

若要備份聯合立方結構

  1. 備份應用程式時不包含資料,但包含您可能需要的所有項目 (例如,組態特性、篩選條件、變數、計算命令檔和其他使用者自建物件)。若要這麼做,請使用 LcmExport (或 Essbase Web 介面中的匯出 LCM 工作)。

  2. 備份事實表格。請參閱備份和還原 Autonomous Database

  3. 依照移除聯合分割區中的步驟,從立方結構刪除同盟分割區定義。

若要從備份回復聯合立方結構

  1. 使用 LcmImport (或 Essbase Web 介面中的 Import LCM 工作) 重新建立應用程式。

  2. 必要時,請還原 Autonomous AI Lakehouse 上的事實資料表。

  3. Re-create the connection to Autonomous AI Lakehouse. 建議使用新的連線名稱以避免發生錯誤。

  4. 重新建立同盟分割區