Preflight checks
Every check BeziSync runs on connections, runtimes and deployments. Generated from the
source by bezisync check-docs — do not edit by hand. In the UI each check links here.
#PostgreSQL
#pg_capacity
Replication capacity
Fix:
-- drop slots nobody uses:
SELECT slot_name, active FROM pg_replication_slots;
-- or raise the limits (restart required):
ALTER SYSTEM SET max_replication_slots = 20;
ALTER SYSTEM SET max_wal_senders = 20;#pg_create
Manage publications
Fix:
GRANT CREATE ON DATABASE {db} TO {user};#pg_failover
Failover safety
#pg_login
Sign in
Fix:
# pg_hba.conf
hostssl {database} {user} <runtime-cidr> scram-sha-256
hostssl replication <runtime-cidr> scram-sha-256#pg_network_blocked
Reach the database
- Why: The address is loopback, link-local or a cloud metadata endpoint, which BeziSync never contacts unless an admin allows it (BEZISYNC_SSRF_ALLOW_CIDRS).
#pg_network_reachable
Reach the database
- Why: The host answered on the port.
#pg_network_unreachable
Reach the database
- Why: No TCP connection: allow the port from where connectors run (firewall, security group, peering).
#pg_replication_role
Replication permission
#pg_ssh
SSH tunnel
- Why: A connection through a bastion needs the SSH user and private key.
#pg_ssh_blocked
Reach the SSH bastion
- Why: The address is loopback, link-local or a cloud metadata endpoint, which BeziSync never contacts unless an admin allows it (BEZISYNC_SSRF_ALLOW_CIDRS).
#pg_ssh_reachable
Reach the SSH bastion
- Why: The host answered on the port.
#pg_ssh_tunnel
SSH tunnel
- Why: Connectors reach the database through this bastion, exactly like this check.
- Why: Fails when the bastion refuses the key, its host key does not match the pinned one, or it cannot reach the database (AllowTcpForwarding must be on).
- Why: Warns while the bastion's host key is not pinned: pin it (ssh-keyscan) so nobody can impersonate the bastion.
#pg_ssh_unreachable
Reach the SSH bastion
- Why: No TCP connection: allow the port from where connectors run (firewall, security group, peering).
#pg_tables
Selected tables
#pg_tables_exist
Selected tables exist
#pg_tables_identity
Replica identity
#pg_tables_keys
Row keys
#pg_tables_owner
Publication ownership
Fix:
CREATE PUBLICATION <pipeline-publication> FOR TABLE ;#pg_tables_select
Read access
- Why: The initial snapshot reads existing rows with SELECT.
#pg_tls
TLS
- Why: Check the TLS mode and CA certificate for this database.
#pg_version
PostgreSQL version
#pg_wal_level
Logical replication
- Why: Debezium reads changes from the database log. The setting needs a restart, so plan it.
#pg_wal_retention
WAL retention limit
- Why: A stopped pipeline's slot can fill the disk. BeziSync alerts on retained WAL; a cap protects the database but invalidates the slot (re-snapshot needed) when reached.
Fix:
ALTER SYSTEM SET max_slot_wal_keep_size = '50GB';
SELECT pg_reload_conf();#MySQL / MariaDB
#mysql_binlog
Binary log
Fix:
# my.cnf
[mysqld]
log_bin = mysql-bin
server_id = 1
binlog_format = ROW#mysql_binlog_format
Row-based binlog
#mysql_grants
Permissions
Fix:
GRANT {REQUIRED_PRIVILEGES} ON *.* TO '{user}'@'%';
GRANT ALL ON {MANAGED_DB}.* TO '{user}'@'%';#mysql_gtid
Failover safety
Fix:
SET GLOBAL enforce_gtid_consistency = ON;
SET GLOBAL gtid_mode = OFF_PERMISSIVE;
SET GLOBAL gtid_mode = ON_PERMISSIVE;
SET GLOBAL gtid_mode = ON;#mysql_login
Sign in
#mysql_network_blocked
Reach the database
- Why: The address is loopback, link-local or a cloud metadata endpoint, which BeziSync never contacts unless an admin allows it (BEZISYNC_SSRF_ALLOW_CIDRS).
#mysql_network_reachable
Reach the database
- Why: The host answered on the port.
#mysql_network_unreachable
Reach the database
- Why: No TCP connection: allow the port from where connectors run (firewall, security group, peering).
#mysql_retention
Binlog retention
Fix:
SET GLOBAL binlog_expire_logs_seconds = 604800; -- 7 daysFix:
CALL mysql.rds_set_configuration('binlog retention hours', 72);#mysql_row_image
Full row images
Fix:
SET GLOBAL binlog_row_image = 'FULL';#mysql_ssh
SSH tunnel
- Why: A connection through a bastion needs the SSH user and private key.
#mysql_ssh_blocked
Reach the SSH bastion
- Why: The address is loopback, link-local or a cloud metadata endpoint, which BeziSync never contacts unless an admin allows it (BEZISYNC_SSRF_ALLOW_CIDRS).
#mysql_ssh_reachable
Reach the SSH bastion
- Why: The host answered on the port.
#mysql_ssh_tunnel
SSH tunnel
- Why: Connectors reach the database through this bastion, exactly like this check.
- Why: Fails when the bastion refuses the key, its host key does not match the pinned one, or it cannot reach the database (AllowTcpForwarding must be on).
- Why: Warns while the bastion's host key is not pinned: pin it (ssh-keyscan) so nobody can impersonate the bastion.
#mysql_ssh_unreachable
Reach the SSH bastion
- Why: No TCP connection: allow the port from where connectors run (firewall, security group, peering).
#mysql_tables
Selected tables
#mysql_tables_exist
Selected tables exist
#mysql_tables_keys
Row keys
#mysql_version
Server version
#SQL Server
#mssql_agent
SQL Server Agent
Fix:
Start the SQL Server Agent service (and set it to start automatically).#mssql_cdc_db
Change data capture
- Why: Debezium reads SQL Server's CDC change tables.
#mssql_login
Sign in
#mssql_network_blocked
Reach the database
- Why: The address is loopback, link-local or a cloud metadata endpoint, which BeziSync never contacts unless an admin allows it (BEZISYNC_SSRF_ALLOW_CIDRS).
#mssql_network_reachable
Reach the database
- Why: The host answered on the port.
#mssql_network_unreachable
Reach the database
- Why: No TCP connection: allow the port from where connectors run (firewall, security group, peering).
#mssql_permissions
Permissions
Fix:
ALTER ROLE db_owner ADD MEMBER {user};#mssql_ssh
SSH tunnel
- Why: A connection through a bastion needs the SSH user and private key.
#mssql_ssh_blocked
Reach the SSH bastion
- Why: The address is loopback, link-local or a cloud metadata endpoint, which BeziSync never contacts unless an admin allows it (BEZISYNC_SSRF_ALLOW_CIDRS).
#mssql_ssh_reachable
Reach the SSH bastion
- Why: The host answered on the port.
#mssql_ssh_tunnel
SSH tunnel
- Why: Connectors reach the database through this bastion, exactly like this check.
- Why: Fails when the bastion refuses the key, its host key does not match the pinned one, or it cannot reach the database (AllowTcpForwarding must be on).
- Why: Warns while the bastion's host key is not pinned: pin it (ssh-keyscan) so nobody can impersonate the bastion.
#mssql_ssh_unreachable
Reach the SSH bastion
- Why: No TCP connection: allow the port from where connectors run (firewall, security group, peering).
#mssql_tables
Selected tables
#mssql_tables_cdc
CDC on tables
#mssql_tables_exist
Selected tables exist
#mssql_tables_keys
Row keys
#MongoDB
#mongo_change_stream
Read change streams
Fix:
db.grantRolesToUser('<user>', [{ role: 'read', db: '<database>' }, { role: 'readAnyDatabase', db: 'admin' }])#mongo_collections_exist
Selected collections exist
#mongo_connect
Connect
- Why: For replica sets, every member's advertised hostname must resolve from the runtime.
#mongo_login
Sign in
#mongo_network_blocked
Reach MongoDB
- Why: The address is loopback, link-local or a cloud metadata endpoint, which BeziSync never contacts unless an admin allows it (BEZISYNC_SSRF_ALLOW_CIDRS).
#mongo_network_reachable
Reach MongoDB
- Why: The host answered on the port.
#mongo_network_unreachable
Reach MongoDB
- Why: No TCP connection: allow the port from where connectors run (firewall, security group, peering).
#mongo_topology
Change streams available
Fix:
mongod --replSet rs0 …
mongosh --eval 'rs.initiate()'#mongo_version
MongoDB version
#Oracle
#ora_archive_retention
Archived log retention
- Why: A pipeline that stops for longer than the archived logs reach back loses changes. Keep at least a day (RMAN deletion policy, recovery area size; on RDS 'archivelog retention hours').
Fix:
BEGIN rdsadmin.rdsadmin_util.set_configuration('archivelog retention hours', 24); END;
/#ora_archivelog
Archive log mode
- Why: LogMiner reads archived redo logs; without ARCHIVELOG, redo is overwritten before Debezium reads it. Switching modes restarts the database.
- Why: Amazon RDS and OCI Base Database run in ARCHIVELOG mode while automated backups are on.
Fix:
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;
ALTER PLUGGABLE DATABASE ALL OPEN; -- multitenant databases onlyFix:
aws rds modify-db-instance --db-instance-identifier <your-instance> --backup-retention-period 7 --apply-immediately#ora_login
Sign in
- Why: Debezium signs in to the database's own service (the CDB root of a multitenant database).
- Why: ORA-01017: wrong user name or password; ORA-28000: the account is locked; ORA-12514: the listener doesn't know the service name.
Fix:
ALTER USER {user} ACCOUNT UNLOCK;Fix:
lsnrctl services # lists the service names this listener serves#ora_managed_tables
BeziSync tables
- Why: Snapshots on demand go through BZ_SIGNAL_
(and the delivery canary through BZ_CANARY_ ) in the connector user's schema: the user needs a quota on its default tablespace.
Fix:
ALTER USER {user} QUOTA 100M ON {tablespace};#ora_network_blocked
Reach the database
- Why: The address is loopback, link-local or a cloud metadata endpoint, which BeziSync never contacts unless an admin allows it (BEZISYNC_SSRF_ALLOW_CIDRS).
#ora_network_reachable
Reach the database
- Why: The host answered on the port.
#ora_network_unreachable
Reach the database
- Why: No TCP connection: allow the port from where connectors run (firewall, security group, peering).
#ora_pdb
Pluggable database
- Why: BeziSync reads the tables through the PDB's service; it must open the PDB named in the connection.
- Why: Set the PDB service name (Expert) when it differs from the PDB's name.
#ora_privileges
Permissions
- Why: Debezium reads the redo log with LogMiner and existing rows with flashback queries: the user needs CREATE SESSION, SET CONTAINER (multitenant), FLASHBACK ANY TABLE, SELECT ANY TABLE, SELECT ANY TRANSACTION, LOGMINING, CREATE TABLE, LOCK ANY TABLE, CREATE SEQUENCE, SELECT_CATALOG_ROLE, EXECUTE_CATALOG_ROLE, SELECT on the V_$ views LogMiner reads and EXECUTE on DBMS_LOGMNR and DBMS_LOGMNR_D.
- Why: On Amazon RDS, SYS objects are granted with rdsadmin.rdsadmin_util.grant_sys_object.
Fix:
GRANT CREATE SESSION, SET CONTAINER, FLASHBACK ANY TABLE, SELECT ANY TABLE, SELECT ANY TRANSACTION, LOGMINING, CREATE TABLE, LOCK ANY TABLE, CREATE SEQUENCE, SELECT_CATALOG_ROLE, EXECUTE_CATALOG_ROLE TO {user} CONTAINER=ALL;
GRANT SELECT ON V_$DATABASE TO {user} CONTAINER=ALL; -- and the other V_$ views
GRANT EXECUTE ON DBMS_LOGMNR TO {user} CONTAINER=ALL;
GRANT EXECUTE ON DBMS_LOGMNR_D TO {user} CONTAINER=ALL;Fix:
BEGIN rdsadmin.rdsadmin_util.grant_sys_object('V_$DATABASE', '{user}', 'SELECT'); END;
/#ora_redo
Redo logs
- Why: Each log switch makes LogMiner rebuild its session; Debezium recommends at least 3 redo log groups and about 4 switches an hour.
Fix:
ALTER DATABASE ADD LOGFILE GROUP <n> SIZE 1G;#ora_ssh
SSH tunnel
- Why: A connection through a bastion needs the SSH user and private key.
#ora_ssh_blocked
Reach the SSH bastion
- Why: The address is loopback, link-local or a cloud metadata endpoint, which BeziSync never contacts unless an admin allows it (BEZISYNC_SSRF_ALLOW_CIDRS).
#ora_ssh_reachable
Reach the SSH bastion
- Why: The host answered on the port.
#ora_ssh_tunnel
SSH tunnel
- Why: Connectors reach the database through this bastion, exactly like this check.
- Why: Fails when the bastion refuses the key, its host key does not match the pinned one, or it cannot reach the database (AllowTcpForwarding must be on).
- Why: Warns while the bastion's host key is not pinned: pin it (ssh-keyscan) so nobody can impersonate the bastion.
#ora_ssh_unreachable
Reach the SSH bastion
- Why: No TCP connection: allow the port from where connectors run (firewall, security group, peering).
#ora_supplemental
Supplemental logging
- Why: The redo log must record enough to rebuild changed rows: at least minimal supplemental logging on the database.
Fix:
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;Fix:
BEGIN rdsadmin.rdsadmin_util.alter_supplemental_logging(p_action => 'ADD'); END;
/#ora_tables
Selected tables
- Why: The selected tables exist and log all columns.
#ora_tables_exist
Selected tables exist
- Why: Every selected table must exist and be readable by the connector user.
#ora_tables_keys
Row keys
- Why: Without a primary key, events carry no key, so consumers cannot tell which row an update or delete belongs to; re-copies use ROWID.
#ora_tables_logging
Table logging
- Why: Debezium needs supplemental logging of all columns on every captured table (or on the whole database) to rebuild updates.
Fix:
ALTER TABLE "{schema}"."{table}" ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;#ora_undo
Undo retention
- Why: The first copy reads every table AS OF one SCN; when the undo it needs is gone it fails with ORA-01555 (snapshot too old).
Fix:
ALTER SYSTEM SET UNDO_RETENTION = <seconds>;#ora_version
Oracle version
- Why: Debezium 3 supports Oracle 19c and newer.
#CockroachDB
#crdb_create
BeziSync tables
- Why: Snapshots on demand go through bezisync.signal_
(and the delivery canary through bezisync.canary_ ): the user needs to create the bezisync schema, or rights on it.
Fix:
CREATE SCHEMA IF NOT EXISTS {database}.bezisync;
GRANT ALL ON SCHEMA {database}.bezisync TO {user};#crdb_gc_ttl
Garbage collection window
- Why: A changefeed resumes only within the tables' gc.ttlseconds: a pipeline stopped for longer must copy its tables again. Warns under an hour, or when the zone configuration can't be read.
Fix:
ALTER TABLE {table} CONFIGURE ZONE USING gc.ttlseconds = 14400;#crdb_login
Sign in
- Why: Debezium signs in with the same user and password; a cluster without passwords accepts the user as it is.
#crdb_network_blocked
Reach the cluster
- Why: The address is loopback, link-local or a cloud metadata endpoint, which BeziSync never contacts unless an admin allows it (BEZISYNC_SSRF_ALLOW_CIDRS).
#crdb_network_reachable
Reach the cluster
- Why: The host answered on the port.
#crdb_network_unreachable
Reach the cluster
- Why: No TCP connection: allow the port from where connectors run (firewall, security group, peering).
#crdb_rangefeed
Rangefeeds
- Why: Changefeeds need the cluster setting kv.rangefeed.enabled. Reading it needs VIEWCLUSTERSETTING; without it the check can't confirm it is on.
Fix:
SET CLUSTER SETTING kv.rangefeed.enabled = true;Fix:
GRANT SYSTEM VIEWCLUSTERSETTING TO {user};#crdb_ssh
SSH tunnel
- Why: A connection through a bastion needs the SSH user and private key.
#crdb_ssh_blocked
Reach the SSH bastion
- Why: The address is loopback, link-local or a cloud metadata endpoint, which BeziSync never contacts unless an admin allows it (BEZISYNC_SSRF_ALLOW_CIDRS).
#crdb_ssh_reachable
Reach the SSH bastion
- Why: The host answered on the port.
#crdb_ssh_tunnel
SSH tunnel
- Why: Connectors reach the database through this bastion, exactly like this check.
- Why: Fails when the bastion refuses the key, its host key does not match the pinned one, or it cannot reach the database (AllowTcpForwarding must be on).
- Why: Warns while the bastion's host key is not pinned: pin it (ssh-keyscan) so nobody can impersonate the bastion.
#crdb_ssh_unreachable
Reach the SSH bastion
- Why: No TCP connection: allow the port from where connectors run (firewall, security group, peering).
#crdb_tables
Selected tables
- Why: The selected tables exist and the user may stream and read them.
#crdb_tables_changefeed
Changefeed permission
- Why: Debezium opens a changefeed on the selected tables: the user needs CHANGEFEED on each (or ALL, or admin).
Fix:
GRANT CHANGEFEED ON TABLE {tables} TO {user};#crdb_tables_exist
Selected tables exist
- Why: Every selected table must exist in the database.
#crdb_tables_select
Read access
- Why: The first copy and re-copies read the existing rows.
Fix:
GRANT SELECT ON TABLE {tables} TO {user};#crdb_tls
TLS
- Why: Secure clusters need TLS (require or stricter); CockroachDB Cloud also needs its CA certificate for verify-full.
#crdb_version
CockroachDB version
- Why: The CHANGEFEED privilege Debezium relies on needs CockroachDB v22.2 or newer.
#Vitess
#vt_binlog_retention
Binlog retention
- Why: How long the tablets keep their binlogs is not visible through VTGate: a pipeline stopped for longer must copy its tables again. Keep at least a day on every tablet's MySQL.
Fix:
SET PERSIST binlog_expire_logs_seconds = 86400;#vt_grpc_blocked
Reach VTGate's gRPC port
- Why: The address is loopback, link-local or a cloud metadata endpoint, which BeziSync never contacts unless an admin allows it (BEZISYNC_SSRF_ALLOW_CIDRS).
#vt_grpc_reachable
Reach VTGate's gRPC port
- Why: The host answered on the port.
#vt_grpc_unreachable
Reach VTGate's gRPC port
- Why: No TCP connection: allow the port from where connectors run (firewall, security group, peering).
#vt_keyspace
Keyspace
- Why: A Vitess connection captures one keyspace, across all its shards.
#vt_login
Sign in
- Why: BeziSync reads tables through VTGate's MySQL port with the connection's user (VTGate's static authentication); Debezium streams over its gRPC port.
#vt_mysql_blocked
Reach VTGate's MySQL port
- Why: The address is loopback, link-local or a cloud metadata endpoint, which BeziSync never contacts unless an admin allows it (BEZISYNC_SSRF_ALLOW_CIDRS).
#vt_mysql_reachable
Reach VTGate's MySQL port
- Why: The host answered on the port.
#vt_mysql_unreachable
Reach VTGate's MySQL port
- Why: No TCP connection: allow the port from where connectors run (firewall, security group, peering).
#vt_ssh
SSH tunnel
- Why: A connection through a bastion needs the SSH user and private key.
#vt_ssh_blocked
Reach the SSH bastion
- Why: The address is loopback, link-local or a cloud metadata endpoint, which BeziSync never contacts unless an admin allows it (BEZISYNC_SSRF_ALLOW_CIDRS).
#vt_ssh_reachable
Reach the SSH bastion
- Why: The host answered on the port.
#vt_ssh_tunnel
SSH tunnel
- Why: Connectors reach the database through this bastion, exactly like this check.
- Why: Fails when the bastion refuses the key, its host key does not match the pinned one, or it cannot reach the database (AllowTcpForwarding must be on).
- Why: Warns while the bastion's host key is not pinned: pin it (ssh-keyscan) so nobody can impersonate the bastion.
#vt_ssh_unreachable
Reach the SSH bastion
- Why: No TCP connection: allow the port from where connectors run (firewall, security group, peering).
#vt_tables
Selected tables
- Why: The selected tables exist in the keyspace.
#vt_tables_exist
Selected tables exist
- Why: Every selected table must exist in the keyspace.
#vt_tables_keyspace
One keyspace
- Why: Every selected table must be in the connection's keyspace.
#vt_tablets
Tablets
- Why: VStream reads every shard from a serving tablet of the chosen type (primary, replica or read-only).
#vt_version
VTGate
- Why: The connection must point at VTGate; a plain MySQL server needs a MySQL / MariaDB connection.
#Google Cloud Spanner
#sp_capture_type
Captured values
- Why: With OLD_AND_NEW_VALUES or NEW_VALUES, update events carry only the columns that changed: destinations that replace rows lose the others.
Fix:
ALTER CHANGE STREAM {name} SET OPTIONS (value_capture_type = 'NEW_ROW_AND_OLD_VALUES');#sp_change_stream
Change stream
- Why: The connector reads a change stream. BeziSync creates one per pipeline (bz_
, watching the pipeline's tables without its removed columns) when the service account may change the schema (roles/spanner.databaseAdmin); otherwise create one yourself and use it.
Fix:
CREATE CHANGE STREAM {name} FOR ALL OPTIONS (retention_period = '7d', value_capture_type = 'NEW_ROW_AND_OLD_VALUES');Fix:
ALTER CHANGE STREAM {name} SET FOR {tables};Fix:
gcloud spanner databases add-iam-policy-binding {database} --instance={instance} --project={project} \
--member=serviceAccount:<service-account-email> --role=roles/spanner.databaseAdmin#sp_coordination
Coordination Kafka
- Why: Debezium's Spanner connector keeps its partition state in two Kafka topics of its own (sync_topic_spanner_connector
, rebalancing_topic_spanner_connector ), even in Debezium Server. BeziSync checks it like a Kafka destination and removes the topics with the pipeline.
#sp_credentials
Credentials
- Why: Without a service-account key, BeziSync and the connector use the default credentials where they run: on GKE with Workload Identity, the runtime's service account.
#sp_database
Database
- Why: BeziSync reads the database's schema with the connection's credentials; the connector needs the same access (roles/spanner.databaseReader).
Fix:
gcloud spanner databases add-iam-policy-binding {database} --instance={instance} --project={project} \
--member=serviceAccount:<service-account-email> --role=roles/spanner.databaseReader#sp_dialect
SQL dialect
- Why: Debezium's Spanner connector supports GoogleSQL databases only, not the PostgreSQL dialect.
#sp_emulator
Emulator
- Why: The emulator address is host:port (its gRPC port, 9010 by default).
#sp_emulator_blocked
Reach the Spanner emulator
- Why: The address is loopback, link-local or a cloud metadata endpoint, which BeziSync never contacts unless an admin allows it (BEZISYNC_SSRF_ALLOW_CIDRS).
#sp_emulator_reachable
Reach the Spanner emulator
- Why: The host answered on the port.
#sp_emulator_unreachable
Reach the Spanner emulator
- Why: No TCP connection: allow the port from where connectors run (firewall, security group, peering).
#sp_retention
Change stream retention
- Why: A stopped pipeline can resume only within the change stream's retention_period (BeziSync's streams keep 7 days; up to 30 are possible).
#sp_tables_exist
Selected tables exist
- Why: Every selected table must exist in the database's default schema.
#Kafka
#kafka_auth
Sign in
#kafka_bootstrap
Broker list
#kafka_create_topics
Create topics
- Why: Turn off 'Create topics automatically' if topics are provisioned another way.
Fix:
kafka-acls --bootstrap-server <broker> --add --allow-principal User: --operation Create --operation Write --operation Describe --topic '*' --resource-pattern-type literal#kafka_metadata
Talk to Kafka
- Why: An open port is not enough: the connector must authenticate and fetch metadata.
Fix:
Check security protocol (PLAINTEXT vs SASL_SSL) and that advertised.listeners resolve from the runtime.#kafka_network
Reach brokers
#kafka_network_blocked
Reach {b}:{b}
- Why: The address is loopback, link-local or a cloud metadata endpoint, which BeziSync never contacts unless an admin allows it (BEZISYNC_SSRF_ALLOW_CIDRS).
#kafka_network_reachable
Reach {b}:{b}
- Why: The host answered on the port.
#kafka_network_unreachable
Reach {b}:{b}
- Why: No TCP connection: allow the port from where connectors run (firewall, security group, peering).
#kafka_replication
Replication factor
#HTTP
#http_network_blocked
Reach the endpoint
- Why: The address is loopback, link-local or a cloud metadata endpoint, which BeziSync never contacts unless an admin allows it (BEZISYNC_SSRF_ALLOW_CIDRS).
#http_network_reachable
Reach the endpoint
- Why: The host answered on the port.
#http_network_unreachable
Reach the endpoint
- Why: No TCP connection: allow the port from where connectors run (firewall, security group, peering).
#http_status
Endpoint answers
#Google Pub/Sub
#pubsub_auth
Sign in
Fix:
gcloud projects add-iam-policy-binding {project_id} --member=serviceAccount:<sa-email> --role=roles/pubsub.editor#AWS Kinesis
#kinesis_auth
Sign in
Fix:
Allow kinesis:ListStreams, kinesis:DescribeStreamSummary, kinesis:CreateStream, kinesis:PutRecord, kinesis:PutRecords for the BeziSync and runtime principals.#kinesis_connect
Reach Kinesis
#Redis Streams
#redis_auth
Sign in
#redis_connect
Talk to Redis
#redis_memory
Memory headroom
- Why: Set a stream length limit or add memory.
#redis_network_blocked
Reach Redis
- Why: The address is loopback, link-local or a cloud metadata endpoint, which BeziSync never contacts unless an admin allows it (BEZISYNC_SSRF_ALLOW_CIDRS).
#redis_network_reachable
Reach Redis
- Why: The host answered on the port.
#redis_network_unreachable
Reach Redis
- Why: No TCP connection: allow the port from where connectors run (firewall, security group, peering).
#redis_write
Write streams
#NATS JetStream
#nats_jetstream
JetStream available
#nats_network_blocked
Reach NATS
- Why: The address is loopback, link-local or a cloud metadata endpoint, which BeziSync never contacts unless an admin allows it (BEZISYNC_SSRF_ALLOW_CIDRS).
#nats_network_reachable
Reach NATS
- Why: The host answered on the port.
#nats_network_unreachable
Reach NATS
- Why: No TCP connection: allow the port from where connectors run (firewall, security group, peering).
#Apache Iceberg
#iceberg_auth
Sign in
- Why: The catalog refused the credentials or the request signature.
Fix:
Give the credentials permission to list and create namespaces, and to create, load and commit tables.#iceberg_catalog
Catalog
- Why: BeziSync signs in to the catalog and lists namespaces, as the connector will.
#iceberg_catalog_blocked
Reach the catalog
- Why: Connection checks may not contact loopback, link-local or cloud metadata addresses.
#iceberg_catalog_unreachable
Reach the catalog
- Why: Connectors run where the runtime runs; if BeziSync cannot reach the catalog, neither can they.
Fix:
Allow HTTPS from the runtime to the catalog (firewall, security group, private endpoint).#iceberg_config
Settings
- Why: A choice in the connection needs another field (the catalog URL, OAuth2 client, token, region or secret key).
#iceberg_existing_tables
Existing tables
- Why: The pipeline writes into tables that already exist, keeping their partitioning; without identifier fields they get changes appended.
Fix:
ALTER TABLE … SET IDENTIFIER FIELDS <key columns> (Spark), or drop the table so the pipeline creates it.#iceberg_namespace
Namespace
- Why: Tables are created in the connection's namespace; BeziSync creates it on deploy when missing.
#iceberg_no_key
Row identity
- Why: Upserts need a key; a table without one gets every change appended.
Fix:
Choose key columns for them in the Transform step (Message key).#iceberg_partitioning
Partitioning
- Why: New tables are bucketed by their key column, recorded by the wizard from discovery.
Fix:
Open the Destination step and continue: BeziSync records each table's key again.#iceberg_rustfs_upsert
Rows
- Why: RustFS S3 Tables (preview) refuses a row-level commit on a table without an earlier snapshot, which every upsert pipeline's first commit is.
Fix:
Choose "Every change appended" in the Destination step.#iceberg_write
Write a test table
- Why: The connector creates tables and writes Parquet files with these credentials: BeziSync creates a one-row table, reads it back and drops it.
#Database (JDBC)
#jdbc_config
Settings
- Why: Database and schema names go into a JDBC URL and SQL: letters, digits, _, - and $ only.
#jdbc_create_table
Create tables
- Why: Pipelines that create their tables (the default) need it; BeziSync creates and drops a test table.
Fix:
GRANT USAGE, CREATE ON SCHEMA {schema} TO {user};#jdbc_login
Sign in
- Why: The connector signs in with the same user and TLS setting.
Fix:
GRANT USAGE, CREATE ON SCHEMA {schema} TO {user};#jdbc_name_length
Table names
- Why: PostgreSQL allows 63 characters, MySQL and MariaDB 64, SQL Server 128.
Fix:
Shorten the destination naming in the Destination step.#jdbc_network_blocked
Reach the database
- Why: Connection checks may not contact loopback, link-local or cloud metadata addresses.
#jdbc_network_reachable
Reach the database
- Why: The host answered on the port.
#jdbc_network_unreachable
Reach the database
- Why: No TCP connection: allow the port from where connectors run (firewall, security group, peering).
#jdbc_no_key
Row keys
- Why: Upserts and deletes find rows by the record key; without one the connector stops.
Fix:
Choose key columns for them in the Transform step (Message key), or insert only in the Destination step.#Amazon SQS
#sqs_auth
Sign in
- Why: AWS rejected the request, or the queue does not exist.
Fix:
Allow sqs:GetQueueAttributes, sqs:SendMessage and sqs:ReceiveMessage on the queue for the BeziSync and runtime principals.#sqs_connect
Reach SQS
- Why: The SQS endpoint did not answer.
#sqs_fifo_dedup
FIFO deduplication
- Why: Debezium sends no deduplication ID, so a FIFO queue must deduplicate by content.
Fix:
aws sqs set-queue-attributes --queue-url <url> --attributes ContentBasedDeduplication=true#sqs_preview
Events tab
- Why: Peeking counts as a receive; with a low dead-letter redrive count BeziSync does not peek.
#sqs_queue
Queue
- Why: BeziSync reads the queue's attributes, as the connector sends to it.
#Amazon SNS
#sns_auth
Sign in
- Why: AWS rejected the request.
Fix:
Allow sns:ListTopics, sns:CreateTopic, sns:GetTopicAttributes, sns:Publish, sns:Subscribe and sns:Unsubscribe on the topics.#sns_connect
Reach SNS
- Why: The SNS endpoint did not answer.
#sns_preview
Events tab
- Why: SNS keeps nothing to read back: BeziSync subscribes a small queue of its own to each topic for the Events tab and the delivery canary.
Fix:
Allow sqs:CreateQueue, sqs:SetQueueAttributes, sqs:GetQueueAttributes, sqs:ReceiveMessage and sqs:DeleteQueue on bz-preview-* queues.#Azure Event Hubs
#eventhubs_auth
Sign in
- Why: The connector sends with this connection string; the hub must exist.
Fix:
Create a shared access policy on the namespace with Send (and Listen for the Events tab), and use its connection string.#eventhubs_config
Settings
- Why: The sink adds the hub to the connection string itself, so it must not name one (EntityPath).
#eventhubs_listen
Events tab
- Why: Reading the hub back (Events tab, delivery canary) needs Listen rights; sending needs only Send.
Fix:
Add a connection string with Listen rights for reading.#eventhubs_network_blocked
Reach Event Hubs
- Why: Connection checks may not contact loopback, link-local or cloud metadata addresses.
#eventhubs_network_reachable
Reach Event Hubs
- Why: The namespace answered on its AMQP port.
#eventhubs_network_unreachable
Reach Event Hubs
- Why: No TCP connection on port 5671 (AMQP over TLS): allow it from where connectors run.
#Apache Pulsar
#pulsar_admin
Admin API
- Why: BeziSync checks the namespace, creates topics and reads recent messages through the admin URL.
#pulsar_auth
Sign in
- Why: Pulsar refused the token.
Fix:
bin/pulsar-admin namespaces grant-permission <tenant>/<namespace> --role <role> --actions produce,consume#pulsar_config
Settings
- Why: The connector needs a pulsar:// or pulsar+ssl:// service URL.
#pulsar_namespace
Namespace
- Why: Topics are created in the connection's tenant and namespace.
Fix:
bin/pulsar-admin namespaces create <tenant>/<namespace>#pulsar_network_blocked
Reach the Pulsar broker
- Why: Connection checks may not contact loopback, link-local or cloud metadata addresses.
#pulsar_network_reachable
Reach the Pulsar broker
- Why: The broker answered on its binary port.
#pulsar_network_unreachable
Reach the Pulsar broker
- Why: No TCP connection on the service URL's port (6650, 6651 with TLS): allow it from where connectors run.
#Deploy
#agent_upgrade_required
Agent version
- Why: The destination's own Debezium Server build serves health on another port; older agents probe 8080 and restart the connector.
Fix:
Upgrade the agent to this BeziSync version (Settings → Runtimes shows the install command).#checked_from_control_plane
Checked from BeziSync
#config_valid
Configuration
#debezium_image_deprecated
Debezium version
- Why: Your Admins marked this image deprecated; move to one they offer.
#debezium_image_unlisted
Debezium version
- Why: Your Admins keep a catalog of tested Debezium Server images; this one is not among them.
#debezium_source_version
Debezium version
- Why: Some sources need a recent Debezium Server: CockroachDB's sinkless changefeed arrived in Debezium 3.7. Blocks for an older official image; warns for a custom image whose release BeziSync can't read.
Fix:
Move the pipeline to Debezium 3.7.0 or newer (Change → Debezium version).#delivery_canary_unavailable
Delivery canary
#pii_mask_unsupported
Personal data
- Why: These columns can't be masked, so they would reach the destination as they are: {columns}. Debezium hashes text columns only and sends any other column (a date, a number) as it is; MongoDB values can't be hashed at all.
Fix:
In Tables, choose Remove (or Keep as is) for each listed column.#pii_protected
Personal data
#pii_rule_column_missing
Personal data
- Why: These columns have a masking rule but are not in their table, so the rule does nothing: {columns}. The column was renamed or dropped after the rule was made; if it was renamed, the new name is sent as it is.
Fix:
In Tables, check the table's columns and choose again.#pii_unknown
Personal data
- Why: BeziSync could not read the tables' columns, so it could not check which ones hold personal data.
#pii_unprotected
Personal data
- Why: These columns look like personal data and are sent as they are: {columns}. Their names suggest personal data (email, phone, address, birth date, card or ID numbers), and nobody chose what to do with them yet.
Fix:
In Tables, choose Mask or Remove for each listed column, or Keep as is when it may be sent.#runtime_capacity
Runtime capacity
- Why: The connector may stay pending until resources free up.
#runtime_disabled
Runtime {name}
- Why: An admin disabled (cordoned) this runtime. Pipelines already running there keep running.
#runtime_ready
Runtime {name}
#sink_image_platform
Image platform
- Why: A connector scheduled on another architecture cannot start (exec format error).
Fix:
Run these connectors where nodes are {platforms} (a runtime namespace pinned to those nodes, or a Docker host of that architecture).#sink_resources
Connector size
- Why: Smaller connectors run out of memory while the destination buffers its writes.
Fix:
Choose the {size} size (or larger) in the Review step.#tables_added_not_copied
Added tables
- Why: Tables added to a running pipeline are copied with an incremental snapshot; Vitess and Spanner have none, so such tables stream only their new changes.
#transform_column_missing
Transforms: columns
- Why: {table}, step {n} refers to {column}, which the table does not send (it does not exist or is excluded). A rename then does nothing and a filter rule sees an empty value.
Fix:
Under Transform, pick a column the table has, or remove the step.#transform_columns_unknown
Transforms: columns
- Why: Could not read the tables' columns to check the transform steps: {error}
Fix:
Fix the source connection, then run the checks again.#transform_custom_class_unknown
Transforms: custom classes
- Why: Debezium Server 3.7 does not ship {class}; the pipeline's image must add it, or the connector stops when it starts.
Fix:
Use a Debezium image that ships the class (Settings → Debezium versions), or remove the step.#transform_field_conflict
Transforms: field names
- Why: {table}, step {n}: two fields would get one name. Debezium Server stops with "Cannot create field because of field name duplication" (an added field or a rename onto a field the event already has, or flattening that produces an existing name).
Fix:
Pick a field name the events do not have yet, under Transform.#transform_key_column_missing
Transforms: message keys
- Why: {table} has no column {column}: Debezium ignores it, so the message key falls back to the primary key (or none).
Fix:
Under Transform, choose key columns the table has.#transform_rule_type
Transforms: filter rules
- Why: {table}, step {n}: the rule compares {column} ({type}) in a way that never matches (for example a number with text, or a masked column whose value is a hash).
Fix:
Compare the column with a value of its type, or pick another column.#Secret stores
#secret_missing
Saved secrets
- Why: The connection was copied from another project without its secrets, and nobody has entered them here yet.
#secret_ref_unresolved
Secrets from the secret store
- Why: The connection takes a secret from an external store, and reading it failed.
#Project policies
#policy_custom_transform
Custom transforms
- Why: {steps} run(s) a custom transform class ({names}); this project does not allow custom transforms. Custom classes cannot be previewed or checked by BeziSync, so an Admin decides who may use them.
Fix:
Ask an Admin to change the policy under Settings → Policies.#policy_ok
Project policies
#policy_resources
Resources
- Why: The '{size}' preset exceeds this project's limit ({max_resources}).
Fix:
Choose {max_resources} or smaller.#policy_runtime
Runtime
- Why: This project does not allow pipelines on that runtime.
#policy_scripted_transform
Scripted transforms
- Why: {steps} run(s) a script you wrote ({names}); this project does not allow scripted transforms. Scripts run inside the connector, next to its database credentials, so an Admin decides who may use them.
Fix:
Ask an Admin to change the policy under Settings → Policies.#policy_sink_type
Destination type
- Why: This project does not allow {sink_type} destinations.
#policy_snapshot_mode
Snapshot mode
- Why: Snapshot mode '{mode}' is not allowed here. Allowed: {allowed_snapshot_modes}.
Fix:
Pick an allowed snapshot mode in the pipeline settings.#policy_source_budget
Pipelines per source
- Why: The source already feeds {other_pipelines_on_source} pipeline(s); this project allows {limit}. Each one holds a replication slot or log reader on the database.
Fix:
Reuse an existing pipeline (add tables to it) or ask an admin to raise the limit.#policy_source_type
Source type
- Why: This project does not allow {source_type} sources.
#policy_transform_type
Transforms
- Why: This project does not allow {steps}. Admins choose which transform types pipelines may use.
Fix:
Ask an Admin to change the policy under Settings → Policies.