联合多维数据集维护和故障排除

按照以下准则对 Essbase 联合多维数据集进行维护或故障排除。

本主题假设您已创建了联合分区,并且查看了前四个主题中详细介绍的信息。

Federated Cubes 进行建模和测试

设计 Essbase 联合多维数据集时,请遵循以下设计和测试准则,以分阶段方法对性能进行故障排除或监视。

  • 在测试环境中开始联合多维数据集项目。

  • 从具有以下特性的 Essbase ASO 或 BSO 多维数据集模型开始入手:

    • 级别不太多

    • 共享成员或属性不太多

  1. 创建联合分区时,将脱机操作安排在不允许对实例进行查询的时间。

  2. 通过下面的方法逐步断开活动 Essbase 用户会话的连接。使用 MaxL alter application disable commands 和/或 disable connects(防止显示任何新用户活动),后跟 alter system logout session 和/或 kill request(如果您需要终止不需要完成的任何活动会话)。请注意, MaxL 无法终止可能在 Autonomous AI Lakehouse 中运行的任何请求。如果在应用程序中禁用命令,请记住要在创建 联合分区后重新启用命令。

    要终止在 Autonomous AI Lakehouse 中作为 SQL 会话运行的请求,需要执行其他步骤。请参阅在联合立方上取消长时间运行的 SQL

  3. 执行超时调整:
    • 客户网络上的 HTTPS 代理 — 调整客户网络超时
    • 负载平衡器 — 将 LoadBalance 超时增加到 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 application enable commands 和/或 connects (如果以前禁用了这些项)让用户重新进入系统。
  7. 对于有关 federated cube 的报告,请调整 QRYGOVEXECTIME 以使其大于针对 federated partitionitions 执行查询所需的时间。请注意,QRYGOVEXECTIME 无法终止可能在 Autonomous AI Lakehouse 中运行的任何请求。
  8. 在完成开发环境测试和调整后,使用上述步骤 1 到 7 将联合部署到生产环境中。

注意:

如果在创建联合分区时看到“无法保存大纲”错误,请等待会话完成,然后刷新浏览器。如果已创建联合分区,则在 SQL Developer 中对其进行验证。如果在 SQL Developer 中进行了验证,则联合多维数据集可以使用。否则,需要修复模型,并需要按上文步骤 3 中所述调整超时。

联合立方的元数据预防措施

编辑非 Essbase 管理的联合多维数据集的大纲时,请务必小心。如果添加或重命名成员,请确保元数据更改也表示在 Autonomous AI Lakehouse 的事实表中。

此主题不适用于具有 Essbase 托管数据存储的联合多维数据集

如果 Essbase 大纲与 Autonomous AI Lakehouse 中的事实表不同步,则 federated cube 将变为无效或无法正常工作。要解决此问题,需要删除联合分区,对大纲和事实表进行更改,然后重新创建联合分区

如果联合多维数据集变为无效,您可能会遇到以 Essbase Error(1040235): Remote warning from federated partition 开头的错误。

以下类型的 Essbase 大纲更改将导致(非 Essbase 管理的)联合多维数据集无效:

  • 添加、重命名或删除维

  • 在透视维中添加、重命名或删除存储成员

  • 将成员从存储成员更改为动态成员

对于上文未指出的其他类型的 Essbase 大纲更改(例如,添加或重命名非透视维成员),应对事实表中的受影响数据行进行对应更改。否则,联合多维数据集可能无法正常工作。

如果您提前知道 Essbase 大纲元数据将更改,最好先删除联合分区,更改大纲,更新事实表,然后重新创建联合分区

但是,如果 Essbase 元数据已更改并导致联合分区变为无效,请执行以下操作:

  1. Remove a Federated Partition 中所述,删除联合分区以及与之关联的连接(如果未另外使用该分区)。

    Autonomous AI Lakehouse 中的用户方案,手动删除任何 Essbase 生成的表以及无法通过联合分区删除的其他对象。

  2. 确保在 Essbase 多维数据集中完成了大纲更改。

  3. 再次创建事实表。请参阅创建事实表

  4. 重新创建与 Autonomous AI Lakehouse 的连接。这可以是全局连接(在 Essbase Web 界面中的主“源”图标下),也可以是在仅为应用程序定义的“源”中。按照 Create a Connection for Federated Cubes 中的说明操作。

  5. 重新创建联合分区,如创建联合分区中所述。

联合多维数据集上取消长时间运行的 SQL

您可以取消在 Essbase 联合多维数据集上运行的 SQL 会话。如果计算用时过长,或者联合多维数据集需要备份或恢复,则可能需要取消 SQL。

如果 Essbase 计算、数据加载或在联合多维数据集上运行的聚合生成长时间运行的 SQL 语句,则可以取消这些会话,即使它们在 Autonomous AI Lakehouse 上运行也是如此。

在通过 Essbase 取消 SQL 会话之前,必须完成一个简短的步骤工作流,才能在 Essbase 中启用 SQL Session Governor

