{"id":37701,"date":"2019-10-31T22:19:10","date_gmt":"2019-10-31T19:19:10","guid":{"rendered":"https:\/\/prohoster.info\/blog\/monitoring-etl-protsessov-v-malenkom-hranilishhe-dannyh\/"},"modified":"2019-10-31T22:19:10","modified_gmt":"2019-10-31T19:19:10","slug":"monitoring-etl-protsessov-v-malenkom-hranilishhe-dannyh","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/monitoring-etl-protsessov-v-malenkom-hranilishhe-dannyh","title":{"rendered":"Monitorowanie proces\u00f3w ETL w ma\u0142ym magazynie danych","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Wielu u\u017cytkownik\u00f3w korzysta z wyspecjalizowanych narz\u0119dzi do tworzenia procedur ekstrakcji, transformacji i \u0142adowania danych do relacyjnych baz danych. Proces dzia\u0142ania narz\u0119dzi jest logowany, a b\u0142\u0119dy s\u0105 dokumentowane.<\/p>\n<p>W przypadku wyst\u0105pienia b\u0142\u0119du w logu znajduje si\u0119 informacja o tym, \u017ce narz\u0119dzie nie mog\u0142o wykona\u0107 zadania oraz kt\u00f3re modu\u0142y (cz\u0119sto jest to java) si\u0119 zatrzyma\u0142y. W ostatnich linijkach mo\u017cna znale\u017a\u0107 b\u0142\u0105d bazy danych, na przyk\u0142ad naruszenie unikalnego klucza tabeli.<\/p>\n<p>Aby odpowiedzie\u0107 na pytanie, jak\u0105 rol\u0119 odgrywaj\u0105 informacje o b\u0142\u0119dach ETL, sklasyfikowa\u0142em wszystkie problemy, kt\u00f3re wyst\u0105pi\u0142y przez ostatnie dwa lata w du\u017cym zbiorze danych. <\/p>\n<p><img decoding=\"async\" alt=\"Monitorowanie proces\u00f3w ETL w ma\u0142ym magazynie danych\" src=\"\/wp-content\/uploads\/2019\/09\/cfe750a4a4ec952651779ec563a40e05.jpg\" style=\"display:block;margin: 0 auto;\" \/><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Do b\u0142\u0119d\u00f3w bazy danych zalicza si\u0119 takie jak brak miejsca, przerwanie po\u0142\u0105czenia, zawieszenie sesji itp.<\/p>\n<p>Do b\u0142\u0119d\u00f3w logicznych zalicza si\u0119 takie jak naruszenie kluczy tabeli, niewa\u017cne obiekty, brak dost\u0119pu do obiekt\u00f3w itp.<br \/>\nPlanista mo\u017ce by\u0107 uruchomiony nie w por\u0119, mo\u017ce tak\u017ce zawiesi\u0107 si\u0119 itp.<\/p>\n<p>Proste b\u0142\u0119dy nie wymagaj\u0105 du\u017co czasu na napraw\u0119. G\u0142\u00f3wnie dobre ETL potrafi sobie z nimi samodzielnie poradzi\u0107.<\/p>\n<p>Z\u0142o\u017cone b\u0142\u0119dy wymagaj\u0105 otwarcia i sprawdzenia procedur pracy z danymi, oraz badania \u017ar\u00f3de\u0142 danych. Cz\u0119sto prowadz\u0105 do konieczno\u015bci testowania zmian i wdro\u017cenia.<\/p>\n<p>Tak wi\u0119c po\u0142owa wszystkich problem\u00f3w dotyczy bazy danych. 48% wszystkich b\u0142\u0119d\u00f3w to proste b\u0142\u0119dy.<br \/>\nJedna trzecia wszystkich problem\u00f3w zwi\u0105zana jest ze zmian\u0105 logiki lub modelu zbioru danych, a wi\u0119kszo\u015b\u0107 tych b\u0142\u0119d\u00f3w jest z\u0142o\u017cona.<\/p>\n<p>I mniej ni\u017c jedna czwarta wszystkich problem\u00f3w zwi\u0105zana jest z planist\u0105 zada\u0144, z czego 18% to proste b\u0142\u0119dy.<\/p>\n<p>Og\u00f3lnie, 22% wszystkich wyst\u0119puj\u0105cych b\u0142\u0119d\u00f3w jest z\u0142o\u017conych, ich naprawa wymaga najwi\u0119kszej uwagi i czasu. Wyst\u0119puj\u0105 one mniej wi\u0119cej raz w tygodniu, podczas gdy proste b\u0142\u0119dy zdarzaj\u0105 si\u0119 prawie ka\u017cdego dnia.<\/p>\n<p>Jasne jest, \u017ce monitorowanie proces\u00f3w ETL b\u0119dzie efektywne wtedy, gdy w logu maksymalnie dok\u0142adnie wskazane jest miejsce b\u0142\u0119du i wymagane jest minimalne czas na znalezienie \u017ar\u00f3d\u0142a problemu.<\/p>\n<h4>Efektywne monitorowanie<\/h4>\n<p>\nCzego chcia\u0142bym widzie\u0107 w procesie monitorowania ETL?<\/p>\n<p><img decoding=\"async\" alt=\"Monitorowanie proces\u00f3w ETL w ma\u0142ym magazynie danych\" src=\"\/wp-content\/uploads\/2019\/09\/03e6ebc3aef69137880a278f9891370a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nStart at \u2014 kiedy rozpocz\u0119to prac\u0119,<br \/>\nSource \u2014 \u017ar\u00f3d\u0142o danych,<br \/>\nLayer \u2014 jaki poziom zbioru danych jest \u0142adowany,<br \/>\nETL Job Name \u2014 procedura \u0142adowania, sk\u0142adaj\u0105ca si\u0119 z wielu drobnych krok\u00f3w,<br \/>\nStep Number \u2014 numer wykonywanego kroku,<br \/>\nLiczba przetworzonych wierszy \u2014 ile danych zosta\u0142o ju\u017c przetworzonych,<br \/>\nCzas trwania (s) \u2014 jak d\u0142ugo trwa wykonanie,<br \/>\nStatus \u2014 czy wszystko jest w porz\u0105dku, czy nie: OK, B\u0141\u0104D, W TRAKCIE, ZAWIESZONE<br \/>\nWiadomo\u015b\u0107 \u2014 ostatnia udana wiadomo\u015b\u0107 lub opis b\u0142\u0119du.<\/p>\n<p>Na podstawie statusu zapis\u00f3w mo\u017cna wys\u0142a\u0107 e-mail do innych uczestnik\u00f3w. Je\u015bli nie ma b\u0142\u0119d\u00f3w, wiadomo\u015b\u0107 e-mail r\u00f3wnie\u017c nie jest konieczna.<\/p>\n<p>W ten spos\u00f3b w przypadku b\u0142\u0119du jest jasno okre\u015blone miejsce wyst\u0105pienia problemu.<\/p>\n<p>Czasami zdarza si\u0119, \u017ce sam narz\u0119dzie do monitorowania nie dzia\u0142a. W takim przypadku mo\u017cna bezpo\u015brednio w bazie danych wywo\u0142a\u0107 widok, na podstawie kt\u00f3rego stworzono raport.<\/p>\n<h4>Tabela monitorowania ETL<\/h4>\n<p>\nAby zrealizowa\u0107 monitoring proces\u00f3w ETL, wystarczy jedna tabela i jeden widok.<\/p>\n<p>W tym celu mo\u017cna wr\u00f3ci\u0107 do <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/462337\/\">swojego ma\u0142ego repozytorium<\/a><\/noindex> i stworzy\u0107 prototyp w bazie danych SQLite.<\/p>\n<p><b class=\"spoiler_title\">DDL tabeli<\/b><\/p>\n<pre><code class=\"sql\">CREATE TABLE UTL_JOB_STATUS (\n\n\/* Tabela do logowania wykonania zada\u0144. To wa\u017cne, aby zadanie mia\u0142o kroki ETL_START i ETL_END lub ETL_ERROR *\/\n  UTL_JOB_STATUS_ID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,\n  SID               INTEGER NOT NULL DEFAULT -1, \/* Identyfikator sesji. Unikalny dla ka\u017cdego uruchomienia zadania *\/\n  LOG_DT            INTEGER NOT NULL DEFAULT 0,  \/* Data i czas *\/\n  LOG_D             INTEGER NOT NULL DEFAULT 0,  \/* Data *\/\n  JOB_NAME          TEXT NOT NULL DEFAULT 'N\/A', \/* Nazwa zadania, np. JOB_STG2DM_GEO *\/\n  STEP_NAME         TEXT NOT NULL DEFAULT 'N\/A', \/* ETL_START, ... , ETL_END\/ETL_ERROR *\/\n  STEP_DESCR        TEXT,                        \/* Opis zadania lub wiadomo\u015bci o b\u0142\u0119dzie *\/\n  UNIQUE (SID, JOB_NAME, STEP_NAME)\n);\nINSERT INTO UTL_JOB_STATUS (UTL_JOB_STATUS_ID) VALUES (-1);<\/code><\/pre>\n<p>\n<b class=\"spoiler_title\">DDL widoku\/raportu<\/b><\/p>\n<pre><code class=\"sql\">UTW\u00d3RZ WIDOK, JE\u017bELI NIE ISTNIEJE UTL_JOB_STATUS_V\nJAKO \n\/* Tre\u015b\u0107: Dziennik wykonania pakietu za ostatnie 3 miesi\u0105ce. *\/\nZ SRC JAKO (\n  WYBIERZ LOG_D,\n    LOG_DT,\n    UTL_JOB_STATUS_ID,\n    SID,\n\tCASE WHEN INSTR(JOB_NAME, 'FTP') THEN 'TRANSFER' \/* przesy\u0142 plik\u00f3w *\/\n\t     WHEN INSTR(JOB_NAME, 'STG') THEN 'ETAP' \/* etap *\/\n\t     WHEN INSTR(JOB_NAME, 'CLS') THEN 'OCZYSZCZANIE' \/* oczyszczanie *\/\n\t     WHEN INSTR(JOB_NAME, 'DIM') THEN 'WYMIAR' \/* wymiar *\/\n\t     WHEN INSTR(JOB_NAME, 'FCT') THEN 'FAKT' \/* fakt *\/\n\t\t WHEN INSTR(JOB_NAME, 'ETL') THEN 'ETAP-MART' \/* magazyn danych *\/\n\t     WHEN INSTR(JOB_NAME, 'RPT') THEN 'RAPORT' \/* raport *\/\n\t     ELSE 'N\/A' END AS WARSTWA,\n\tCASE WHEN INSTR(JOB_NAME, 'ACCESS') THEN 'LOG DOST\u0118PU' \/* \u017ar\u00f3d\u0142o *\/\n\t     WHEN INSTR(JOB_NAME, 'MASTER') THEN 'DANE MASTER' \/* \u017ar\u00f3d\u0142o *\/\n\t     WHEN INSTR(JOB_NAME, 'AD-HOC') THEN 'AD-HOC' \/* \u017ar\u00f3d\u0142o *\/\n\t     ELSE 'N\/A' END AS \u0179R\u00d3D\u0141O,\n    JOB_NAME,\n    STEP_NAME,\n    CASE WHEN STEP_NAME='ETL_START' THEN 1 ELSE 0 END AS FLAG_START,\n    CASE WHEN STEP_NAME='ETL_END' THEN 1 ELSE 0 END AS FLAG_END,\n    CASE WHEN STEP_NAME='ETL_ERROR' THEN 1 ELSE 0 END AS FLAG_B\u0141\u0118D\u00d3W,\n    STEP_NAME || ' : ' || STEP_DESCR AS LOG_ETAPU,\n\tSUBSTR( SUBSTR(STEP_DESCR, INSTR(STEP_DESCR, '***')+4), 1, INSTR(SUBSTR(STEP_DESCR, INSTR(STEP_DESCR, '***')+4), '***')-2 ) AS ZMIENIONE_WIERSZE\n  Z UTL_JOB_STATUS\n  GDZIE datetime(LOG_D, 'unixepoch') &gt;= date('now', 'start of month', '-3 month')\n)\nWYBIERZ JB.SID,\n  JB.MIN_LOG_DT AS DATA_START,\n  strftime('%d.%m.%Y %H:%M', datetime(JB.MIN_LOG_DT, 'unixepoch')) AS LOG_DT,\n  JB.\u0179R\u00d3D\u0141O,\n  JB.WARSTWA,\n  JB.JOB_NAME,\n  CASE\n  WHEN JB.FLAG_B\u0141\u0118D\u00d3W = 1 THEN 'B\u0141\u0104D'\n  WHEN JB.FLAG_B\u0141\u0118D\u00d3W = 0 AND JB.FLAG_END = 0 AND strftime('%s','now') - JB.MIN_LOG_DT &gt; 0.5*60*60 THEN 'WISZY' \/* p\u00f3\u0142 godziny *\/\n  WHEN JB.FLAG_B\u0141\u0118D\u00d3W = 0 AND JB.FLAG_END = 0 THEN 'DZIA\u0141A'\n  ELSE 'OK'\n  END AS STATUS,\n  ERR.LOG_ETAPU     AS LOG_ETAPU,\n  JB.CNT           AS CNT_ETAPU,\n  JB.ZMIENIONE_WIERSZE AS ZMIENIONE_WIERSZE,\n  strftime('%d.%m.%Y %H:%M', datetime(JB.MIN_LOG_DT, 'unixepoch')) AS DATA_START_JOBU,\n  strftime('%d.%m.%Y %H:%M', datetime(JB.MAX_LOG_DT, 'unixepoch')) AS DATA_END_JOBU,\n  JB.MAX_LOG_DT - JB.MIN_LOG_DT AS CZAS_TRWANIA_JOBU_SEC\nZ\n  ( WYBIERZ SID, \u0179R\u00d3D\u0141O, WARSTWA, JOB_NAME,\n           MAX(UTL_JOB_STATUS_ID) AS UTL_JOB_STATUS_ID,\n           MAX(FLAG_START)       AS FLAG_START,\n           MAX(FLAG_END)         AS FLAG_END,\n           MAX(FLAG_B\u0141\u0118D\u00d3W)     AS FLAG_B\u0141\u0118D\u00d3W,\n           MIN(LOG_DT)           AS MIN_LOG_DT,\n           MAX(LOG_DT)           AS MAX_LOG_DT,\n           SUM(1)                AS CNT,\n           SUM(IFNULL(ZMIENIONE_WIERSZE, 0)) AS ZMIENIONE_WIERSZE\n    Z SRC\n    GROUP BY SID, \u0179R\u00d3D\u0141O, WARSTWA, JOB_NAME\n  ) JB,\n  ( WYBIERZ UTL_JOB_STATUS_ID, SID, JOB_NAME, LOG_ETAPU\n    Z SRC\n    GDZIE 1 = 1\n  ) ERR\nGDZIE 1 = 1\n  I JB.SID = ERR.SID\n  I JB.JOB_NAME = ERR.JOB_NAME\n  I JB.UTL_JOB_STATUS_ID = ERR.UTL_JOB_STATUS_ID\nZAM\u00d3WIONE PRZEZ JB.MIN_LOG_DT DESC, JB.SID DESC, JB.\u0179R\u00d3D\u0141O;<\/code><\/pre>\n<p>\n<b class=\"spoiler_title\">SQL Sprawdzenie mo\u017cliwo\u015bci uzyskania nowego numeru sesji<\/b><\/p>\n<pre><code class=\"sql\">WYBIERZ SUMA (\n  CASE WHEN start_job.JOB_NAME IS NOT NULL I end_job.JOB_NAME IS NULL \/* istniej\u0105ca praca zako\u0144czona *\/\n\t    I NIE ( 'y' = 'n' ) \/* wymu\u015b ponowne uruchomienie PARAMETRU *\/\n       TO 1 INNY 0\n  END ) AS IS_RUNNING\n  Z\n    ( WYBIERZ 1 AS dummy Z UTL_JOB_STATUS GDZIE sid = -1) d_job\n  LEWY ZJAZD DO\n    ( WYBIERZ JOB_NAME, SID, 1 AS dummy\n      Z UTL_JOB_STATUS\n      GDZIE JOB_NAME = 'RPT_ACCESS_LOG' \/* nazwa pracy PARAMETRU *\/\n\t    I STEP_NAME = 'ETL_START'\n      GRUPUJ PO JOB_NAME, SID\n    ) start_job \/* zaczyna *\/\n  NA d_job.dummy = start_job.dummy\n  LEWY ZJAZD DO\n    ( WYBIERZ JOB_NAME, SID\n      Z UTL_JOB_STATUS\n      GDZIE JOB_NAME = 'RPT_ACCESS_LOG'  \/* nazwa pracy PARAMETRU *\/\n\t    I STEP_NAME in ('ETL_END', 'ETL_ERROR') \/* status zatrzymania *\/\n      GRUPUJ PO JOB_NAME, SID\n    ) end_job \/* ko\u0144czy *\/\n  NA start_job.JOB_NAME = end_job.JOB_NAME\n     I start_job.SID = end_job.SID<\/code><\/pre>\n<p>\nCechy tabeli:<\/p>\n<ul>\n<li>Pocz\u0105tek i koniec procedury przetwarzania danych powinny by\u0107 poprzedzone krokami ETL_START i ETL_END<\/li>\n<li>W przypadku b\u0142\u0119du powinien by\u0107 tworzony krok ETL_ERROR z jego opisem<\/li>\n<li>Liczba przetworzonych danych powinna by\u0107 wyr\u00f3\u017cniona, na przyk\u0142ad gwiazdkami<\/li>\n<li>Jednocze\u015bnie t\u0119 sam\u0105 procedur\u0119 mo\u017cna uruchomi\u0107 z parametrem force_restart=y, bez niego numer sesji jest wydawany tylko dla zako\u0144czonej procedury <\/li>\n<li>W normalnym trybie nie mo\u017cna r\u00f3wnocze\u015bnie uruchomi\u0107 tej samej procedury przetwarzania danych<\/li>\n<\/ul>\n<p>\nNiezb\u0119dnymi operacjami pracy z tabel\u0105 s\u0105 nast\u0119puj\u0105ce:<\/p>\n<ul>\n<li>Pobranie numeru sesji uruchamianej procedury ETL<\/li>\n<li>Wstawienie rekordu logu do tabeli<\/li>\n<li>Pobranie ostatniego udanego rekordu procedury ETL<\/li>\n<\/ul>\n<p>\nW takich bazach danych, jak na przyk\u0142ad Oracle czy Postgres, te operacje mo\u017cna zrealizowa\u0107 wbudowanymi funkcjami. W przypadku sqlite potrzebny jest zewn\u0119trzny mechanizm, a w tym przypadku <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/marchanka\/sqlite-php-etl-utilities\/blob\/master\/utl_func.php\">jest on prototypowany w PHP<\/a><\/noindex>.<\/p>\n<h4>Wnioski<\/h4>\n<p>\nW ten spos\u00f3b komunikaty o b\u0142\u0119dach w narz\u0119dziach do przetwarzania danych odgrywaj\u0105 niezwykle wa\u017cn\u0105 rol\u0119. Jednak trudno je nazwa\u0107 optymalnymi dla szybkiego znalezienia przyczyny problemu. Gdy liczba procedur zbli\u017ca si\u0119 do stu, monitorowanie proces\u00f3w staje si\u0119 skomplikowanym projektem.<\/p>\n<p>W artykule przedstawiono przyk\u0142ad mo\u017cliwego rozwi\u0105zania problemu w postaci prototypu. Ca\u0142y prototyp ma\u0142ego magazynu jest dost\u0119pny w gitlab <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/marchanka\/sqlite-php-etl-utilities\">SQLite PHP ETL Utilities<\/a><\/noindex>.<br \/>\n<br \/>\u0179r\u00f3d\u0142o: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/465637\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041c\u043d\u043e\u0433\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f, \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445. \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0431\u043e\u0442\u044b \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043b\u043e\u0433\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u043e\u0448\u0438\u0431\u043a\u0438 \u0444\u0438\u043a\u0441\u0438\u0440\u0443\u044e\u0442\u0441\u044f. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 \u043b\u043e\u0433\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0443 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0438 \u043a\u0430\u043a\u0438\u0435 \u043c\u043e\u0434\u0443\u043b\u0438 (\u0447\u0430\u0441\u0442\u043e \u044d\u0442\u043e java) \u0433\u0434\u0435 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0438\u0441\u044c. \u0412 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u0441\u0442\u0440\u043e\u043a\u0430\u0445 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043e\u0448\u0438\u0431\u043a\u0443 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u0435 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":28295,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-37701","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041c\u043d\u043e\u0433\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f, \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/monitoring-etl-protsessov-v-malenkom-hranilishhe-dannyh\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 ETL-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u0432 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u043c \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041c\u043d\u043e\u0433\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f, \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/monitoring-etl-protsessov-v-malenkom-hranilishhe-dannyh\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:19:10+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:19:10+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Monitorowanie proces\u00f3w ETL w ma\u0142ym magazynie danych | ProHoster","description":"Wiele os\u00f3b korzysta ze specjalistycznych narz\u0119dzi do tworzenia procedur ekstrakcji, transformacji i \u0142adowania danych do relacyjnych baz danych.","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/monitoring-etl-protsessov-v-malenkom-hranilishhe-dannyh","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 ETL-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u0432 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u043c \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 | ProHoster","og:description":"\u041c\u043d\u043e\u0433\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f, \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445.","og:url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/monitoring-etl-protsessov-v-malenkom-hranilishhe-dannyh","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:19:10+00:00","article:modified_time":"2019-10-31T19:19:10+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"37701","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-23 18:57:59","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:22:28","updated":"2026-01-23 18:57:59","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/37701","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=37701"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/37701\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/28295"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=37701"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=37701"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=37701"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}