Skip to main content
The CREATE CHANGEFEED creates a new changefeed, which targets an allowlist of tables called “watched rows”. Every change to a watched row is emitted as a record in a configurable format (such as JSON, Avro, CSV, Parquet, or protobuf) to a or directly to the SQL session. When a changefeed emits messages to a sink, it works as a . You can create, pause, resume, , or cancel a changefeed job. To get started with changefeeds, refer to the page for important usage considerations. For details on how changefeeds emit messages, refer to the page. The examples on this page provide the foundational syntax of the CREATE CHANGEFEED statement. For examples on more specific use cases with changefeeds, refer to the following pages:
Cockroach Labs recommends monitoring your changefeeds to track and usage. Refer to the page for more information.

Required privileges

As of v25.1, viewing and managing a changefeed job by users with the CHANGEFEED privilege is deprecated. This functionality of the CHANGEFEED privilege will be removed in a future release.We recommend transitioning users that need to view and manage running changefeed jobs to that own the or them the VIEWJOB or CONTROLJOB privilege. For more details, refer to View and manage changefeed jobs.

Privilege model

For fine-grained access control, we recommend using the system-level privileges CHANGEFEED and CONTROLJOB / VIEWJOB.
The following summarizes the operations users can run depending on whether the assigned privileges are at the job or table level:

CHANGEFEED privilege

Viewing and managing changefeed jobs with the CHANGEFEED privilege is deprecated as of v25.1. Instead, transition users that need to view and manage running changefeed jobs to that own the or them the VIEWJOB or CONTROLJOB privilege. For more details, refer to View and manage changefeed jobs.
You can a user the CHANGEFEED privilege to allow them to create changefeeds on a specific table:
When you grant a user the CHANGEFEED privilege on a set of tables, they can create changefeeds on the target tables even if the user does not have the or the SELECT privilege on the tables. These users will be able to create changefeeds, but they will not be able to run a SELECT query on that data directly. However, they could still read this data indirectly if they have read access to the . You can add CHANGEFEED to the user or role’s with :
To restrict a user’s access to changefeed data and sink credentials, enable the changefeed.permissions.require_external_connection_sink.enabled cluster setting. When you enable this setting, users with the on a set of tables can only create changefeeds into .

View and manage changefeed jobs

Users can and manage changefeed jobs when one of the following are met:
  • Job ownership: They own the job, or are a member of a role that owns a job.
  • Global privileges: They are assigned .
To give a set of users access to a specific job, or set of jobs, assign them to a that owns the job(s). You can transfer ownership of a job to a role or user using the statement:

Synopsis

create_changefeed syntax diagram

Parameters

CDC query parameters

Change data capture queries allow you to define the change data emitted to your sink when you create a changefeed. See the page for detail on the functionality, syntax, and use cases for changefeeds created with queries.

Sink URI

To form the URI for each sink:
For more comprehensive detail of using and configuring each sink, refer to:
  • (in Preview)
  • / HTTP
You can create an external connection to represent a changefeed sink URI. This allows you to specify the external connection’s name in statements rather than the provider-specific URI. For detail on using external connections, see the page.

Query parameters

Parameters should always be URI-encoded before they are included the changefeed’s URI, as they often contain special characters. Use Javascript’s encodeURIComponent function or Go language’s url.QueryEscape function to URI-encode the parameters. Other languages provide similar functions to URI-encode special characters.
Query parameters include:

Options

Using the format=avro, envelope=key_only, and updated options together is rejected. envelope=key_only prevents any rows with updated fields from being emitted, which makes the updated option meaningless.

Files

The files emitted to a sink use the following naming conventions:
The timestamp format is YYYYMMDDHHMMSSNNNNNNNNNLLLLLLLLLL.

General file format

For example:
When emitting changefeed messages to a , you can specify a partition format for your files using the partition_format query parameter. This will result in the following file path formats:
  • daily: This is the default option and will follow the same pattern as the previous general file format.
  • hourly: This will partition into an hourly directory as the changefeed emits messages, like the following:
  • flat: This will result in no file partitioning. The cloud storage path you specify when creating a changefeed will store all of the message files with no additional directories created.

Resolved file format

For example:

Examples

Before running any of the examples in this section it is necessary to . If you are working on a CockroachDB Standard or Basic cluster, this cluster setting is enabled by default. The following examples show the syntax for managing changefeeds and starting changefeeds with different use cases and features. The Options table on this page provides a list of all the available options. For information on sink-specific query parameters and configurations, refer to the page. You can create an external connection to represent a changefeed sink URI. This allows you to specify the external connection’s name in statements rather than the provider-specific URI. For detail on using external connections, see the page. We recommend limiting the number of changefeeds per cluster to 80.

