Appendix B. Database Notes

Each database management system has its own characteristics that results in feature coverage in SymmetricDS. The following table shows which features are available by database.

DatabaseVersions supportedTransaction IdentifierFallback UpdateConditional SyncUpdate Loop PreventionBLOB SyncCLOB Sync
Oracle8.1.7 and aboveYYYYYY
MySQL5.0.2 and aboveYYYYYY
PostgreSQL8.2.5 and aboveY (8.3 and above only)YYYYY
SQL Server2005YYYYYY
Apache Derby10.3.2.1YYYYYY

Table B.1. Support by Database


B.1. Oracle

On Oracle Real Application Clusters (RAC), sequences should be ordered so data is processed in the correct order. To offset the performance cost of ordering, the sequences should also be cached.

alter sequence SEQ_SYM_DATA_DATA_ID cache 1000 order; alter sequence SEQ_SYM_OUTGOIN_BATCH_BATCH_ID cache 1000 order; alter sequence SEQ_SYM_TRIGGER_RIGGER_HIST_ID cache 1000 order; alter sequence SEQ_SYM_TRIGGER_TRIGGER_ID cache 1000 order; 

While BLOBs are supported on Oracle, the LONG data type is not. LONG columns cannot be accessed from triggers.

The SymmetricDS user generally needs privileges for connecting and creating tables (including indexes), triggers, sequences, and procedures (including packages and functions). The following is an example of the needed grant statements:


B.2. MySQL

MySQL supports several storage engines for different table types. SymmetricDS requires a storage engine that handles transaction-safe tables. The recommended storage engine is InnoDB, which is included by default in MySQL 5.0 distributions. Either select the InnoDB engine during installation or modify your server configuration. To make InnoDB the default storage engine, modify your MySQL server configuration file (my.ini on Windows, my.cnf on Unix):

default-storage_engine = innodb 

Alternatively, you can convert tables to the InnoDB storage engine with the following command:

alter table t engine = innodb; 

On MySQL 5.0, the SymmetricDS user needs the SUPER privilege in order to create triggers.

grant super on *.* to symmetric; 

On MySQL 5.1, the SymmetricDS user needs the TRIGGER and CREATE ROUTINE privileges in order to create triggers and functions.

grant trigger on *.* to symmetric; 
grant create routine on *.* to symmetric; 

B.3. PostgreSQL

Starting with PostgreSQL 8.3, SymmetricDS supports the transaction identifier.

In order to function properly, SymmetricDS needs to use session variables. On PostgreSQL, session variables are enabled using a custom variable class. Add the following line to the postgresql.conf file of PostgreSQL server:

custom_variable_classes = 'symmetric' 

This setting is required, and SymmetricDS will log an error and exit if it is not present.

Before database triggers can be created by in PostgreSQL, the plpgsql language handler must be installed on the database. The following statements should be run by the administrator on the database:

CREATE FUNCTION plpgsql_call_handler() RETURNS language_handler AS     '$libdir/plpgsql' LANGUAGE C;  CREATE FUNCTION plpgsql_validator(oid) RETURNS void AS     '$libdir/plpgsql' LANGUAGE C;  CREATE TRUSTED PROCEDURAL LANGUAGE plpgsql     HANDLER plpgsql_call_handler     VALIDATOR plpgsql_validator; 

B.4. MS SQL Server

SQL Server was tested using the jTDS JDBC driver.


HSQLDB was implemented with the intention that the database be run embedded in the same JVM process as SymmetricDS. Instead of dynamically generating static SQL-based triggers like the other databases, HSQLDB triggers are Java classes that re-use existing SymmetricDS services to read the configuration and insert data events accordingly.

The transaction identifier support is based on SQL events that happen in a 'window' of time. The trigger(s) track when the last trigger fired. If a trigger fired within X milliseconds of the previous firing, then the current event gets the same transaction identifier as the last. If the time window has passed, then a new transaction identifier is generated.

B.6. H2

The H2 database allows only Java-based triggers. Therefore the H2 dialect requires that the SymmetricDS jar file be in the database's classpath.

B.7. Apache Derby

The Derby database can be run as an embedded database that is accessed by an application or a standalone server that can be accessed from the network. This dialect implementation creates database triggers that make method calls into Java classes. This means that the supporting JAR files need to be in the classpath when running Derby as a standalone database, which includes symmetric-ds.jar and commons-lang.jar.

B.8. IBM DB2

The DB2 Dialect uses global variables to enable and disable node and trigger synchronization. These variables are created automatically during the first startup. The DB2 JDBC driver should be placed in the "lib" folder.

Currently, the DB2 Dialect for SymmetricDS does not provide support for transactional synchronization. Large objects (LOB) are supported, but are limited to 16,336 bytes in size. The current features in the DB2 Dialect have been tested using DB2 9.5 on Linux and Windows operating systems.

B.9. Firebird

The Firebird Dialect requires the installation of a User Defined Function (UDF) library in order to provide functionality needed by the database triggers. SymmetricDS includes the required UDF library, called SYM_UDF, in both source form (as a C program) and as pre-compiled libraries for both Windows and Linux. The SYM_UDF library is copied into the UDF folder within the Firebird installation directory.

For Linux users:

cp databases/firebird/ /opt/firebird/UDF

For Windows users:

copy databases\firebird\sym_udf.dll C:\Program Files\Firebird\Firebird_2_0\UDF

The Jaybird JDBC driver was used during testing, but the user must download the driver and place it in the SymmetricDS "lib" folder.

The following limitations currently exist for this dialect:

  • The outgoing batch does not honor the channel size, and all outstanding data events are included in a batch.

  • Syncing of Binary Large Object (BLOB) is limited to 16K bytes per column.

  • Syncing of character data is limited to 32K bytes per column.