Skip to main content
A is the simplest way of . In this approach, you stop application traffic to the source database and migrate data to the target cluster using during a significant downtime window. Application traffic is then cut over to the target after schema finalization and data verification.
  • All source data is migrated to the target .
  • This approach does not utilize .
  • is manual, but in most cases it’s simple, as the source database is preserved and write traffic begins on the target all at once. If you wish to roll back before the target has received any writes that are not present on the source database, nothing needs to be done. If you wish to roll back after the target has received writes that are not present on the source database, you must manually replicate these new rows on the source.
This approach is best for small databases (<100 GB), internal tools, dev/staging environments, and production environments that can handle business disruption. It’s a simple approach that guarantees full data consistency and is easy to execute with limited resources, but it can only be performed if your system can handle significant downtime. This page describes an example scenario. While the commands provided can be copy-and-pasted, they may need to be altered or reconsidered to suit the needs of your specific environment. Classic Bulk Load Migration flow

Example scenario

You have a small (50 GB) database that provides the data store for a web application. You want to migrate the entirety of this database to a new CockroachDB cluster. You schedule a maintenance window for Saturday from 2 AM to 6 AM, and announce it to your users several weeks in advance. The application runs on a Kubernetes cluster. Estimated system downtime: 4 hours.

Before the migration

  • Install the tools.
  • Review the documentation.
  • and .
  • Recommended: Perform a dry run of this full set of instructions in a development environment that closely resembles your production environment. This can help you get a realistic sense of the time and complexity it requires.
  • Announce the maintenance window to your users.
  • Understand the prerequisites and limitations of the MOLT tools:

Prerequisites

Oracle Instant Client

Install Oracle Instant Client on the machine that will run molt and replicator. If using the MOLT Replicator binary (instead of Docker), the Oracle Instant Client libraries must be accessible at /usr/lib.
  • On macOS ARM machines, download the Oracle Instant Client. After installation, you should have a new directory at /Users/$USER/Downloads/instantclient_23_3 containing .dylib files. Set the LD_LIBRARY_PATH environment variable to this directory:
  • On Linux machines, install the Oracle Instant Client dependencies and set the LD_LIBRARY_PATH to the client library path:
    You can also download Oracle Instant Client directly from the Oracle site for Linux ARM64 or Linux x86-64.

Limitations

MOLT Fetch limitations

  • Only tables with types of , , or can be sharded with .
  • GEOMETRY and GEOGRAPHY types are not supported.
  • Migrations must be performed from a single Oracle schema. You must include so that MOLT Fetch only loads data from the specified schema. Refer to .
    • Specifying is also strongly recommended to ensure that only necessary tables are migrated from the Oracle schema.
  • Oracle advises against LONG RAW columns and recommends converting them to BLOB. LONG RAW can only store binary values up to 2GB, and only one LONG RAW column per table is supported.

MOLT Verify limitations

  • MOLT Verify compares 20,000 rows at a time by default, and row values can change between batches, potentially resulting in temporary inconsistencies in data. To configure the row batch size, use the --row_batch_size .
  • MOLT Verify checks for collation mismatches on columns. This may cause validation to fail when a is used as a primary key and the source and target databases are using different .
  • MOLT Verify might give an error in case of schema changes on either the source or target database.
  • cannot yet be compared.

Step 1: Prepare the source database

In this step, you will:

Create migration user on source database

Create a dedicated migration user (for example, MIGRATION_USER) on the source database. This user is responsible for reading data from source tables during the migration. You will pass this username in the source connection string.
When migrating from Oracle Multitenant (PDB/CDB), this should be a common user. Prefix the username with C## (e.g., C##MIGRATION_USER).
Grant the user privileges to connect, read metadata, and SELECT and FLASHBACK the tables you plan to migrate. The tables should all reside in a single schema (for example, migration_schema). For details, refer to Schema and table filtering.

Oracle Multitenant (PDB/CDB) user privileges

Connect to the Oracle CDB as a DBA and grant the following:
Connect to the Oracle PDB (not the CDB) as a DBA and grant the following:

Single-tenant Oracle user privileges

Connect to the Oracle database as a DBA and grant the following:

Step 2: Prepare the target database

In this step, you will:

Provision a CockroachDB cluster

Use one of the following options to create and run a new CockroachDB cluster. This is your migration target.

