0

我们正在 teradata 中实施数据仓库,并使用 mload 实用程序将数据从源加载到 teradata。我们遇到的问题是,如果由于某种原因 mload 在表会话上处于活动状态,则无法加载数据。然后 99% 我们返回并运行命令释放加载表名。这总是有效的,我们从来没有任何数据丢失。

我的问题是我们可以自动化这个过程吗?我有大约 50 个表,所以我可以创建一个脚本来检查这些表的 mload 是否处于活动状态,如果处于活动状态则释放 mload。在实际启动 wf 之前。我可以将这些脚本作为 IF 加载激活然后释放或通过。我无法找到如何检查 mload 在桌子上是否处于活动状态。

是否有任何系统表或查询可以判断 mload 是否在表上处于活动状态。请指教。谢谢!

4

2 回答 2

0

您可以使用 .LABLES 和 ACTIVITYCOUNT 来查找表是否被锁定或帮助表是否存在。在 Mload 脚本的末尾/开头添加它。

ACTIVITYCOUNT返回上一个 SQL 查询选择/影响的记录数。

LABEL - 为一组 SQL 命令分配标签。

-- DECLARE RULES OF THE LABES
SELECT TOP 1 * FROM <tablename>;
.IF ACTIVITYCOUNT <> 0 THEN .GOTO RELEASE_MLOAD;

SELECT TOP 1 * FROM UV_<tablename>;
.IF ACTIVITYCOUNT >= 0 THEN .GOTO DROP_UV;

SELECT TOP 1 * FROM ET_<tablename>;
.IF ACTIVITYCOUNT >= 0 THEN .GOTO DROP_ET;

SELECT TOP 1 * FROM WT_<tablename>;
.IF ACTIVITYCOUNT >= 0 THEN .GOTO DROP_WT;

SELECT TOP 1 * FROM LOG_<tablename>;
.IF ACTIVITYCOUNT >= 0 THEN .GOTO DROP_LOG;

-- DECLARE THE LABELS
.LABEL RELEASE_MLOAD
RELEASE MLOAD <tablename>;
.IF ERRORCODE <> 0 THEN .EXIT ERRORCODE;

.LABEL DROP_UV
DROP TABLE UV_<tablename>;
.IF ERRORCODE <> 0 THEN .EXIT ERRORCODE;

.LABEL DROP_ET
DROP TABLE ET_<tablename>;
.IF ERRORCODE <> 0 THEN .EXIT ERRORCODE;

.LABEL DROP_WT
DROP TABLE WT_<tablename>;
.IF ERRORCODE <> 0 THEN .EXIT ERRORCODE;

.LABEL DROP_LOG
DROP TABLE LOG_<tablename>;
.IF ERRORCODE <> 0 THEN .EXIT ERRORCODE;
于 2020-01-14T08:37:06.370 回答
0

如果您访问该表的尝试遇到错误号2652, Operation not allowed: %DBID.%TVMID is being Loaded,这表示该表正在加载,或者之前加载该表的尝试失败并且尚未解决。

通过仔细规划,您可能能够利用获取和应用程序错误表的存在来确定是否存在 MultiLoad 锁或之前的 MultiLoad 是否以非零返回码完成了作业。采集错误表在BEGIN MLOAD命令 ( et_tname1) 中指定为第三个表,用于捕获采集阶段发生的错误。应用程序表在BEGIN MLOAD命令 ( uv_tname1) 中指定为第四个表,用于捕获应用程序阶段遇到的错误。

如果UV表存在但不包含任何记录,则多加载可能在获取阶段失败。您可以通过检查“ET”表中是否存在行来确认这一点。在这种状态下,可以释放 MultiLoad 锁并删除错误表。这将允许访问表和/或重新启动加载步骤。

如果“UV”表存在且包含行,则 MultiLoad 可能在应用阶段失败。在这种状态下,不应释放 MultiLoad 锁,也不应删除错误表。您应该确定失败的原因并从失败点重新启动失败的作业。如果您释放 MultiLoad 锁和/或删除错误表,您最终可能会得到一个处于不一致状态的表。在这种状态下,可能必须从源文件或备份中删除、重新创建和重新加载表。

通常,除非表一开始是空的,否则最好解决失败的加载作业。

您是否考虑过在 Informatica 工作流程中使用 ANSI MERGE 语句来避免这个问题?您获得了 MultiLoad 实用程序的一些效率,但您的可恢复性不会像该实用程序那样使表处于锁定状态。它可能需要重新设计您在 ETL 中的方法,但需要考虑一些事情。

于 2015-12-01T20:38:59.470 回答