Overview

SymmetricDS Pro 3.15 release includes 39 features, 174 improvements, and 249 bug fixes.

Security Fixes

Issue Summary Severity

5758

Add break glass users (Pro)

Medium

5830

Allow console users to login using SAML authentication (Pro)

Medium

5857

Security Vulnerability in Spring Framework and h2 database

High

6035

Use the value of javax.net.ssl.trustStoreType as the truststore type if specified

Medium

6039

CVE-2016-1000027 - /opt/symmetric-server/web/WEB-INF/lib/spring-web-5.3.27.jar

Urgent

6176

Upgrade Jetty

Medium

6283

Spring Framework URL Parsing with Host Validation

Medium

6297

Upgrade mysql, postgres, vaadin, jetty libraries

Medium

6325

Spring Framework URL Parsing with Host Validation (part 2)

Medium

6553

SQL Explorer privileges for read-only queries (Pro)

Medium

6576

Disallow HTTP methods not needed for data sync

Medium

6604

Upgrade Spring libraries

Medium

Performance Fixes

Issue Summary Severity

5784

Cache list of enabled nodes used by routing

Medium

5840

Purge should use "exists" clause instead of "in" clause for performance

Medium

6300

Hot spot removing old node sessions in mixed environment with versions < 3.11

Medium

What’s New

DB2 for i Log-based Replication

DB2 for i replication (on IBM iSeries AS/400 platform) was expanded to include log mining of journals, in addition to trigger-based change capture.

MariaDB Log-based Replication

MariaDB support was expanded to include log mining of the binary log, in addition to trigger-based change capture.

Progress OpenEdge Replication

Replicate changes from Progress OpenEdge database or load data from other databases into it. OpenEdge is a relational database management system with a 4GL programming language for building business applications. This dialect has bi-directional support that includes change data capture, sub-setting, transformations, and initial loads.

Compare and Repair

Compare and Repair feature allows comparison of data between a source database and one or more target databases. The user has options of all or specific tables, level of comparison, immediate or scheduled, and whether to report or repair data. Comparison can use checksums at a table or chunk level to minimize use of the network. Parallel threads are used on each database per comparison request (compare.queue.per.request.count) with a maximum number of threads available on each server (compare.thread.per.server.count). A report of matching, different, missing, and extra rows can be kept, including a SQL file of changes that can be viewed or applied automatically to the target database.

Insight Manager

The Insights Manager is a sliding panel on the left side of the Dashboard that presents the user with proactive AI-generated recommendations that can help optimize and enhance the system. The user can choose to approve actions, schedule reminders for a later time, or dismiss altogether. Insights are collected across all nodes in the system and use pattern matching and rules collected from support cases.

UI Improvements

Screens now use lazy initialization to reduce the time it takes to login and navigate. The Manage → Jobs screen has a new history icon that opens a listing of job runs from the past 30 days along with a graph of job statistics.

Security Improvements

Web console users can be put into a hierarchy of roles, giving them permission to create or modify users at or below their current role. Web console users can be given a "break glass" indicator that prevents login unless another user breaks the glass for a temporary, time-based password to the account. Web console users can now authenticate with single sign-on (SSO) using the SAML security standard with a third party identity provider.

Performance Improvements

Purge now uses "exists" clause instead of "in" clause for correlated deletes if the database supports it. File sync now stages file changes to improve response time for pull sync requests, which also helps with network timeouts. Routing now uses a cached list of enabled nodes it can route changes to for each batch it creates. The default push and pull intervals were changed to 10 seconds to reduce the sync time experienced by new users.

Operational Improvements

Old data gaps are marked as expired by routing for performance, but left in the system for purge service to track and remove after a longer time period (purge.expired.data.gap.retention.minutes). If purge service finds data in an expired gap, it will repair the data by queuing reloads of the rows by primary key values. The sym_outgoing_error table was added to mirror sym_incoming_error and allow users to provide resolution for data conflicts on the outgoing side. All HTTP error codes now use 600 series to distinguish from any network devices that use standard 500 series. In some cases, more specific HTTP error codes are now used that may cause older clients to log only a general error message with the error code, which include 601 bad request, 602 engine not found, and 605 client already connected.

The symconsole command line utility can now perform operations with the license key.

Technology Upgrades

H2 database version 2 is now included. Users with existing H2 1.x databases may need to add ";MODE=LEGACY" to the end of db.url or "set MODE LEGACY" to db.init.sql (the Pro installer will do this automatically). Spring framework libraries were updated to version 6. Spring Boot 3 is now used to run the Jetty web server in standalone mode. Java 17 or later is now required.

Issues

New Features

3.15.0 (Pro)
1613 - Add the ability to resend a batch by reload that has been ignored or has had a row ignored
5591 - Add symconsole subcommands to REST API
5758 - Add break glass users
5830 - Allow console users to login using SAML authentication
5838 - Log miner for MariaDB database
5917 - Add insight manager to dashboard and replace integrity checks with insights
5945 - Compare and repair with remote nodes
5952 - Add job trending insight
5953 - Replace unsent batch monitor with one for online nodes and another for offline nodes

3.15.0
4034 - Create tables based on target table name and column names set by routers and transforms
5545 - Add support for H2 2.x and upgrade the H2 driver to the latest version
5926 - Adding a corresponding sym_outgoing_error table connected to sym_incoming_error

3.15.1 (Pro)
6000 - Add import-cert subcommand to symadmin
6031 - Add connection reset insight
6037 - Add LOB insight
6042 - Add Registration → Show Rejected menu option to Manage Nodes screen
6049 - Add connection pool insight
6056 - Add priority column and Control → Toggle Priority button to Manage Nodes screen
6075 - Add stranded data insight

3.15.1
6015 - Add :SOURCE_NODE_ID, :SOURCE_EXTERNAL_ID, and :SOURCE_NODE_GROUP_ID variables to column match routers
6079 - Make it possible to use DBCompare’s --config option to specify a suffix for each column in the order by clause
6094 - Add symadmin take-snapshot subcommand

3.15.2 (Pro)
6063 - Add support for RabbitMQ
6108 - Make it possible to log in via LDAP without having a corresponding console user
6111 - Make it possible to log in via SAML without having a corresponding console user
6123 - Add Unknown Certificate Authority insight

3.15.2
6154 - Add parameters that can disable specific types of conflict resolution

3.15.3 (Pro)
6218 - Subselect router support for SOURCE_NODE_ID variable

3.15.3
6188 - Add boolean data type support for Oracle 23c

3.15.4 (Pro)
6231 - Time-Based Capture Feature

3.15.4
6243 - Support H2 version 2.2

3.15.5 (Pro)
6160 - Add documentation for RabbitMQ
6314 - Add symconsole subcommand to generate a REST API key

3.15.7 (Pro)
6417 - Log miner support for update loop prevention and sync on incoming

3.15.7
6460 - Add symadmin export-sym-objects subcommand
6473 - Add a --use-sym-db option to the DbImport and DbSql commands

3.15.8 (Pro)
6494 - License key for jumpmind commerce (jmc)
6534 - Added functionality to support Prometheus integration

3.15.9
6598 - IPurgeListener needs to have the capability to run functionality before the purge outgoing/incoming is run

Improvements

3.15.0 (Pro)
5137 - Upgrade to Vaadin 24
5589 - Move REST API to SymmetricDS Pro
5637 - Set SET MODE LEGACY in db.init.sql for H2 databases in engines, remove DB_CLOSE_ON_EXIT from db URL if AUTO_SERVER also set
5769 - Optimize startup of all screens by waiting until they’re opened to query and populate data
5789 - Move and enhance monitors and notifications for SymmetricDS Pro
5796 - MongoDB bidirectional nested data sync
5861 - Improve accuracy of CPU monitor
5928 - Use sym_outgoing_error table to ignore a row in outgoing batch
5941 - Enhance User Roles with Hierarchy
5963 - License key command line operations
5972 - Unlock feature of Nodes Panel should be in Registration dropdown

