ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ ETL-процСссов Π² малСньком Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ Π΄Π°Π½Π½Ρ‹Ρ…

МногиС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ спСциализированныС инструмСнты для создания ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ извлСчСния, трансформации ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π² рСляционныС Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…. ΠŸΡ€ΠΎΡ†Π΅ΡΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹ инструмСнтов логируСтся, ошибки Ρ„ΠΈΠΊΡΠΈΡ€ΡƒΡŽΡ‚ΡΡ.

Π’ случаС ошибки Π² Π»ΠΎΠ³Π΅ содСрТится информация ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ инструмСнту Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π·Π°Π΄Π°Ρ‡Ρƒ ΠΈ ΠΊΠ°ΠΊΠΈΠ΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ (часто это java) Π³Π΄Π΅ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΠ»ΠΈΡΡŒ. Π’ послСдних строках ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ ΠΎΡˆΠΈΠ±ΠΊΡƒ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΠ΅ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π° Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ Π½Π° вопрос, ΠΊΠ°ΠΊΡƒΡŽ Ρ€ΠΎΠ»ΡŒ ΠΈΠ³Ρ€Π°Π΅Ρ‚ информация ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… ETL, я классифицировал всС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ΅Π΄ΡˆΠΈΠ΅ Π·Π° послСдниС Π΄Π²Π° Π³ΠΎΠ΄Π° Π² нСмалСньком Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅.

ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ ETL-процСссов Π² малСньком Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ Π΄Π°Π½Π½Ρ‹Ρ…

К ошибкам Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… относятся Ρ‚Π°ΠΊΠΈΠ΅, ΠΊΠ°ΠΊ Π½Π΅ Ρ…Π²Π°Ρ‚ΠΈΠ»ΠΎ мСста, ΠΎΠ±ΠΎΡ€Π²Π°Π»ΠΎΡΡŒ соСдинСниС, зависла сСссия ΠΈ Ρ‚.ΠΏ.

К логичСским ошибкам относятся Ρ‚Π°ΠΊΠΈΠ΅, ΠΊΠ°ΠΊ Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, Π½Π΅ Π²Π°Π»ΠΈΠ΄Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, отсутствиС доступа ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ ΠΈ Ρ‚.ΠΏ.
ΠŸΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΏΡƒΡ‰Π΅Π½ Π½Π΅ воврСмя, ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π²ΠΈΡΠ½ΡƒΡ‚ΡŒ ΠΈ Ρ‚.ΠΏ.

ΠŸΡ€ΠΎΡΡ‚Ρ‹Π΅ ошибки Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π° исправлСниС. Π‘ большСй ΠΈΡ… Ρ‡Π°ΡΡ‚ΡŒΡŽ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ ETL ΡƒΠΌΠ΅Π΅Ρ‚ ΡΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒΡΡ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ.

Π‘Π»ΠΎΠΆΠ½Ρ‹Π΅ ошибки Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ, ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ источники Π΄Π°Π½Π½Ρ‹Ρ…. Часто приводят ΠΊ нСобходимости тСстирования ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΈ Π΄Π΅ΠΏΠ»ΠΎΠΉΠΌΠ΅Π½Ρ‚Π°.

Π˜Ρ‚Π°ΠΊ, ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π° всСх ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ связана с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…. 48% всСх ошибок β€” это простыС ошибки.
Π’Ρ€Π΅Ρ‚ΡŒΡ Ρ‡Π°ΡΡ‚ΡŒ всСх ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ связана с ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ Π»ΠΎΠ³ΠΈΠΊΠΈ ΠΈΠ»ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°, большС ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρ‹ этих ошибок ΡΠ²Π»ΡΡŽΡ‚ΡΡ слоТными.

И мСньшС Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚ΠΈ всСх ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ связана с ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠΎΠΌ Π·Π°Π΄Π°Ρ‡, 18% ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… β€” это простыС ошибки.

