MOC — dny 1 a 2
1. Představení Azure Databricks 2. Výběr a konfigurace compute 3. Objekty v Unity Catalogu 4. Zabezpečení Unity Catalogu 5. Governance Unity Catalogu 6. Datové modelování 7. Ingest dat
MOC — pokračování
8. Čištění a transformace dat 9. Data quality constraints · mimo osnovu 10. Datové pipelines 11. Lakeflow Jobs 12. Vývojový lifecycle · mimo osnovu 13. Monitoring a optimalizace
🏠 Rozcestník kurzu
Pod čarou — den 3
14. Průřez Microsoft Fabric 15. Power BI + Fabric + Databricks 16. Migrace z Oracle
🏠 Rozcestník kurzu
DP-750 · Kapitola 16

Migrace z Oracle

Přístupy k migraci EDW do lakehouse, Lakebridge, mapování konceptů a tipy na zdroje
🗂 Pod čarou — mimo MOC➕ Vlastní modul mimo oficiální MOC

Cíle kapitoly

  • Popsat fáze migrace Oracle DWH do Databricks a rozhodnout mezi lift-and-shift a redesignem.
  • Vysvětlit, k čemu slouží Databricks Lakebridge (analyzer, converter, reconcile) a kdy sáhnout po ADF či Lakeflow Connect.
  • Zmapovat klíčové Oracle koncepty (PL/SQL, materialized views, sekvence, indexy, hinty) na jejich lakehouse ekvivalenty.
  • Vyjmenovat typické zrady migrace — od NULL vs prázdný řetězec po transakční sémantiku.
  • Vědět, kde hledat oficiální migration guides a nástroje.
16.1

Strategie migrace: z EDW do lakehouse

Migrace Oracle datového skladu do Databricks není jeden velký přesun, ale fázovaný projekt. Databricks i praxe partnerů se shodují na stejné kostře: assessment (inventura objektů, závislostí a workloadů), konverze schématu a kódu, přenos a synchronizace dat, validace (rekonsiliace výsledků proti Oracle) a teprve nakonec cutover — přepnutí konzumentů a vypnutí staré platformy. Fáze se navíc iterují po doménách: nemigruje se „celý sklad", ale postupně datamarty či subject areas podle rizika a byznysové hodnoty.

1. Assessment inventura objektů, složitost, TCO 2. Konverze schema (DDL), PL/SQL, ETL kod 3. Data sync historicky load + inkrementy / CDC 4. Validace reconcile dat, paralelni beh 5. Cutover prepnuti BI, decommission iterace: rozdily → oprava konverze Lakebridge Analyzer Lakebridge Converter ADF / Lakeflow Connect (Oracle) Lakebridge Reconcile Runbook + rollback plan Migruje se po domenach (datamart po datamartu), ne „big bang" — kazda domena projde vsemi fazemi.
Pět fází migrace Oracle → Databricks s typickými nástroji; validace se iteruje zpět do konverze, dokud rekonsiliace nesedí.

Zásadní strategické rozhodnutí je lift-and-shift vs redesign. Lift-and-shift (přeložit kód 1:1, zachovat struktury) je rychlejší a levnější na projekt, ale přenáší do lakehouse i dvacet let technického dluhu — a některé Oracle konstrukty stejně 1:1 nepřeložíte. Redesign (přepis na medallion architekturu, deklarativní pipelines, viz kapitoly 7 a 10) dá dlouhodobě lepší výsledek, ale stojí víc analýzy. V praxi vítězí hybrid: core tabulky a ETL lift-and-shift s automatickým převodem, nejbolavější a nejhodnotnější části (staging logika v PL/SQL balíčcích, MV kaskády) redesign.

💡
Tip: Nemigrujte mrtvolu. Assessment typicky ukáže, že 30–50 % objektů ve starém DWH nikdo roky nepoužil. Nejlevnější migrace je ta, kterou neuděláte — mrtvé tabulky a joby vyřaďte ze scope hned na začátku.
⚠️
Pozor: Cutover plánujte s obdobím paralelního běhu — obě platformy živé, reporty se porovnávají. Bez něj zjistíte rozdíly až od uživatelů. A mějte rollback plán: dokud běží synchronizace dat z Oracle, návrat je levný.
16.2

Lakebridge a další nástroje

Lakebridge je bezplatný open-source migrační toolkit od Databricks Labs (ohlášen v červnu 2025; vznikl spojením akvizice BladeBridge a interního projektu Remorph). Pokrývá tři fáze migrace a Oracle podporuje ve všech:

