แแแแ แ แแงแแแแแก แกแแแชแแแแแแแแฃแ แแแกแขแ แฃแแแแขแแแก แแแแแชแแแแ แแแแฆแแแแก, แขแ แแแกแคแแ แแแชแแแกแ แแ แ แแแแชแแฃแ แแแแแชแแแแ แแแแแแจแ แฉแแขแแแ แแแแก แแ แแชแแแฃแ แแแแก แจแแกแแฅแแแแแแ. แกแแแฃแจแแ แแแกแขแ แฃแแแแขแแแแก แแ แแชแแกแ แแฆแ แแชแฎแฃแแแ, แจแแชแแแแแแ แคแแฅแกแแ แแแแ.
แจแแชแแแแแก แจแแแแฎแแแแแจแ แแฃแ แแแแ แจแแแชแแแก แแแคแแ แแแชแแแก แแแแก แจแแกแแฎแแ, แ แแ แแแกแขแ แฃแแแแขแแ แแแ แจแแแกแ แฃแแ แแแแแแแแ แแ แ แแแแแ แแแแฃแแแแ (แฎแจแแ แแ java) แกแแ แแแฉแแ แแ. แแแแ แกแขแ แแฅแแแแแจแ แจแแแแซแแแแ แแแแแแ แแแแแชแแแแ แแแแแก แจแแชแแแแ, แแแแแแแแแ, แชแฎแ แแแแก แฃแแแแแแฃแ แ แแแกแแฆแแแแก แแแ แฆแแแแ.
แแแกแฃแฎแแก แแแกแแชแแแแ, แแฃ แ แ แ แแแก แแกแ แฃแแแแก ETL แจแแชแแแแแก แจแแกแแฎแแ แแแคแแ แแแชแแ, แแ แแแแแฎแแ แแกแฎแ แงแแแแ แแ แแแแแแ, แ แแแแแแช แฌแแ แแแแจแแ แแแแ แแ แ แฌแแแก แแแแแแแแแแแจแ แกแแแแแแ แแแ แกแแชแแแจแ.
แแแแแชแแแแ แแแแแก แจแแชแแแแแแก แแแแชแแแก แแ แแกแแแแแ แแกแ แกแแแ แชแ, แแแแแ แแฃแแ แแแแจแแ แ, แกแแกแแแก แแแแแแแแ แแ แ.แจ.
แแแแแแฃแ แ แจแแชแแแแแแ แแแแชแแแก แแแแแแแก แแแแแแจแแแแก แแแ แฆแแแแแก, แแ แแกแฌแแ แแแแแฅแขแแแก, แแแแแฅแขแแแแ แฌแแแแแแก แแแแแแแแแแก แแ แ.แจ.
แแแแแแแแแ แจแแแซแแแแ แแ แแแแฌแงแแก แแ แแฃแแแ, แจแแแซแแแแ แแแแงแแแแก แแ แ.แจ.
แแแ แขแแแ แจแแชแแแแแแแก แแแแแกแฌแแ แแแแก แแแแ แแ แ แแ แกแญแแ แแแแ. แแแ แ ETL-แก แจแแฃแซแแแ แแแแแฃแแแแแแแแ แแแฃแแแแแแแแก แแแ แฃแแแขแแกแแแแก.
แแแแแแแฅแกแฃแ แ แจแแชแแแแแแ แกแแญแแ แแแแก แแแแแชแแแแแแแ แแฃแจแแแแแก แแ แแชแแแฃแ แแแแก แแฆแแแฉแแแแก แแ แขแแกแขแแ แแแแก, แแแแแชแแแแ แฌแงแแ แแแแแก แจแแกแฌแแแแแก. แฎแจแแ แแ แแฌแแแแก แชแแแแแแแแแแก แขแแกแขแแ แแแแกแ แแ แแแแแแแแแแก แแฃแชแแแแแแแแแก.
แแกแ แ แแ, แงแแแแ แแ แแแแแแแก แแแฎแแแแ แ แแแแแแจแแ แแแฃแแแ แแแแแชแแแแ แแแแแกแแแ. แงแแแแ แจแแชแแแแแก 48% แแแ แขแแแ แจแแชแแแแแ.
แงแแแแ แแ แแแแแแแก แแแกแแแแแ แแแแแแจแแ แแแฃแแแ แจแแแแฎแแแก แแแแแแแก แแ แแแแแแแก แจแแชแแแแกแแแ, แแ แจแแชแแแแแแแก แแแฎแแแแ แแ แแแขแ แ แแฃแแแ.
แแ แงแแแแ แแ แแแแแแแก แแแแแฎแแแแ แแแแแแแ แแแแแแจแแ แแแฃแแแ แแแแแแแแแก แแแแ แแแแแ, แ แแแแแแ 18% แแ แแก แแแ แขแแแ แจแแชแแแแแแ.
แแแแแแแ, แงแแแแ แจแแชแแแแแก 22% แแแแแแแฅแกแฃแ แแ แแ แแแแ แแแแแกแฌแแ แแแ แงแแแแแแ แแแ แงแฃแ แแแฆแแแแก แแ แแ แแก แแแแแฎแแแก. แแกแแแ แแแแฎแแแแแแ แแแแ แแจแ แแ แแฎแแ แฎแแแแ. แแแจแแ แ แแชแ แแแ แขแแแ แจแแชแแแแแแ แแแแฅแแแก แงแแแแแแฆแ แฎแแแแ.
แแจแแแ แแ, แ แแ ETL แแ แแชแแกแแแแก แแแแแขแแ แแแแ แแคแแฅแขแฃแ แ แแฅแแแแ แแแจแแ, แ แแแแกแแช แจแแชแแแแแก แแแแแแแแแแแ แแแแ แแฅแแแแ แแแแแแแแฃแแ แแฃแ แแแแจแ แ แแช แจแแแซแแแแ แแฃแกแขแแ แแ แแแแแแแแฃแ แ แแ แแ แกแแญแแ แ แแ แแแแแแแก แฌแงแแ แแก แแแกแแซแแแแแ.
แแคแแฅแขแฃแ แ แแแแแขแแ แแแแ
แ แแกแ แแแฎแแ แแแแแแแ ETL แแแแแขแแ แแแแแก แแ แแชแแกแจแ?
แแแฌแงแแแ - แ แแแแกแแช แแแ แแแแฌแงแ แแฃแจแแแแ,
แฌแงแแ แ - แแแแแชแแแแ แฌแงแแ แ,
แคแแแ - แ แ แแแแแก แกแแชแแแ แแขแแแ แแแแ,
ETL Job Name - แแขแแแ แแแแก แแ แแชแแแฃแ แ, แ แแแแแแช แจแแแแแแ แแ แแแแแ แแชแแ แ แแแแแฏแแกแแแ,
แแแแแฏแแก แแแแแ แ - แจแแกแ แฃแแแแฃแแ แแแแแฏแแก แ แแแแแแแแ,
แแแแแ แแแแแฃแแ แ แแแแแ - แ แแแแแแ แแแแแชแแแแ แฃแแแ แแแแฃแจแแแแแฃแแ,
แฎแแแแ แซแแแแแแ แฌแแแ - แ แแแแแแ แฎแแแ แกแญแแ แแแแ,
แกแขแแขแฃแกแ - แงแแแแแคแแ แ แแแ แแแ แแ แแก แแฃ แแ แ: OK, ERROR, RUNNING, HANGS
แจแแขแงแแแแแแแ - แแแแ แฌแแ แแแขแแแฃแแ แจแแขแงแแแแแแแ แแ แจแแชแแแแแก แแฆแฌแแ แ.
แฉแแแแฌแแ แแแแก แกแขแแขแฃแกแแแแ แแแแแแแแแแ แ, แจแแแแซแแแแ แแแแแแแแแ แแ.แฌแแ แแแ. แฌแแ แแแ แกแฎแแ แฌแแแ แแแก. แแฃ แจแแชแแแแแแ แแ แแ แแก, แแแจแแ แฌแแ แแแ แแ แแ แแก แกแแญแแ แ.
แแแ แแแแ, แจแแชแแแแแก แแแจแแแแแก แจแแแแฎแแแแแจแ, แแแแคแแแ แแ แแก แแแแแแแแฃแแ แจแแแแฎแแแแแก แแแแแแ.
แแแแฏแแ แฎแแแแ, แ แแ แแแแแ แแแแแขแแ แแแแแก แแแกแขแ แฃแแแแขแ แแ แแฃแจแแแแก. แแ แจแแแแฎแแแแแจแ แจแแกแแซแแแแแแแ แฎแแแแก (แฎแแแแก) แแแแแซแแฎแแแ แแแ แแแแแ แแแแแชแแแแ แแแแแจแ, แ แแแแแก แกแแคแฃแซแแแแแแช แแแแแฃแแแ แแแแแ แแจแ.
ETL แแแแแขแแ แแแแแก แชแฎแ แแแ
ETL แแ แแชแแกแแแแก แแแแแขแแ แแแแแก แแแแกแแฎแแ แชแแแแแแแแ แกแแแแแ แแกแแ แแ แแ แชแฎแ แแแ แแ แแ แแ แฎแแแ.
แแแแกแแแแแก แจแแแแซแแแแ แแแแ แฃแแแแ
DDL แแแแแแแแ
CREATE TABLE UTL_JOB_STATUS (
/* Table for logging of job execution log. Important that the job has the steps ETL_START and ETL_END or ETL_ERROR */
UTL_JOB_STATUS_ID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
SID INTEGER NOT NULL DEFAULT -1, /* Session Identificator. Unique for every Run of job */
LOG_DT INTEGER NOT NULL DEFAULT 0, /* Date time */
LOG_D INTEGER NOT NULL DEFAULT 0, /* Date */
JOB_NAME TEXT NOT NULL DEFAULT 'N/A', /* Job name like JOB_STG2DM_GEO */
STEP_NAME TEXT NOT NULL DEFAULT 'N/A', /* ETL_START, ... , ETL_END/ETL_ERROR */
STEP_DESCR TEXT, /* Description of task or error message */
UNIQUE (SID, JOB_NAME, STEP_NAME)
);
INSERT INTO UTL_JOB_STATUS (UTL_JOB_STATUS_ID) VALUES (-1);
แแแฎแแ/แแแฎแกแแแแแ DDL
CREATE VIEW IF NOT EXISTS UTL_JOB_STATUS_V
AS /* Content: Package Execution Log for last 3 Months. */
WITH SRC AS (
SELECT LOG_D,
LOG_DT,
UTL_JOB_STATUS_ID,
SID,
CASE WHEN INSTR(JOB_NAME, 'FTP') THEN 'TRANSFER' /* file transfer */
WHEN INSTR(JOB_NAME, 'STG') THEN 'STAGE' /* stage */
WHEN INSTR(JOB_NAME, 'CLS') THEN 'CLEANSING' /* cleansing */
WHEN INSTR(JOB_NAME, 'DIM') THEN 'DIMENSION' /* dimension */
WHEN INSTR(JOB_NAME, 'FCT') THEN 'FACT' /* fact */
WHEN INSTR(JOB_NAME, 'ETL') THEN 'STAGE-MART' /* data mart */
WHEN INSTR(JOB_NAME, 'RPT') THEN 'REPORT' /* report */
ELSE 'N/A' END AS LAYER,
CASE WHEN INSTR(JOB_NAME, 'ACCESS') THEN 'ACCESS LOG' /* source */
WHEN INSTR(JOB_NAME, 'MASTER') THEN 'MASTER DATA' /* source */
WHEN INSTR(JOB_NAME, 'AD-HOC') THEN 'AD-HOC' /* source */
ELSE 'N/A' END AS SOURCE,
JOB_NAME,
STEP_NAME,
CASE WHEN STEP_NAME='ETL_START' THEN 1 ELSE 0 END AS START_FLAG,
CASE WHEN STEP_NAME='ETL_END' THEN 1 ELSE 0 END AS END_FLAG,
CASE WHEN STEP_NAME='ETL_ERROR' THEN 1 ELSE 0 END AS ERROR_FLAG,
STEP_NAME || ' : ' || STEP_DESCR AS STEP_LOG,
SUBSTR( SUBSTR(STEP_DESCR, INSTR(STEP_DESCR, '***')+4), 1, INSTR(SUBSTR(STEP_DESCR, INSTR(STEP_DESCR, '***')+4), '***')-2 ) AS AFFECTED_ROWS
FROM UTL_JOB_STATUS
WHERE datetime(LOG_D, 'unixepoch') >= date('now', 'start of month', '-3 month')
)
SELECT JB.SID,
JB.MIN_LOG_DT AS START_DT,
strftime('%d.%m.%Y %H:%M', datetime(JB.MIN_LOG_DT, 'unixepoch')) AS LOG_DT,
JB.SOURCE,
JB.LAYER,
JB.JOB_NAME,
CASE
WHEN JB.ERROR_FLAG = 1 THEN 'ERROR'
WHEN JB.ERROR_FLAG = 0 AND JB.END_FLAG = 0 AND strftime('%s','now') - JB.MIN_LOG_DT > 0.5*60*60 THEN 'HANGS' /* half an hour */
WHEN JB.ERROR_FLAG = 0 AND JB.END_FLAG = 0 THEN 'RUNNING'
ELSE 'OK'
END AS STATUS,
ERR.STEP_LOG AS STEP_LOG,
JB.CNT AS STEP_CNT,
JB.AFFECTED_ROWS AS AFFECTED_ROWS,
strftime('%d.%m.%Y %H:%M', datetime(JB.MIN_LOG_DT, 'unixepoch')) AS JOB_START_DT,
strftime('%d.%m.%Y %H:%M', datetime(JB.MAX_LOG_DT, 'unixepoch')) AS JOB_END_DT,
JB.MAX_LOG_DT - JB.MIN_LOG_DT AS JOB_DURATION_SEC
FROM
( SELECT SID, SOURCE, LAYER, JOB_NAME,
MAX(UTL_JOB_STATUS_ID) AS UTL_JOB_STATUS_ID,
MAX(START_FLAG) AS START_FLAG,
MAX(END_FLAG) AS END_FLAG,
MAX(ERROR_FLAG) AS ERROR_FLAG,
MIN(LOG_DT) AS MIN_LOG_DT,
MAX(LOG_DT) AS MAX_LOG_DT,
SUM(1) AS CNT,
SUM(IFNULL(AFFECTED_ROWS, 0)) AS AFFECTED_ROWS
FROM SRC
GROUP BY SID, SOURCE, LAYER, JOB_NAME
) JB,
( SELECT UTL_JOB_STATUS_ID, SID, JOB_NAME, STEP_LOG
FROM SRC
WHERE 1 = 1
) ERR
WHERE 1 = 1
AND JB.SID = ERR.SID
AND JB.JOB_NAME = ERR.JOB_NAME
AND JB.UTL_JOB_STATUS_ID = ERR.UTL_JOB_STATUS_ID
ORDER BY JB.MIN_LOG_DT DESC, JB.SID DESC, JB.SOURCE;
SQL แแแแฌแแแแก แจแแกแแซแแแแแแแ แแฃ แแ แ แกแแกแแแก แแฎแแแ แแแแ แแก แแแฆแแแ
SELECT SUM (
CASE WHEN start_job.JOB_NAME IS NOT NULL AND end_job.JOB_NAME IS NULL /* existed job finished */
AND NOT ( 'y' = 'n' ) /* force restart PARAMETER */
THEN 1 ELSE 0
END ) AS IS_RUNNING
FROM
( SELECT 1 AS dummy FROM UTL_JOB_STATUS WHERE sid = -1) d_job
LEFT OUTER JOIN
( SELECT JOB_NAME, SID, 1 AS dummy
FROM UTL_JOB_STATUS
WHERE JOB_NAME = 'RPT_ACCESS_LOG' /* job name PARAMETER */
AND STEP_NAME = 'ETL_START'
GROUP BY JOB_NAME, SID
) start_job /* starts */
ON d_job.dummy = start_job.dummy
LEFT OUTER JOIN
( SELECT JOB_NAME, SID
FROM UTL_JOB_STATUS
WHERE JOB_NAME = 'RPT_ACCESS_LOG' /* job name PARAMETER */
AND STEP_NAME in ('ETL_END', 'ETL_ERROR') /* stop status */
GROUP BY JOB_NAME, SID
) end_job /* ends */
ON start_job.JOB_NAME = end_job.JOB_NAME
AND start_job.SID = end_job.SID
แแแแแแแก แแแฎแแกแแแแแแแแแ:
- แแแแแชแแแแ แแแแฃแจแแแแแแก แแ แแชแแแฃแ แแก แแแฌแงแแแแก แแ แแแกแแกแ แฃแแก แฃแแแ แแแฐแงแแแก แแแแแฏแแแ ETL_START แแ ETL_END
- แจแแชแแแแแก แจแแแแฎแแแแแจแ, แฃแแแ แจแแแฅแแแแก ETL_ERROR แแแแแฏแ แแแกแ แแฆแฌแแ แแแแแแ
- แแแแฃแจแแแแแฃแแ แแแแแชแแแแแแก แ แแแแแแแแ แฃแแแ แแงแแก แฎแแแแแกแแฃแแ, แแแแแแแแแ, แแแ แกแแแแแแแ
- แแ แแ แแ แแแแแ แแ แแชแแแฃแ แ แจแแแซแแแแ แแ แแแ แแฃแแแ แแแแฌแงแแก force_restart=y แแแ แแแแขแ แแ, แแแแก แแแ แแจแ แกแแกแแแก แแแแแ แ แแแแชแแแ แแฎแแแแ แแแกแ แฃแแแแฃแ แแ แแชแแแฃแ แแแ
- แแแ แแแแฃแ แ แแแแแจแ, แแฅแแแ แแ แจแแแแซแแแแ แแแแแชแแแแ แแแแฃแจแแแแแแก แแแแแ แแ แแชแแแฃแ แแก แแแ แแแแแฃแ แแ แแแจแแแแ
แแแแแแแกแแแ แแฃแจแแแแแกแแแแก แแฃแชแแแแแแแ แแแแ แแชแแแแ แจแแแแแแแ:
- แแแแแแแแ แ ETL แแ แแชแแแฃแ แแก แกแแกแแแก แแแแ แแก แแแฆแแแ
- แฉแแแแ แแฃแ แแแแแก แฉแแแแฌแแ แ แชแฎแ แแแจแ
- ETL แแ แแชแแแฃแ แแก แแแแ แฌแแ แแแขแแแฃแแ แฉแแแแฌแแ แแก แแแฆแแแ
แแแแแชแแแแ แแแแแแจแ, แ แแแแ แแชแแ Oracle แแ Postgres, แแก แแแแ แแชแแแแ แจแแแซแแแแ แแแแฎแแ แชแแแแแแก แฉแแจแแแแแฃแแ แคแฃแแฅแชแแแแแก แกแแฎแแ. sqlite แแแแแฎแแแก แแแ แ แแแฅแแแแแแก แแ แแ แจแแแแฎแแแแแจแ แแแก
แแแแแงแแแแแก
แแแ แแแแ, แแแแแชแแแแ แแแแฃแจแแแแแแก แแแกแขแ แฃแแแแขแแแจแ แจแแชแแแแแก แจแแขแงแแแแแแแแแ แแแแ-แแแแจแแแแแแแแ แ แแแก แแแแแจแแแก. แแแแ แแ แซแแแแแ แแแ แฃแฌแแแ แแแขแแแแแฃแ แ แแ แแแแแแแก แแแแแแแก แกแฌแ แแคแแ แแแกแแแแแแแ. แ แแชแ แแ แแชแแแฃแ แแแแก แ แแแแแแแแ แแกแก แฃแแฎแแแแแแแ, แแแจแแ แแ แแชแแกแแก แแแแแขแแ แแแแ แ แแฃแ แแ แแแฅแขแแ แแฅแชแแแ.
แกแขแแขแแแจแ แแแชแแแฃแแแ แแ แแแแแแแก แจแแกแแซแแ แแแแแฌแงแแแขแแก แแแแแแแแ แแ แแขแแขแแแแก แกแแฎแแ. แแแแแ แแชแแ แ แกแแชแแแแก แแ แแขแแขแแแ แฎแแแแแกแแฌแแแแแแ gitlab-แจแ
แฌแงแแ แ: www.habr.com