3.15.0
1132 - Support Postgres Special Floating Point Values Infinity, -Infinity, NaN
5641 - Increase default db.pool.max.active connections to match what is needed for http.concurrent.workers.max
5740 - Have file sync make better use of staging
5770 - Use 600 series HTTP codes to distinguish from network devices
5778 - Change timestamp size on sym tables with a timestamp as a primary key
5784 - Cache list of enabled nodes used by routing
5792 - Better logging when ack fail
5827 - Track expired data gaps and repair any data missed by routing
5840 - Purge should use "exists" clause instead of "in" clause for performance
5842 - Purge retention for monitor events and console events
5843 - Change default push/pull to 10 seconds
5860 - Increase the statement query timeout
5927 - Use sym_outgoing_error table to ignore a row in outgoing batch

3.15.1 (Pro)
5882 - Postgres Log Mining Enhancements
5995 - Load screens should not reset their sort order on refresh
5997 - Selecting a multi-node row on the Manage Nodes screen should select all of the child rows
6009 - Connect Database Wizard should prevent the user from using the Microsoft driver for SQL Server 2005 or older
6022 - Oracle log miner should skip the SQL statement instead of throwing an exception when the SQL is empty or the schema is null
6038 - Upgrade to Vaadin 24.2 and use the new SvgIcon class
6045 - Improve details of CPU and memory monitor events
6054 - Move Unlock feature of Manage Nodes screen back to the Control dropdown
6058 - Dashboard Health panel should have a separate message for system batches
6061 - Add Table(s) Wizard should not query for metadata when filtering table names
6066 - "Open Web Console" button in SymmetricDS Pro Control Center should get the hostname from the host.bind.name property
6068 - Windows service fails to start when desktop is slow to initialize
6102 - Add more details to the Rest Keys section of the User Guide

3.15.1
6003 - Upgrade Gradle Docker Plugin to latest version and get it working
6007 - Prevent node from starting up if the sync.url is invalid
6017 - DDL Create Table Oracle with varchar columns that have a size > 4000
6035 - Use the value of javax.net.ssl.trustStoreType as the truststore type if specified
6041 - Reject node registration request
6057 - Multi-threaded routing by channel
6069 - Slow extract and load when using $(targetExternalId) variable
6081 - Improve name and documentation for DBExport’s --symmetric option
6083 - SQLite nodes do not insert into sym_context correctly when disabling sync triggers
6086 - Improve watchdog job and enable it by default
6096 - Contains big LOB check can be fooled by commas in data
6097 - Cache trigger template hashcode
6104 - Add indexes to sym_outgoing_batch

3.15.2 (Pro)
6114 - Add process info to support snapshot
6125 - Ensure subset data wizard does not create a router id that exceeds max length of table
6126 - Prevent users from creating triggers for a load-only node group via the Add Tables Wizard
6149 - Set query time out for log based support to match trigger based

3.15.2
6106 - Some Bulk loaders don’t process before filters
6132 - Too many "Expected but did not receive an ack for batch"
6146 - Additional trigger template variable to suppor primary key joins without an alias
6148 - Remove individual jobs stats for push and pull and uri handlers

3.15.3 (Pro)
6136 - Look into using Launch4j to start java on Windows
6169 - Improving and Re-evaluating the Email Verification Process
6172 - Windows service executable that launches Java
6191 - SQL-Server log mining should not require snapshot isolation
6200 - Remove securityToken parameter from /outgoingBatchSummary REST API call
6202 - Make "Active Errors" dialog display all severe monitor events
6225 - Compare and repair subsets, also fixes for scale, sort column names, viewing scripts

3.15.3
6165 - During an upgrade, log DDL before executing it instead of afterwards
6174 - Could not find trigger history, causes error of had X columns but expected Y
6178 - Snapshot util timeout for taking too long on table definitions
6184 - Multi-threaded routing and gap detection
6185 - Unnecessary unrouted batch appears along with routed batch
6189 - Issue with syncing BIGINT, INT, TINYINT, SMALLINT, and BIT data types to Oracle and Tibero databases
6198 - Record failed sync trigger attempts to database in trigger history and stats
6206 - Add LOB Mapping for SQL Server 2005 and later
6210 - "Node failed to authenticate" in server logs after server restarts or client session expires

3.15.4 (Pro)
6228 - Prevent empty identifier on configure screens
6236 - Add logging for if the Bulk Loader Screen has a failure
6239 - Deleting items on a Configure screen should not create the UI for the form
6242 - Improve performance of table selection in Add Tables Wizard
6247 - Unknown monitor type with older nodes causes excessive logging
6249 - CPU monitor should use Java routine if native command not available
6254 - Blocked transaction monitor continuously logs error if missing permissions
6255 - Snowflake default connection to continue to use JSON instead of Apache Arrow
6290 - MSSQL Bulk Loader (BCP) parameter to allow the instance value to be omitted from the command
6293 - Compare repair UI improvements
6294 - Compare repair allow tables without PK if user sets sync key names
6304 - Progress OpenEdge platform should have a dirty SQL template
6305 - Compare repair snapshot and logging

3.15.4
6201 - Add support for NTypes in XML
6240 - Failed to update a table_reload_request as processed for loadId
6256 - Add virtual column to sym_file_snapshot for easier routing by column match and bean shell routers
6272 - Startup logging for specific node securities that can’t decrypt
6278 - Change file sync processing to make immediate request when batches are received or sent
6279 - Make File Sync Tracker transactions smaller to minimize locking collision problems
6292 - File sync BeanShell script should place files in a separate error directory if they are not writable
6301 - Update Rest Keys docs to reflect correct error code

3.15.5 (Pro)
6261 - Table group support with log based and time based captures
6287 - Add table wizard checks configured tables based on trigger id rather than table name
6291 - Enhance logging surrounding a failure to decrypt node password
6319 - Replace deprecated vaadin.whitelisted-packages property
6322 - Console event for cancelling a load request
6345 - Update user guide to explain how to capture old data for updates when using DB2 for IBM i journaling
6349 - Log when refresh of screen runs longer than a threshold
6354 - Reduce time to login to web console and access important screens

3.15.5
6320 - Parameter for file sync compression of ZIP archive
6332 - Allow specification of initial load select for initial load of filesync channel
6333 - File sync BeanShell script should place files in a separate error directory if any error occurs when they are copied
6346 - Use read uncommitted for checking heartbeats and offline nodes
6352 - Improve logging when a problem occurs during repair of unrouted data

3.15.6 (Pro)
6376 - Added functionality to support Elasticsearch 8

3.15.6
6365 - Add logging when instance ID changes
6369 - REV_INITIAL_LOAD_TIME should be set in the NODE_SECURITY table if a reverse initial load is made
6375 - File Sync exceptions thrown by bsh script should be retried for transient errors

3.15.7 (Pro)
6392 - Add parameter to allow null values to remain null when loading into columns with default values using SQL Server bcp bulk loader
6396 - Move bulk loader parameters from symmetric-ds to symmetric-pro
6398 - Allow multi-line editing of delete first parameter
6399 - Auto Create Transforms dialog should notify the user if it fails to auto create column mappings
6405 - On the Manage Nodes screen, move the Sync URL column’s copy button to the left of the text
6418 - SQL Server bcp trust server certificate parameter
6421 - Added auto selection for load data if only one node exists
6425 - If a user ignores a row via the "Resolve Data" panel, no console event is logged
6426 - The batch window should ignore a row in the same way the batch panel ignores a row
6427 - User feedback on Comparison panel when request is cancelled
6431 - Allow disabling the ordering of SQL Server log mining output by transaction ID, allowing ordering by foreign key constraints
6432 - Fixed issue causing auto refresh to uncheck on scroll
6437 - Batch Panels in the UI should show when a batch has rows that were ignored
6439 - Add -b option to SQL Server bcp bulk loader
6440 - Repair script that handles different table case by using batch CSV
6455 - Conflict detection newer wins for log miners
6463 - RabbitMQ support for username and password
6472 - Move REST API parameters to Pro

3.15.7
6413 - DBImport should have option to adjust create.index.convert.unique.to.nonunique.when.columns.not.required param
6434 - Logging of mismatch primary key that causes auto resolver action
6435 - Avoid checking newer capture time if table isn’t being captured
6448 - Provide the ability to specify a no lock hint when reading DDL
6449 - Add a "Show Triggers" option to SQL Explorer
6465 - Prevent sync triggers from running the trigger DDL when it’s called to export a SQL script
6469 - Add a section to the user guide that explains how to add a new node without having SymmetricDS run any DDL
6478 - Column match router expression for has, starts with, and ends with

