按照以下准则对具有联合分区的 Essbase 多维数据集进行维护或故障排除。
本主题假设您已创建联合分区,并且查看了前几个主题中详细介绍的信息。
设计联合分区多维数据集时,如果创建所需时间太长,请遵循以下测试准则。采用分阶段方法对性能进行故障排除或监视时,这些准则会很有用。
在测试环境中开始创建联合分区项目。
从具有以下特性的多维数据集模型开始入手:
级别不太多
共享成员或属性不太多
创建联合分区时,将脱机操作安排在不允许对实例进行查询的时间。
通过以下方法逐步断开活动 Essbase 用户会话的连接:使用 MaxL alter application disable commands
和/或 disable connects
(防止出现任何新用户活动),后接 alter system logout session
和/或 kill request
(如果您需要终止不需要完成的活动会话)。请注意,MaxL 无法终止可能正在自治数据仓库中运行的请求。如果在应用程序中禁用命令,请记住要在创建联合分区后重新启用命令。
/etc/httpd/conf.d/00_base.conf:ProxyTimeout 1260
/etc/httpd/conf.d/00_base.conf:Timeout 1260
olap.server.netRetryCount
设置为 9000。注:
如果在创建联合分区时看到“无法保存大纲”错误,请等待会话完成,然后刷新浏览器。如果已创建联合分区,则在 SQL Developer 中对其进行验证。如果在 SQL Developer 中通过了验证,则联合分区可以使用。如果在 SQL Developer 中未通过验证,则需要修复模型,并需要按上文步骤 3 中所述调整超时。如果 Essbase 具有联合分区,编辑多维数据集大纲时需谨慎。如果您添加或重命名成员,请确保元数据更改也体现在自治数据仓库中的事实表中。
如果 Essbase 大纲与自治数据仓库中的事实表不再同步,联合分区将变为无效或无法正常工作。要解决此问题,需要删除联合分区,对大纲和事实表进行更改,然后重新创建联合分区。
如果联合分区变为无效,您可能会遇到开头为以下内容的错误:Essbase Error(1040235): Remote warning from federated partition
(Essbase 错误 (1040235):来自联合分区的远程警告)。
以下类型的 Essbase 大纲更改会导致联合分区变为无效:
添加、重命名或删除维
在透视维中添加、重命名或删除存储成员
将成员从存储成员更改为动态成员
对于上文未指出的其他类型的 Essbase 大纲更改(例如,添加或重命名非透视维成员),应对事实表中的受影响数据行进行对应更改。否则,联合分区可能无法正常工作。
如果您提前知道 Essbase 大纲元数据将更改,最好先删除联合分区,更改大纲,更新事实表,然后重新创建联合分区。
但是,如果 Essbase 元数据已更改并导致联合分区变为无效,请执行以下操作:
按删除联合分区中所述,删除联合分区以及与之关联的连接(如果未另外使用)。
从自治数据仓库中的联合分区用户方案中,手动删除无法与联合分区一起删除的 Essbase 生成的任何表和其他对象。
确保在 Essbase 多维数据集中完成了大纲更改。
再次创建事实表。请参见创建事实表。
重新创建与自治数据仓库的连接。这可以是全局连接(在 Essbase Web 界面中的主“源”图标下),也可以是在仅为应用程序定义的“源”中。按照创建用于联合分区的连接中的说明进行操作。
按创建联合分区中所述,重新创建联合分区。
如果 Essbase 用于联合分区的自治数据仓库连接详细信息发生了更改,您需要删除并重新创建联合分区,以及从数据库方案中清除关联对象和元数据表。
如果在创建联合分区后发生以下任何事件,您需要删除并重新创建联合分区:
自治数据仓库端口更改
连接名称更改
连接使用 wallet,并且您从一个服务名称切换到另一个服务名称(以进行性能或并发更改)
大纲更新更改了成员到事实表映射,从而导致联合分区不再同步。有关详细信息,请参见联合分区多维数据集的元数据防范措施。
如果您提前知道连接详细信息将更改,最好在更改之前删除联合分区,并在以后再次创建联合分区。但是,如果连接已更改并导致联合分区变为无效,请执行以下步骤。
删除联合分区
按删除联合分区中所述,删除联合分区以及与之关联的连接(如果未另外使用)。
清除联合分区相关对象和元数据表
从自治数据仓库中的联合分区用户方案中,删除无法与联合分区一起删除的 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
计算应用程序名称中的字符数 (appx)。
示例:appx = 6。
导航到多维数据集目录并获取多维数据集名称 (DbName)。该名称区分大小写,因此要注意确切的大小写。在此示例中,DbName = Basic。
cd /Sample
ls
Basic
计算多维数据集名称中的字符数 (dby)。
示例:dby = 5。
将 Prefix 构建为:
ESSAV_<appx><AppName>_<dby><DbName>_
示例:
<Prefix> = ESSAV_6Sample_5Basic_
使用 SQL Developer 或其他工具,以联合分区连接到的方案的用户身份连接到 Oracle 数据库。
运行 SELECT 语句以创建与您的联合分区应用程序关联的对象列表。这些是将在下一步中清除的对象。
SELECT 语句格式如下:
SELECT * FROM user_OBJECTS WHERE OBJECT_NAME like '<Prefix>%';
示例:
SELECT * FROM user_OBJECTS WHERE OBJECT_NAME like 'ESSAV_6Sample_5Basic_%';
运行清除与 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; /
删除并更新关联的元数据相关表。首先,需要获取 ESSBASE_INSTANCE_UNIQUE_ID 和 OTL_ID 的值。
以 opc 用户身份通过 SSH 连接到 Essbase 服务器主机。
ssh -i MPOCI_KEY.pem opc@100.xxx.xxx.xxx
更改为 oracle 用户(并转到其主目录)。
sudo su - oracle
搜索 Essbase 代理进程。
ps -ef | grep ESSS | grep -v "grep"
以上命令应返回以 oracle
开头且后接两个进程 ID 的进程列表,例如:
oracle 10769 19563 ...
假定第一个进程 ID 为 <PID>
(将在下一步中使用此 ID)。
使用 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
使用 SQL Developer 或其他工具,以联合分区连接到的方案的用户身份连接到 Oracle 数据库。
运行 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';
以上查询应返回 OTL_ID 的值,例如:
62
运行存储 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; /
运行 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;
重新创建连接和联合分区
重新创建与自治数据仓库的连接。这可以是全局连接(在 Essbase Web 界面中的主“源”图标下),也可以是在仅为应用程序定义的“源”中。按照连接中的说明进行操作。务必测试并保存连接。
按创建联合分区中所述,重新创建联合分区。
如果仍然看到连接错误,例如 Essbase Error(1350012): Attempt to connect to OCI failed
(Essbase 错误 (1350012):尝试连接到 OCI 时失败),请查看 https://support.oracle.com/rs?type=doc&id=2925030.1。
联合分区不会与 Essbase 应用程序一起迁移。准备将应用程序和多维数据集移至其他服务器或者迁移至其他 Essbase 版本时,需要删除联合分区,并在新环境中重新创建联合分区。
要备份联合分区多维数据集,请执行以下操作:
备份应用程序,不含数据,但包含可能需要的所有其他内容(例如配置属性、筛选器、变量、计算脚本和其他构件)。要执行此操作,请使用 LCM 导出(或在 Essbase Web 界面中使用导出 LCM 作业)。
备份事实表。请参见 "Backing Up and Restoring Autonomous Database"。
按照删除联合分区中的步骤操作,从多维数据集中删除联合分区定义。
要从备份还原联合分区多维数据集,请执行以下操作:
使用 LcmImport:还原多维数据集文件(或在 Essbase Web 界面中使用导入 LCM 作业),重新创建应用程序。
根据需要在自治数据仓库上还原事实表。
重新创建连接(与自治数据仓库的连接)。建议使用新的连接名称,以避免出错。
重新创建联合分区。