Move schema and data from Oracle to ParadeDB (a PostgreSQL-based engine) using ora2pg, FDW, and COPY.
Use the open-source tool ora2pg
to export Oracle schema and data into PostgreSQL-compatible SQL, then run the script on a ParadeDB instance. ora2pg auto-converts DDL, data types, and constraints and supports parallel data unload.
Confirm Oracle character set, identify unsupported data types (e.g., LONG RAW
), and collect row counts for tables like Customers
and Orders
. Resolve invalid objects and disable materialized views before export.
Place a config file with Oracle DSN, user, password, and target schema. Run ora2pg -t COPY
for data and -t TABLE
for DDL. The generated SQL contains CREATE TABLE Customers ...
and COPY
statements ready for ParadeDB.
Yes. Use Oracle change-data-capture via oracle_fdw
to pull only rows where created_at > :last_sync
. Schedule Cron or Airflow to copy deltas until cut-over.
Load the extension: CREATE EXTENSION IF NOT EXISTS parade;
. Add full-text or vector indexes as needed: CREATE INDEX idx_products_name_search ON Products USING pgroonga (name);
Compare row counts: SELECT COUNT(*) FROM Customers;
in both systems. Spot-check totals: SELECT SUM(total_amount) FROM Orders;
. Use EXCEPT queries to find mismatches.
Freeze writes on Oracle, run final incremental sync, promote ParadeDB to primary, and point applications to the new connection string. Keep Oracle in read-only mode for quick rollback.
Data type drift—NUMBER(1) becomes BOOLEAN in Postgres; cast explicitly in ora2pg config. Constraint timing—disable foreign keys during bulk load using SET session_replication_role = replica;
Yes, it is GPL-licensed and widely used.
No. ParadeDB speaks the regular PostgreSQL protocol; any Postgres client works.
ora2pg streams data in parallel; databases above 5 TB have been migrated successfully when bandwidth allows.
Yes. Add -n 'Customers,Orders'
to ora2pg or list tables in the config’s TABLES
parameter.
PL/SQL must be rewritten to PL/pgSQL. ora2pg flags incompatible syntax and produces skeleton functions for manual editing.
ora2pg converts them to PostgreSQL SEQUENCE
objects and updates default column values automatically.