Option 1: Create a secure cluster locally

If you have the CockroachDB binary installed locally, you can manually deploy a multi-node, self-hosted CockroachDB cluster on your local machine. Learn how to .

Option 2: Create a CockroachDB Self-Hosted cluster on AWS

You can manually deploy a multi-node, self-hosted CockroachDB cluster on Amazon’s AWS EC2 platform, using AWS’s managed load-balancing service to distribute client traffic. Learn how to .

Option 3: Create a CockroachDB Cloud cluster

CockroachDB Cloud is a fully-managed service run by Cockroach Labs, which simplifies the deployment and management of CockroachDB. Sign up for a CockroachDB Cloud account and using .

Define the target tables

Convert the source table definitions into CockroachDB-compatible equivalents. CockroachDB supports the PostgreSQL wire protocol and is largely .
  • The source and target table definitions must match. Review to understand which source types can be mapped to CockroachDB types. For example, an Oracle source table defined as CREATE TABLE migration_schema.tbl (pk INT PRIMARY KEY); must have a corresponding schema and table in CockroachDB:
    • MOLT Fetch can automatically define matching CockroachDB tables using the option.
    • If you define the target tables manually, review how MOLT Fetch handles . You can use the MOLT Schema Conversion Tool to create matching table definitions.
    • By default, table and column names are case-insensitive in MOLT Fetch. If using the flag, schema, table, and column names must match Oracle’s default uppercase identifiers. Use quoted names on the target to preserve case. For example, the following CockroachDB SQL statement will error:
      It should be written as:
      When using --case-sensitive, quote all identifiers and match the case exactly (for example, use "CO"."STORES" and "STORE_ID").
  • Every table must have an explicit primary key.
    Avoid using sequential keys. To learn more about the performance issues that can result from their use, refer to the . If a sequential key is necessary in your CockroachDB table, you must create it manually, after using to load and replicate the data.
  • Review to understand how computed columns and partitioned tables can be mapped to the target, and how target tables can be renamed.
  • By default on CockroachDB, INT is an alias for INT8, which creates 64-bit signed integers. PostgreSQL and MySQL default to 32-bit integers. Depending on your source database or application requirements, you may need to change the integer size to 4. For more information, refer to .

Schema Conversion Tool

The (SCT) converts source table definitions to CockroachDB-compatible syntax. It requires a free .
  1. Upload a source .sql file to convert the syntax and identify in the table definitions.
  2. Import the converted table definitions to a CockroachDB cluster:
    • When migrating to CockroachDB Cloud, the Schema Conversion Tool automatically .
    • When migrating to a self-hosted CockroachDB cluster, and pipe the directly into .

Drop constraints and indexes

To optimize data load performance, drop all non-PRIMARY KEY and on the target CockroachDB database before migrating:
  • (you do not need to drop this constraint when using drop-on-target-and-recreate for table handling)
Do not drop constraints.
You can recreate the constraints and indexes after loading the data.

Create the SQL user

Create a SQL user in the CockroachDB cluster that has the necessary privileges. To create a user crdb_user in the default database (you will pass this username in the target connection string):
Grant database-level privileges for schema creation within the target database:
Grant permission to modify cluster settings:
Grant usage on schemas being migrated:
Grant user privileges to create tables in the migration_schema schema and internal MOLT tables like _molt_fetch_exceptions in the public CockroachDB schema:
Ensure that you are connected to the target database.
If you manually defined the target tables (which means that drop-on-target-and-recreate will not be used), grant the following privileges on the schema:
Grant the same privileges for internal MOLT tables in the public CockroachDB schema:
If you will be running Fetch with drop-on-target-and-recreate, and the target schema has pre-existing tables that were created by a different user, you may need to change table ownership to allow the migration user to drop those tables. Make the following alteration for each table:
Depending on the MOLT Fetch you will use, grant the necessary privileges to run either IMPORT INTO or COPY FROM on the target tables:

IMPORT INTO privileges

Grant SELECT, INSERT, and DROP (required because the table is taken offline during the IMPORT INTO) privileges on all tables being migrated:
If you plan to use cloud storage with implicit authentication for data load, grant the EXTERNALIOIMPLICITACCESS :

COPY FROM privileges

Grant privileges to the user:

Set session variable

Ensure that the statement_timeout is set to 0s for the user:

Step 3: Stop application traffic