Π’ Ρ†Π΅Π»ΠΎΠΌ, 22% всСх ΡΠ»ΡƒΡ‡ΠΈΠ²ΡˆΠΈΡ…ΡΡ ошибок ΡΠ²Π»ΡΡŽΡ‚ΡΡ слоТными, ΠΈΡ… исправлСниС Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ наибольшСго внимания ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. ΠŸΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΡΡ‚ ΠΎΠ½ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ€Π°Π· Π² нСдСлю. Π’ Ρ‚ΠΎ врСмя, ΠΊΠ°ΠΊ простыС ошибки ΡΠ»ΡƒΡ‡Π°ΡŽΡ‚ΡΡ ΠΏΠΎΡ‡Ρ‚ΠΈ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ дСнь.

ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ ETL-процСссов Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚ΠΎΠ³Π΄Π° эффСктивным, ΠΊΠΎΠ³Π΄Π° Π² Π»ΠΎΠ³Π΅ максимально Ρ‚ΠΎΡ‡Π½ΠΎ ΡƒΠΊΠ°Π·Π°Π½ΠΎ мСсто ошибки ΠΈ трСбуСтся минимальноС врСмя Π½Π° поиск источника ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹.

Π­Ρ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³

Π§Ρ‚ΠΎ ΠΌΠ½Π΅ Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ Π² процСссС ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° ETL?

ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ ETL-процСссов Π² малСньком Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ Π΄Π°Π½Π½Ρ‹Ρ…
Start at β€” ΠΊΠΎΠ³Π΄Π° Π½Π°Ρ‡Π°Π» Ρ€Π°Π±ΠΎΡ‚Ρƒ,
Source β€” источник Π΄Π°Π½Π½Ρ‹Ρ…,
Layer β€” ΠΊΠ°ΠΊΠΎΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° загруТаСтся,
ETL Job Name β€” ΠΏΠΎΡ†Π΅Π΄ΡƒΡ€Π° Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ, которая состоит ΠΈΠ· мноТСства ΠΌΠ΅Π»ΠΊΠΈΡ… шагов,
Step Number β€” Π½ΠΎΠΌΠ΅Ρ€ выполняСмого шага,
Affected Rows β€” сколько Π΄Π°Π½Π½Ρ‹Ρ… ΡƒΠΆΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΎΡΡŒ,
Duration sec β€” ΠΊΠ°ΠΊ Π΄ΠΎΠ»Π³ΠΎ выполняСтся,
Status β€” всё Π»ΠΈ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΈΠ»ΠΈ Π½Π΅Ρ‚: OK, ERROR, RUNNING, HANGS
Message β€” послСднСС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ΅ сообщСниС ΠΈΠ»ΠΈ описаниС ошибки.

На основании статуса записСй ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ эл. письмо Π΄Ρ€ΡƒΠ³ΠΈΠΌ участникам. Если ошибок Π½Π΅Ρ‚, Ρ‚ΠΎ ΠΈ письмо Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π² случаС ошибки Ρ‡Ρ‘Ρ‚ΠΊΠΎ ΡƒΠΊΠ°Π·Π°Π½ΠΎ мСсто ΠΏΡ€ΠΎΠΈΡΡˆΠ΅ΡΡ‚Π²ΠΈΡ.

Иногда случаСтся, Ρ‡Ρ‚ΠΎ сам инструмСнт ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚. Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС Π΅ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ прямо Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ прСдставлСниС (Π²ΡŒΡŽΡˆΠΊΡƒ), Π½Π° основании ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ построСн ΠΎΡ‚Ρ‡Ρ‘Ρ‚.

Π’Π°Π±Π»ΠΈΡ†Π° ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° ETL

Π§Ρ‚ΠΎΠ±Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ ETL-процСссов достаточно ΠΎΠ΄Π½ΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ прСдставлСния.

Для этого ΠΌΠΎΠΆΠ½ΠΎ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ Π² своё малСнькоС Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ ΠΈ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… sqlite.

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 Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ внСшний ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΈ Π² Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΎΠ½ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠΈΡ€ΠΎΠ²Π°Π½ Π½Π° PHP.

Π’Ρ‹Π²ΠΎΠ΄

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, сообщСния ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… Π² инструмСнтах ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ³Ρ€Π°ΡŽΡ‚ ΠΌΠ΅Π³Π°-Π²Π°ΠΆΠ½ΡƒΡŽ Ρ€ΠΎΠ»ΡŒ. Но ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ для быстрого поиска ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΈΡ… слоТно Π½Π°Π·Π²Π°Ρ‚ΡŒ. Когда количСство ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ приблиТаСтся ΠΊ сотнС, Ρ‚ΠΎ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ процСссов прСвращаСтся Π² слоТный ΠΏΡ€ΠΎΠ΅ΠΊΡ‚.

Π’ ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ³ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π² Π²ΠΈΠ΄Π΅ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠ°. Π’Π΅ΡΡŒ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ малСнького Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° доступСн Π² gitlab SQLite PHP ETL Utilities.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