3.15.8 (Pro)
6491 - Compare support excluded/included column names
6493 - RabbitMQ add content type to header for JSON XML etc
6495 - Added on click icon in Node status when node registration is in error
6498 - Data refresh job defer constraints on table
6499 - Enhance REST API to allow users to select xml or json for the return type
6519 - Split violation screen into tabs. Added ability to delete groups in group violation screen
6527 - Added File Sync to Azure Blob Storage
6542 - Removed parameter changes associated with Dashboard Layout changes
6546 - The add table wizard will not refresh the table list if the database does not support schemas
6548 - Enhancing REST API logging and tracking
6550 - File Sync to and from S3 bucket storage
6553 - SQL Explorer privileges for read-only queries

3.15.8
6219 - Make Sybase ASE triggers use an "insert …​ select" statement instead of a cursor
6516 - Routing process status and lock improvements
6521 - Initial load request should cancel outstanding load requests
6528 - Upgrade sybase JDBC driver to jconn4 version 16.0 build 27538
6529 - Do not data load columns that are generated (computed)
6535 - Support for MySQL 5.1 with latest 3.15.x versions
6545 - MSSQL create table support for user defined types
6557 - Filter extension point during extraction

3.15.9 (Pro)
6558 - Add IExtractDataFilter interface to Extension Form screen
6564 - Various improvements to load detail and loads panel
6570 - Display max memory on control center
6573 - SQL Server bulk loader should fail on first error
6574 - SQL Server bulk loader better row and field terminators
6587 - SQL Server bulk loader bcp use quoted identifiers
6591 - Load Detail, Load Panel, and Load Detail Pop up
6596 - Compare default to chunking for remote and without for local
6599 - IPurgeListener needs to have the capability to run functionality before the purge outgoing/incoming is run

3.15.9
6559 - Purge and recapture can cause exception in routing
6569 - Symadmin option to drop SymmetricDS triggers
6575 - Service wrapper should warn if incompatible Java version
6576 - Disallow HTTP methods not needed for data sync
6578 - SQL Server support for datetime and datetime2 column types when the paramter db.treat.date.time.as.varchar.enabled is true
6592 - Added currentRowCount to process info. Updated DataService
6594 - Support DDL for automatic update of timestamp by database

Bug Fixes

3.15.0 (Pro)
4968 - Oracle log miner SQL parser exception from backslash value
5868 - Ignore Row Count not getting updated in outgoing batch table when a row is ignored
6235 - Linking table is failing to replicate with error "There is 1 table without a primary key, which can cause slow replication."

3.15.0
2530 - postgresql infinity timestamp
2826 - Monitor event duplicate key when syncing
3505 - SYM_TABLE_RELOAD_REQUEST is updated via DateTime which sometimes fails due to precision mismatch
5835 - column name containing a "/" causes error
5857 - Security Vulnerability in Spring Framework and h2 database
5925 - Ignore Row Count not getting updated in outgoing batch table when a row is ignored
6039 - CVE-2016-1000027 - /opt/symmetric-server/web/WEB-INF/lib/spring-web-5.3.27.jar

3.15.1 (Pro)
5998 - Error viewing job history on Manage → Jobs screen
6020 - Oracle log miner stuck on resetting SCN number ORA-01281
6024 - JsonSyntaxException when deserializing monitor event details
6027 - SQL Server Bulk issue when batch column count is different than target table column count
6029 - LogMinerService debug log issue when logging close of miner and start and end SCN ids
6048 - Oracle statement parser does not handle the case when the column names in the where clause are prefixed with the table name
6053 - List of table names in Add Table(s) Wizard can extend below the bottom edge of the layout
6060 - Sybase ASE generated column query fails on versions older than 16
6070 - Compare and repair table using Sybase reserved keyword
6077 - Protect against exceptions in CPU monitor
6078 - db.init.sql parsing needs to allow values to contain semicolons, specified as 2 semicolons in the value
6085 - ElasticSearch Data Writer should use upsert functionality when updating records
6088 - Spring Boot builds unnecessary ElasticsearchRestClientAutoConfiguration bean when elastic search module jars are installed
6089 - Elastic Search module needs httpclient from apache to be installed
6090 - Log off not closing session
6093 - Add Table(s) Wizard should not specify the catalog/schema name for a new trigger if it is the default catalog/schema
6105 - Setting up a new log based or extract only node via the Add Database Wizard causes a JdbcSQLFeatureNotSupportedException

3.15.1
6004 - SQL Explorer grid editor causes error in browser and "Edit" button is initially invisible
6012 - Do not attempt to "create or alter" triggers on SQL Server 2016 RTM
6016 - Missing Kafka dependencies when installing Kafka module
6023 - SQLException when updating a non-OK outgoing batch on some database platforms
6040 - maxFormContentSize and maxFormKeys are no longer used
6044 - ConcurrentConnectionManager expects nodeId-channel in the white list, but only the nodeId is put in the white list
6046 - The watchdog job should not allow a node to detect itself as offline
6052 - Sybase ASE result set has already been closed during trigger exists check
6072 - sym_node gets updated unnecessarily when heartbeat.update.node.with.batch.status parameter is disabled
6074 - Sync triggers fails when checking for multiple active trigger histories if Sybase ASE page size is 2K
6087 - Upgrade from pre-3.15 to 3.15 loses H2 databases
6099 - Many router types attempt to handle non-DML data event types when they do not support them
6100 - Engine "filesync" not found

3.15.2 (Pro)
6109 - Web console is unresponsive after logging in via SAML
6110 - Logging in via SAML results in the web console repeatedly reloading itself
6120 - JsonIOException fails to deserialize log summary event
6121 - Save As Copy in GUI always keeps saved object as selected
6138 - Refresh loop after hitting refresh button in browser
6142 - Postgres log miner parsing exception with NULL value
6147 - SQL-Server bulk load bcp integrated security
6157 - Getting logged out after returning to SymmetricDS with 'Session Limit Exceeded'
6158 - Upgrade of module can fail on Windows because files are locked

3.15.2
6115 - Cancel of load at target does not clean up everything at the source and still shows active at target
6128 - Dbfill of nchar/nvarchar and avoid timestamp/rowversion
6139 - Jtds driver does not work with Sybase ASE
6140 - DB compare was incorrectly hex-encoding Unitype columns
6144 - Postgres timestamp with time zone columns get their values formatted incorrectly when extracted for a load
6145 - Purge fails with incorrect syntax near 'd' on SQL Server
6152 - DDL replication errors on SQL-Server with renaming columns and deadlocks
6155 - Conflict resolver does not handle unique index violations correctly when a unique index ignores null values
6156 - Repair of unrouted data should go through routing
6159 - Firebird sym_hex UDF can cause an access violation

3.15.3 (Pro)
6005 - "Enter" keyboard shortcut in wizards does not consistently work when using Chrome or Edge
6033 - Work queued via BackgroundRefresherService sometimes does not get done
6161 - Mail Server checked wrong class for encryption type and password
6167 - Checking for root user during installation fails even when user is root
6180 - "Allow changes from SQL to be captured" checkbox doesn’t work when sending SQL
6182 - Table name filter in Load Data Wizard doesn’t work
6186 - Configure → Table Routing screen stuck in bulk edit mode
6187 - Enabling change tracking on MSSQL should not use brackets
6197 - Failed to queue work because the background refresher service has been shut down
6204 - Selection on Manage Installed Triggers screen does not behave correctly when filtering the grid
6213 - Encrypted parameter values need to be decrypted before saving into the batch file when synchronizing
6215 - Violation Edit Panel throws exceptions when parsing JSON text for reset of statistics dates and when generating JSON strings
6216 - MySQL Bulk Loading documentation in appendix missing images
6220 - Incoming Panel on dashboard does not show bulk loading correctly