准备步骤中涉及具有以下类型访问权限的用户。

用户类型 工作流中的角色
数据库管理员

了解 Autonomous AI Lakehouse 的管理员方案名称和密码。可以在 Autonomous AI Lakehouse 上创建存储的 PL/SQL 过程,并向其他用户授予权限。

数据库用户

也称为联合分区用户

了解 Autonomous AI Lakehouse 方案名称和密码,即用于创建与 Oracle Database 的 Essbase 连接的相同方案和密码(在创建联合分区之前是必需的先决条件)。

Essbase 应用程序管理器

用于联合多维数据集Essbase 应用程序的管理员/所有者。

必须完成以下步骤工作流才能启用 SQL Session Governor

  1. DB 管理员:在 Autonomous AI Lakehouse 中创建以下 PL/SQL 存储过程,并将 EXECUTE 权限授予 DB 用户

    注意:

    将在数据库用户方案上创建存储过程。
    1. ESS_SESSION_SET_MODULE(VARCHAR2 中的 jagent_id,VARCHAR2 中的 app_name,VARCHAR2 中的 db_name,VARCHAR2 中的 req_id

      使用以下语句创建过程:

      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(VARCHAR2 中的 jagent_id、VARCHAR2 中的 app_name、VARCHAR2 中的 db_name、VARCHAR2 中的 req_id

      使用以下语句创建过程:

      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. DB 用户:在 Autonomous AI Lakehouse 方案中,确认您有权访问 Synonyms 下的以下存储过程:

    • ESS_SESSION_SET_MODULE
    • ESS_SESSION(取消)
  3. 满足这些先决条件后,联合多维数据集上长时间运行的 SQL 请求可以像其他 Essbase 请求一样被取消。可以在 Essbase Web 界面中从控制台会话区域取消请求。如果使用的是 MaxL ,则可以使用语句 alter system kill request 取消请求。有关会话终止的准则,请查看 Model and Test Federated Partition Cubes

数据库连接详细信息更改时怎么办

如果 Essbase 用于联合多维数据集Autonomous AI Lakehouse 连接详细信息已更改,则您需要删除并重新创建联合分区,并从数据库模式中清除关联的对象和元数据表。

此主题不适用于具有 Essbase 托管数据存储的联合多维数据集

You will need to drop and re-create the federated partition if any of the following events occur after it was created:

  • Autonomous AI Lakehouse 端口变更

  • connection 名称更改

  • 连接使用 wallet,并且您从一个服务名切换到另一个服务名称(以进行性能或并发更改)

  • 大纲更新更改了成员到事实表映射,从而导致联合分区不再同步。有关详细信息,请参见 Metadata Precautions for Federated Cubes

如果您提前知道连接详细信息将更改,最好在更改之前删除联合分区,并在以后再次创建联合分区。但是,如果连接发生更改并导致联合多维数据集变为无效,请执行以下步骤。

删除联合分区

Remove a Federated Partition 中所述,删除联合分区以及与之关联的连接(如果未另外使用该分区)。

清除联合分区相关对象和元数据表

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 = 示例。

      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>';

      示例

      Sample 替换为 AppName

      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. 运行清除与 Prefix 关联的所有分析视图、程序包、层次、表和其他对象的存储 PL/SQL 过程。

    示例

    ESSAV_987_ 替换为 Prefix

    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 关联的元数据相关表。

      示例

      987 替换为 OTL_ID

      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 表设置为非活动状态。

      示例

      Sample 替换为 AppName

      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 界面中的主“源”图标下),也可以是在仅为应用程序定义的“源”中。按照 connection 中的说明进行操作。务必测试并保存连接。

  2. 重新创建联合分区,如创建联合分区中所述。

  3. 如果仍然看到连接错误,例如 Essbase Error(1350012): Attempt to connect to OCI failed(Essbase 错误),请检查 https://support.oracle.com/rs?type=doc&id=2925030.1

备份和恢复联合多维数据集

联合分区不会与 Essbase 应用程序一起迁移。准备将联合多维数据集移至其他服务器或迁移至其他 Essbase 版本时,您需要删除联合分区,并在新环境中重新创建。

要备份联合多维数据集

  1. 备份应用程序,不含数据,但包含可能需要的所有其他内容(例如配置属性、筛选器、变量、计算脚本和其他构件)。为此,请使用 LcmExport (或 Essbase Web 界面中的 Export LCM 作业)。

  2. 备份事实表。请参见 Backing Up and Restoring Autonomous Database

  3. 按照 Remove a Federated Partition 中的步骤,从多维数据集中删除联合分区定义。

要从备份还原联合多维数据集

  1. 使用 LcmImport (或 Essbase Web 界面中的 Import LCM 作业)重新创建应用程序。

  2. 如有必要,请在 Autonomous AI Lakehouse 上恢复事实表。

  3. 重新创建与 Autonomous AI Lakehouse 的连接。建议使用新的连接名称,以避免出错。

  4. 重新创建联合分区