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

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

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

联合分区多维数据集进行建模和测试

设计联合分区多维数据集时,如果创建所需时间太长,请遵循以下测试准则。采用分阶段方法对性能进行故障排除或监视时,这些准则会很有用。

  • 在测试环境中开始创建联合分区项目。

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

    • 级别不太多

    • 共享成员或属性不太多

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

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

  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. 如果报表基于具有联合分区Essbase 多维数据集,应将 QRYGOVEXECTIME 调整为大于对联合分区执行查询的预期时间。请注意,QRYGOVEXECTIME 无法终止可能正在自治数据仓库中运行的请求。
  8. 在完成开发环境测试和调整后,使用上述步骤 1 到 7 将联合分区添加到生产环境中。

注:

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

联合分区多维数据集的元数据防范措施

如果 Essbase 具有联合分区,编辑多维数据集大纲时需谨慎。如果您添加或重命名成员,请确保元数据更改也体现在自治数据仓库中的事实表中。

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

如果联合分区变为无效,您可能会遇到开头为以下内容的错误:Essbase Error(1040235): Remote warning from federated partition(Essbase 错误 (1040235):来自联合分区的远程警告)。

以下类型的 Essbase 大纲更改会导致联合分区变为无效:

  • 添加、重命名或删除维

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

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

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

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

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

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

    自治数据仓库中的联合分区用户方案中,手动删除无法与联合分区一起删除的 Essbase 生成的任何表和其他对象。

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

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

  4. 重新创建与自治数据仓库的连接。这可以是全局连接(在 Essbase Web 界面中的主“源”图标下),也可以是在仅为应用程序定义的“源”中。按照创建用于联合分区的连接中的说明进行操作。

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

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

如果 Essbase 用于联合分区自治数据仓库连接详细信息发生了更改,您需要删除并重新创建联合分区,以及从数据库方案中清除关联对象和元数据表。

如果在创建联合分区后发生以下任何事件,您需要删除并重新创建联合分区

  • 自治数据仓库端口更改

  • 连接名称更改

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

  • 大纲更新更改了成员到事实表映射,从而导致联合分区不再同步。有关详细信息,请参见联合分区多维数据集的元数据防范措施

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

删除联合分区

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

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