3.15.3
4617 - Corrupted row data during extract
6163 - Snapshot error from database time on Sybase ASE/ASA
6168 - File sync push is rejected because of a lack of a reservation
6171 - Cookies required error when both http and https enabled
6176 - Upgrade Jetty
6193 - Adjusting unique indexes to non-unique when columns can be null should be able to be turned off by parameter
6194 - Postgres XML incorrectly identifies "BOOLEAN" as "BIT"
6195 - symadmin module error when file exists without a dot
6205 - Syncing a NCLOB from Oracle to Postgres results in an error
6207 - Reverse initial load sometimes doesn’t start when also using forward initial load
6212 - Registration error: sym_parameter changes causing sync triggers need to be limited to DML changes
6214 - SQLite sync error on sym_table_reload_request when db.treat.date.time.as.varchar.enabled
6224 - Imported configuration sometimes gets deleted from sym_data

3.15.4 (Pro)
6137 - take snapshot from license violation screen does not show the snapshots to download them
6183 - Terminal on Manage Nodes screen does not work
6227 - If import config during first setup contains license, don’t prompt for license
6230 - DB2 AS400 iSeries failed to mine log for numeric data types that had a scale.
6232 - Node group summary database icons sometimes broken
6233 - SAML authentication does not work with a load balancer
6237 - Health panel should not count insights
6238 - When the Process Builder returns non-zero for the Bulk Loader Screen, an UnknownFormatException can occur
6241 - Switching engine not taking effect on Manage Comparison panel
6250 - Registration failing when registering node is remote and SMTP Mail Server authentication is configured
6257 - Design wizard creates lookup table router with unknown type
6258 - Lookup table router with log mining
6260 - Comparison screen views repair script as garbage binary when encrypted staging is enabled
6268 - Registration failing when registering node is remote and SMTP password is set to null in sym_parameter
6284 - Remote status with websockets broken after Spring Boot transition
6286 - IndexOutOfBoundsException occurs when trying to access incoming batch data in error via the UI
6289 - Compare request can’t update status, loops creating new request IDs
6295 - Compare repair table request gets stuck in inconsistent state
6307 - Syntax error when updating sym_table_reload_status using a Progress OpenEdge database
6309 - LOBs should not be included in where clauses when using a Progress OpenEdge database

3.15.4
6170 - DB Compare incorrectly comparing values
6217 - Schema information missing from drop index query generated by DDL on PostgreSQL
6226 - H2 DDL Builder incorrectly adds size information to "UUID" data type
6229 - Old stage files used after node is rebuilt
6246 - Cancel Load needs to make sure processes threads shut down before updating outstanding load request records
6251 - BSH column transform column names can conflict with built-in variable names
6252 - ASE large column types for primary keys need to limit max size based on page size
6253 - Issue with Initial loads when using Sybase ASE Unitypes while using JTDS driver
6259 - Sync triggers is mis-detecting last update time on sym triggers
6264 - Include source_node_id in the where clause when updating or deleting from sym_table_reload_status
6267 - Prevent columns from being created with a size of 0
6270 - Prevent OracleSymmetricDialect from underestimating the current value of a sequence
6271 - Finding trigger histories should treat null or blank as default catalog/schema
6275 - FileSyncDataRouter gets FileTriggerRouters from database instead of cache
6283 - Spring Framework URL Parsing with Host Validation
6285 - Memory leak in MSSQL JDBC driver 10.2.0
6288 - Writing table definitions from xml for indexes that do not have a corresponding platform index
6296 - DefaultDatabaseWriter sql(…​) method parsing sql statement during exception needs changed
6297 - Upgrade mysql, postgres, vaadin, jetty libraries
6300 - Hot spot removing old node sessions in mixed environment with versions < 3.11
6302 - Unable to set web context path with symmetric.server.web.home

3.15.5 (Pro)
6317 - Add Tables Wizard reads table from wrong database when opened from target node with *.auto.create.trigger.options enabled
6330 - When editing an email-type notification, the email address does not display
6338 - SQL Server bcp bulk loader can’t handle database URLs that specify the server name or port number via connection properties
6340 - Debug logging for Db2As400LogMiner doesn’t work

3.15.5
6310 - Sybase ASE 12 can only quote column names 28 characters or less
6312 - Failed to decrypt password counter measure if node registration is already open
6313 - Sync triggers for table should treat null or blank catalog/schema as default catalog/schema
6315 - MySQL and MariaDB create table support for UNSIGNED columns
6318 - NullPointerException while extracting data on SQLite as the typeName is not being set by driver
6321 - Issues using DB Compare with Unitypes
6324 - Routing file deletes causes null pointer exception when capturing statistics
6325 - Spring Framework URL Parsing with Host Validation (part 2)
6328 - Specifying a reload channel ID for the channel_id in sym_table_reload_request results in the load getting stuck
6335 - File sync batches get synchronized when there is an error during extraction
6342 - Index out of bounds routing change to sym_node_group_link
6343 - DbCompare on Postgres not using cursor with fetch size
6350 - H2 version 2 LONGVARCHAR implementation uses VARCHAR(1000000000)
6353 - Recapture data in purge service should not handle pre-routed data records
6355 - Support autosave=always mode on PostgreSQL
6356 - Creating a table in a load was not checking if platform column existed

3.15.6 (Pro)
6348 - Issue using DbCompare on SQLServer with table names using reserved keywords
6358 - Filter on Configure Table Triggers screen doesn’t work correctly
6368 - License validation fails when the registration server’s sym_node_host row is missing and there are unsent heartbeat batches
6372 - Source Table field can appear to be blank when editing an existing transform
6378 - NullPointerException in bcp bulk loader when a batch’s row count exceeds the mssql.bulk.load.max.rows.before.flush
6379 - Fixed Use Windows Authentication option not showing in the Runtime Database Settings screen
6382 - SQL Server log miner should use table cache
6388 - SQL Server bcp bulk loader converts zero-length binary values to null values

3.15.6
6277 - Startup of SymmetricDS does not fail when Jetty fails to access defined ports
6347 - Support SQLServer float positive negative infinity value
6357 - Initial load with overridden symmetric table trigger definition should skip symmetric tables when creating create table events
6359 - Purge of stranded data fails on Sybase ASE
6361 - NullPointerException when sending a load with file sync enabled and without a valid sym_trigger_hist row for sym_file_snapshot
6362 - Upgrade Jetty libraries
6363 - Auto resolve delete of blocking rows when binary type in primary key
6370 - MySQL 5.5 and earlier don’t allow timestamp precision
6373 - SQLite purge fails with unrecognized token: "{"
6383 - DB Compare fails to work bidirectionally when using Unitypes
6385 - Error on registration batch or import of config from newer 3.14 or 3.15

3.15.7 (Pro)
6390 - Bi-directional log-based intermittent unrouted batches that should have routed
6403 - Transform column editor on Configure Transforms screen can get into a state where a column cannot be deselected
6416 - MySQL log-based permission check failure can exhaust connection pool
6422 - Incorrect console event logging when ignoring a row from Outgoing Batch Panel
6423 - Send Table Schema does not list the tables correctly when trigger is defined with wildcard characters for the table name
6428 - Compare request may not complete when non-initiating node is the target
6443 - Control → Toggle Priority button on Manage Nodes screen is only enabled if the current node and selected node are multi-homed
6450 - Oracle log miner stuck on resetting SCN number ORA-01281
6451 - The logminer fails to serialize/deserialize timestamps
6464 - SQL-Server bcp error datetime fractional second precision exceeded

3.15.7
6394 - When building DDL for SQL Server, default values of 'true' or null for bit columns get changed to 0
6401 - Issue with file sync when successful, retry is tried even when bean shell script is successful
6406 - Trigger Sync do not capture updates on included_column_names or excluded_column_names
6414 - Stream Lobs setting does not work with Sybase ASE Unitypes
6415 - Recapture data for stranded data and for expired data gaps should keep the old data values to allow subselect routing to work
6419 - Stopping an engine from JMX sets the auto.start.engine false for ALL engines.
6420 - SQL Server money data type error with commas
6424 - Statistics for synchronization should not be saved when batch is in error
6433 - Exception when auto resolver tries to lock row in conflict
6442 - NullPointerException when searching for a matching trigger history and row_data or pk_data is null
6447 - Stack overflow when inserting last gap
6452 - Newer wins conflict detection table case when cross platform
6453 - SQL Explorer tree displays schemas incorrectly when using Postgres JDBC driver version 42.7.0 or later
6458 - DB Compare unable to process Unitypes in both directions.
6459 - Unitext Columns fail during initial load
6468 - Symadmin export-sym-tables subcommand doubles the table prefix when called without the --alters option
6476 - If auto resolve missing foreign key fails, try again

