我们正在teradata中实现数据仓库,并且我们的阶段过程是使用mload实用程序将数据从源加载到teradata。我们遇到的问题是,如果由于某种原因mload在表会话上处于活动状态,则无法加载数据。然后99%我们返回并运行命令释放加载表名称。这总是有效,我们从未有任何数据丢失。
我的问题是我们可以自动化这个过程。我有大约50个表,所以我可以创建一个脚本,检查mload是否激活这些表并释放mload如果激活。在实际启动wf之前。我可以将这些脚本作为IF加载激活然后释放或通过。我无法找到如何检查mload是否在桌面上处于活动状态。
是否有任何系统表或查询可以判断mload是否在表上处于活动状态。请指教。谢谢!
答案 0 :(得分: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中重新设计您的方法,但需要考虑未来。
答案 1 :(得分: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;