Migrace z Oracle
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.
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.
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.
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:
| Komponenta | Fáze | Co dělá pro Oracle |
|---|---|---|
| Analyzer | assessment | projde data dictionary (ALL_OBJECTS, ALL_TAB_COLUMNS…) a zdrojové skripty; spočítá inventuru, složitost a odhad pracnosti |
| Converter (transpiler) | konverze | př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) |
| Reconcile | validace | porovná zdrojová a cílová data (row counts, hash, agregáty) a vygeneruje report rozdílů |
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:
# 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
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.
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.
Mapování Oracle konceptů na Databricks
Než se pustíte do jednotlivých objektů, pomůže vidět mapování po vrstvách:
Největší mentální posun: v lakehouse neexistují B-tree indexy, sekvence s triggery ani optimizer hinty. Jejich funkci přebírají jiné mechanismy:
| Oracle | Databricks | Poznámka |
|---|---|---|
| PL/SQL procedury, balíčky | SQL Scripting (BEGIN…END), SQL/Python UDF, notebooky + Lakeflow Jobs | SQL 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 tables | refresh řídí Lakeflow pipeline; inkrementálnost zajišťuje engine, ne MV logy |
| SEQUENCE + trigger | GENERATED ALWAYS AS IDENTITY | hodnoty nejsou gapless ani nutně souvislé; MV identity nepodporují |
| NUMBER(p,s) | DECIMAL(38,s), BIGINT, DOUBLE | oba 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, TIMESTAMP | TIMESTAMP (příp. DATE) | Oracle DATE obsahuje i čas! Převod na čistý DATE ztrácí data |
| VARCHAR2, CLOB | STRING | bez délkového limitu; kontroly délky řešte constraints/expectations |
| B-tree/bitmap indexy | liquid clustering, Z-ORDER, data skipping | viz sekce 6.9; predictive optimization ladí layout samo |
| Range/hash partitioning | liquid clustering (preferované) / partitioning | statické 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_SCHEDULER | Lakeflow Jobs | viz 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:
-- 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:
-- 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ě:
-- 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);
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.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).
-- 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í.
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_DATEspadnou nebo vrátí NULL. Formátovací maskyTO_CHAR/TO_DATEse navíc liší od masekdate_format(). - Oracle DATE má čas. Bezmyšlenkovitý převod na Spark
DATEoří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…COMMITv 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
MERGEselž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/LASTexplicitně!), 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:
-- 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;
'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.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.
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.
Kurátorovaný seznam zdrojů (vše EN):
- Lakebridge — dokumentace — instalace, podporované zdroje a enginy, návody pro analyzer/converter/reconcile. Startovní bod pro celý toolkit.
- Lakebridge — GitHub — zdrojový kód, releases a changelog; sledujte, podpora dialektů přibývá po měsících.
- Introducing Lakebridge (Databricks blog) — ohlášení a architektura toolkitu, kontext akvizice BladeBridge.
- Navigating the Oracle to Databricks Migration (Databricks blog) — nejucelenější oficiální text přímo k Oracle: fázování, datové typy, partitioning, anti-patterny.
- Lakebridge Agentic Converter (docs) — LLM-powered konverze SQL (engine Switch); hodí se na konstrukce, které pravidlové enginy nezvládnou.
- Lakeflow Connect — managed konektory (Microsoft Learn) — přehled database/query-based konektorů včetně Oracle CDC (LogMiner) a jejich release stavů.
- ADF Oracle connector (Microsoft Learn) — konfigurace self-hosted IR, výkonové ladění paralelního čtení z Oracle.
- Databricks Migration hub — rozcestník migračních guides, webinářů a partnerského programu.