3.15.8 (Pro)
6457 - Configure → Table Triggers screen stuck in bulk edit mode
6479 - SQL Server log miner replicating bit as true/false instead of 1/0 causing it to load as false
6490 - Compare with level 2 statistics gets null pointer exception
6500 - Kafka throws "Could not find target table" error when "bulk" is used
6501 - Batch error monitor fails to convert batch details to JSON when they contain a java.sql.Timestamp
6504 - Compare with CHAR columns with databases using different padding
6518 - Compare missing t alias, cluster lock, support Boolean and LocalDateTime
6522 - Failed to compare request with IOException stream closed
6523 - Compare extract table query can fail if initial load select uses table alias
6525 - Creating an extension for IDatabaseWriterFilter prevents batches from loading
6536 - When importing configuration via the "Connect Database Wizard", sym_console_role does not get populated
6554 - Java validation pop-up on extensions screen
6556 - CPU monitor is inaccurate for systems with a Mac or Linux OS and more than 1 core

3.15.8
4000 - java.lang.NoClassDefFoundError: org.jumpmind.symmetric.io.stage.StagingManager$1, even though the class exists in the jar file
6475 - New "Initial Load" not cancelling previous initial loads
6482 - Could not find trigger history causes error of wrong number of columns data validation in wrong column
6485 - Do not issue foreign key correction for non-DML events
6487 - Wildcard trigger definitions do not remove existing triggers when adding a NOT table name to wild carded definition
6488 - org.hsqldb.HsqlException: length must be specified in type definition: VARCHAR
6503 - Sync on incoming batch setting does not get applied if a group link exists with the same source and target group ID
6505 - Service error and bad request are using same 601 http error code
6507 - Values can be matched with the wrong columns during extraction when using targetExternalId variable and table definitions differ
6508 - SQL-Server DDL table alterations when change not needed
6510 - SQLite with initial load in background can hang
6513 - File Sync Tracker changes to improve performance and to collect completely the set of files
6514 - H2 always reconfiguring sym_node table when schema XML changes most_recent_active_table column from varchar to varchar(255)
6515 - Incoming batch from reload missing table summary when 0 rows
6517 - Multi primary incorrectly detected when group link is routes only
6520 - Trigger template replacement for SQL Server and Sybase not replacing channel id variables correctlly
6524 - Symadmin sync-triggers command does not update triggers
6526 - Triggers aren’t synced after schema changes.
6531 - 0006530: Conflict resolution needs to set source node ID when executing conflict resolution for a SQL Server log mining node
6533 - mssql-jdbc 12.6.1 SocketTimeoutException
6539 - FileSyncDataRouter should handle initial load that uses an initialloadselect like other routers
6547 - Prevent registration of registration server or empty node group
6552 - SQL Anywhere fails to call DatabaseMetaData.getSchemas()

3.15.9 (Pro)
6563 - AS400 log miner support for negative numeric values
6568 - Summary 0006563: AS400 log miner support for null numeric values
6579 - Clustering does not enable after adding license key or changing from GUI
6581 - Java job validation behaves incorrectly
6583 - Clicking outside of job script editor causes unexpected behavior
6588 - Setup program warns of memory available on Linux
6589 - Restart needed after setup wizard downloads of driver

3.15.9
6562 - Stream LOB when row is deleted can get exception ColumnNotFoundException
6565 - Java Load Filter compilation error when some categories are blank.
6566 - Load cancellation not working from client node
6567 - Outgoing and incoming error tables sync to wrong targets
6571 - Database trigger is left on table after removing configuration for it
6572 - SQL Server updates create duplicate rows with datetime2 in primary key
6586 - StackOverflow on startup with DB2 LUW
6590 - Empty LOB loads as null on Oracle
6597 - Registration batch fails with foreign key error
6600 - DDL replication of create table with insert in same transaction
6602 - MySQL/MariaDB treat bit type with size greater than 1 as integer
6603 - NULL-able trait is not preserved, when column referenced by a unique index
6604 - Upgrade Spring libraries

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 Tables

Table Name Description

sym_outgoing_error

The captured data change that is in error for a batch. The user can tell the system what to do by updating the resolve columns. Entries in data_error are created when an outgoing batch encounters an error.

sym_compare_request (Pro)

Compare one or more tables between source and target nodes with option to repair data

sym_compare_status (Pro)

Compare one or more tables between source and target nodes with option to repair data

sym_compare_table_status (Pro)

Status by table of a compare_request to compare one or more tables.

New Columns

SYM_CONSOLE_ROLE (Pro)
Column Name Description

parent_role_id

SYM_CONSOLE_USER (Pro)
Column Name Description

is_glass_break_required

Indicates if a glass break is required to login as the user.

break_glass_start_time

Timestamp when the glass was last broken.

break_glass_end_time

Timestamp when the glass break expires.

break_glass_user_id

ID of the user who last broke the glass for this user.

SYM_DATA_GAP
Column Name Description

is_expired

Routing will watch a gap for data to commit up until the time of routing.stale.dataid.gap.time.ms parameter is reached, then this flag is set to expire it. The purge job will see any data that commits after expiration as stranded data.

SYM_MONITOR (Pro)
Column Name Description

display_order

Numerical ascending order of monitors to display to user.

is_insight

Insights are optional recommendations for changing the system settings, while other monitors are for errors that must be resolved.

is_pinned

A pinned monitor will be displayed to the user even if there are no unresolved events for it.

SYM_MONITOR_EVENT (Pro)
Column Name Description

is_insight

Insights are optional recommendations for changing the system settings, while other monitor events are for errors that must be resolved.

not_before

Timestamp before which the recommendation should not be displayed in the web console.

approved_option

Identifier for the option that was selected when approving the recommendation.

approved_by

The user who approved the event.

is_approval_processed

Whether the recommendation’s approval has been processed.

SYM_NODE_GROUP_LINK
Column Name Description

sync_sql_enabled

Whether SQL/DDL events are routed and synced on this link.

SYM_NODE_HOST_STATS
Column Name Description

purged_stranded_data_rows

purged_stranded_event_rows

purged_expired_data_rows

SYM_TRIGGER
Column Name Description

time_based_column_name

Only used for time-based capture nodes. This will be the column to use as part of the time-based capture mining.

SYM_TRIGGER_ROUTER
Column Name Description

data_refresh_type

If this table should be refreshed when the refresh job runs. Usually for tables where typical trigger, log, or time-based capture is not available. Possible values are: 'auto' (attempts difference only refresh unless there are more than the threshold and will switch automatically to a full), 'differences' (Uses the compare feature to send only differences), and 'full' (remove all data at the target and fully load it again using a reload)

Modified Tables

SYM_CONSOLE_ROLE (Pro)
  • Added foreign key fk_conrole_conrole (parent_role_id)

SYM_NODE
  • most_recent_active_table size changed from null to 255

SYM_NODE_GROUP_CHANNEL_WND
  • start_time size changed from null to 2

  • end_time size changed from null to 2

SYM_NODE_HOST_CHANNEL_STATS
  • start_time size changed from null to 2

  • end_time size changed from null to 2

SYM_NODE_HOST_JOB_STATS
  • start_time size changed from null to 2

  • end_time size changed from null to 2

SYM_NODE_HOST_STATS
  • start_time size changed from null to 2

  • end_time size changed from null to 2

SYM_OUTGOING_BATCH
  • Modified columns on index idx_ob_node_status:

    • Old: (node_id, status)

    • New: (node_id, channel_id, status)

SYM_REGISTRATION_REQUEST
  • create_time size changed from null to 2

SYM_TABLE_RELOAD_REQUEST
  • create_time size changed from null to 2

Parameters

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

New Parameters

auto.resolve.capture.delete.missing.rows