With both the source and target databases prepared for the data load, it’s time to stop application traffic to the source. At the start of the maintenance window, scale down the Kubernetes cluster to zero pods.
Application downtime begins now.It is strongly recommended that you perform a dry run of this migration in a test environment. This will allow you to practice using the MOLT tools in real time, and it will give you an accurate sense of how long application downtime might last.

Step 4: Load data into CockroachDB

In this step, you will:

Configure MOLT Fetch

The includes detailed information about how to , and how to . When you run molt fetch, you can configure the following options for data load:
  • : Specify URL‑encoded source and target connections.
  • : Specify schema and table names to migrate.
  • : Export data to cloud storage or a local file server.
  • : Specifies whether data will only be loaded into/from intermediate storage.
  • : Divide larger tables into multiple shards during data export.
  • : Choose between IMPORT INTO and COPY FROM.
  • : Determine how existing target tables are initialized before load.
  • : Define any row-level transformations to apply to the data before it reaches the target.
  • : Configure metrics collection during initial data load.
Read through the documentation to understand how to configure your molt fetch command and its flags. Follow , especially those related to security. At minimum, the molt fetch command should include the source, target, data path, and flags:
However, depending on the needs of your migration, you may have many more flags set, and you may need to prepare some accompanying .json files.

Run MOLT Fetch

Perform the bulk load of the source data.
  1. Run the command to move the source data into CockroachDB. This example command passes the source and target connection strings as environment variables, writes intermediate files to S3 storage, and uses the truncate-if-exists table handling mode to truncate the target tables before loading data. It limits the migration to a single schema and filters for three specific tables. The defaults to IMPORT INTO. Include the --ignore-replication-check flag to skip replication checkpoint queries, which eliminates the need to configure the source database for logical replication. The command assumes an Oracle Multitenant (CDB/PDB) source. specifies the container database (CDB) connection string.
  2. Check the output to observe fetch progress. A starting fetch message indicates that the task has started:
    data extraction messages are written for each table that is exported to the location in --bucket-path:
    data import messages are written for each table that is loaded into CockroachDB:
    A fetch complete message is written when the fetch task succeeds:

Continue MOLT Fetch after an interruption

If MOLT Fetch fails while loading data into CockroachDB from intermediate files, it exits with an error message, fetch ID, and continuation token for each table that failed to load on the target database.
You can use this information to where it was interrupted. Continuation is only possible under the following conditions:
  • All data has been exported from the source database into intermediate files on or .
  • The initial load of source data into the target CockroachDB database is incomplete.
  • The load uses IMPORT INTO rather than COPY FROM.
Only one fetch ID and set of continuation tokens, each token corresponding to a table, are active at any time. See .
The following command reattempts the data load starting from a specific continuation file, but you can also use individual continuation tokens to . The command assumes an Oracle Multitenant (CDB/PDB) source. specifies the container database (CDB) connection string.

Step 5: Verify the data

In this step, you will use to confirm that the source and target data is consistent. This ensures that the data load was successful.

Run MOLT Verify

  1. Run the command, specifying the source and target connection strings and the tables to validate.
    With Oracle Multitenant deployments, while --source-cdb is required for fetch, it is not necessary for verify.
  2. Check the output to observe verify progress. A verification in progress indicates that the task has started:
    starting verify messages are written for each specified table:
    A finished row verification message is written after each table is compared. If num_success equals num_truth_rows and the error counters (num_missing, num_mismatch, num_extraneous, and num_column_mismatch) are all 0, the table verified successfully. Any non-zero values in the error counters indicate data discrepancies that need investigation. For details on each field, refer to the page.
    A verification complete message is written when the verify task succeeds:

Step 6: Finalize the target schema

Add constraints and indexes

Add any constraints or indexes that you previously removed from the CockroachDB schema to facilitate data load.
If you used the --table-handling drop-on-target-and-recreate option for data load, only and constraints are preserved. You must manually recreate all other constraints and indexes.
For the appropriate SQL syntax, refer to and . Review the on CockroachDB.

Step 7: Cut over application traffic

With the target cluster verified and finalized, it’s time to resume application traffic.

Modify application code

In the application back end, make sure that the application now directs traffic to the CockroachDB cluster. For example:

Resume application traffic

Scale up the Kubernetes deployment to the original number of replicas:
This ends downtime.

See also