Introduction
The PowerSync protocol is schemaless, and not directly affected by schema changes. Replicating data from the source database to buckets may be affected by server-side changes to the schema (in the case of Postgres), and may need reprocessing in some cases. The client-side schema is just a view on top of the schemaless data. Updating this client-side schema is immediate when the new version of the app runs, with no client-side migrations required. The developer is responsible for keeping client-side schema changes backwards-compatible with older versions of client apps. PowerSync has some functionality to assist with this:- Different stream queries can be applied based on connection parameters such as client version. (In Sync Rules, this uses client parameters.)
- Stream queries can apply simple data transformations to keep data in a format compatible with older clients, for example by aliasing or casting columns. (In Sync Rules, this is done via data query expressions.)
Client-Side Impact of Schema and Sync Config Changes
As mentioned above, the PowerSync system itself is schemaless — the client syncs any data as received, in JSON format, regardless of the data model on the client. The schema as supplied on the client is only a view on top of the schemaless data.- If tables/collections not described by the client-side schema are synced, it is stored internally, but not accessible.
- Same applies for columns/fields not described by the client-side schema.
-
When there is a type mismatch, SQLite’s
CASTfunctionality is used to cast to the type described by the schema.- Data is internally stored as JSON.
-
SQLite’s
CASTis used to cast values toTEXT,INTEGERorREAL. -
Casting between types should never error, but it may not fully represent the original data. For example, casting an arbitrary string to
INTEGERwill likely result in a “0” value. - Full rules for casting between types are described in the SQLite documentation here.
- Removing a table/collection is handled on the client as if the table exists with no data.
-
Removing a column/field is handled on the client as if the values are
undefined.
Postgres Specifics
PowerSync keeps the buckets up to date with any incremental data changes, as recorded in the Postgres WAL / received in the logical replication stream. This is also referred to as DML (Data Manipulation Language) queries. However, this does not include DDL (Data Definition Language), which includes:- Creating, dropping or renaming tables.
- Changing replica identity of a table.
- Adding, dropping or renaming columns.
- Changing the type of a column.
Postgres Schema Changes Affecting Sync Streams
DROP table
Dropping a table is not directly detected by PowerSync, and previous data may be preserved. To make sure the data is removed,TRUNCATE the table before dropping, or remove the table from your Sync Streams (or legacy Sync Rules).
CREATE table
The new table is detected as soon as data is inserted.DROP and re-CREATE table
This is a special case of combiningDROP and CREATE. If a dropped table is created again, and data is inserted into the new table, the schema change is detected by PowerSync. PowerSync will delete the old data in this case, as if TRUNCATE was called before dropping.
RENAME table
A renamed table is handled similarly to dropping the old table, and creating a new table with the new name. The rename is only detected when data is inserted, updated or deleted to the new table. At this point, PowerSync effectively does aTRUNCATE of the old table, and replicates the new table.
This may be a slow operation if the table is large, and all other replication will be blocked until the new table is replicated.
Change REPLICA IDENTITY
The replica identity of a table is considered changed if either:-
The type of replica identity changes (
DEFAULT,INDEX,FULL,NOTHING). - The name or type of columns part of the replica identity changes.
-
Using
REPLICA IDENTITY FULL, and any column is added, removed, renamed, or the type changed. -
Using
REPLICA IDENTITY DEFAULT, and the type of any column in the primary key is changed. -
Using
REPLICA IDENTITY INDEX, and the type of any column in the replica index is changed. - The primary key or replica index is removed or changed.
Column Changes
Column changes such as adding, dropping, renaming columns, or changing column types, are not automatically detected by PowerSync (unless it affects the replica identity as described above). Adding a column with aNULL default value will generally not cause issues. Existing records will have a missing value instead of NULL value, but those are generally treated the same on the client.
Adding a column with a different default value, whether it’s a static or computed value, will not have this default automatically replicated for existing rows. To propagate this value, make an update to every existing row.
Removing a column will not have the values automatically removed for existing rows on PowerSync. To propagate the change, make an update to every existing row.
Changing a column type, and/or changing the value of a column using an ALTER TABLE statement, will not be automatically replicated to PowerSync. In some cases, the change will have no effect on PowerSync (for example changing between VARCHAR and TEXT types). When the values are expected to change, make an update to every existing row to propagate the changes.
Publication Changes
A table is not replicated unless it is part of the powersync publication. If a table is added to the publication, it is treated the same as a new table, and any existing data is replicated. This may be a slow operation if the table is large, and all other replication will be blocked until the new table is replicated. There are additional changes that can be made to a table in a publication:- Which operations are replicated (insert, update, delete and truncate).
- Which rows are replicated (row filters).
MongoDB Specifics
Since MongoDB is schemaless, schema changes generally do not impact PowerSync. However, adding, dropping, and renaming collections require special consideration.Adding Collections
Sync Streams/Sync Rules can include collections that do not yet exist in the source database. These collections will be created in MongoDB when data is first inserted. PowerSync will begin replicating changes as they occur in the source database.Dropping Collections
Due to a limitation in the replication process, dropping a collection does not immediately propagate to synced clients. To ensure the change is reflected, any additionalinsert, update, replace, or delete operation must be performed in any collection within a synced database.
Renaming Collections
Renaming a synced collection to a name that is not included in Sync Streams (or legacy Sync Rules) has the same effect as dropping the collection. Renaming an unsynced collection to a name that is included in your Sync/Streams/Sync Rules triggers an initial snapshot replication. The time required for this process depends on the collection size. Circular renames (e.g., renamingtodos → todos_old → todos) are not directly supported. To reprocess the database after such changes, a Sync Streams/Sync Rules update must be deployed.
Convex Specifics
For Convex, most schema changes are document-shape changes rather than DDL events. PowerSync reads the JSON documents returned by Convex snapshots and document deltas, not Convex schema metadata, so added fields and type changes are replicated through normal Convex writes. Convex tables use_id as the replication identity for PowerSync. There is no source-specific primary key or replica identity definition to track.
Convex validates schema changes against existing data. If you change a field type, use Convex’s migration pattern: add or allow the new shape, update existing documents with mutations, then tighten the schema once the data has moved. Convex often recommends writing migrated values to a new field for this flow. Those mutation updates should appear in document_deltas and replicate like other writes.
You do not need to redeploy your Sync Config or re-snapshot merely because a field was added to Convex. New fields selected by your existing Sync Streams are replicated as they appear in Convex documents.
If you remove a field, first make it optional in your Convex schema, then run a migration that removes the field from existing documents, and only then remove it from the schema. PowerSync stops replicating new values for that field after the data stops containing it. Previously synced values can remain on clients until the affected data is reprocessed.
A re-snapshot is still required for cases that change the selected data set or invalidate the source cursor. This includes initial replication, a Sync Streams deployment that selects new existing data, restarting an incomplete initial snapshot, or recovering from a lost or expired Convex cursor.
Dropping Tables
Dropping Convex tables has a known limitation. Deleting a table from the Convex dashboard does not emit per-document delete rows indocument_deltas, so PowerSync does not automatically remove previously synced rows for that table.
To decommission a table while preserving replication correctness, clear the table before deleting it. In the Convex dashboard, use Clear Table first, then delete the table after those document removals have replicated. Deleting documents through Convex mutations is also valid when that path emits document delete deltas. Otherwise, treat dashboard table deletion or schema-only table removal as a Sync Config deployment change and clear or re-replicate affected PowerSync state.
MySQL Specifics
MySQL support is currently in a Beta release.
- Creating, dropping or renaming tables.
- Truncating tables. (Not technically a schema change, but they appear in the query updates regardless.)
- Changing replica identity of a table. (Creation, deletion or modification of primary keys, unique indexes, etc.)
- Adding, dropping, renaming or changing the types of columns.
MySQL Schema Changes Affecting Sync Streams
DROP table
PowerSync will detect when a table is dropped, and automatically remove the data from the buckets.CREATE table
Table creation is detected and handled the first time row events for the new table appear on the binary log.TRUNCATE table
PowerSync will detect truncate statements in the binary log, and consequently remove all data from the buckets for that table.RENAME table
A renamed table is handled similarly to dropping the old table, and then creating a new table with existing data under the new name. This may be a slow operation if the table is large, since the “new” table has to be re-replicated. Replication will be blocked until the new table is replicated.Change REPLICA IDENTITY
The replica identity of a table is considered to be changed if either:-
The type of replica identity changes (
DEFAULT,INDEX,FULL,NOTHING). - The name or type of columns which form part of the replica identity changes.
-
Using
REPLICA IDENTITY FULL, and any column is added, removed, renamed, or the type changed. -
Using
REPLICA IDENTITY DEFAULT, and the type of any column in the primary key is changed. -
Using
REPLICA IDENTITY INDEX, and the type of any column in the replica index is changed. - The primary key or replica index is removed or changed.
Column Changes
Column changes such as adding, dropping, renaming columns, or changing column types, are detected by PowerSync but will generally not result in re-replication. (Unless the replica identity was affected as described above). Adding a column with aNULL default value will generally not cause issues. Existing records will have a missing value instead of NULL value, but those are generally treated the same on the client.
Adding a column with a different default value, whether it’s a static or computed value, will not have this default automatically replicated for existing rows. To propagate this value, make an update to every existing row.
Removing a column will not have the values automatically removed for existing rows on PowerSync. To propagate the change, make an update to every existing row.
Changing a column type, and/or changing the default value of a column using an ALTER TABLE statement, will not be automatically replicated to PowerSync.
In some cases, the change will have no effect on PowerSync (for example, changing between VARCHAR and TEXT types). When the values are expected to change, make an update to every existing row to propagate the changes.
SQL Server Specifics
SQL Server support is currently in a Beta release.Schema change handling for SQL Server is supported from PowerSync Service v1.20.2.
Dropping and Recreating a Capture Instance
Creating a New Capture Instance
Supported SQL Server Schema Changes
CREATE table
Table creation is automatically detected when a new capture instance for a source table that matches your Sync Streams/Sync Rules is created. The table is snapshotted before replication can resume.DROP table
PowerSync can detect a table drop by checking for the table existence when the capture instance for a table is dropped. This only works if PowerSync is running at the time of the table drop.RENAME table
Renaming a table is automatically detected and results in the removal of the bucket data for the old table, followed by a snapshot of the newly renamed table. Once the snapshot is completed, replication will resume.Column Changes
Some column changes are blocked on the database level if CDC is enabled on a table. These include:- column renames
- changing the primary key
- changing the data type of the primary key column
- adding a new column: Until the capture instance has been recreated, the new column will not be replicated.
- dropping a column: Until the capture instance has been recreated, replicated rows will contain a NULL value for the dropped column.
- changing the data type of a column to another compatible type: PowerSync will replicate updated rows with the new data type, but historic rows will not be updated. To propagate the changes, make an update to every existing row to propagate the changes.