If this is true, when a delete affects zero rows, if the table is configured for sync on incoming, then the auto resolver will write the deletes into the capture log. (Default: false)

auto.resolve.foreign.key.violation.delete

If this is true, when a batch receives a foreign key violation due to the parent row being updated or deleted, all existing child rows will be deleted. (Default: true)

auto.resolve.primary.key.violation

If this is true, when a batch receives a primary key violation during an update, the blocking row will be replaced with the updated row. (Default: true)

auto.resolve.unique.index.ignore.null.values

If this is true, when a batch receives a unique index violation, the blocking rows for each unique index will only be deleted if the unique index has a value that is not null. (Default: true)

auto.resolve.unique.index.violation

If this is true, when a batch receives a unique index violation, the blocking rows for each unique index will be deleted. (Default: true)

cache.monitor.time.ms (Pro)

This is the amount of time monitor entries will be cached before re-reading them from the database. (Default: 60000)

cache.notification.time.ms (Pro)

This is the amount of time notification entries will be cached before re-reading them from the database. (Default: 60000)

cloud.bulk.codepage (Pro)

The cloud based codepage to use for bulk insert if supported by vendor and version (Default: )

cloud.bulk.field.quote (Pro)

The cloud based character used in bulk loading to be used when quoting fields (Default: �)

cloud.bulk.field.terminator (Pro)

The cloud based terminator used in bulk loading to separate each field (Default: |)

cloud.bulk.load.azure.account.key (Pro)

The Azure storage account key (Default: )

cloud.bulk.load.azure.account.name (Pro)

The Azure storage account name (Default: )

cloud.bulk.load.azure.blob.container (Pro)

The Azure storage account blob container name (Default: symmetricds)

cloud.bulk.load.azure.sas.token (Pro)

The Azure storage account SAS Token (Shared Access Signature) (Default: )

cloud.bulk.load.max.bytes.before.flush (Pro)

Maximum number of bytes to write to file before copying to cloud storage (Default: -1)

cloud.bulk.load.max.rows.before.flush (Pro)

Maximum number of rows to write to file before copying to cloud storage (Default: -1)

cloud.bulk.load.s3.access.key (Pro)

The AWS access key ID (aws_access_key_id) to use as credentials for uploading to S3 (Default: )

cloud.bulk.load.s3.bucket (Pro)

The S3 bucket where bulk load files will be uploaded (Default: )

cloud.bulk.load.s3.endpoint (Pro)

The endpoint for the s3 bucket. If not set it will use the default endpoint. (Default: )

cloud.bulk.load.s3.region (Pro)

The AWS S3 region (Default: us-east-1)

cloud.bulk.load.s3.secret.key (Pro)

The AWS secret access key (aws_secret_access_key) to use as credentials for uploading to S3 (Default: )

cloud.bulk.row.terminator (Pro)

The cloud based terminator used in bulk loading to be used for a new row (Default: )

compare.immediate.if.request.found (Pro)

If true, the job will continue running as long as uncompleted requests exist. See compare.immediate.time.ms for the delay between checking and executing requests. (Default: true)

compare.immediate.time.ms (Pro)

The delay between querying for uncompleted requests when compare.immediate.if.request.found is true. (Default: 2000)

compare.lock.timeout.ms (Pro)

The amount of time a single compare worker node_communication lock will timeout after. (Default: 7200000)

compare.max.inflight.count (Pro)

Maximum number of outstanding changes for a table that is allowed for comparison. When the maximum is exceeded, the table request will be ignored. (Default: 10000)

compare.queue.per.request.count (Pro)

Number of threads to use for each compare request. See also compare.thread.per.server.count for overall thread pool. (Default: 4)

compare.repair.batch.csv (Pro)

If true, the repair script will be batch CSV and use the default data loader. The data loader is tolerant of different case for catalog, schema, and table name. If false, the repair script will be SQL with unquoted table names that is run on the database. (Default: true)

compare.thread.per.server.count (Pro)

The number of threads created that will be used to compare data concurrently on one node in the cluster. (Default: 10)

console.auth.ldap.admin.password (Pro)

The password for the user specified by the console.auth.ldap.adminDN parameter. (Default: )

console.auth.ldap.adminDN (Pro)

The DN of the user to log in as while determining whether a user belongs to one of the groups specified by the console.auth.ldap.role.group.map parameter. If blank, the credentials from the login screen will be used. (Default: )

console.auth.ldap.memberAttribute (Pro)

The attribute of an LDAP group to check to determine whether or not a user is a member of the group. This only has an effect if the console.auth.ldap.role.group.map parameter is set and the console.auth.ldap.use.memberOf parameter is set to false. (Default: member)

console.auth.ldap.role.group.map (Pro)

Map of LDAP groups to console role IDs. Allows LDAP users to log in without having a corresponding console user if they are a member of one of the specified groups. (Default: )

console.auth.ldap.use.memberOf (Pro)

Whether or not the LDAP server maintains a "memberOf" attribute. This only has an effect if the console.auth.ldap.role.group.map parameter is set. (Default: true)

console.auth.saml.groupAttribute (Pro)

The attribute of an SAML response to check to determine whether or not a user is a member of a SAML group. This only has an effect if the console.auth.saml.role.group.map parameter is set. (Default: group)

console.auth.saml.idp.cert (Pro)

Path to the public x509 certificate of the SAML IdP. (Default: )

console.auth.saml.idp.entityid (Pro)

Identifier of the SAML IdP entity (must be a URI). (Default: )

console.auth.saml.idp.sso.service.url (Pro)

SSO endpoint info of the SAML IdP. URL target of the IdP where the SP will send the authentication request message. (Default: )

console.auth.saml.organization.display.name (Pro)

Display name of the organization within the SAML SP’s metadata (Default: )

console.auth.saml.organization.language (Pro)

Language of the organization within the SAML SP’s metadata (Default: )

console.auth.saml.organization.name (Pro)

Name of the organization within the SAML SP’s metadata (Default: )

console.auth.saml.organization.url (Pro)

URL of the organization within the SAML SP’s metadata (Default: )

console.auth.saml.role.group.map (Pro)

Map of SAML groups to console role IDs. Allows SAML users to log in without having a corresponding console user if they are a member of one of the specified groups. (Default: )

console.auth.saml.sp.nameid.format (Pro)

Specifies constraints on the name identifier to be used to represent the requested subject during SAML authentication. (Default: urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified)

console.log.slow.refresh.threshold.millis (Pro)

The number of milliseconds before logging that the refresh of a screen is slow. (Default: 5000)

console.log.slow.sql.threshold.millis

For queries related to the web console, defines the number of milliseconds before logging that a query is slow. (Default: 4000)

console.report.as.offline.minutes (Pro)

Setting that defines when a Node should be considered "offline." The offlineNodes, batchUnsent, and batchUnsentOffline monitors use this setting. (Default: 1440)

create.index.convert.unique.to.nonunique.when.columns.not.required

If set to true, then convert unique indexes to non-unique when one of the columns is defined as not required (defined with the NOT NULL constraint). (Default: true)

data.refresh.create.first (Pro)

Whether or not to set create first flag on reload requests from the data refresh job. See also initial.load.defer.create.constraints which defaults to true. If setting both this and initial.load.defer.create.constraints to true, the reload request will remove constraints before loading the data, and add back the constraints afterwards. (Default: false)

file.compression.level

Set the compression level this node will use when compressing file synchronization payloads. @see java.util.zip.Deflater NO_COMPRESSION = 0 BEST_SPEED = 1 BEST_COMPRESSION = 9 DEFAULT_COMPRESSION = -1 (Default: -1)

file.sync.azure.account.name (Pro)

Azure Blob Storage Account Name for file sync (Default: )

file.sync.azure.sas.token (Pro)

Azure Blob Storage SAS token for file sync (Default: )

file.sync.delete.zip.file.after.sync

If set to true, this will delete the zip file from staging immediately after attempting to sync it to the target. If synchronization fails due to a timeout or an error, the zip file will have to be re-created during the next sync attempt. If set to false, this will leave the zip file in staging until it is purged by the Stage Management job. (Default: false)

file.sync.retry.count