KomponentaFázeCo dělá pro Oracle
Analyzerassessmentprojde data dictionary (ALL_OBJECTS, ALL_TAB_COLUMNS…) a zdrojové skripty; spočítá inventuru, složitost a odhad pracnosti
Converter (transpiler)konverzepřekládá Oracle SQL a PL/SQL do Databricks SQL / Spark SQL; engine BladeBridge (zralý, nosný právě pro Oracle a legacy ETL), Morpheus (deterministický SQL-only transpiler, cílí hlavně na Snowflake a Redshift) a Switch (LLM-powered, tzv. agentic converter)
Reconcilevalidaceporovná zdrojová a cílová data (row counts, hash, agregáty) a vygeneruje report rozdílů
1. Assessment Profiler metadata a statistiky ze zdrojove DB Analyzer inventura objektu, slozitost, odhad prace 2. Transpile BladeBridge pravidlovy, nosny pro Oracle Morpheus deterministicky, SQL-only Switch LLM-powered (agentic) 3. Reconcile schema / row typy sloupcu a hash radku bez join klice data / all porovnani hodnot pres join sloupce rozdily → oprava pravidel → nova iterace Automaticky (nastroj) DDL, SELECT a DML, ANSI JOIN misto (+), ROWNUM, vetsina PL/SQL procedur, inventura a reporty Rucne (vas tym) dynamicke SQL, DBMS_* balicky, kurzorova logika, ladeni vykonu, semanticke rozdily, opravneni Lakebridge neprenasi data — na historicky load a CDC pouzijte ADF nebo Lakeflow Connect.
Tři fáze Lakebridge a jejich nástroje; dolní pás ukazuje, kde končí automatika a začíná ruční práce vývojářů.

Instaluje se jako CLI přes databricks labs install lakebridge. Realistické očekávání od converteru: Databricks uvádí automatizaci až 80 % pracnosti; u Oracle počítejte spíš se 70–80 % podle složitosti PL/SQL — zbytek (dynamické SQL, DBMS_* balíčky, kurzorová logika) je ruční práce. Přesný stav podpory jednotlivých enginů ověřte v dokumentaci, projekt se vyvíjí rychle.

Celý cyklus se dá projet z příkazové řádky:

BASH
# instalace CLI a transpileru (vyzaduje Databricks CLI a profil)
databricks labs install lakebridge
databricks labs lakebridge install-transpile

# 1) assessment: inventura a slozitost zdroje -> Excel report
databricks labs lakebridge analyze \
    --source-directory /migrace/oracle/src \
    --report-file /migrace/reports/oracle-inventory.xlsx \
    --source-tech oracle

# 2) transpile: prevod Oracle SQL a PL/SQL do Databricks SQL
databricks labs lakebridge transpile \
    --input-source /migrace/oracle/src \
    --output-folder /migrace/databricks/out \
    --source-dialect oracle \
    --error-file-path /migrace/reports/errors.log

# 3) reconcile: konfigurace a porovnani zdroje s cilem
databricks labs lakebridge configure-reconcile
databricks labs lakebridge reconcile

# presne nazvy a hodnoty prepinacu overte pres --help,
# CLI se mezi verzemi meni
⚠️
Pozor: Výstup transpileru je návrh, ne hotový kód. Každý vygenerovaný soubor patří do code review a do gitu — jinak po pár iteracích nikdo nepozná, co je strojový překlad a co ruční oprava.

Na přenos dat Lakebridge není — tam patří:

  • Azure Data Factory s Oracle konektorem (self-hosted integration runtime pro on-prem) — klasika pro historický load i plánované inkrementy. Berte ji jako orchestrátor a „přistávací dráhu" do bronze vrstvy, ne jako transformační engine (viz kapitola 7).
  • Lakeflow Connect — managed Oracle konektory: query-based konektor (dotazuje zdroj přes watermark sloupec) a integrovaný CDC konektor postavený na Oracle LogMiner přes JDBC (bez GoldenGate/XStream). Obě varianty jsou k srpnu 2026 v Beta / Public Preview — dostupnost ve vašem regionu a přesný stav ověřte v dokumentaci, než na nich postavíte produkční migraci.
  • Lakehouse Federation — dotazování Oracle „na místě" bez kopírování; hodí se během přechodného období na porovnávání a na dosud nemigrované tabulky.
Co Lakebridge nepřevede▼

Ruční práci si spolehlivě drží: dynamické SQL (EXECUTE IMMEDIATE skládané za běhu), volání DBMS_* balíčků (DBMS_LOB, UTL_FILE), Java stored procedures, kurzorová a řídicí logika bez množinového ekvivalentu a všechno kolem výkonu — hinty, partition strategie, statistiky. Lakebridge navíc nepřenáší data, nemigruje oprávnění (Oracle role a granty → Unity Catalog privileges) ani BI vrstvu (reporty, semantické modely). Aktuální rozsah podpory pro Oracle ověřte v release notes projektu.