自治数据仓库中的联合分区用户方案中,删除无法与联合分区一起删除的 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. 计算应用程序名称中的字符数 (appx)。

      示例:appx = 6。

    3. 导航到多维数据集目录并获取多维数据集名称 (DbName)。该名称区分大小写,因此要注意确切的大小写。在此示例中,DbName = Basic。

      cd /Sample
      ls
      Basic
    4. 计算多维数据集名称中的字符数 (dby)。

      示例:dby = 5。

    5. Prefix 构建为:

      ESSAV_<appx><AppName>_<dby><DbName>_

      示例:

      <Prefix> = ESSAV_6Sample_5Basic_
  5. 使用 SQL Developer 或其他工具,以联合分区连接到的方案的用户身份连接到 Oracle 数据库。

  6. 运行 SELECT 语句以创建与您的联合分区应用程序关联的对象列表。这些是将在下一步中清除的对象。

    SELECT 语句格式如下:

    SELECT * FROM user_OBJECTS WHERE OBJECT_NAME like '<Prefix>%';

    示例:

    SELECT * FROM user_OBJECTS WHERE OBJECT_NAME like 'ESSAV_6Sample_5Basic_%';
  7. 运行清除与 Prefix 关联的所有分析视图、程序包、层次、表和其他对象的存储 PL/SQL 过程。

    示例

    ESSAV_6Sample_5Basic_ 替换为您的 Prefix

    SET SERVEROUTPUT ON;
    
    declare
      prefix_str varchar2(70) := 'ESSAV_6Sample_5Basic_';
    
    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 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 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 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;
    /
    
  8. 删除并更新关联的元数据相关表。首先,需要获取 ESSBASE_INSTANCE_UNIQUE_IDOTL_ID 的值。

    1. opc 用户身份通过 SSH 连接到 Essbase 服务器主机。

                              ssh -i MPOCI_KEY.pem opc@100.xxx.xxx.xxx
                           
    2. 更改为 oracle 用户(并转到其主目录)。

                              sudo su - oracle
                           
    3. 搜索 Essbase 代理进程。

                              ps -ef | grep ESSS | grep -v "grep"
                           

      以上命令应返回以 oracle 开头且后接两个进程 ID 的进程列表,例如:

      oracle   10769  19563 ...

      假定第一个进程 ID 为 <PID>(将在下一步中使用此 ID)。

    4. 使用 strings 命令捕获 ESSBASE_INSTANCE_UNIQUE_ID 的值。

      strings /proc/<PID>/environ | grep ESSBASE_INSTANCE_UNIQUE_ID

      示例:

                              strings /proc/10769/environ | grep ESSBASE_INSTANCE_UNIQUE_ID
                           

      以上命令应返回 ESSBASE_INSTANCE_UNIQUE_ID 的值,例如:

      ESSBASE_INSTANCE_UNIQUE_ID=EWRnHFlQteCEzWUhF7P3TPKunf3bYs
    5. 使用 SQL Developer 或其他工具,以联合分区连接到的方案的用户身份连接到 Oracle 数据库。

    6. 运行 SELECT 语句以获取 OTL_ID 的值。

      SELECT 语句格式如下:

      SELECT OTL_ID FROM ESSAV_OTL_MTD_VERSION where APPNAME ='<AppName>' and "JAGENT_INSTANCE_ID"='<ESSBASE_INSTANCE_UNIQUE_ID>';

      示例

      ESSAV_6Sample_5Basic 替换为您的 AppName,并将 'EWRnHFlQteCEzWUhF7P3TPKunf3bYs' 替换为您的 ESSBASE_INSTANCE_UNIQUE_ID

      SELECT OTL_ID FROM ESSAV_OTL_MTD_VERSION where APPNAME ='ESSAV_6Sample_5Basic' and "JAGENT_INSTANCE_ID"='EWRnHFlQteCEzWUhF7P3TPKunf3bYs';
    7. 以上查询应返回 OTL_ID 的值,例如:

      62
    8. 运行存储 PL/SQL 过程以删除与 OTL_ID 关联的元数据相关表。

      示例

      62 替换为您的 OTL_ID

      SET SERVEROUTPUT ON;
      BEGIN
        FOR c IN ( SELECT distinct TABLE_NAME FROM USER_TABLES WHERE TABLE_NAME like 'ESSAV_MTD_62_%' )
        LOOP
          EXECUTE IMMEDIATE 'DROP TABLE "' || c.TABLE_NAME || '" purge';
          DBMS_OUTPUT.PUT_LINE('TABLE ' || c.TABLE_NAME || ' dropped successfully.');
        END LOOP;
      END;
      /
      
    9. 运行 UPDATE 语句以将 ESSAV_OTL_MTD_VERSION 表设置为非活动状态。

      示例

      ESSAV_6Sample_5Basic 替换为您的 AppName,并将 EWRnHFlQteCEzWUhF7P3TPKunf3bYs 替换为您的 ESSBASE_INSTANCE_UNIQUE_ID

      UPDATE "ESSAV_OTL_MTD_VERSION" SET  "OTL_STATUS" = 'INACTIVE'  where APPNAME ='ESSAV_6Sample_5Basic' and "JAGENT_INSTANCE_ID"='EWRnHFlQteCEzWUhF7P3TPKunf3bYs';
      commit;

重新创建连接和联合分区

  1. 重新创建与自治数据仓库的连接。这可以是全局连接(在 Essbase Web 界面中的主“源”图标下),也可以是在仅为应用程序定义的“源”中。按照连接中的说明进行操作。务必测试并保存连接。

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

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

备份和还原联合分区应用程序

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

要备份联合分区多维数据集,请执行以下操作:

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

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

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

要从备份还原联合分区多维数据集,请执行以下操作:

  1. 使用 LcmImport:还原多维数据集文件(或在 Essbase Web 界面中使用导入 LCM 作业),重新创建应用程序。

  2. 根据需要在自治数据仓库上还原事实表。

  3. 重新创建连接(与自治数据仓库的连接)。建议使用新的连接名称,以避免出错。

  4. 重新创建联合分区