# Release Notes

version 3.17.0.RC10

## Overview

SymmetricDS 3.17.0 release includes 0 features, 0 improvements, and 0 bug fixes.

## What’s New

### Capture Changes Only Per Trigger

Fine-tune how SymmetricDS captures update data on a per-trigger basis. Previously, capturing only changed columns on updates was an all-or-nothing setting at the node level (`trigger.update.capture.changed.data.only.enabled`). Version 3.17 introduces a `capture_changes_only` column on `sym_trigger`, giving you precise control over which tables use change-only capture and which require full row capture — without blanket node-level overrides.

### DDL Replication Loop Prevention

Multi-master and bidirectional deployments with DDL capture enabled no longer need custom workarounds to prevent schema changes from looping back to the originating node. SymmetricDS 3.17 includes built-in DDL loop detection and prevention, ensuring schema changes replicate to their intended targets and stop — making DDL replication production-ready out of the box.

### Enhanced Replication Statistics

SymmetricDS 3.17 significantly expands the statistics available for monitoring and diagnostics, giving operations teams and monitoring integrations deeper visibility into replication health:

- `sym_node_host_channel_stats` now tracks `data_received`, `data_bytes_received`, `data_min_create_time`, and `data_max_create_time` — enabling inbound throughput measurement and data latency tracking per channel.

- `sym_outgoing_batch` now records `data_min_create_time` and `data_max_create_time`, so you can calculate true end-to-end replication lag from data capture to batch delivery.

- `sym_node_host_stats` now records gap counts and unrouted row counts, providing early warning signals for routing backlogs before they become problems.

### Node Channel Control Improvements

The node_channel_control table now includes a target_node_id column, making it possible to suspend or ignore synchronization between two specific nodes in an individual direction. For ease of use and increased visibility, SymmetricDS now synchronizes this table between nodes via the config channel. In addition, the behavior of this table is more consistent and no longer affected by the group link’s data event action. When upgrading to 3.17, all rows will be deleted from the node_channel_control table.

## Tables

The following changes were made to the definition of configuration and runtime tables. Table changes are applied to the database automatically using data definition language (DDL) during startup.

### New Columns

SYM_EXTRACT_REQUEST
Column Name | Description
--- | ---
`byte_count` | The number of bytes that were transferred to the target for this table
`conflicted_rows` | The rows in this table that went into conflict when loaded to the target

SYM_FILE_SNAPSHOT
Column Name | Description
--- | ---
`external_file_data` | A field that can be populated for use by routing.

SYM_NODE_CHANNEL_CTL
Column Name | Description
--- | ---
`target_node_id` | Unique identifier for a target node for which this channel will be suspended and/or ignored.

SYM_NODE_GROUP_LINK
Column Name | Description
--- | ---
`description` | An optional description of this link.

SYM_NODE_HOST_CHANNEL_STATS
Column Name | Description
--- | ---
`data_received` | The number of rows that were received during this time period.
`data_bytes_received` | The number of bytes that were received during this time period.
`data_min_create_time` | The minimum create time of a data row that was routed during this time period.
`data_max_create_time` | The maximum create time of a data row that was routed during this time period.

SYM_NODE_HOST_STATS
Column Name | Description
--- | ---
`data_gap_count` | Number of non-expired data gaps during this period.
`data_unrouted_count` | Estimated number of unrouted data rows during this period.

SYM_OUTGOING_BATCH
Column Name | Description
--- | ---
`data_min_create_time` | The minimum create time of a data row contained within this batch.
`data_max_create_time` | The maximum create time of a data row contained within this batch.

SYM_TRIGGER
Column Name | Description
--- | ---
`capture_changes_only` | Set this to 1 to force a compare of old and new data. If old=new, then don’t record the change in the data capture table. This is currently supported by the following dialects: MySQL, Oracle, DB2, PostgreSQL, SQL Server.

### Modified Tables

SYM_NODE_CHANNEL_CTL

- Added primary keys: `target_node_id`

SYM_TABLE_RELOAD_STATUS

- Added index `idx_tbl_rld_sts` (`target_node_id`, `source_node_id`, `completed`, `cancelled`)

## Parameters

The following changes were made to add new parameters, modify their default value, modify their description, or remove them from use.

### New Parameters

target.db.delimited.identifier.mode

Determines whether delimited identifiers are used (as opposite to normal SQL92 identifiers) on target database connection. Note: SQL92 identifiers may only contain alphanumerical characters and the underscore, must start with a letter and cannot be a reserved keyword. DatabaseOverrideable: false (Default: true)

### Modified Parameters

routing.gaps.transaction.view.clock.sync.threshold

When using the earliest transaction time to expire gaps (routing.gaps.use.transaction.view=true), subtract the given number of milliseconds from the transaction time. This may be needed in a clustered environment where the time on each database master is not perfectly in sync. (Old Default: 10000) (New Default: 60000)

transport.type

Specify the transport type. Supported values currently include: hybrid, http, internal, file. Set to "hybrid" to use internal communication for multi-homed nodes and network communication for remote nodes. Set to "http" to use network communication for all nodes. Set to "internal" to use internal communication for all nodes. Set to "file" to use offline file-based communication for all nodes. (Old Default: http) (New Default: hybrid)

oracle.template.precision

{REMOVED}

mssql.use.ntypes.for.sync

{REMOVED}

mssql.allow.only.row.level.locks.on.runtime.tables

{REMOVED}

mssql.trigger.execute.as

{REMOVED}

mssql.include.catalog.in.triggers

{REMOVED}

oracle.template.precision.text.minimum

{REMOVED}

oracle.use.ntypes.for.sync

{REMOVED}

mssql.use.snapshot.isolation

{REMOVED}

oracle.load.query.hint.parallel.count

{REMOVED}

mssql.trigger.order.first

{REMOVED}

mssql.use.varchar.for.lob.in.sync

{REMOVED}

oracle.use.transaction.view

{REMOVED}

mssql.lock.escalation.disabled

{REMOVED}

oracle.jdbc.lob.handling

{REMOVED}

oracle.sequence.noorder.nextvalue.db.urls

{REMOVED}

oracle.transaction.view.clock.sync.threshold.ms

{REMOVED}

oracle.sequence.noorder

{REMOVED}