ΠΠ½ΠΎΠ³ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΡΠ΅Π΄ΡΡΠΈ Π·Π° ΠΈΠ·Π²Π»ΠΈΡΠ°Π½Π΅, ΡΡΠ°Π½ΡΡΠΎΡΠΌΠΈΡΠ°Π½Π΅ ΠΈ Π·Π°ΡΠ΅ΠΆΠ΄Π°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ Π² ΡΠ΅Π»Π°ΡΠΈΠΎΠ½Π½ΠΈ Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ. ΠΡΠΎΡΠ΅ΡΡΡ Π½Π° ΡΠ°Π±ΠΎΡΠ½ΠΈΡΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ ΡΠ΅ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°, Π³ΡΠ΅ΡΠΊΠΈΡΠ΅ ΡΠ΅ ΠΊΠΎΡΠΈΠ³ΠΈΡΠ°Ρ.
Π ΡΠ»ΡΡΠ°ΠΉ Π½Π° Π³ΡΠ΅ΡΠΊΠ°, Π»ΠΎΠ³ΡΡ ΡΡΠ΄ΡΡΠΆΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, ΡΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡΡ Π½Π΅ Π΅ ΡΡΠΏΡΠ» Π΄Π° ΠΈΠ·ΠΏΡΠ»Π½ΠΈ Π·Π°Π΄Π°ΡΠ°ΡΠ° ΠΈ ΠΊΠΎΠΈ ΠΌΠΎΠ΄ΡΠ»ΠΈ (ΡΠ΅ΡΡΠΎ java) ΠΊΡΠ΄Π΅ ΡΠ° ΡΠΏΡΠ΅Π»ΠΈ. Π ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΡΠ΅Π΄ΠΎΠ²Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈΡΠ΅ Π³ΡΠ΅ΡΠΊΠ° Π² Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π½Π°ΡΡΡΠ΅Π½ΠΈΠ΅ Π½Π° ΡΠ½ΠΈΠΊΠ°Π»Π΅Π½ ΠΊΠ»ΡΡ Π½Π° ΡΠ°Π±Π»ΠΈΡΠ°.
ΠΠ° Π΄Π° ΠΎΡΠ³ΠΎΠ²ΠΎΡΡ Π½Π° Π²ΡΠΏΡΠΎΡΠ° ΠΊΠ°ΠΊΠ²Π° ΡΠΎΠ»Ρ ΠΈΠ³ΡΠ°Π΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡΡΠ° Π·Π° Π³ΡΠ΅ΡΠΊΠ° Π² ETL, ΠΊΠ»Π°ΡΠΈΡΠΈΡΠΈΡΠ°Ρ Π²ΡΠΈΡΠΊΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ, Π²ΡΠ·Π½ΠΈΠΊΠ½Π°Π»ΠΈ ΠΏΡΠ΅Π· ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ Π΄Π²Π΅ Π³ΠΎΠ΄ΠΈΠ½ΠΈ Π² Π΄ΠΎΡΡΠ° Π³ΠΎΠ»ΡΠΌΠΎ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅.
ΠΡΠ΅ΡΠΊΠΈΡΠ΅ Π² Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ Π²ΠΊΠ»ΡΡΠ²Π°Ρ Π½Π΅Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ ΠΌΡΡΡΠΎ, Π·Π°Π³ΡΠ±Π΅Π½Π° Π²ΡΡΠ·ΠΊΠ°, ΠΏΡΠ΅ΠΊΡΡΠ²Π°Π½Π΅ Π½Π° ΡΠ΅ΡΠΈΡΡΠ° ΠΈ Π΄Ρ.
ΠΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈΡΠ΅ Π³ΡΠ΅ΡΠΊΠΈ Π²ΠΊΠ»ΡΡΠ²Π°Ρ Π½Π°ΡΡΡΠ°Π²Π°Π½Π΅ Π½Π° ΠΊΠ»ΡΡΠΎΠ²Π΅ΡΠ΅ Π½Π° ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ°, Π½Π΅Π²Π°Π»ΠΈΠ΄Π½ΠΈ ΠΎΠ±Π΅ΠΊΡΠΈ, Π»ΠΈΠΏΡΠ° Π½Π° Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ ΠΎΠ±Π΅ΠΊΡΠΈ ΠΈ Π΄Ρ.
ΠΠ»Π°Π½ΠΈΡΠΎΠ²ΡΠΈΠΊΡΡ ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π΅ ΡΡΠ°ΡΡΠΈΡΠ° Π½Π°Π²ΡΠ΅ΠΌΠ΅, Π΄Π° Π·Π°ΠΌΡΡΠ·Π½Π΅ ΠΈ Ρ.Π½.
ΠΡΠΎΡΡΠΈΡΠ΅ Π³ΡΠ΅ΡΠΊΠΈ Π½Π΅ ΠΎΡΠ½Π΅ΠΌΠ°Ρ ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅ Π·Π° ΠΎΡΡΡΡΠ°Π½ΡΠ²Π°Π½Π΅. ΠΠ΄ΠΈΠ½ Π΄ΠΎΠ±ΡΡ ETL ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΡΠΏΡΠ°Π²ΠΈ Ρ ΠΏΠΎΠ²Π΅ΡΠ΅ΡΠΎ ΠΎΡ ΡΡΡ ΡΠ°ΠΌ.
Π‘Π»ΠΎΠΆΠ½ΠΈΡΠ΅ Π³ΡΠ΅ΡΠΊΠΈ Π½Π°Π»Π°Π³Π°Ρ ΠΎΡΠΊΡΠΈΠ²Π°Π½Π΅ΡΠΎ ΠΈ ΡΠ΅ΡΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΏΡΠΎΡΠ΅Π΄ΡΡΠΈ Π·Π° ΡΠ°Π±ΠΎΡΠ° Ρ Π΄Π°Π½Π½ΠΈ, ΠΈΠ·ΡΠ»Π΅Π΄Π²Π°Π½Π΅ Π½Π° ΠΈΠ·ΡΠΎΡΠ½ΠΈΡΠΈΡΠ΅ Π½Π° Π΄Π°Π½Π½ΠΈ. Π§Π΅ΡΡΠΎ Π²ΠΎΠ΄ΡΡ Π΄ΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡΠ° ΠΎΡ ΡΠ΅ΡΡΠ²Π°Π½Π΅ ΠΈ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠΌΡΠ½Π°.
Π’Π°ΠΊΠ° ΡΠ΅ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π°ΡΠ° ΠΎΡ Π²ΡΠΈΡΠΊΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ ΡΠ° ΡΠ²ΡΡΠ·Π°Π½ΠΈ Ρ Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ. 48% ΠΎΡ Π²ΡΠΈΡΠΊΠΈ Π³ΡΠ΅ΡΠΊΠΈ ΡΠ° ΠΏΡΠΎΡΡΠΈ Π³ΡΠ΅ΡΠΊΠΈ.
ΠΠ΄Π½Π° ΡΡΠ΅ΡΠ° ΠΎΡ Π²ΡΠΈΡΠΊΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ ΡΠ° ΡΠ²ΡΡΠ·Π°Π½ΠΈ Ρ ΠΏΡΠΎΠΌΡΠ½Π° Π½Π° Π»ΠΎΠ³ΠΈΠΊΠ°ΡΠ° ΠΈΠ»ΠΈ ΠΌΠΎΠ΄Π΅Π»Π° Π½Π° ΡΡΡ
ΡΠ°Π½Π΅Π½ΠΈΠ΅, ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΎΡ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π°ΡΠ° ΠΎΡ ΡΠ΅Π·ΠΈ Π³ΡΠ΅ΡΠΊΠΈ ΡΠ° ΡΠ»ΠΎΠΆΠ½ΠΈ.
Π ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ ΠΎΡ Π΅Π΄Π½Π° ΡΠ΅ΡΠ²ΡΡΡ ΠΎΡ Π²ΡΠΈΡΠΊΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ ΡΠ° ΡΠ²ΡΡΠ·Π°Π½ΠΈ Ρ ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²ΡΠΈΠΊΠ° Π½Π° Π·Π°Π΄Π°ΡΠΈ, 18% ΠΎΡ ΠΊΠΎΠΈΡΠΎ ΡΠ° ΠΏΡΠΎΡΡΠΈ Π³ΡΠ΅ΡΠΊΠΈ.
ΠΠ°ΡΠΎ ΡΡΠ»ΠΎ 22% ΠΎΡ Π²ΡΠΈΡΠΊΠΈ Π²ΡΠ·Π½ΠΈΠΊΠ½Π°Π»ΠΈ Π³ΡΠ΅ΡΠΊΠΈ ΡΠ° ΡΠ»ΠΎΠΆΠ½ΠΈ ΠΈ ΠΊΠΎΡΠΈΠ³ΠΈΡΠ°Π½Π΅ΡΠΎ ΠΈΠΌ ΠΈΠ·ΠΈΡΠΊΠ²Π° Π½Π°ΠΉ-ΠΌΠ½ΠΎΠ³ΠΎ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΈ Π²ΡΠ΅ΠΌΠ΅. Π’Π΅ ΡΠ΅ ΡΠ»ΡΡΠ²Π°Ρ ΠΎΠΊΠΎΠ»ΠΎ Π²Π΅Π΄Π½ΡΠΆ ΡΠ΅Π΄ΠΌΠΈΡΠ½ΠΎ. ΠΠΎΠΊΠ°ΡΠΎ ΠΏΡΠΎΡΡΠΈ Π³ΡΠ΅ΡΠΊΠΈ ΡΠ΅ ΡΠ»ΡΡΠ²Π°Ρ ΠΏΠΎΡΡΠΈ Π²ΡΠ΅ΠΊΠΈ Π΄Π΅Π½.
ΠΡΠ΅Π²ΠΈΠ΄Π½ΠΎ Π½Π°Π±Π»ΡΠ΄Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ETL ΠΏΡΠΎΡΠ΅ΡΠΈ ΡΠ΅ Π±ΡΠ΄Π΅ Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ, ΠΊΠΎΠ³Π°ΡΠΎ ΠΌΠ΅ΡΡΠΎΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π½Π° Π³ΡΠ΅ΡΠΊΠ°ΡΠ° Π΅ ΠΏΠΎΡΠΎΡΠ΅Π½ΠΎ Π² Π΄Π½Π΅Π²Π½ΠΈΠΊΠ° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉ-ΡΠΎΡΠ½ΠΎ ΠΈ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½ΠΎΡΠΎ Π²ΡΠ΅ΠΌΠ΅ Π·Π° Π½Π°ΠΌΠΈΡΠ°Π½Π΅ Π½Π° ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊΠ° Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°.
ΠΡΠ΅ΠΊΡΠΈΠ²Π΅Π½ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³
ΠΠ°ΠΊΠ²ΠΎ ΠΈΡΠΊΠ°Ρ Π΄Π° Π²ΠΈΠ΄Ρ Π² ΠΏΡΠΎΡΠ΅ΡΠ° Π½Π° ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ Π½Π° ETL?
ΠΠ°ΠΏΠΎΡΠ½Π΅ΡΠ΅ ΠΎΡ - ΠΊΠΎΠ³Π°ΡΠΎ ΡΠΎΠΉ Π·Π°ΠΏΠΎΡΠ½Π° ΡΠ°Π±ΠΎΡΠ°,
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ - ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊ Π½Π° Π΄Π°Π½Π½ΠΈ,
Π‘Π»ΠΎΠΉ - ΠΊΠ°ΠΊΠ²ΠΎ Π½ΠΈΠ²ΠΎ Π½Π° ΡΡΡ
ΡΠ°Π½Π΅Π½ΠΈΠ΅ ΡΠ΅ Π·Π°ΡΠ΅ΠΆΠ΄Π°,
ETL Job Name - ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ° Π·Π° ΠΊΠ°ΡΠ²Π°Π½Π΅, ΠΊΠΎΡΡΠΎ ΡΠ΅ ΡΡΡΡΠΎΠΈ ΠΎΡ ΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠ°Π»ΠΊΠΈ ΡΡΡΠΏΠΊΠΈ,
ΠΠΎΠΌΠ΅Ρ Π½Π° ΡΡΡΠΏΠΊΠ° - Π½ΠΎΠΌΠ΅ΡΡΡ Π½Π° ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°Π½Π°ΡΠ° ΡΡΡΠΏΠΊΠ°,
ΠΠ°ΡΠ΅Π³Π½Π°ΡΠΈ ΡΠ΅Π΄ΠΎΠ²Π΅ - ΠΊΠΎΠ»ΠΊΠΎ Π΄Π°Π½Π½ΠΈ Π²Π΅ΡΠ΅ ΡΠ° ΠΎΠ±ΡΠ°Π±ΠΎΡΠ΅Π½ΠΈ,
ΠΡΠΎΠ΄ΡΠ»ΠΆΠΈΡΠ΅Π»Π½ΠΎΡΡ Π² ΡΠ΅ΠΊΡΠ½Π΄ΠΈ - ΠΊΠΎΠ»ΠΊΠΎ Π²ΡΠ΅ΠΌΠ΅ ΠΎΡΠ½Π΅ΠΌΠ°,
Π‘ΡΠ°ΡΡΡ - Π΄Π°Π»ΠΈ Π²ΡΠΈΡΠΊΠΎ Π΅ Π½Π°ΡΠ΅Π΄ ΠΈΠ»ΠΈ Π½Π΅: ΠΠ, ΠΠ ΠΠ¨ΠΠ, Π ΠΠΠΠ’Π, ΠΠΠ‘ΠΠ
Π‘ΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ - ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΎ ΡΡΠΏΠ΅ΡΠ½ΠΎ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π½Π° Π³ΡΠ΅ΡΠΊΠ°ΡΠ°.
ΠΡΠ· ΠΎΡΠ½ΠΎΠ²Π° Π½Π° ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ΡΠΎ Π½Π° Π·Π°ΠΏΠΈΡΠΈΡΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ·ΠΏΡΠ°ΡΠΈΡΠ΅ ΠΈΠΌΠ΅ΠΉΠ». ΠΏΠΈΡΠΌΠΎ Π΄ΠΎ Π΄ΡΡΠ³ΠΈ ΡΠ»Π΅Π½ΠΎΠ²Π΅. ΠΠΊΠΎ Π½ΡΠΌΠ° Π³ΡΠ΅ΡΠΊΠΈ, ΡΠΎΠ³Π°Π²Π° ΠΏΠΈΡΠΌΠΎΡΠΎ Π½Π΅ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ.
ΠΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½, Π² ΡΠ»ΡΡΠ°ΠΉ Π½Π° Π³ΡΠ΅ΡΠΊΠ°, ΠΌΡΡΡΠΎΡΠΎ Π½Π° ΠΈΠ½ΡΠΈΠ΄Π΅Π½ΡΠ° Π΅ ΡΡΠ½ΠΎ ΠΏΠΎΡΠΎΡΠ΅Π½ΠΎ.
ΠΠΎΠ½ΡΠΊΠΎΠ³Π° ΡΠ΅ ΡΠ»ΡΡΠ²Π° ΡΠ°ΠΌΠΈΡΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π·Π° Π½Π°Π±Π»ΡΠ΄Π΅Π½ΠΈΠ΅ Π΄Π° Π½Π΅ ΡΠ°Π±ΠΎΡΠΈ. Π ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΄Π° ΡΠ΅ ΠΈΠ·Π²ΠΈΠΊΠ° ΠΈΠ·Π³Π»Π΅Π΄ (ΠΈΠ·Π³Π»Π΅Π΄) Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ Π² Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ, Π²ΡΠ· ΠΎΡΠ½ΠΎΠ²Π° Π½Π° ΠΊΠΎΡΡΠΎ ΡΠ΅ ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π° ΠΎΡΡΠ΅ΡΡΡ.
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