Skip to main content

MySQL Batch Query Connector

This connector captures data from MySQL databases into Estuary collections by periodically executing queries and translating the results into JSON documents.

When to use this connector​

We recommend using our MySQL CDC Connector instead when possible. CDC provides lower latency data capture, delete and update events, and typically has a smaller impact on the source database.

However, the batch connector is the right choice when:

  • Your MySQL instance doesn't support binary log replication (e.g., some managed services)
  • You need to capture from database views
  • You want to execute ad-hoc or custom queries
  • You need to capture from a read replica that doesn't have binary logging enabled

Supported versions and platforms​

This connector works with all supported MySQL versions on major cloud platforms (including Amazon RDS and Aurora, Google Cloud SQL, Azure Database for MySQL, and other managed services), as well as self-hosted instances.

Configuration Tip

To capture data from databases hosted on your internal network, you may need to use SSH tunneling. If you have a private deployment, you can also use private cloud networking features to reach your database.

Prerequisites​

You'll need:

  • A MySQL database with a user that has SELECT permission on the tables you want to capture
  • Network access to the database (direct or via SSH tunnel)

Setup​

Creating a capture user​

We recommend creating a dedicated user for Estuary captures:

CREATE USER flow_capture IDENTIFIED BY 'secret';

Grant read permissions on the tables you want to capture:

-- Grant SELECT on a specific database
GRANT SELECT ON my_database.* TO flow_capture;

-- Or grant SELECT on all databases
GRANT SELECT ON *.* TO flow_capture;

Replace my_database with the name of your database, or grant permissions on multiple databases as needed.

Usage​

Query behaviors​

The connector executes queries periodically to capture data. It defaults to a built-in query template which supports three patterns of use:

  • Full-refresh (no cursor): The entire table/view is re-read on each poll.
  • Cursor-incremental: Captures rows where the cursor has advanced since we last polled, according to WHERE cursor > $lastValue ORDER BY cursor.
  • Custom query: Override the built-in template to execute arbitrary SQL. This may be useful for filtering, aggregations, or subsets of your data.

Common cursor choices:

  • Update timestamps: Best when available, as they capture both new rows and updates
  • Creation timestamps: Work for append-only tables but won't detect updates
  • Auto-incrementing IDs: Work for append-only tables but won't detect updates

When no cursor is configured, the entire table or view is re-read on each poll.

Data Volume Consideration

Full-refresh bindings re-capture all data on each poll, which can generate significant data volumes. A few megabytes polled every hour adds up to gigabytes per day. Use cursors or longer polling intervals to manage data volume when capturing views or tables without suitable cursors.

Polling schedule​

The connector executes queries on a configurable schedule, which may be set at the capture level and/or overridden on a per-binding basis. When unset, the schedule defaults to polling every 24 hours.

Polling intervals are written as strings in one of two formats:

  • Interval format: 5m (5 minutes), 1h (1 hour), 24h (24 hours), etc
  • Time-of-day format: daily at 12:34Z (daily at 12:34 UTC)
    • Time-of-day polling schedules must specify the time in UTC with the 'Z' suffix. Other timezones or offsets are not currently supported.

Collection keys​

Discovered tables with primary keys will use them as their collection keys. Tables without a primary key use /_meta/row_id as the collection key.

When a full-refresh binding outputs to a collection keyed by /_meta/row_id, the connector can infer deletions: if a refresh yields fewer rows than the previous poll, deletion documents are emitted for the missing row IDs.

Configuration​

Configure this connector in the Estuary web app or using YAML config files with flowctl CLI. See connectors to learn more about using connectors.

Endpoint Properties​