ℹ️
Poznámka: Lakebridge je projekt Databricks Labs — bez formální produktové SLA podpory. Pro velké migrace Databricks nabízí program s partnery a professional services; toolkit ale můžete použít zdarma sami.
16.3

Mapování Oracle konceptů na Databricks

Než se pustíte do jednotlivých objektů, pomůže vidět mapování po vrstvách:

Oracle EDW Databricks lakehouse Staging tabulky SQL*Loader, external tables, denni davky do stage schematu PL/SQL ETL balicky, kurzory, procedury, joby v DBMS_SCHEDULER Materialized views MV logy, fast refresh, kaskady agregatu Star schema (dim / fact) indexy, range partitions, hinty, rucni statistiky 1:1 lift, bez transformace kurzory → mnozinovy SQL MV → MV, refresh ridi engine layout misto indexu a hintu Bronze — raw Auto Loader, Lakeflow Connect, data tak, jak prisla Silver — pipelines deklarativni Lakeflow pipelines, expectations misto rucnich kontrol Gold — MV a streaming tables inkrementalni refresh bez MV logu, zavislosti resi engine Gold — dimenzionalni model liquid clustering, AQE, predictive optimization Mapovani neni 1:1 — jedna PL/SQL procedura casto skonci jako nekolik kroku jedne pipeline.
Vrstvy Oracle EDW a jejich protějšky v lakehouse; nejvíc práce je uprostřed — přepis PL/SQL ETL do deklarativních pipelines.
ℹ️
Poznámka: Vrstvy nemapujte mechanicky. Staging → bronze sedí skoro vždycky, ale jeden PL/SQL balíček se běžně rozpadne do několika kroků silver pipeline a naopak tři kaskádové MV nahradí jediná materialized view nad silver.

Největší mentální posun: v lakehouse neexistují B-tree indexy, sekvence s triggery ani optimizer hinty. Jejich funkci přebírají jiné mechanismy:

OracleDatabricksPoznámka
PL/SQL procedury, balíčkySQL Scripting (BEGIN…END), SQL/Python UDF, notebooky + Lakeflow JobsSQL Scripting a CREATE PROCEDURE jsou GA (DBR 17.0+) — nejbližší náhrada PL/SQL procedur; balíčkovou strukturu ale nemají, tu nahraďte schématy a notebooky
Materialized views (fast refresh)CREATE MATERIALIZED VIEW / streaming tablesrefresh řídí Lakeflow pipeline; inkrementálnost zajišťuje engine, ne MV logy
SEQUENCE + triggerGENERATED ALWAYS AS IDENTITYhodnoty nejsou gapless ani nutně souvislé; MV identity nepodporují
NUMBER(p,s)DECIMAL(38,s), BIGINT, DOUBLEoba mají max. 38 číslic přesnosti, ale NUMBER má plovoucí scale a širší rozsah (−84 až 127). NUMBER bez p/s se přes JDBC typicky mapuje na DECIMAL(38,10) — u finančních sloupců scale zvolte vědomě
DATE, TIMESTAMPTIMESTAMP (příp. DATE)Oracle DATE obsahuje i čas! Převod na čistý DATE ztrácí data
VARCHAR2, CLOBSTRINGbez délkového limitu; kontroly délky řešte constraints/expectations
B-tree/bitmap indexyliquid clustering, Z-ORDER, data skippingviz sekce 6.9; predictive optimization ladí layout samo
Range/hash partitioningliquid clustering (preferované) / partitioningstatické partition schéma nekopírujte 1:1 — hrozí over-partitioning
Optimizer hinty (/*+ … */)AQE (Adaptive Query Execution)hinty se při konverzi zahazují; AQE řeší skew a join strategie za běhu
DBMS_SCHEDULERLakeflow Jobsviz kapitola 11

Dvě rychlé ukázky. Typická PL/SQL procedura „smaž a nahraj agregát" se v Databricks zjednoduší na MERGE nebo ještě lépe na deklarativní materialized view:

SQL
-- Oracle: PL/SQL procedura + MV log + fast refresh
-- Databricks: deklarativni MV, refresh ridi engine
CREATE MATERIALIZED VIEW main.gold.sales_daily
AS SELECT order_date, sum(amount) AS total_amount
FROM main.silver.orders
GROUP BY order_date;

A náhrada sekvence s triggerem za identity sloupec:

SQL
-- misto CREATE SEQUENCE cust_seq + BEFORE INSERT trigger:
CREATE TABLE silver.customers (
  customer_sk BIGINT GENERATED ALWAYS AS IDENTITY,
  customer_id STRING,
  valid_from  TIMESTAMP
);

A nejčastější antipattern celé migrace — kurzorová smyčka, která se musí přepsat množinově:

SQL
-- Oracle: radek po radku, jeden UPDATE na kazdou objednavku
--   FOR r IN (SELECT order_id, amount FROM orders) LOOP
--     UPDATE order_stats SET total = total + r.amount WHERE id = r.order_id;
--   END LOOP;

-- Databricks: jeden mnozinovy MERGE misto smycky
MERGE INTO main.gold.order_stats AS t
USING (
  SELECT order_id, sum(amount) AS amount
  FROM main.silver.orders
  GROUP BY order_id
) AS s
ON t.id = s.order_id
WHEN MATCHED THEN UPDATE SET t.total = t.total + s.amount
WHEN NOT MATCHED THEN INSERT (id, total) VALUES (s.order_id, s.amount);
⚠️
Pozor: Kurzorovou smyčku převedenou 1:1 na Python for cyklus nad collect() uvidíte v každé neopatrné migraci — a z minutového jobu se stane hodinový. Vždy hledejte množinový přepis: MERGE, window funkce, agregace.
Co s hierarchickými dotazy (CONNECT BY) a starou (+) syntaxí?▼

CONNECT BY PRIOR nemá přímý ekvivalent — přepisuje se na rekurzivní CTE (WITH RECURSIVE), které Databricks SQL podporuje (stav ověřte v dokumentaci pro vaši verzi DBR). Stará Oracle outer-join syntaxe (+) se musí přepsat na ANSI LEFT/RIGHT JOIN — to zvládá Lakebridge Converter automaticky. ROWNUM se překládá na LIMIT nebo window funkci row_number() — pozor, sémantika není identická (ROWNUM se v Oracle vyhodnocuje před ORDER BY).

SQL
-- Oracle: SELECT employee_id, manager_id, LEVEL FROM employees
--         START WITH manager_id IS NULL
--         CONNECT BY PRIOR employee_id = manager_id;

-- Databricks: rekurzivni CTE v ANSI syntaxi
WITH RECURSIVE org (employee_id, manager_id, lvl) AS (
  SELECT employee_id, manager_id, 1
  FROM main.silver.employees
  WHERE manager_id IS NULL
  UNION ALL
  SELECT e.employee_id, e.manager_id, o.lvl + 1
  FROM main.silver.employees e
  JOIN org o ON e.manager_id = o.employee_id
)
SELECT * FROM org;

Rekurzivní CTE přibyly do Databricks relativně nedávno (DBSQL 2025.20 / DBR 17.0, v době ohlášení Public Preview) a mají zabudované pojistky proti nekonečné rekurzi — dostupnost i limity pro vaši verzi runtime ověřte v dokumentaci. Pokud je nemáte k dispozici, obvyklé náhrady jsou předpočítaný path sloupec v dimenzi (hierarchii zploštíte při loadu) nebo iterativní zpracování v PySparku s pevným počtem úrovní.

16.4

Typické zrady migrace

Automatický převod přepíše syntaxi, ale sémantické rozdíly musíte pohlídat sami. Tohle jsou ty, na kterých se migrace z Oracle spálí nejčastěji:

  • NULL vs prázdný řetězec. Oracle notoricky zachází s '' jako s NULL. Ve Spark SQL je prázdný řetězec regulérní hodnota různá od NULL. Každé WHERE col IS NULL, konkatenace a join klíč s textovými sloupci může po migraci vracet jiné výsledky.
  • Implicitní konverze typů. Oracle tiše převádí string ↔ number ↔ date podle NLS nastavení session. Spark má vlastní (a v ANSI módu přísnější) pravidla — dotazy spoléhající na implicitní TO_DATE spadnou nebo vrátí NULL. Formátovací masky TO_CHAR/TO_DATE se navíc liší od masek date_format().
  • Oracle DATE má čas. Bezmyšlenkovitý převod na Spark DATE ořízne časovou složku — a inkrementální loady postavené na porovnávání „dat" se rozbijí.
  • Transakční sémantika. Delta Lake garantuje ACID na úrovni jedné tabulky; multi-statement transakce přes více tabulek à la BEGIN…COMMIT v PL/SQL nemají přímý ekvivalent. Logiku „všechno nebo nic" přes více tabulek je nutné přestavět (idempotentní kroky, orchestraci a případné kompenzace řeší pipeline). Stav multi-table transactions ověřte v dokumentaci — oblast se vyvíjí.
  • MERGE rozdíly. Delta MERGE selže, pokud více zdrojových řádků matchuje jeden cílový — Oracle v témže případě hlásí ORA-30926, takže chování je v jádru stejné. Rozdíl je v tom, že na tuhle chybu se v Oracle často naráželo až v produkci a týmy si zvykly ji obcházet v ETL; po migraci ji Delta odhalí znovu. Zdroj před MERGE deduplikujte (row_number() = 1).
  • Řazení a case sensitivity. Jiné výchozí collation, jiné řazení NULL hodnot (NULLS FIRST/LAST explicitně!), citlivost identifikátorů na velikost písmen.