How many times the file sync bean shell script will be attempted at the target node. The bean shell script will be attempted more than once if the exception java.nio.file.FileSystemException is thrown during the execution of the script. (Default: 2)

file.sync.retry.delay.ms

How long to pause in milliseconds between the attempts of the bean shell script that is run at the target node when the execution of the script fails. (Default: 5000)

file.sync.s3.account.key (Pro)

S3 Access Key for Bucket Storage (Default: )

file.sync.s3.region (Pro)

S3 Region for Bucket Storage (Default: )

file.sync.s3.secret.key (Pro)

S3 Secret Key for Bucket Storage (Default: )

filesynctracker.max.rows.before.commit

Maximum number of rows to put into sym_file_snapshot in a single database transaction. This will help keep sym_data freed up for other processing to occur. (Default: 10000)

job.purge.max.data.gaps.read

The maximum number of expired data gaps to check individually before using a single query to detect any expired data that was missed. The single query gets a range from sym_data before the starting gap that does not exist in sym_data_event, and then queries only the expired data gaps that are within that range. (Default: 100)

license.cache.time.ms (Pro)

How long in milliseconds to cache license key. Useful for re-reading license key that was just installed to a cluster. (Default: 60000)

log.miner.mariadb.directory (Pro)

Specifies the name and path for the directory that contains MariaDB’s binary log files. When blank, SymmetricDS will use each log file’s path as it appears in MariaDB’s binary log index file. (Default: )

log.miner.mariadb.index (Pro)

Specifies the name and path for MariaDB’s binary log index file. When blank, SymmetricDS will use MariaDB’s log_bin_index system variable. (Default: )

log.miner.mssql.sort.by.transaction.id (Pro)

Specifies that the order of the SQL Server log mining output should be ordered by transaction ID. If set to false, then the output is ordered by foreign key constraints. (Default: true)

log.miner.use.incoming.transactions (Pro)

Use incoming batches to collect transaction IDs and their source node IDs. When mining changes, it will ignore these transactions to prevent update loops. If trigger.sync_on_incoming is enabled, it will mine the change but include the source node ID so routing won’t send a batch back to that node. Some miners have their own built-in loop prevention and don’t need this. Supported on the following platforms: PostgreSQL, Oracle, MySql, MariaDB. (Default: true)

monitor.events.capture.enabled (Pro)

Enable capturing of monitor events and syncing to other nodes. When disabled, monitor events are still generated, just not synced to other nodes. (Default: true)

mssql.bulk.load.bcp.cmd (Pro)

Specifies the path to the SQL Server bulk copy program utility (bcp) executable. (Default: )

mssql.bulk.load.bcp.keep.null.values (Pro)

Specifies if null values should remain null when using the SQL Server bcp bulk loader to load into nullable columns that have default values. (Default: false)

mssql.bulk.load.bcp.quoted.identifiers (Pro)

Specifies that identifiers like database, schema, and tables names need to be quoted because they may contain special characters like spaces or dashes. (Default: true)

mssql.bulk.load.bcp.trust.server.cert (Pro)

Specifies if server cert should be trusted when connecting bcp bulk loader to SQL Server. (Default: false)

mssql.bulk.load.bcp.use.instance (Pro)

Specifies if the server instance should be used on the SQL Server bulk copy program utility (bcp) executable. (Default: true)

mssql.bulk.load.field.terminator (Pro)

Specify the field terminator used by the SQL Server bulk loader. Pick something that does not exist in the data in your database. (Default: |})

mssql.bulk.load.fire.triggers (Pro)

Whether or not triggers should be allowed to fire when bulk loading data. (Default: false)

mssql.bulk.load.max.rows.before.flush (Pro)

Maximum number of rows to write to file before running with "BULK INSERT" to SQL-Server (Default: 100000)

mssql.bulk.load.row.terminator (Pro)

Specify the line terminator used by the SQL Server bulk loader. Pick something that does not exist in the data in your database. (Default: |>\n)

mssql.bulk.load.unc.path (Pro)

Specify a UNC network path to the tmp\bulkloaddir directory for SQL Server to access bulk load files. Use this property with bulk loader when SymmetricDS is on a separate server from SQL Server. (Default: )

mssql.bulk.load.use.bcp (Pro)

Enables the use of the SQL Server bulk copy program utility (bcp) as the bulk loader. (Default: false)

mysql.bulk.load.local (Pro)

Whether or not files are local to client only, so we must send the file to MySQL to load. If client is running on same server as MySQL, then this can be set to false to have MySQL read file directly. (Default: true)

mysql.bulk.load.max.bytes.before.flush (Pro)

Maximum number of bytes to write to file before running with 'LOAD DATA INFILE' to MySQL (Default: 1000000000)

mysql.bulk.load.max.rows.before.flush (Pro)

Maximum number of rows to write to file before running with 'LOAD DATA INFILE' to MySQL (Default: 100000)

mysql.bulk.load.replace (Pro)

Whether or not to replace rows that already exist, based on primary key or unique key. If set to false, duplicates will be skipped. (Default: true)

oracle.bulk.load.ezconnect (Pro)

For bulk loading with SQL*Loader, specify how to connect to the database with an ezconnect name. If blank, the connection is determined using the db.url parameter. (Default: )

oracle.bulk.load.field.terminator (Pro)

Specify the field terminator used by the Oracler SQL*Loader. Pick something that does not exist in the data in your database. (Default: |})

oracle.bulk.load.line.terminator (Pro)

Specify the line terminator used by the Oracler SQL*Loader. Pick something that does not exist in the data in your database. (Default: |>)

oracle.bulk.load.sqlldr.cmd (Pro)

Path to the sqlldr executable for running Oracle SQL*Loader. If blank, it will check for ORACLE_HOME environment variable and find sqlldr there. Otherwise, it will run "sqlldr" and expect the operating system to find it. (Default: )

oracle.bulk.load.sqlldr.infile.charset (Pro)

For bulk loading with SQL*Loader, specify input file character set when needed to support characters other than US-ASCII characters. For example: oracle.bulk.load.sqlldr.infile.charset=UTF8 LENGTH SEMANTICS CHAR This will generate the following string in the control file after the LOAD DATA line: CHARACTERSET UTF8 LENGTH SEMANTICS CHAR If blank, this line will not show up. (Default: )

oracle.bulk.load.sqlldr.options (Pro)

Options passed to Oracle SQL*Loader. (Default: silent=(header,discards) direct=false readsize=4096000 bindsize=4096000 rows=2000 errors=0)

postgres.convert.infinity.date.to.null

Enable this parameter to convert infinite (positive or negative) values of date and timestamp (with/without time zones) types to null. DatabaseOverrideable: false (Default: true)

purge.compare.request.retention.minutes (Pro)

This is the retention time for how long a compare request will be retained (Default: 14400)

purge.expired.data.gap.retention.minutes

This is the retention time for how long an expired data gap will be retained. The purge job will watch for data to commit inside of expired data gaps, and try to resend the data. Knowing about expired data gaps lets the purge use a fast range-based delete but avoid purging any ranges that could include expired data gaps. (Checking for stranded data before running a purge isn’t sufficient because it leaves open a race condition of the data arriving during the deletes.) (Default: 1440)

purge.monitor.event.retention.minutes

This is the retention time for how long to keep monitor events before purging them. (Default: 43200)

redshift.append.to.copy.command (Pro)

The value of this property will be appended to the end of the copy command when the redshift data loader is enabled. (Default: )

redshift.bulk.load.max.bytes.before.flush (Pro)

Maximum number of bytes to write to file before copying to S3 and running with COPY statement (Default: 1000000000)

redshift.bulk.load.max.rows.before.flush (Pro)

Maximum number of rows to write to file before copying to S3 and running with COPY statement (Default: 100000)

redshift.bulk.load.s3.access.key (Pro)

The AWS access key ID (aws_access_key_id) to use as credentials for uploading to S3 (Default: )

redshift.bulk.load.s3.bucket (Pro)

The S3 bucket where bulk load files will be uploaded to before bulk loading into Redshift (Default: )

redshift.bulk.load.s3.endpoint (Pro)

The endpoint for the s3 bucket. If not set it will use the default endpoint. (Default: )

