molt: MOLT Fetch and MOLT Verifyreplicator: MOLT Replicator
Installation
To install MOLT, download the binary that matches your architecture and source database:
The download package includes the following:
moltbinary.replicatorbinary.- Grafana dashboard JSON files for MOLT Fetch (
grafana_dashboard.json) and Replicator (replicator_grafana_dashboard.json) metrics. Each bundled dashboard is compatible with its corresponding binary version.- Oracle downloads also include the Oracle-specific Replicator dashboard (
replicator_oracle_grafana_dashboard.json).
- Oracle downloads also include the Oracle-specific Replicator dashboard (
molt and replicator in your current working directory.
To display the current version of each binary, run molt --version and replicator --version.
molt is bundled with the latest replicator version available at the time of the MOLT release. This means that the MOLT download always contains the latest released version of MOLT Replicator. To verify that the molt and replicator versions match, run molt --version and replicator --version.
For previous binaries, refer to the MOLT version manifest.
MOLT Fetch is supported on Red Hat Enterprise Linux (RHEL) 9 and above.
Docker images
MOLT Fetch
Docker multi-platform images containing both the AMD and ARMmolt and replicator binaries are available. To pull the latest image for PostgreSQL and MySQL:
1.1.3):
linux/amd64 is supported):
MOLT Replicator
Docker images for MOLT Replicator are also available as a standalone binary:v1.1.1):
Changelog
- molt
- replicator
November 10, 2026
molt 1.5.0 is available:Breaking changes
-
MySQL source connection strings now use MySQL’s TLS parameter names. In
mysql://source URLs, renamesslmodetossl-mode,sslrootcerttossl-ca,sslcerttossl-cert, andsslkeytossl-key. For details, refer to Connection security. -
MOLT log files are now readable only by the user who runs MOLT (permissions
0600), and log directories that MOLT creates are0700. Previously, log files were readable by all users. If another user or process reads MOLT log files, such as a log shipping agent running under its own account, run it as the same user as MOLT or asroot, or pass--log-file stdoutand capture the output. -
MOLT Fetch now fails when the tables selected from a PostgreSQL source include a parent table that uses table inheritance (
CREATE TABLE ... INHERITS), and the error names each parent and child table. Previously, MOLT Fetch reported success but loaded each child row twice: into the child table and again into the parent table. There is no override flag, so migrate inheritance hierarchies manually. Refer to Known limitations. -
When
--bucket-pathpoints to Amazon S3, MOLT Fetch no longer gets credentials from the AWS EC2 instance metadata service (IMDS) by default. This prevents multi-minute hangs on hosts outside AWS. If you run MOLT Fetch on EC2 and use the instance profile for credentials, setAWS_EC2_METADATA_DISABLED=false. Other credential sources, such as environment variables and the shared credentials file, still work. Refer to Cloud storage security. -
For Oracle sources, when
--oracle-application-usersis not set, MOLT Fetch now finds the application users automatically (users withORACLE_MAINTAINED='N') and checks only their active transactions when it chooses the replication start point (SCN). Previously, it checked the transactions of all users. On Oracle 11g, or if the MOLT user cannot queryALL_USERS, MOLT Fetch now fails unless you set--oracle-application-users. The flag still overrides the automatic list. -
MOLT now rejects an Oracle
--sourceconnection string whosecharsetparameter is notUTF-8orAL32UTF8. Previously, other values could corrupt character data or be ignored. MOLT Fetch also logs a warning when the Oracle source database character set is not Unicode. -
MOLT Verify now records telemetry, as MOLT Fetch already does. It writes run summary events to the MOLT log, and creates and writes to a
_molt_telemetry_runstable on the target database. Previously, MOLT Verify did not create or write tables on the target. Telemetry is on by default. To turn it off, pass--opt-out-telemetry. If MOLT Verify cannot write the table, it logs a warning and continues. MOLT does not send this telemetry over the network.
Enhancements
MOLT Fetch
-
Added the
--require-empty-targetflag. If set, then before it moves any data, MOLT Fetch checks that every target table in scope is empty, and stops if any table has rows. This flag cannot be combined with--table-handling truncate-if-exists,--table-handling drop-on-target-and-recreate,--fetch-id,--continuation-token, or--mode export-only. -
Added the
--dropped-constraints-fileand--dropped-indexes-fileflags. With--table-handling drop-on-target-and-recreate, MOLT Fetch writes the constraints and secondary indexes that it dropped to SQL files, so that you can recreate them after the data load. The files contain the source definitions, adjusted to CockroachDB syntax where needed (for example,LIKEin place of the PostgreSQL~~operator). Review the files before you run them. -
Added the
--flatten-partitioned-tablesflag for PostgreSQL sources. MOLT Fetch loads each declaratively partitioned table into one unpartitioned target table. With this flag,--table-filtermatches only the partitioned table’s name, not the names of its partitions. -
On PostgreSQL 13 and later, you can use
--flatten-partitioned-tableswith logical replication setup (--pglogical-replication-slot-name). With--pglogical-publication-and-slot-drop-and-recreate, MOLT Fetch creates the publication withpublish_via_partition_rootenabled. Otherwise, the existing publication must havepublish_via_partition_rootenabled and must include each partitioned table. -
Added the
--fail-on-no-tablesflag. MOLT Fetch exits with an error when no tables are left to migrate, for example because the filters match no tables or the tables are missing on the target. -
--assume-rolenow accepts CockroachDBASSUME_ROLEsyntax for Amazon S3, including an external ID (<role>;external_id=<id>) and comma-separated role chains. The new--import-assume-roleflag sets a different role chain forIMPORT INTO. It works only withs3://paths and requires--use-implicit-auth. -
MOLT Fetch now logs the progress of each
IMPORT INTOjob during the data load, including the job ID, status, and percent complete. -
After the data load, MOLT Fetch now advances each target sequence past the largest value it loaded, so the first insert after the migration no longer conflicts with a migrated row. To turn this off, pass
--skip-sequence-sync. -
With
--table-handling drop-on-target-and-recreate, MOLT Fetch now keeps explicit per-column collations when it creates target tables from a PostgreSQL source. For example,name text COLLATE "en_US.utf8"becomesname STRING COLLATE en_US. Previously, MOLT Fetch silently dropped these collations, which could change sort order, string comparison, and uniqueness on the target. Collations that CockroachDB cannot represent, such as custom collations, are dropped with a warning. -
When MOLT Fetch creates target tables, its column type warnings now name the column as
table.column. - For MySQL sources, MOLT Fetch now distinguishes between GTID being disabled and GTID being enabled with no transactions committed yet, and explains how to fix each case.
MOLT Verify
-
Added the
--fail-on-mismatchflag. MOLT Verify exits with a non-zero code when it finds missing or extra tables, table definition mismatches, or missing, mismatched, or extra rows. Tables that cannot be compared row by row (no primary key, or a primary key collation mismatch) are reported as warnings and do not cause a failure. With or without this flag, MOLT Verify now also exits with a non-zero code if it cannot finish comparing a table, for example because of a statement timeout. Previously, it logged the error and exited with code0, leaving rows unchecked. - MOLT Verify no longer reports false missing and extra rows when string primary keys use collations that sort differently on the source and on CockroachDB. It now logs a warning that the collation prevents verification, and skips row verification for that table.
-
MOLT Verify no longer reports CockroachDB’s hidden
rowidcolumn (added to tables without a primary key) or MOLT’s own tables (_molt_fetch_status,_molt_fetch_exceptions, and_molt_telemetry_runs) as mismatches. -
Column exclusions in a
--transformations-filenow work correctly in MOLT Verify. An excluded column that exists on both the source and the target is no longer reported as a mismatch, and exclusions also apply to columns that exist only on the target. In MOLT Fetch and MOLT Verify, anchored patterns (^and$) now match quoted identifiers, such as mixed-case column names. If an anchored pattern now matches a primary key column, MOLT Fetch and MOLT Verify stop with an error, because primary key columns cannot be excluded.
General
-
MOLT Fetch and MOLT Verify now read connection strings from the
MOLT_SOURCE,MOLT_TARGET, andMOLT_SOURCE_CDBenvironment variables, which correspond to--source,--target, and--source-cdb. A flag takes precedence over its variable. Use the variables to keep credentials out of the process list. Refer to Connection security. -
MOLT now prints a
HINT:line on stderr for each remediation hint attached to an error, such as theALTER PUBLICATIONstatements that MOLT Fetch suggests for a partitioned PostgreSQL source.
Security
- Connection string parse errors no longer print the connection string.
-
MOLT Fetch and MOLT Verify now log a warning when a PostgreSQL or CockroachDB connection with
sslmode=prefer(the default whensslmodeis not set) falls back to an unencrypted connection because the server refused TLS. - MOLT log files and directories now have restricted permissions. For details, refer to Breaking changes.
Oracle sources
-
Added the
--oracle-tablespace-filterflag to MOLT Fetch and MOLT Verify. It limits the run to Oracle tables in tablespaces that match a POSIX regular expression. -
Before it exports data, MOLT Fetch now checks the Oracle source’s redo and archive log settings. It stops on settings that would break replication, such as
NOARCHIVELOGmode or missing primary key supplemental logging, and logs warnings for weaker settings, such as single-member redo log groups or a short retention window. To skip the check, pass--ignore-replication-check. -
Added the
--oracle-narrow-snapshot-scn-by-table-touchflag. When it is set, MOLT Fetch moves the replication start point (SCN) later by checking only the active transactions that touch the tables being migrated. The flag requiresSELECTaccess toV$LOCKandALL_OBJECTS.
Data types
-
PostgreSQL sources: PostGIS
GEOMETRYandGEOGRAPHYcolumns are now supported, including when PostGIS is installed in a schema other thanpublic. Previously, these columns failed for PostgreSQL sources. Geometry values with a non-zero SRID (for example,4326) no longer cause a panic. -
PostgreSQL sources:
DOMAINcolumns (migrated as their base type),money,tsvector,tsquery, and pgvectorvector(migrated toVECTOR) are now supported. Built-in types that CockroachDB does not have, such as the geometric types,xml, andmacaddr, now migrate asSTRINGinstead of stopping the run, andcidrmigrates asINET. Arrays of these types and composite types can migrate asSTRINGwith a--type-map-fileentry. -
MySQL sources: MOLT Fetch and MOLT Verify now migrate spatial columns (
GEOMETRY,POINT,POLYGON, and others) to CockroachDBGEOMETRY. -
MOLT Fetch and MOLT Verify now support tables with a
TEXTprimary key on the source and aUUIDprimary key on the target. Previously, both skipped these tables.
Type map files
-
MOLT Fetch and MOLT Verify now apply
--type-map-filewhen they compare source and target column types, so an intended type override no longer stops the data load. MOLT Verify now accepts--type-map-file. Both reject a malformed file, and warn about entries that name a table that is not on the source. -
You can now map Oracle
NUMBERcolumns toINT2,INT4,INT8,FLOAT4, orFLOAT8with--type-map-file. MOLT rejects integer types for columns with a non-zero scale, and warns about possible precision loss for floating-point types.
Bug fixes
- Fixed a bug where, for a CockroachDB source, rows committed in the second before MOLT Fetch started could be left out of the initial data load.
-
Fixed a bug where, with
--pglogical-publication-and-slot-drop-and-recreateon a PostgreSQL source, a transaction committed while MOLT Fetch created the replication slot could be both copied and replicated, which could cause unique constraint failures during replication. The export now reads at the slot’s consistent point. MOLT Fetch now opens one additional replication connection to the source, so a connection pooler that rejects replication connections now rejects MOLT Fetch. MOLT Fetch also no longer ignores errors when it drops the previous slot, other than a slot that does not exist. -
Fixed a bug where, with a PostgreSQL 18 source and
--table-handling drop-on-target-and-recreate, MOLT Fetch warned that the recreated tables were missingNOT NULLconstraints. -
Fixed a bug where MOLT Fetch failed with
array element OID not registeredwhen migrating PostgreSQL enum array columns. -
Fixed a bug where Oracle tables with a
RAWprimary key lost rows in MOLT Fetch and showed false extra rows in MOLT Verify when the table spanned more than one batch. -
Fixed a bug where Oracle tables with a string primary key could fail with
ORA-00904in MOLT Fetch and MOLT Verify after the first batch. -
Fixed a bug where MOLT Fetch created
FLOAT4target columns for OracleFLOAT,REAL, andDOUBLE PRECISIONcolumns, which rounded double-precision values. When it creates target tables, MOLT Fetch now createsFLOAT8columns, and MOLT Verify expectsFLOAT8. -
Fixed a bug where MOLT Fetch dropped the time of day from Oracle
DATEvalues, and MOLT Verify did not report the loss. OracleDATEcolumns are now mapped to the CockroachDBTIMESTAMPtype, and fetching into an existingDATEcolumn fails if any value has a time of day. -
Fixed a bug where, when you resumed MOLT Fetch with
--fetch-id, a transient error while reading the earlier run’s failure records could cause MOLT Fetch to skip a table that had failed.
July 31, 2026
molt 1.4.3 is available:Enhancements
-
Stats-based sharding is now automatic for PostgreSQL sources. MOLT Fetch turns this on by default, so migrations from PostgreSQL are faster without any extra flags. Run
ANALYZEon your source tables first so the statistics are current. To turn it off, pass--use-stats-based-sharding=false. -
Oracle wallets for TLS connections are now supported. Use the new
--source-oracle-wallet-locationflag to connect to an Oracle source secured with SSL/TLS through an Oracle wallet.
Bug fixes
-
Fixed out-of-memory failures when fetching tables without a primary key.
molt fetch--direct-copy--skip-pk-checkno longer loads an entire table into memory before copying it. Rows are now streamed in batches, so very large tables (hundreds of millions of rows) migrate without running the host out of memory. -
Fixed errors being silently ignored while reading the source. Temporary errors while listing source tables or reading table details could previously be missed, letting
molt verifyandmolt fetchcontinue with an incomplete set of tables. These errors are now reported.
June 26, 2026
molt 1.4.2 is available:-
Fixed a bug where MOLT Fetch and MOLT Verify, run against a MySQL source with
--schema-filterset to anything other than.*, would silently filter out all tables, completing with zero rows migrated and a success (exit 0) status. The schema filter is now correctly reset for MySQL sources. -
MOLT Verify now honors
column_exclusionrules from a--transformations-file. Previously these rules were silently ignored, producing falsemissing column on targetwarnings for columns intentionally excluded during MOLT Fetch. -
MOLT Fetch now handles empty (0-row) tables in export-only to import-only workflows. Previously, an empty table produced no output during export, causing a subsequent import-only run to fail with a
no such file or directoryerror. Empty tables are now marked and skipped gracefully on import (from local filesystem, S3, GCP, and Azure). - MOLT Fetch now validates flag values at startup and reports all invalid flags at once, instead of failing one flag at a time across re-runs.
-
At the end of a
fetchrun, MOLT Fetch now prints the exact commands to drop the PostgreSQL logical replication slot and publication that it created on the source, since replication is complete and WAL no longer needs to be retained. -
Reduced per-object and per-batch log volume at default (
info) logging in MOLT Fetch and MOLT Verify for large migrations. Verbose per-table and per-batch progress is now logged atdebuglevel.
May 28, 2026
molt 1.4.1 is available:- MOLT Fetch now logs structured telemetry events. Opt out with the
--opt-out-telemetryflag. - MOLT Fetch no longer counts tables that cannot be migrated (no primary key or source/target collation mismatch) toward the
fetch completesummary’snum_tablesandtablesfields. Such tables are now reported separately in a newskipped_unmigratable_tablesfield.
April 30, 2026
molt 1.4.0 is available:- MOLT Verify now supports PostgreSQL declarative partitioned tables.
March 26, 2026
molt 1.3.7 is available:- Fixed a bug in MOLT Fetch v1.3.3-v1.3.6 where a transient error when scanning rows from the source database could cause retried queries to resume from an incorrect position, resulting in rows missing from the target database. Migrations from PostgreSQL and CockroachDB databases may have been exposed to this issue. Fetch retry attempts are recorded in the MOLT Fetch logs, and MOLT Verify will have detected any data discrepancies introduced by this bug.
February 26, 2026
molt 1.3.6 is available:- Added support for selective data verification on PostgreSQL and MySQL sources, allowing users to compare a subset of data from both source and target databases based on filter predicates.
- Fixed an issue where MOLT Fetch failed to copy data from PostgreSQL when numeric arrays contained negative values.
January 22, 2026
molt 1.3.5 is available:- Binary downloads now include version-compatible Grafana dashboards.
December 18, 2025
molt 1.3.4 is available:- Deprecated
data-load-and-replication,replication-only, andfailbackmodes in Fetch. Replication should now be performed separately with Replicator. Refer to the MOLT Replicator documentation. - Oracle-compatible MacOS builds are now available for arm64 and amd64. Refer to Installation.
- Fixed a bug where the
--filter-pathflag for MOLT Fetch was hidden.--filter-pathis now present for selective data movement in MOLT Fetch. - MOLT Fetch now logs a warning when
--schema-filteris used with MySQL sources, which do not support schemas. - Fixed a character escaping bug where MOLT Verify was incorrectly reporting mismatching rows for JSON data in MySQL.
- Added better edge case handling for cleaning up the target database after
IMPORTruns so that a fresh connection is opened, which mitigates against stale or already broken long-lived connections. - Added better logging to handle the case where the recreation of a connection fails during a retry.
- Removed fixup mode, live verify mode, and continuous verify mode from MOLT Verify, including the
--continuousand--continuous-pause-between-runsflags. - Fixed a bug in retry logic to cleanly exit (without hanging) when the context is canceled and report the proper error.
October 24, 2025
molt 1.3.2 is available:- MOLT Fetch replication modes are deprecated in favor of a separate replication workflow using
replicator. For details, refer to MOLT Replicator. - Added retry logic to the export phase for CockroachDB and PostgreSQL sources to handle transient errors while maintaining a consistent snapshot point. Not currently supported for Oracle or MySQL sources.
- Added
--export-retry-max-attemptsand--export-retry-max-durationflags to control retry behavior for source query exports.
September 25, 2025
molt 1.3.2 is available.-
MOLT Fetch replication modes will be deprecated in favor of a separate replication workflow in an upcoming release. This includes the
data-load-and-replication,replication-only, andfailbackmodes. - Fixed a bug with stats-based sharding where PostgreSQL queries were generated incorrectly when the first primary key column did not have sufficient unique values.
-
Fixed a bug in
escape-passwordwhere passwords that start with a hyphen were not handled correctly. Users must now pass the--passwordflag when runningescape-password. For example,molt escape-password --password 'a$52&'. - Added support for assume role authentication during data export with MOLT Fetch.
-
Added support to
replicatorfor retrying unique constraint violations on the target database, which can be temporary in some cases. -
Added exponential backoff to
replicatorfor retryable errors when applying mutations to the target database. This reduces load on the target database and prevents exhausting retries prematurely. The new replication flags--retryInitialBackoff,--retryMaxBackoff, and--retryMultipliercontrol backoff behavior. The new--maxRetriesflag configures the maximum number of retries. To retain the previous “immediate retry” behavior, set--retryMaxBackoff 1ns --retryInitialBackoff 1ns --retryMultiplier 1. -
Added support to
replicatorfor thesource_lag_seconds,target_lag_seconds,apply_mutation_age_seconds, andsource_commit_to_apply_lag_secondsmetrics for replication from PostgreSQL and MySQL, and introduced histogram metricssource_lag_seconds_histogramandtarget_lag_seconds_histogramfor replication from CockroachDB.source_lag_secondsmeasures the delay before data is ready to be processed byreplicator, whiletarget_lag_secondsmeasures the “end-to-end” delay untilreplicatorhas written data to the target. A steady increase insource_lag_secondsmay indicatereplicatorcannot keep up with the source workload, while a steady increase intarget_lag_secondsmay indicatereplicatorcannot keep up with the source workload or that writes on the target database are bottlenecked.
August 21, 2025
molt 1.3.1 is available.- MOLT Fetch now supports sharding of primary keys of any data type on PostgreSQL 11+ sources. This can be enabled with the
--use-stats-based-shardingflag. - Added the
--ignore-replication-checkflag to allow data loads with planned downtime and no replication setup. The--pglogical-ignore-wal-checkflag has been removed. - Added the
--enableParallelAppliesreplication flag to enable parallel application of independent table groups during replication. By default, applies are synchronous. When enabled, this increases throughput at the cost of increased target pool and memory usage. - Improved cleanup logic for scheduled tasks to ensure progress reporting and prevent indefinite hangs.
- Added parallelism gating to ensure the parallelism setting is smaller than the
targetMaxPoolSize. This helps prevent a potential indefinite hang. - Added new metrics that track start and end times for progress reports (
core_progress_reports_started_countandcore_progress_reports_ended_count) and error reports (core_error_reports_started_countandcore_error_reports_ended_count). These provide visibility into the core sequencer progress and help identify hangs in the applier and progress tracking pipeline. - Added new metrics
target_apply_queue_utilization_percentandtarget_apply_queue_depthto track target apply queue utilization, indicating when the queue should be resized. These metrics apply only to PostgreSQL, Oracle, and CockroachDB sources. - Oracle sources now support configurable backpressure between the source and target applier. The new
target_apply_queue_depthmetric tracks queue depth. - Improved visibility into queue depth between each source frontend and the backend applier to the target. Updated logging to use lower log levels with clearer, less alarming messages.
- Improved throughput for tables in the replication stream that have no dependencies on one another. This increases parallelism and minimizes blocking of transactions that are mutually independent.
- The best effort window is now disabled by default to prevent unexpected mode switches that could cause consistency issues or stall replication due to failed target applies.
Bug fixes
- Fixed a panic that could occur with
ENUMtypes.
July 24, 2025
molt 1.3.0 is available.- Oracle is now supported on Fetch Docker images and standalone binaries.
- Oracle is now supported on Replicator Docker images and standalone binaries.
- Azure Blob Storage is now supported as an intermediate data store for Fetch.
- Added a
--skip-pk-checkflag that lets you run the initial data load even when the source or target table is missing a primary key, or the keys do not match. When this flag is set, Fetch treats every table as keyless, disables sharding, and exports each table in a single batch, ignoringexport-concurrencyandrow-batch-size. Querying the entire table at once may lead to high memory usage or long-running queries. Duplicate source rows are automatically removed during import when the target has primary key or unique constraints. - Replication now uses checkpoint polling by default. This is because polling (which periodically queries the staging table for updates) performs comparably to checkpoint streaming (which uses an internal changefeed from the staging table to broadcast real-time updates). To use checkpoint streaming, set
--enableCheckpointStream.--disableCheckpointStreamis deprecated and should be removed from replication commands. - Replaced the
--copierChanneland--stageCopierChannelSizereplication flags with a single--targetApplyQueueSizeflag, which controls downstream apply throughput and memory usage. This feature applies only to CockroachDB and PostgreSQL (pglogical) sources. - Added support for compressed changefeed payloads, improving performance of changefeed-to-Replicator communication. This only affects failback workflows from CockroachDB v25.2 and later.
- Improved apply-side performance by switching to a faster JSON decoder.
- Improved batch-accumulation performance by removing unnecessary sorting.
Bug fixes
- Fixed a bug where some error logs were not displayed when replicating to the target database.
June 19, 2025
molt 1.2.7 is available.- Updated the MOLT Grafana dashboard with the following timing metrics to better diagnose performance: Source Side Queries, Convert Source Side Queries to Datums, Writing Datums to Pipe, Preparing CSV files to be uploaded, Uploading CSV files to S3/GCP/local.
- Upgraded the MOLT parser to support new syntax that is valid in CockroachDB v25.2.
- Added more granular replication counter metrics to track data counts at each stage of the mutation pipeline, helping to diagnose data correctness issues.
Bug fixes
- MOLT Fetch failback now reliably creates changefeeds with a sorted list of table names so that create changefeed operations can be properly deduplicated.
- Fixed an issue where shard connections failed to recognize custom types (e.g.,
ENUM) in primary keys during table migration. This occurred because the type map from the originalpgx.Connwas not cloned. The type map is now properly cloned and attached to each shard connection. - Fixed a bug that could cause an integer overflow, which impacts retrieving the correct shards for exporting data.
May 22, 2025
molt 1.2.6 is available.- Fixed a bug in
--direct-copymode that occurred when--case-sensitivewas set tofalse(default). Previously, theCOPYquery could use incorrect column names in some cases during data transfer, causing errors. The query now uses the correct column names. - Fixed a bug in how origin messages were handled during replication from PostgreSQL sources. This allows replication to successfully continue.
ENUMtypes can now be replicated from MySQL 8.0 sources.
April 25, 2025
molt 1.2.5 is available.- During data export, MOLT Fetch now treats empty
STRINGvalues on source Oracle databases asNULLvalues on the target database. This is because Oracle does not differentiate between emptySTRINGandNULLvalues.
April 7, 2025
molt 1.2.4 is available.- MOLT Fetch now supports PostgreSQL 11.
- MOLT Fetch failback to CockroachDB is now disallowed.
- MOLT Verify can now compare tables that are named differently on the source and target schemas.
- The
moltlogging date format is now period-delimited for Windows compatibility. - During replication, an index is now created on all tables by default, improving replication performance. Because index creation can cause the replication process to initialize more slowly, this behavior can be disabled using the
--stageDisableCreateTableReaderIndexreplication flag. - Added a failback metric that tracks the time to write a source commit to the staging schema for a given mutation.
- Added a failback metric that tracks the time to write a source commit to the target database for a given mutation.
February 26, 2025
molt 1.2.3 is available.- MOLT Fetch users can now set
--table-concurrencyand--export-concurrencyto values greater than1for MySQL sources. - MOLT Fetch now supports case-insensitive comparison of table and column names by default. Previously, case-sensitive comparisons could result in
no matching table on targeterrors. To disable case-sensitive comparisons explicitly, set--case-sensitive=false. If=is not included (e.g.,--case-sensitive false), this is interpreted as--case-sensitive(i.e.,--case-sensitive=true).
February 5, 2025
molt 1.2.2 is available.- Added an
--import-regionflag that is used to set theAWS_REGIONquery parameter explicitly in thes3URL. - Fixed the
truncate-if-existsschema mode for cases where there are uppercase table or schema names. - Fixed an issue with unsigned
BIGINTvalues overflowing in replication. - Added a
--schemaRefreshreplication flag that is used to configure the schema watcher refresh delay in the replication phase. Previously, the refresh delay was set to a constant value of 1 minute. Set the flag as follows:--replicator-flags "--schemaRefresh {value}".
December 13, 2024
molt 1.2.1 is available.- MOLT Fetch users now can use
--assume-roleto specify a service account for assume role authentication to cloud storage.--assume-rolemust be used with--use-implicit-auth, or the flag will be ignored. - MySQL 5.7 and later are now supported with MOLT Fetch replication modes.
- Fetch replication mode now defaults to a less verbose
INFOlogging level. To specifyDEBUGlogging, pass in the--replicator-flags '-v'setting, or--replicator-flags '-vv'for trace logging. - MySQL columns of type
BIGINT UNSIGNEDorSERIALare now auto-mapped toDECIMALtype in CockroachDB. MySQL regularBIGINTtypes are mapped toINTtype in CockroachDB. - The
pglogicalreplication workflow was modified in order to enforce safer and simpler defaults for thedata-load,data-load-and-replication, andreplication-onlyworkflows for PostgreSQL sources. Fetch now ensures that the publication is created before the slot, and thatreplication-onlydefaults to using publications and slots created either in previous Fetch runs or manually. - Fixed scan iterator query ordering for
BINARYandTEXT(of same collation) PKs so that they lead to the correct queries and ordering. - For a MySQL source in
replication-onlymode, the--stagingSchemareplicator flag can now be used to resume streaming replication after being interrupted. Otherwise, the--defaultGTIDSetreplicator flag is used to start initial replication after a previous Fetch run indata-loadmode, or as an override to the current replication stream.
October 29, 2024
molt 1.2.0 is available.- Added
failbackmode to MOLT Fetch, which allows the user to replicate changes on CockroachDB back to the initial source database. Failback is supported for MySQL and PostgreSQL databases. - The
--pprof-list-addrflag, which specifies the address of thepprofendpoint, is now configurable. The default value is'127.0.0.1:3031'. - Fetch modes involving replication now state that MySQL 8.0 and later are supported for replication between MySQL and CockroachDB.
- Partitioned tables can now be moved to CockroachDB using
IMPORT INTO. - Improved logging for the Fetch schema check phases under the
tracelogging level, which is set with--logging trace. - Added a sample Grafana dashboard for monitoring MOLT tasks.
- Fetch now logs the name of the staging database in the target CockroachDB cluster used to store metadata for replication modes.
- String primary keys that use
Ccollations on PostgreSQL can now be compared to the defaulten_US.utf8on CockroachDB. - MOLT is now distributed under the Cockroach Labs Product License Agreement, which is bundled with the binary.
August 26, 2024
molt 1.1.7 is available.- When a Fetch transformation rule is used to rename a table or map partitioned tables, a script in the format
partitionTableScript.{timestamp}.tsis now automatically generated to ensure that replication works properly if enabled.
August 19, 2024
molt 1.1.6 is available.- Fixed a Fetch bug where
--table-exclusion-filterwas ignored when--table-filterand--schema-filterwere set to the default ('.*').
August 15, 2024
molt 1.1.5 is available.- Deprecated the
--ongoing-replicationflag in favor of--mode data-load-and-replication, using the new--modeflag. Users should replace all instances of--ongoing-replicationwith--mode data-load-and-replication. - Fetch can now be run in an export-only mode by specifying
--mode export-only. This will export all the data incsvorcsv.gzformat to the specified cloud or local store. - Fetch can now be run in an import-only mode by specifying
--mode import-only. This will load all data in the specified cloud or local store into the target CockroachDB database, effectively skipping the export data phase. - Strings for the
--modeflag are now word-separated by hyphens instead of underscores. For example,replication-onlyinstead ofreplication_only.
August 8, 2024
molt 1.1.4 is available.- Added a replication-only mode for Fetch that allows the user to run ongoing replication without schema creation or initial data load. This requires users to set
--mode replication_onlyand--replicator-flagsto specify thedefaultGTIDSet( MySQL ) orslotName( PostgreSQL ). - Partitioned tables can now be mapped to renamed tables on the target database, using the Fetch transformations framework.
- Added a new
--metrics-scrape-intervalflag to allow users to specify their Prometheus scrape interval and apply a sleep at the end to allow for the final metrics to be scraped. - Previously, there was a mismatch between the errors logged in log lines and those recorded in the exceptions table when an
IMPORT INTOorCOPY FROMoperation failed due to a non-PostgreSQL error. Now, all errors will lead to an exceptions table entry that allows the user to continue progress from a certain table’s file. - Fixed a bug that will allow Fetch to properly determine a GTID if there are multiple
source_uuids.
July 31, 2024
molt 1.1.3 is available.'infinity'::timestampvalues can now be moved with Fetch.- Fixed an issue where connections were not being closed immediately after sharding was completed. This could lead to errors if the maximum number of connections was set to a low value.
- Fetch users can now exclude specific tables from migration using the
--table-exclusion-filterflag.
July 18, 2024
molt 1.1.2 is available.- Fetch users can now specify columns to exclude from table migrations in order to migrate a subset of their data. This is supported in the schema creation, export, import, and direct copy phases.
- Fetch now automatically maps a partitioned table from a PostgreSQL source to the target CockroachDB schema.
- Fetch now supports column exclusions and computed column mappings via a new transformations framework.
- The new Fetch
--transformations-fileflag specifies a JSON file for schema/table/column transformations, which has validation utilities built in.
July 10, 2024
molt 1.1.1 is available.- Fixed a bug that led to incorrect list continuation file behavior if a trailing slash was provided in
--bucket-path. - Fixed a bug with extracting the filename from a failed import URL. Previously, an older filename was being used, which could result in duplicated data. Now, the filename that is used in import matches what is stored in the exceptions log table.
- Added a
--use-implicit-authflag that determines whether implicit authentication is used for cloud storage import URIs.
July 8, 2024
molt 1.1.0 is available.- Fixed a bug where integer values for
JSONB/JSONtypes were not correctly handled when migrating from a PostgreSQL or CockroachDB source. - Optimized the logic for clearing continuation tokens. Now, the clearing option is only presented in the relevant modes and when there are tokens to clear.
- CockroachDB sources now exclusively accept connections from
adminorrootusers. - The statement timeout can now be adjusted during the export phase. This guards against hanging queries.
May 31, 2024
molt 1.0.0 is available.- Renamed the
--table-splitsflag to--concurrency-per-table, which is more descriptive. - Increased the default value of
--import-batch-sizeto1000. This leads to better performance on the target post-migration. Each individual import job will take longer, since more data is now imported in each batch, but the sum total of all jobs should take the same (or less) time.
May 29, 2024
molt 0.3.0 is available.- Added an
--import-batch-sizeflag, which configures the number of files to be imported in eachIMPORTjob. - In some cases on the previous version, binaries would not work due to how
moltwas being built. Updated the build method to use static linking, which creates binaries that should be more portable. VARBIT<>BOOLconversion is now allowed for Fetch and Verify. The bit array is first converted toUINT64. A resulting1or0is converted totrueorfalseaccordingly. If theUINT64is another value, an error is emitted.
May 20, 2024
molt 0.2.1 is available.- MOLT tools now enforce secure connections to databases as a default. The
--allow-tls-mode-disableflag allows users to override that behavior if secure access is not possible. - When using MySQL as a source,
--table-concurrencyand--export-concurrencyare strictly set to1. - Fixed a bug involving history retention for
DECIMALvalues.
May 3, 2024
molt 0.2.0 is available.- Fetch now supports CockroachDB multi-region tables.
- Fetch now supports continuous replication for PostgreSQL and MySQL source databases via the
--ongoing-replicationflag. When Fetch finishes the initial data load phase, it will start the replicator process as a subprocess, which runs indefinitely until the user ends the process with aSIGTERM(ctrl-c). - Replicator flags for ( PostgreSQL and MySQL ) are now supported, allowing users to further configure the
--ongoing-replicationmode for their use case. - Added the
--type-map-fileflag, which enables custom type mapping for schema creation. - Fixed a bug where primary key positions could be missed when creating a schema with multiple primary keys.
- Added a default mode for MySQL sources that ensures consistency and does not leverage parallelism. New text is displayed that alerts the user and links to documentation in cases where fetching from MySQL might not be consistent.
- Logging for continuation tokens is now omitted when data export does not successfully complete.
April 10, 2024
molt 0.1.4 is available.- Fixed an inconsistency where inserting
'null'as a string intoJSON/JSONBcolumns did not align with PostgreSQL’s case-sensitive null handling.
March 22, 2024
molt 0.1.2 is available.- Fixed a bug where running Verify with a PostgreSQL or CockroachDB source would cause an error when there are dropped columns on the table.
March 13, 2024
molt 0.1.1 is available.- An error is now displayed if the original column is a PostgreSQL nested array.
- Added sharded data export functionality for faster performance.
- Added support for the
--table-handling 'drop-on-target-and-recreate'flag for MySQL sources, enabling automatic schema recreation. - Added support for
ENUMdata types in schema creation. - Deprecated the
--s3-bucketand--gcp-bucketflags in favor of a single--bucket-pathflag.
February 22, 2024
molt 0.1.0 is available.- Added implicit authentication for GCP sources.
- Resolved a CSV write deadlock issue for large file exports.
- Added new dashboard metrics:
molt_verify_num_tables(categorizes tables asverified,missing, orextraneous) andmolt_verify_duration_ms(how long a Verify run took to complete, in milliseconds). - Previously, if a comparison between heterogeneous column types occurred, Verify would panic and stop execution. Now, Verify no longer panics, but records the error and reports it to logging, and also marks the row as having mismatching columns. The error message is logged at most once per shard to avoid log spewing. Additionally, introduced the concept of conditional success, which means that all comparable row columns were compared and succeeded with the same value. Upon conditional success, the user is instructed to check all warnings and verify the data.
- Marked the
--liveand--continuousflags as dependencies for other sub-configuration flags. If a flag is set without its dependency, MOLT will indicate which dependency flag is not correctly set. - Added the RFC for MOLT Fetch, which explains the architectural decisions and considerations of how Fetch was built. The RFC also outlines limitiations of the current system and further improvements around usability, performance, and integration with replication tools.
- Added logging annotations for data-level errors and information that surfaced during the Verify process, as well as summary status logs about the overall functioning of the job (e.g., 10000 truth rows seen, 5000 mismatches, etc.). These can be filtered so that exact tables and rows can be triaged in one place.
- Changed the output for the running summary statistics so that they are now more easily indexable by log processing tools. Previously, it was more human-readable, but fields were not easily indexable out of the box. Now, there is a balance between readability and downstream processing.
- Added tagging for summary and data logs so that users can filter the logs in a variety of log processing tools, or
grepin the command line. This solves the pain point of all the logs going to the same location without any differentiation. Now, it is possible to view types of logs one at a time. Summary logs report aggregated results on either a task or step in a task (e.g., task took 10 minutes; 500 tables processed overall). Data logs report on individual or row-level operations and quantitative markers (e.g., 1000 rows completed so far; failed to verify item with PK 1000) - Marked the
--s3-bucket,--gcp-bucket, and--local-pathflags as mutually exclusive because they all represent different intermediary stores. - Adjusted settings for the number of rows and the size of data to be flushed so that only one rule is applied at any given time.
- Fixed a bug where outputs containing special characters were not formatted correctly.
- When running the import query for Fetch, the import statement is now printed if the logger is in debug mode.
- Updated the MOLT README with an OS + Docker-based edge case with Fetch.
- Logging for Fetch and Verify now defaults to structured JSON logging, which contains at least the message, level, and formatted time string. The
--use-console-writerflag enables prettier console writing that has colored and human-readable log output. Structured logging is the default because it is easier to parse with log ingestion tools and is more efficient for the application to output. - Task/data logs can now be written to specified log files using
--log-file. If the flag is left empty, the MOLT tool will only write tostdout, which is more efficient.

