联合多维数据集维护和故障排除
按照以下准则对 Essbase 联合多维数据集进行维护或故障排除。
本主题假设您已创建了联合分区,并且查看了前四个主题中详细介绍的信息。
对 Federated Cubes 进行建模和测试
设计 Essbase 联合多维数据集时,请遵循以下设计和测试准则,以分阶段方法对性能进行故障排除或监视。
-
在测试环境中开始联合多维数据集项目。
-
从具有以下特性的 Essbase ASO 或 BSO 多维数据集模型开始入手:
-
级别不太多
-
共享成员或属性不太多
-
-
创建联合分区时,将脱机操作安排在不允许对实例进行查询的时间。
-
通过下面的方法逐步断开活动 Essbase 用户会话的连接。使用 MaxL alter application
disable commands和/或disable connects(防止显示任何新用户活动),后跟 alter systemlogout session和/或kill request(如果您需要终止不需要完成的任何活动会话)。请注意, MaxL 无法终止可能在 Autonomous AI Lakehouse 中运行的任何请求。如果在应用程序中禁用命令,请记住要在创建 联合分区后重新启用命令。要终止在 Autonomous AI Lakehouse 中作为 SQL 会话运行的请求,需要执行其他步骤。请参阅在联合立方上取消长时间运行的 SQL 。
- 执行超时调整:
- 客户网络上的 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。
- 创建联合分区。
- 还原在步骤 3 中所做的超时调整。
- 使用 alter application enable commands 和/或 connects (如果以前禁用了这些项)让用户重新进入系统。
- 对于有关 federated cube 的报告,请调整 QRYGOVEXECTIME 以使其大于针对 federated partitionitions 执行查询所需的时间。请注意,QRYGOVEXECTIME 无法终止可能在 Autonomous AI Lakehouse 中运行的任何请求。
- 在完成开发环境测试和调整后,使用上述步骤 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 元数据已更改并导致联合分区变为无效,请执行以下操作:
-
按 Remove a Federated Partition 中所述,删除联合分区以及与之关联的连接(如果未另外使用该分区)。
从 Autonomous AI Lakehouse 中的用户方案,手动删除任何 Essbase 生成的表以及无法通过联合分区删除的其他对象。
-
确保在 Essbase 多维数据集中完成了大纲更改。
-
再次创建事实表。请参阅创建事实表。
-
重新创建与 Autonomous AI Lakehouse 的连接。这可以是全局连接(在 Essbase Web 界面中的主“源”图标下),也可以是在仅为应用程序定义的“源”中。按照 Create a Connection for Federated Cubes 中的说明操作。
-
重新创建联合分区,如创建联合分区中所述。
在联合多维数据集上取消长时间运行的 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 :
-
DB 管理员:在 Autonomous AI Lakehouse 中创建以下 PL/SQL 存储过程,并将 EXECUTE 权限授予 DB 用户:
注意:
将在数据库用户方案上创建存储过程。-
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; -
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; -
将上述存储过程的 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;
-
-
DB 用户:在 Autonomous AI Lakehouse 方案中,确认您有权访问 Synonyms 下的以下存储过程:
- ESS_SESSION_SET_MODULE
- ESS_SESSION(取消)
-
满足这些先决条件后,联合多维数据集上长时间运行的 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 生成的表以及无法通过联合分区删除的其他对象。
-
以 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 = 示例。
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>';示例
将
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 实例中删除应用程序,然后再继续执行下一步。 -
以以下方式构建 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 '\'; -
运行清除与 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; / -
删除并更新关联的元数据相关表。
-
运行存储的 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; / -
运行 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。请参阅联合立方限制。重新创建连接和联合分区
-
重新创建与 Autonomous AI Lakehouse 的连接。这可以是全局连接(在 Essbase Web 界面中的主“源”图标下),也可以是在仅为应用程序定义的“源”中。按照 connection 中的说明进行操作。务必测试并保存连接。
-
重新创建联合分区,如创建联合分区中所述。
-
如果仍然看到连接错误,例如
Essbase Error(1350012): Attempt to connect to OCI failed(Essbase 错误),请检查 https://support.oracle.com/rs?type=doc&id=2925030.1 。
备份和恢复联合多维数据集
联合分区不会与 Essbase 应用程序一起迁移。准备将联合多维数据集移至其他服务器或迁移至其他 Essbase 版本时,您需要删除联合分区,并在新环境中重新创建。
要备份联合多维数据集,
-
备份应用程序,不含数据,但包含可能需要的所有其他内容(例如配置属性、筛选器、变量、计算脚本和其他构件)。为此,请使用 LcmExport (或 Essbase Web 界面中的 Export LCM 作业)。
-
备份事实表。请参见 Backing Up and Restoring Autonomous Database 。
-
按照 Remove a Federated Partition 中的步骤,从多维数据集中删除联合分区定义。
要从备份还原联合多维数据集,
-
使用 LcmImport (或 Essbase Web 界面中的 Import LCM 作业)重新创建应用程序。
-
如有必要,请在 Autonomous AI Lakehouse 上恢复事实表。
-
重新创建与 Autonomous AI Lakehouse 的连接。建议使用新的连接名称,以避免出错。
-
重新创建联合分区。