Exports
What exports do#
An export job reads a table or a read-only SELECT from a database
connector, formats the rows as files, and writes them to a storage connector on
a schedule. Use it for partner hand-offs, archival snapshots, and feeding
downstream tools that want files rather than a database session.
Exports are the mirror image of file ingestions: same storage connectors, opposite direction.
Before you begin#
- Role. A viewer can read export jobs and run history. An editor is required to create or edit a job — and also to use Validate SQL and Preview, because both execute against the source database.
- A source connector: Postgres, CockroachDB, MySQL, or SingleStore.
- A destination connector: local, S3, Azure Blob, GCS, FTP, or FTPS.
Warning. MariaDB appears in the source picker but is not supported. Saving a MariaDB-sourced export always fails with
source engine 'mariadb' is not a supported export source yet. Export from a supported engine, or replicate the data first.
The builder#
Four steps: Source → Format → Destination → Schedule & review.
Step 1 — Source#
| Field | Notes |
|---|---|
| Name | Identifies the job, and feeds the {name} filename token. |
| Source connector | Postgres, CockroachDB, MySQL, or SingleStore. |
| Source type | A table or A custom SQL query. |
| Table | Table picker, when the source type is a table. |
| SQL query | A read-only SELECT. Statements that modify data are rejected. |
For a custom query, press Validate SQL before continuing. It checks the statement against the live connector and reports the resulting columns, so you catch a typo or a missing schema qualifier before the first scheduled run.
SELECT order_id, customer_id, order_total, ordered_at
FROM sales.orders
WHERE ordered_at >= CURRENT_DATE - INTERVAL '7 days'
Step 2 — Format#
| Field | Values |
|---|---|
| Format | CSV, JSON Lines (.jsonl), JSON array, Parquet. |
| Compression | none, gzip, or snappy. |
Compression rules:
snappyis valid for Parquet only. Choosing it with any other format is rejected.gzipappends.gzto the filename — except on Parquet, which carries its compression codec internally and keeps the.parquetextension.
Preview runs the configured SELECT with LIMIT 50 and shows a sample.
It writes nothing to the destination — it is safe to run repeatedly while
you tune the query, and it requires the editor role because it queries the
source.
Step 3 — Destination#
| Field | Notes |
|---|---|
| Destination connector | local, S3, Azure Blob, GCS, FTP, or FTPS. |
| Bucket | S3 only. |
| Path | The folder files are written to, for example exports/orders/. |
| Filename template | See the token table below. |
| Rows per file | Splits the result across multiple files. |
| Mode | Full, Incremental, or Partitioned. |
Filename template
The template accepts exactly three tokens — no others are substituted:
| Token | Expands to | Example |
|---|---|---|
{name} |
The export job's name. | orders_weekly |
{ts} |
The run's UTC timestamp. | 20260730T021500Z |
{part} |
The file's sequence number, 4-digit zero-padded. | 0001 |
A typical template:
{name}_{ts}_{part}.csv
Always include {part} when Rows per file is set — without it every part
overwrites the last.
Modes
| Mode | Behaviour | Requires |
|---|---|---|
| Full | Exports the whole result every run. | — |
| Incremental | Exports only rows added since the last run. | An increasing column (a monotonically increasing id or timestamp). |
| Partitioned | Writes one file per date, laid out as column=YYYY-MM-DD under the path. |
The partition column. |
An empty result still writes one header-only file, so downstream consumers see a file every cycle rather than an ambiguous silence.
Step 4 — Schedule and review#
| Schedule | Notes |
|---|---|
| Manual | Runs only when someone presses Run now. |
| Hourly | Every hour. |
| Daily at a time | You choose the time of day. |
| Weekly on chosen days | You choose the days and the time. |
| Custom cron | A 5-field cron expression. |
Note. All schedule times are UTC, including the daily and weekly time pickers and any cron expression. Convert from local time before entering it.
Running an export#
Run now lives on the exports list page, not on the job's detail page.
A disabled job cannot be run:
export is disabled; enable it before running
Enable the job from the list, then run it.
Run history#
Each run records:
| Column | Meaning |
|---|---|
| Status | Success or failure. |
| Started | Run start time. |
| Duration | Wall-clock time of the run. |
| Rows | Rows exported. |
| Size | Total bytes written. |
| Files | Number of files produced. |
Open a run to see its log lines and the path of every file it wrote — the quickest way to confirm where a partner's data actually landed.
A retry does not overwrite the original run: it creates a new run row with an incremented attempt number, so the failure and the recovery both stay in the history.
Deleting an export#
Deleting is a soft delete: the job disappears from the list and stops running, and its history is retained. Ask your administrator if you need a deleted job restored — see Retention.
Field reference#
| Field | Step | Values / default |
|---|---|---|
| Name | 1 | Feeds the {name} token. |
| Source connector | 1 | Postgres, CockroachDB, MySQL, SingleStore. MariaDB is rejected on save. |
| Source type | 1 | A table, or a custom read-only SELECT. |
| Validate SQL | 1 | Editor role; runs against the source. |
| Format | 2 | CSV, JSON Lines (.jsonl), JSON array, Parquet. |
| Compression | 2 | none, gzip, snappy (Parquet only). |
| Preview | 2 | LIMIT 50; writes nothing; editor role. |
| Destination connector | 3 | local, S3, Azure Blob, GCS, FTP, FTPS. |
| Bucket | 3 | S3 only. |
| Path | 3 | Destination folder. |
| Filename template | 3 | Tokens {name}, {ts}, {part} only. |
| Rows per file | 3 | Splits output into parts. |
| Mode | 3 | Full, Incremental (increasing column), Partitioned (column=YYYY-MM-DD). |
| Schedule | 4 | Manual, Hourly, Daily at a time, Weekly on days, custom 5-field cron — UTC. |
Failure modes#
| What you see | Cause | Fix |
|---|---|---|
source engine 'mariadb' is not a supported export source yet |
The source connector is MariaDB. | Use Postgres, CockroachDB, MySQL, or SingleStore. |
export is disabled; enable it before running |
Run now was pressed on a disabled job. | Enable the job on the list page, then run it. |
| Compression rejected | snappy was chosen with a non-Parquet format. |
Use gzip or none, or switch the format to Parquet. |
| Validate SQL fails | The statement is not a read-only SELECT, or a table/column is missing or unqualified. |
Qualify names with the schema and remove any data-modifying statement. |
| Every run writes one file that overwrites the previous | {ts} and {part} are missing from the filename template. |
Add both tokens. |
| Only part of the data is exported | The job is in Incremental mode and the increasing column is not actually increasing. | Pick a monotonic id or timestamp, or switch to Full. |
| A file appears with headers and no rows | Expected behaviour — an empty result still writes one header-only file. | None; treat it as "no new data". |
| A run appears to have run at the wrong hour | Schedules are UTC, not local time. | Recalculate the time from UTC. |
Related pages#
- Data connectors
- File ingestions — files in, rather than out.
- Schedules and Executions
- Retention