PropertyTitleDescriptionTypeRequired/Default
/addressServer AddressThe host or host:port at which the database can be reached.stringRequired
/userUserThe database user to authenticate as.stringRequired, "flow_capture"
/passwordPasswordPassword for the specified database user.stringRequired
/advancedAdvanced OptionsOptions for advanced users. You should not typically need to modify these.object
/advanced/pollDefault Polling ScheduleWhen and how often to execute fetch queries. Accepts a Go duration string like '5m' or '6h' for frequency-based polling, or a string like 'daily at 12:34Z' to poll at a specific time (specified in UTC) every day.string"24h"
/advanced/discover_viewsDiscover ViewsWhen set, views will be automatically discovered as resources. If unset, only tables will be discovered.booleanfalse
/advanced/discover_schemasDiscovery Schema SelectionIf this is specified, only tables in the selected schema(s) will be automatically discovered. Omit all entries to discover tables from all schemas.array[]
/advanced/dbnameDatabase NameThe name of database to connect to. In general this shouldn't matter. The connector can discover and capture from all databases it's authorized to access.string
/advanced/source_tagSource TagWhen set, the capture will add this value as the property 'tag' in the source metadata of each document.string
/advanced/sslmodeSSL ModeControls whether connections use TLS and whether the server's certificate is verified. One of disabled, preferred, required, verify_ca, or verify_identity. See TLS and certificate verification. Defaults to preferred when unset.string
/advanced/ssl_server_caSSL Server CAPEM-encoded certificate authority the server certificate must chain to. Required for verify_ca. Optional for verify_identity, where the system root certificates are used when unset.string
/advanced/ssl_client_certSSL Client CertificateOptional PEM-encoded client certificate to present to the server for mutual TLS.string
/advanced/ssl_client_keySSL Client KeyPEM-encoded private key for the SSL Client Certificate.string
/networkTunnelNetwork TunnelConnect to your system through an SSH server that acts as a bastion host for your network.object

Binding Properties​

PropertyTitleDescriptionTypeRequired/Default
/nameResource NameThe unique name of this resource.stringRequired
/schemaSchema NameThe name of the schema in which the captured table lives. Must be set unless using a custom template.string
/tableTable NameThe name of the table to be captured. Must be set unless using a custom template.string
/cursorCursor ColumnsThe names of columns which should be persisted between query executions as a cursor.array[] (full-refresh)
/pollPolling ScheduleWhen and how often to execute the fetch query (overrides the connector default setting). Accepts a Go duration string like '5m' or '6h' for frequency-based polling, or a string like 'daily at 12:34Z' to poll at a specific time (specified in UTC) every day.string
/templateQuery Template OverrideOptionally overrides the query template which will be rendered and then executed.string

Sample​

captures:
${PREFIX}/${CAPTURE_NAME}:
endpoint:
connector:
image: ghcr.io/estuary/source-mysql-batch:v1
config:
address: host:port
user: flow_capture
password: secret
bindings:
- resource:
name: main_orders
schema: main
table: orders
target: ${PREFIX}/${COLLECTION_NAME}

TLS and certificate verification​

By default the connector encrypts its connection with TLS when the server supports it, but does not verify the server's certificate. To protect against an attacker impersonating your database server, set the sslmode advanced option to one of the verifying modes:

  • verify_ca checks that the server certificate is signed by the CA you paste into ssl_server_ca, without checking the hostname. Use this when connecting by IP address, or when the certificate's name doesn't match the address you connect to.
  • verify_identity additionally checks that the certificate is valid for the configured server hostname. If your server uses a certificate from a public CA you can leave ssl_server_ca empty; otherwise paste the CA that issued the certificate.

Both modes work when connecting through an SSH network tunnel, because the certificate is checked against the configured server address rather than the tunnel endpoint.

required enforces TLS without verifying the server, preferred falls back to an unencrypted connection when TLS fails, and disabled never uses TLS.

Type mapping​

MySQL types are mapped to JSON types as follows:

MySQL TypeJSON TypeNotes
TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT, BITinteger
FLOAT, DOUBLEnumber
DECIMAL, NUMERICstringFormatted as number string with format number to preserve precision
CHAR, VARCHAR, TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXTstring
BINARY, VARBINARY, TINYBLOB, BLOB, MEDIUMBLOB, LONGBLOBstringBytes encoded as base64 string
ENUM, SETstring
DATEstring
DATETIME, TIMESTAMPstring
TIMEstring
YEARinteger
JSONNative JSONPassed through without modification

Query templates​

Query templates use Go's template syntax to generate SQL queries. The connector uses a default template which implements appropriate behavior for full-refresh and cursor-incremental bindings, but you can override this for custom behavior.

Overriding the query template is best left to power-users or done at the direction of Estuary support. Consult the connector source for the current text of the default template.