Na úrovni jednotlivých funkcí je převod přímočarý — zrádné jsou až formátovací masky:

SQL
-- Oracle
SELECT NVL(discount, 0)                                AS discount,
       DECODE(status, 'A', 'aktivni',
                      'C', 'zavreno', 'ostatni')  AS status_txt,
       TO_DATE(order_dt_txt, 'DD.MM.YYYY')          AS order_date
FROM stage.orders;

-- Databricks SQL
SELECT coalesce(discount, 0)                           AS discount,
       CASE status WHEN 'A' THEN 'aktivni'
                   WHEN 'C' THEN 'zavreno'
                   ELSE 'ostatni' END            AS status_txt,
       to_date(order_dt_txt, 'dd.MM.yyyy')          AS order_date
FROM main.silver.orders;
ℹ️
Poznámka: Všimněte si masky. Oracle 'DD.MM.YYYY' odpovídá ve Sparku 'dd.MM.yyyy' — velké D je tu den v roce a velké Y week-based rok. Transpiler to většinou ošetří, ručně psané dotazy analytiků ne.
⚠️
Pozor: Právě kvůli těmto rozdílům není rekonsiliace „nice to have". Pouštějte Lakebridge Reconcile (nebo vlastní porovnání row counts + hash + klíčové agregáty) na každou migrovanou tabulku a report rozdílů řešte před cutoverem, ne po něm.
💡
Tip: Založte si „sémantický regres" — sadu 20–50 byznysově kritických dotazů (top reporty, uzávěrkové sestavy) a jejich očekávaných výsledků z Oracle. Spouštějte ji po každé iteraci konverze. Chytí rozdíly, které row-count rekonsiliace nevidí.
Validace a rekonsiliace dat po migraci▼

Lakebridge Reconcile nabízí čtyři typy reportu: schema (jména a datové typy sloupců), row (hash celého řádku, nepotřebuje join klíč), data (porovnání hodnot přes join sloupce, s detailem neshod) a all (data + schema). Osvědčený postup: nejdřív schema na všechny tabulky — chytí špatně namapované NUMBER a DATE, pak row na plný objem a teprve u tabulek s neshodami data s join klíčem.

Nejčastější provozní past je pohyblivý cíl: pokud Oracle mezitím běží dál, porovnávejte proti pevnému bodu — snapshot ve zdroji, watermark, případně time travel v Delta. Jinak strávíte týden honěním rozdílů, které vznikly mezi dvěma čteními. Výsledky reconcile se zapisují do dashboardu nasazeného ve workspace; přesnou strukturu i konfiguraci ověřte v dokumentaci.

16.5

Shrnutí a tipy na zdroje

Migrace z Oracle je proveditelná a dobře prošlapaná cesta: fázujte po doménách, nechte Lakebridge udělat hrubou práci (assessment, převážná část konverze, rekonsiliace), data tahejte přes ADF nebo Lakeflow Connect a než přepnete uživatele, provozujte paralelní běh. Největší rizika nejsou v syntaxi, ale v sémantice — NULL, typy, transakce.

💡
Tip: Berte migraci jako příležitost, ne jen jako přesun. Než něco přepíšete 1:1, zeptejte se, jestli to ještě někdo potřebuje a jestli by to v lakehouse nešlo jednodušeji — deklarativní pipeline místo tří set řádků PL/SQL.

Kurátorovaný seznam zdrojů (vše EN):

✓
Shrnutí: 1) Fázujte: assessment → konverze → data sync → validace → cutover, po doménách. 2) Lakebridge = free toolkit na assessment, konverzi PL/SQL i rekonsiliaci; data řeší ADF / Lakeflow Connect. 3) Indexy, sekvence a hinty nemigrujete — nahrazují je liquid clustering, identity columns a AQE. 4) Sémantické zrady (NULL vs '', implicitní konverze, MERGE, transakce) chytá jen důsledná rekonsiliace a paralelní běh.