redshift.bulk.load.s3.secret.key (Pro)

The AWS secret access key (aws_secret_access_key) to use as credentials for uploading to S3 (Default: )

rest.api.enable (Pro)

Enables the REST API (Default: false)

rest.api.heartbeat.on.pull (Pro)

Enables the REST API to update the heartbeat when pulling data (Default: false)

routing.lock.timeout.ms

The amount of time a single routing worker node_communication lock will timeout after. (Default: 7200000)

routing.thread.per.server.count

The number of threads created that will be used to route channels concurrently on one server in the cluster. (Default: 5)

routing.use.channel.threads

When enabled, use a thread per channel for parallel routing. (Default: false)

smtp.allow.untrusted.cert (Pro)

Whether or not to accept an untrusted certificate for SSL/TLS when connecting to the mail server. (Default: false)

smtp.auth (Pro)

Whether or not to authenticate with the mail server. (Default: false)

smtp.from (Pro)

The email address to use in the "from" header when sending email. (Default: symmetricds@localhost)

smtp.host (Pro)

The hostname of the mail server (Default: localhost)

smtp.password (Pro)

When authenticating with the mail server, the password to use. (Default: )

smtp.port (Pro)

The port number of the mail server (Default: 25)

smtp.starttls (Pro)

Whether or not to use TLS after connecting to the mail server. (Default: false)

smtp.transport (Pro)

The transport type to use when connecting to mail server, either smtp or smtps. (Default: smtp)

smtp.user (Pro)

When authenticating with the mail server, the username to use. (Default: )

start.compare.job (Pro)

Whether the compare job is started. (Default: true)

start.data.refresh.job (Pro)

Whether the data refresh job is started. (Default: false)

start.monitor.job (Pro)

Whether the monitor job is started. (Default: true)

statistic.record.count.threshold

Controls whether statistics are recorded to the sym_node_host_job_stats table. Statistics will only be recorded if the number of items that were processed exceeds this threshold. A value of -1 (or any negative value) disables these statistics. (Default: 0)

tibero.bulk.load.dname (Pro)

For bulk loading with tbLoader, specify the database name. If blank, the database name is determined using the db.url parameter. (Default: )

tibero.bulk.load.field.terminator (Pro)

Specify the field terminator used by the Tibero tbLoader. Pick something that does not exist in the data in your database. (Default: |})

tibero.bulk.load.line.terminator (Pro)

Specify the line terminator used by the Tibero tbLoader. Pick something that does not exist in the data in your database. (Default: |>)

tibero.bulk.load.tbloader.cmd (Pro)

Path to the tbloader executable for running Tibero tbLoader. If blank, it will check for TB_HOME environment variable and find tbLoader there. Otherwise, it will run "tbloader" and expect the operating system to find it. (Default: )

tibero.bulk.load.tbloader.options (Pro)

Options passed to Tibero tbLoader (Default: direct=N dpl_parallel=1 disable_idx=N readsize=2097152 bindsize=2097152 rows=2000 errors=0)

time.based.capture (Pro)

Enables time based capture miner when the log miner job is running to select changes out of tables based on a date time column or numeric primary key (Default: false)

Modified Parameters

console.events.purge.retention.period (Pro)

This is the retention time for the number of minutes that a console event will be retained. (Old Default: 20160) (New Default: 43200)

db.pool.max.active

The maximum number of connections that will be allocated in the pool The http.concurrent.workers.max value should be less than half of this value. (Old Default: 40) (New Default: 50)

db.sql.query.timeout.seconds

Number of seconds a query can execute before being interrupted using the statement query timeout. The timeout can avoid hanging if a query is slow to return because of an un-optimized plan or if the system is overloaded. Set to zero for no limit. (Make sure socket/read timeout in db.url is set higher than query timeout.) (Old Default: 300) (New Default: 3600)

job.pull.period.time.ms

This is how often the pull job will be run to schedule pulls of nodes. (Old Default: 60000) (New Default: 10000)

job.push.period.time.ms

This is how often the push job will be run to schedule pushes to nodes. (Old Default: 60000) (New Default: 10000)

offline.node.detection.period.minutes

This is the number of minutes that a node has been offline before taking action A value of -1 (or any negative value) disables the feature. (Old Default: -1) (New Default: 86400)

purge.trigger.hist.retention.minutes

This is the retention time for how long an inactive trigger history will be retained (Old Default: 43200) (New Default: 86400)

target.db.sql.query.timeout.seconds

Number of seconds a query can execute before being interrupted using the statement query timeout. The timeout can avoid hanging if a query is slow to return because of an un-optimized plan or if the system is overloaded. Set to zero for no limit. (Make sure socket/read timeout in db.url is set higher than query timeout.) (Old Default: ) (New Default: 3600)

cloud.bulk.field.quote

{REMOVED}

redshift.bulk.load.s3.endpoint

{REMOVED}

tibero.bulk.load.field.terminator

{REMOVED}

job.monitor.period.time.ms

{REMOVED}

smtp.auth

{REMOVED}

smtp.from

{REMOVED}

mysql.bulk.load.local

{REMOVED}

oracle.bulk.load.sqlldr.options

{REMOVED}

smtp.host

{REMOVED}

mssql.bulk.load.bcp.cmd

{REMOVED}

rest.api.enable

{REMOVED}

cache.notification.time.ms

{REMOVED}

oracle.bulk.load.sqlldr.cmd

{REMOVED}

rest.api.heartbeat.on.pull

{REMOVED}

mysql.bulk.load.max.rows.before.flush

{REMOVED}

mssql.bulk.load.use.bcp

{REMOVED}

oracle.bulk.load.line.terminator

{REMOVED}

redshift.bulk.load.s3.bucket

{REMOVED}

cloud.bulk.load.azure.account.name

{REMOVED}

cloud.bulk.load.max.rows.before.flush

{REMOVED}

mssql.bulk.load.row.terminator

{REMOVED}

smtp.password

{REMOVED}

tibero.bulk.load.tbloader.options

{REMOVED}

cloud.bulk.load.s3.secret.key

{REMOVED}

mysql.bulk.load.max.bytes.before.flush

{REMOVED}

cloud.bulk.load.s3.access.key

{REMOVED}

cloud.bulk.load.s3.region

{REMOVED}

cloud.bulk.codepage

{REMOVED}

smtp.user

{REMOVED}

start.monitor.job

{REMOVED}

cloud.bulk.load.azure.blob.container

{REMOVED}

cloud.bulk.load.max.bytes.before.flush

{REMOVED}

redshift.bulk.load.max.bytes.before.flush

{REMOVED}

cloud.bulk.load.s3.endpoint

{REMOVED}

tibero.bulk.load.line.terminator

{REMOVED}

cloud.bulk.load.azure.account.key

{REMOVED}

redshift.bulk.load.max.rows.before.flush

{REMOVED}

mssql.bulk.load.field.terminator

{REMOVED}

redshift.append.to.copy.command

{REMOVED}

smtp.allow.untrusted.cert

{REMOVED}

oracle.bulk.load.sqlldr.infile.charset

{REMOVED}

tibero.bulk.load.tbloader.cmd

{REMOVED}

console.report.as.offline.minutes

{REMOVED}

mysql.bulk.load.replace

{REMOVED}

cache.monitor.time.ms

{REMOVED}

smtp.port

{REMOVED}

cloud.bulk.load.s3.bucket

{REMOVED}

mssql.bulk.load.fire.triggers

{REMOVED}

redshift.bulk.load.s3.secret.key

{REMOVED}

cloud.bulk.field.terminator

{REMOVED}

cloud.bulk.row.terminator

{REMOVED}

oracle.bulk.load.field.terminator

{REMOVED}

tibero.bulk.load.dname

{REMOVED}

mssql.bulk.load.max.rows.before.flush

{REMOVED}

redshift.bulk.load.s3.access.key

{REMOVED}

mssql.bulk.load.unc.path

{REMOVED}

oracle.bulk.load.ezconnect

{REMOVED}

smtp.starttls

{REMOVED}

smtp.transport

{REMOVED}

cloud.bulk.load.azure.sas.token

{REMOVED}

monitor.events.capture.enabled

{REMOVED}