Create a changefeed connected to a sink

You can connect a changefeed to the following sinks:
  • (in Preview)
  • / HTTP

Create a changefeed that filters and transforms change data

can filter and transform change data before emitting it to a sink or a SQL client. You can adapt a changefeed with CDC queries by including SELECT and WHERE clauses in your CREATE statement:
CDC queries can only run on a single table per changefeed.

Create a sinkless changefeed

You can create a changefeed that will send messages to the SQL client rather than a sink:
To create a sinkless changefeed using :

Use an external connection to specify a changefeed sink

provide a way to define a name for a sink, which you can use instead of the provider-specific URI. To restrict a user’s access to changefeed data and sink credentials, enable the changefeed.permissions.require_external_connection_sink.enabled cluster setting. When you enable this setting, users with the on a set of tables can only create changefeeds into . External connections support all changefeed sinks.
In the changefeed statement, you specify the external connection name:

Filter changefeeds for tables using row-level TTL

Use the ttl_disable_changefeed_replication table storage parameter to prevent changefeeds from sending DELETE messages issued by row-level TTL jobs for a table. Include the storage parameter when you create or alter the table. For example:
You can also widen the scope to the cluster by setting the sql.ttl.changefeed_replication.disabled to true. This will prevent changefeeds from emitting deletes issued by all TTL jobs on a cluster. If you want to have a changefeed ignore the storage parameter or cluster setting that disables changefeed replication, you can set the changefeed option ignore_disable_changefeed_replication to true:
This is useful when you have multiple use cases for different changefeeds on the same table. For example, you have a table with a changefeed streaming changes to another database for analytics workflows in which you do not want to reflect row-level TTL deletes. Secondly, you have a changefeed on the same table for audit-logging purposes for which you need to persist every change through the changefeed. For guidance on how to filter changefeed messages to emit deletes only, refer to .

Disallow schema changes on tables to improve changefeed performance

Use the schema_locked to indicate that a is not currently ongoing on a watched table. This allows the changefeed to take a fast path that avoids checking if there are schema changes that could require synchronization between . This helps to decrease the latency between a write committing to a table and it emitting to the . Enable schema_locked on the watched table with the statement:
CockroachDB attempts to automatically unset schema_locked before performing a schema change and reapply it when done. However, certain schema changes (such as ALTER TABLE... SET LOCALITY) cannot automatically unset it. For these cases, you must manually unlock the table with schema_locked = false, complete the schema change, and then lock the table again with schema_locked = true. The changefeed will run as normal while schema_locked is unset, but it will not benefit from the performance optimization.

Manage a changefeed

For changefeed jobs, use to check the status:
Use the following SQL statements to pause, resume, or cancel a changefeed.

Pause a changefeed

For more information, see .

Resume a paused changefeed

For more information, see .

Cancel a changefeed

For more information, see .

Modify a changefeed

To modify a changefeed, the job and then use:
You can add new table targets, remove them, set new , and unset them. For more information, see .

Configuring all changefeeds

It is useful to be able to pause all running changefeeds during troubleshooting, testing, or when a decrease in CPU load is needed. To pause all running changefeeds:
This will change the status for each of the running changefeeds to paused, which can be verified with . To resume all running changefeeds:
This will resume the changefeeds and update the status for each of the changefeeds to running.

Start a new changefeed where another ended

In some situations, you may want to start a changefeed where a previously running changefeed ended. For example, a changefeed could encounter an error it cannot recover from, such as when a , and you need to restart the changefeed.
  1. Use to find the for the ended changefeed:
If a changefeed has failed, you must restart the changefeed from a timestamp after the event that caused the failure.
  1. Use the high_water_timestamp to start the new changefeed:
When you use the cursor option to start a changefeed, it will not perform an initial scan.

Create a changefeed with an S3 storage class

To associate the changefeed message files with a in your Amazon S3 bucket, use the S3_STORAGE_CLASS parameter with the class. For example, the following S3 connection URI specifies the INTELLIGENT_TIERING storage class:
Use the parameter to set one of these storage classes listed in Amazon’s documentation. For more general usage information, see Amazon’s Using Amazon S3 storage classes documentation.

Define a key to determine the changefeed sink partition

With the key_column option, you can define the key used in message metadata that determines the partition for the changefeed message at your . This option overrides the default :
key_column does not preserve ordering of messages from CockroachDB to the downstream sink, therefore you must include the unordered option. It does not affect per-key or the output of key_in_value.

See also