Thursday 24 June 2021

SymmetricDS Installation & Configuration POC (Oracle->Oracle)


Oracle Database data synchronization using SymmetricDS – Overview

Here I am going to setup a real time table data synchronization between two Oracle Databases located in different locations. Symmetric DS is open source software that is free to use. It includes command line tools, documentation, and example configuration files for getting setup and running.

 Environment details 


Source

Target 

Instance Type

Production

Reporting

Oracle Database version

Oracle 11gR2 Standard Edition (11.2.0.4)

Oracle 11gR2 Standard Edition (11.2.0.4)

DB Schema Name

SCOTT1

SCOTT1

Operating System

Oracle Linux 7.9

Oracle Linux 7.9

Symetric DS Version

SymmetricDS 3.12.10

SymmetricDS 3.12.10

Symetric DS Location

/home/oracle/symdshome/ symmetric-server-3.12.10

/home/oracle/symds/symmetric-server-3.12.10

IP Address

158.101.7.75

129.146.254.56

 

We will install SymmetricDS on two servers One on production and other on target. One will represent the Source server and one will represent the Target server.

Each installed copy of SymmetricDS will be responsible for one database, and thus each copy acts as a single “node” in SymmetricDS terminology. This is the most common configuration of SymmetricDS – one installed copy of the software is responsible for one single database and represents one node.

We can replicate multiple schemas via SymmetricDS in other words You can replicate multiple source and target schemas if the jdbc connection and your database vendor supports it.

It is not a SymmetricDS limitation it would be based on each database and how you setup your permissions. If you can connect into SCOTT with user ABC and can still access SCOTT1 then your set if your database does not allow that then you cannot replicate multiple schemas via SymmetricDS.  SymmetricDS does not limit it is only based on what is allowed by your database

Download Latest version of the symmetricds from the symmetricds website https://www.symmetricds.org/

Latest version available - symmetric-server-3.12.10.zip

Software Installation steps

On source (Production)

I have copied the symmetricsds zip file to /home/oracle/symdshome folder, execute the unzip symmetric-server-3.12.1.zip command.
 

[oracle@symdssrc symdshome]$ pwd
/home/oracle/symdshome
[oracle@symdssrc symdshome]$ ls -lrt
total 42480
-rwxrwxrwx  1 oracle oinstall 43492343 Jun 17 14:41 symmetric-server-3.12.10.zip
 

[oracle@symdssrc symdshome]$ unzip symmetric-server-3.12.1.zip
chown -R oracle:oinstall symmetric-server-3.12.10
chmod 775 symmetric-server-3.12.10

On Target (Reporting)

 Kindly perform the same steps and as mentioned below.
[oracle@symds]$ mkdir -p /home/oracle/symds/
[oracle@symds symds] $ cd /home/oracle/symds/
/home/oracle/symds
[oracle@symds symds]$ ls -l
-rw-r--r--  1 oracle oinstall 43492343 Jun 18 06:55 symmetric-server-3.12.10.zip
[oracle@symds symds]$unzip symmetric-server-3.12.10.zip
chown -R oracle:oinstall /home/oracle/symds/symmetric-server-3.12.10
chmod 775 /home/oracle/symds/symmetric-server-3.12.10
 

SymmetricDS Configuration at Source & Target servers –

On Source we need mainly look in to two configuration files symmetric-server.properties & sym_service.conf, files located under conf folder on symetricds location

 

From symmetric-server.properties file ensure the below properties are uncommented and the ports listed are open for communication at source & target servers.

 http.port=31415

https.port=31417

I have used the default parameter configuration and copied sample engine property file (corp-000.properties) from sample folder and create a source-000.properties under engines folder


Key configuration parameters for source-000

We have to modify the key parameters from the corp-000.properties file to configure source engine for replication.

engine.name=source-000
db.driver=oracle.jdbc.driver.OracleDriver
db.url=jdbc:oracle:thin:@11.11.11.14:1521/symdssrc_dd.symdsonprem.symmetricds.oraclevcn.com
db.user=SCOTT
db.password=TIGER123
registration.url=  
sync.url=http://158.101.7.75:31415/sync/source-000
group.id=source
external.id=000
db.validation.query=select 1 from dual
cluster.lock.enabled=false
 

Note: registration.url is left blank to indicate this is the root/source node.
 

Key configuration parameter for dest-001

On target we will create file dest-001.properties under engines directory. Copy store-001.properties from sample folder and create it under the engine folder.

 

engine.name=dest-001
db.driver=oracle.jdbc.driver.OracleDriver
db.url=jdbc:oracle:thin:@11.11.11.2:1521/dbsystgt_db.symdspub.symmetricds.oraclevcn.com
db.user=SCOTT1
db.password=TIGER123
registration.url=http://158.101.7.75:31415/sync/source-000
sync.url=http://129.146.254.56:31415/sync/dest-001
group.id=dest
external.id=001
db.validation.query=select 1 from dual
cluster.lock.enabled=false
 

Pre-requisites prior creating SymmetricDS specific tables & initiate replication.

Step :1 (Create Replication User)


Create SCOTT user at source and target database and provide appropriate privileges.
Minimum privileges required for SymmetricDS replication is shared below.
CONNECT
RESOURCE
CREATE ANY TRIGGER
EXECUTE ON UTL_RAW

 

Step:2 (Create objects for Replication)

Create dummy table for replication at source and target. Insert few dummy records @ source DB only.

create table TEST1 (a1 number, desc01 varchar2(10));
create table TEST2 (a1 number, desc01 varchar2(10));
create table TEST3 (a1 number, desc01 varchar2(10));

insert into TEST1 values(1,’DAS’);
insert into TEST1 values(2,’SINGH’);
insert into TEST1 values(3,’SHIBIN’);
insert into TEST2 values(2,’DEV’);
insert into TEST3 values(3,’PLATO’);

commit;

Creation of SymmetricS specific tables in Production database

we need to create SymmetricDS-specific tables in the Production database. These tables will contain the configuration for synchronization. The following command uses the auto-creation feature to create all the necessary SymmetricDS system tables. thie command is required to be run only on production server.

 cd  /home/oracle/symdshome/symmetric-server-3.12.10/bin

./symadmin -engine source-000 create-sym-tables 

 [oracle@symdssrc bin]$ ./symadmin -engine source-000 create-sym-tables
Log output will be written to /home/oracle/symds/symmetric-server-3.12.10/logs/symmetric.log
[] - AbstractCommandLauncher - Option: name=engine, value={source-000}
[] - SymmetricUtils -
   _____                              __       _       ____   _____
  / ___/ __  _____ __  ___ __  ___  _/ /_ ____(_)___  / __ | / ___/
  \__ \ / / / / _ `_ \/ _ `_ \/ _ \/_ __// __/ / __/ / / / / \__ \
 ___/ // /_/ / // // / // // /  __// /  / / / / /_  / /_/ / ___/ /
/____/ \__  /_//_//_/_//_//_/\___/ \_/ /_/ /_/\__/ /_____/ /____/
      /____/
+-----------------------------------------------------------------+
| Copyright (C) 2007-2021 JumpMind, Inc.                          |
|                                                                 |
| Licensed under the GNU General Public License version 3.        |
| This software comes with ABSOLUTELY NO WARRANTY.                |
| See http://www.gnu.org/licenses/gpl.html                        |
+-----------------------------------------------------------------+
[source-000] - AbstractSymmetricEngine - Initializing connection to database
[source-000] - JdbcDatabasePlatformFactory - Detected database 'Oracle', version '11', protocol 'oracle'
[source-000] - JdbcDatabasePlatformFactory - The IDatabasePlatform being used is org.jumpmind.db.platform.oracle.OracleDatabasePlatform
[source-000] - OracleSymmetricDialect - The DbDialect being used is org.jumpmind.symmetric.db.oracle.OracleSymmetricDialect
[source-000] - StagingManager - The staging directory was initialized at the following location: /home/oracle/symds/symmetric-server-3.12.10/tmp/source-000
[source-000] - ClientExtensionService - Found 7 extension points from spring that will be registered
[source-000] - AbstractSymmetricEngine - Initializing SymmetricDS database
[source-000] - OracleSymmetricDialect - Installing SymmetricDS database object:
CREATE OR REPLACE FUNCTION sym_blob2clob (blob_in IN BLOB)                                                                                                                                                RETURN CLOB                                                                                                                                                             AS                                                                                                                                                                            v_clob    CLOB := null;                                                                                                                                                   v_varchar VARCHAR2(32767);                                                                                                                                                v_start   PLS_INTEGER := 1;                                                                                                                                               v_buffer  PLS_INTEGER := 999;                                                                                                                                         BEGIN                                                                                                                                                                         IF blob_in IS NOT NULL THEN                                                                                                                                                   IF DBMS_LOB.GETLENGTH(blob_in) > 0 THEN                                                                                                                                       DBMS_LOB.CREATETEMPORARY(v_clob, TRUE);                                                                                                                                   FOR i IN 1..CEIL(DBMS_LOB.GETLENGTH(blob_in) / v_buffer)                                                                                                                  LOOP                                                                                                                                                                          v_varchar := UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.base64_encode(DBMS_LOB.SUBSTR(blob_in, v_buffer, v_start)));                                                             v_varchar := REPLACE(v_varchar,CHR(13)||CHR(10));                                                                                                                         DBMS_LOB.WRITEAPPEND(v_clob, LENGTH(v_varchar), v_varchar);                                                                                                               v_start := v_start + v_buffer;                                                                                                                                        END LOOP;                                                                                                                                                             END IF;                                                                                                                                                               END IF;                                                                                                                                                                   RETURN v_clob;                                                                                                                                                        END sym_blob2clob;
[source-000] - OracleSymmetricDialect - Just installed sym_blob2clob
[source-000] - OracleSymmetricDialect - Installing SymmetricDS database object:
CREATE OR REPLACE function sym_transaction_id                                                                                                                                                                return varchar is                                                                                                                                                     begin                                                                                                                                                                    return DBMS_TRANSACTION.local_transaction_id(false);                                                                                                               end;                                                                                                                 
[source-000] - OracleSymmetricDialect - Just installed sym_transaction_id
[source-000] - OracleSymmetricDialect - Installing SymmetricDS database object:
CREATE OR REPLACE function sym_trigger_disabled return varchar is                                                                                                                                              begin                                                                                                                                                                      return sym_pkg.disable_trigger;                                                                                                                                      end;                                                                                                             
[source-000] - OracleSymmetricDialect - Just installed sym_trigger_disabled
[source-000] - OracleSymmetricDialect - Installing SymmetricDS database object:
CREATE OR REPLACE package sym_pkg as                                                                                                                                                                         disable_trigger pls_integer;                                                                                                                                             disable_node_id varchar(50);                                                                                                                                             procedure setValue (a IN number);                                                                                                                                        procedure setNodeValue (node_id IN varchar);                                                                                                                         end sym_pkg;                                                                                               
[source-000] - OracleSymmetricDialect - Just installed sym_pkg
[source-000] - OracleSymmetricDialect - Installing SymmetricDS database object:
CREATE OR REPLACE package body sym_pkg as                                                                                                                                                                   procedure setValue(a IN number) is                                                                                                                                      begin                                                                                                                                                                       sym_pkg.disable_trigger:=a;                                                                                                                                        end;                                                                                                                                                                    procedure setNodeValue(node_id IN varchar) is                                                                                                                           begin                                                                                                                                                                       sym_pkg.disable_node_id := node_id;                                                                                                                                end;                                                                                                                                                                end sym_pkg;                                                                                      
[source-000] - OracleSymmetricDialect - Just installed sym_pkg
[source-000] - OracleSymmetricDialect - Installing SymmetricDS database object:
  CREATE OR REPLACE FUNCTION sym_wkt2geom (
        clob_in IN CLOB,
        srid_in IN INTEGER)
      RETURN SDO_GEOMETRY
    AS
      v_out SDO_GEOMETRY := NULL;
    BEGIN
      IF clob_in IS NOT NULL THEN
        IF DBMS_LOB.GETLENGTH(clob_in) > 0 THEN
          v_out := SDO_GEOMETRY(clob_in, srid_in);
        END IF;
      END IF;
      RETURN v_out;
    END sym_wkt2geom;

[source-000] - OracleSymmetricDialect - Just installed sym_wkt2geom
[source-000] - OracleSymmetricDialect - Checking if SymmetricDS tables need created or altered
[source-000] - OracleSymmetricDialect - There are SymmetricDS tables that needed altered
[source-000] - OracleSymmetricDialect - DDL applied: CREATE TABLE "SYM_CHANNEL"(
    "CHANNEL_ID" VARCHAR2(128) NOT NULL,
    "PROCESSING_ORDER" NUMBER(22) DEFAULT 1 NOT NULL,
    "MAX_BATCH_SIZE" NUMBER(22) DEFAULT 1000 NOT NULL,
    "MAX_BATCH_TO_SEND" NUMBER(22) DEFAULT 60 NOT NULL,
    "MAX_DATA_TO_ROUTE" NUMBER(22) DEFAULT 100000 NOT NULL,
    "EXTRACT_PERIOD_MILLIS" NUMBER(22) DEFAULT 0 NOT NULL,
    "ENABLED" NUMBER(3) DEFAULT 1 NOT NULL,
    "USE_OLD_DATA_TO_ROUTE" NUMBER(3) DEFAULT 1 NOT NULL,
    "USE_ROW_DATA_TO_ROUTE" NUMBER(3) DEFAULT 1 NOT NULL,
    "USE_PK_DATA_TO_ROUTE" NUMBER(3) DEFAULT 1 NOT NULL,
    "RELOAD_FLAG" NUMBER(3) DEFAULT 0 NOT NULL,
    "FILE_SYNC_FLAG" NUMBER(3) DEFAULT 0 NOT NULL,
    "CONTAINS_BIG_LOB" NUMBER(3) DEFAULT 0 NOT NULL,
    "BATCH_ALGORITHM" VARCHAR2(50) DEFAULT 'default' NOT NULL,
    "DATA_LOADER_TYPE" VARCHAR2(50) DEFAULT 'default' NOT NULL,
    "DESCRIPTION" VARCHAR2(255),
    "QUEUE" VARCHAR2(25) DEFAULT 'default' NOT NULL,
    "MAX_NETWORK_KBPS" NUMBER(10,3) DEFAULT 0.000 NOT NULL,
    "DATA_EVENT_ACTION" CHAR(1),
    "CREATE_TIME" TIMESTAMP,
    "LAST_UPDATE_BY" VARCHAR2(50),
    "LAST_UPDATE_TIME" TIMESTAMP
)
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_CHANNEL"
    ADD CONSTRAINT "SYM_CHANNEL_PK" PRIMARY KEY ("CHANNEL_ID")
[source-000] - OracleSymmetricDialect - DDL applied: CREATE TABLE "SYM_CONFLICT"(
    "CONFLICT_ID" VARCHAR2(50) NOT NULL,
    "SOURCE_NODE_GROUP_ID" VARCHAR2(50) NOT NULL,
    "TARGET_NODE_GROUP_ID" VARCHAR2(50) NOT NULL,
    "TARGET_CHANNEL_ID" VARCHAR2(128),
    "TARGET_CATALOG_NAME" VARCHAR2(255),
    "TARGET_SCHEMA_NAME" VARCHAR2(255),
    "TARGET_TABLE_NAME" VARCHAR2(255),
    "DETECT_TYPE" VARCHAR2(128) NOT NULL,
    "DETECT_EXPRESSION" CLOB,
    "RESOLVE_TYPE" VARCHAR2(128) NOT NULL,
    "PING_BACK" VARCHAR2(128) NOT NULL,
    "RESOLVE_CHANGES_ONLY" NUMBER(3) DEFAULT 0,
    "RESOLVE_ROW_ONLY" NUMBER(3) DEFAULT 0,
    "CREATE_TIME" TIMESTAMP NOT NULL,
    "LAST_UPDATE_BY" VARCHAR2(50),
    "LAST_UPDATE_TIME" TIMESTAMP NOT NULL
)
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_CONFLICT"
    ADD CONSTRAINT "SYM_CONFLICT_PK" PRIMARY KEY ("CONFLICT_ID")
[source-000] - OracleSymmetricDialect - DDL applied: CREATE TABLE "SYM_CONTEXT"(
    "NAME" VARCHAR2(80) NOT NULL,
    "CONTEXT_VALUE" CLOB,
    "CREATE_TIME" TIMESTAMP,
    "LAST_UPDATE_TIME" TIMESTAMP
)
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_CONTEXT"
    ADD CONSTRAINT "SYM_CONTEXT_PK" PRIMARY KEY ("NAME")
[source-000] - OracleSymmetricDialect - DDL applied: CREATE SEQUENCE "SEQ_SYM_DATA_DATA_ID" CACHE 1000 ORDER
[source-000] - OracleSymmetricDialect - DDL applied: CREATE TABLE "SYM_DATA"(
    "DATA_ID" NUMBER(38) NOT NULL ,
    "TABLE_NAME" VARCHAR2(255) NOT NULL,
    "EVENT_TYPE" CHAR(1) NOT NULL,
    "ROW_DATA" CLOB,
    "PK_DATA" CLOB,
    "OLD_DATA" CLOB,
    "TRIGGER_HIST_ID" NUMBER(22) NOT NULL,
    "CHANNEL_ID" VARCHAR2(128),
    "TRANSACTION_ID" VARCHAR2(255),
    "SOURCE_NODE_ID" VARCHAR2(50),
    "EXTERNAL_DATA" VARCHAR2(50),
    "NODE_LIST" VARCHAR2(255),
    "IS_PREROUTED" NUMBER(3) DEFAULT 0 NOT NULL,
    "CREATE_TIME" TIMESTAMP
)
[source-000] - OracleSymmetricDialect - DDL applied: CREATE UNIQUE INDEX "SYM_IDX_D_CHANNEL_ID" ON "SYM_DATA" ("DATA_ID", "CHANNEL_ID")
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_DATA"
    ADD CONSTRAINT "SYM_DATA_PK" PRIMARY KEY ("DATA_ID")
[source-000] - OracleSymmetricDialect - DDL applied: CREATE OR REPLACE TRIGGER "TRG_SYM_DATA_DATA_ID" BEFORE INSERT ON "SYM_DATA" FOR EACH ROW WHEN (new."DATA_ID" IS NULL)
BEGIN SELECT "SEQ_SYM_DATA_DATA_ID".nextval INTO :new."DATA_ID" FROM dual; END;
[source-000] - OracleSymmetricDialect - DDL applied: CREATE TABLE "SYM_DATA_EVENT"(
    "DATA_ID" NUMBER(38) NOT NULL,
    "BATCH_ID" NUMBER(38) NOT NULL,
    "CREATE_TIME" TIMESTAMP
)
[source-000] - OracleSymmetricDialect - DDL applied: CREATE INDEX "SYM_IDX_DE_BATCHID" ON "SYM_DATA_EVENT" ("BATCH_ID")
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_DATA_EVENT"
    ADD CONSTRAINT "SYM_DATA_EVENT_PK" PRIMARY KEY ("DATA_ID", "BATCH_ID")
[source-000] - OracleSymmetricDialect - DDL applied: CREATE TABLE "SYM_DATA_GAP"(
    "START_ID" NUMBER(38) NOT NULL,
    "END_ID" NUMBER(38) NOT NULL,
    "CREATE_TIME" TIMESTAMP NOT NULL,
    "LAST_UPDATE_HOSTNAME" VARCHAR2(255)
)
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_DATA_GAP"
    ADD CONSTRAINT "SYM_DATA_GAP_PK" PRIMARY KEY ("START_ID", "END_ID")
[source-000] - OracleSymmetricDialect - DDL applied: CREATE TABLE "SYM_EXTENSION"(
    "EXTENSION_ID" VARCHAR2(50) NOT NULL,
    "EXTENSION_TYPE" VARCHAR2(10) NOT NULL,
    "INTERFACE_NAME" VARCHAR2(255),
    "NODE_GROUP_ID" VARCHAR2(50) NOT NULL,
    "ENABLED" NUMBER(3) DEFAULT 1 NOT NULL,
    "EXTENSION_ORDER" NUMBER(22) DEFAULT 1 NOT NULL,
    "EXTENSION_TEXT" CLOB,
    "CREATE_TIME" TIMESTAMP,
    "LAST_UPDATE_BY" VARCHAR2(50),
    "LAST_UPDATE_TIME" TIMESTAMP
)
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_EXTENSION"
    ADD CONSTRAINT "SYM_EXTENSION_PK" PRIMARY KEY ("EXTENSION_ID")
[source-000] - OracleSymmetricDialect - DDL applied: CREATE TABLE "SYM_EXTRACT_REQUEST"(
    "REQUEST_ID" NUMBER(38) NOT NULL,
    "NODE_ID" VARCHAR2(50) NOT NULL,
    "QUEUE" VARCHAR2(128),
    "STATUS" CHAR(2),
    "START_BATCH_ID" NUMBER(38) NOT NULL,
    "END_BATCH_ID" NUMBER(38) NOT NULL,
    "TRIGGER_ID" VARCHAR2(128) NOT NULL,
    "ROUTER_ID" VARCHAR2(50) NOT NULL,
    "LOAD_ID" NUMBER(38),
    "TABLE_NAME" VARCHAR2(255),
    "EXTRACTED_ROWS" NUMBER(38) DEFAULT 0 NOT NULL,
    "EXTRACTED_MILLIS" NUMBER(38) DEFAULT 0 NOT NULL,
    "TRANSFERRED_ROWS" NUMBER(38) DEFAULT 0 NOT NULL,
    "TRANSFERRED_MILLIS" NUMBER(38) DEFAULT 0 NOT NULL,
    "LAST_TRANSFERRED_BATCH_ID" NUMBER(38),
    "LOADED_ROWS" NUMBER(38) DEFAULT 0 NOT NULL,
    "LOADED_MILLIS" NUMBER(38) DEFAULT 0 NOT NULL,
    "LAST_LOADED_BATCH_ID" NUMBER(38),
    "TOTAL_ROWS" NUMBER(38),
    "LOADED_TIME" TIMESTAMP,
    "PARENT_REQUEST_ID" NUMBER(38) DEFAULT 0 NOT NULL,
    "LAST_UPDATE_TIME" TIMESTAMP,
    "CREATE_TIME" TIMESTAMP
)
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_EXTRACT_REQUEST"
    ADD CONSTRAINT "SYM_EXTRACT_REQUEST_PK" PRIMARY KEY ("REQUEST_ID")
[source-000] - OracleSymmetricDialect - DDL applied: CREATE TABLE "SYM_FILE_INCOMING"(
    "RELATIVE_DIR" VARCHAR2(255) NOT NULL,
    "FILE_NAME" VARCHAR2(128) NOT NULL,
    "LAST_EVENT_TYPE" CHAR(1) NOT NULL,
    "NODE_ID" VARCHAR2(50) NOT NULL,
    "FILE_MODIFIED_TIME" NUMBER(38)
)
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_FILE_INCOMING"
    ADD CONSTRAINT "SYM_FILE_INCOMING_PK" PRIMARY KEY ("RELATIVE_DIR", "FILE_NAME")
[source-000] - OracleSymmetricDialect - DDL applied: CREATE TABLE "SYM_FILE_SNAPSHOT"(
    "TRIGGER_ID" VARCHAR2(128) NOT NULL,
    "ROUTER_ID" VARCHAR2(50) NOT NULL,
    "RELATIVE_DIR" VARCHAR2(255) NOT NULL,
    "FILE_NAME" VARCHAR2(128) NOT NULL,
    "CHANNEL_ID" VARCHAR2(128) DEFAULT 'filesync' NOT NULL,
    "RELOAD_CHANNEL_ID" VARCHAR2(128) DEFAULT 'filesync_reload' NOT NULL,
    "LAST_EVENT_TYPE" CHAR(1) NOT NULL,
    "CRC32_CHECKSUM" NUMBER(38),
    "FILE_SIZE" NUMBER(38),
    "FILE_MODIFIED_TIME" NUMBER(38),
    "LAST_UPDATE_TIME" TIMESTAMP NOT NULL,
    "LAST_UPDATE_BY" VARCHAR2(50),
    "CREATE_TIME" TIMESTAMP NOT NULL
)
[source-000] - OracleSymmetricDialect - DDL applied: CREATE INDEX "SYM_IDX_F_SNPSHT_CHID" ON "SYM_FILE_SNAPSHOT" ("RELOAD_CHANNEL_ID")
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_FILE_SNAPSHOT"
    ADD CONSTRAINT "SYM_FILE_SNAPSHOT_PK" PRIMARY KEY ("TRIGGER_ID", "ROUTER_ID", "RELATIVE_DIR", "FILE_NAME")
[source-000] - OracleSymmetricDialect - DDL applied: CREATE TABLE "SYM_FILE_TRIGGER"(
    "TRIGGER_ID" VARCHAR2(128) NOT NULL,
    "CHANNEL_ID" VARCHAR2(128) DEFAULT 'filesync' NOT NULL,
    "RELOAD_CHANNEL_ID" VARCHAR2(128) DEFAULT 'filesync_reload' NOT NULL,
    "BASE_DIR" VARCHAR2(255) NOT NULL,
    "RECURSE" NUMBER(3) DEFAULT 1 NOT NULL,
    "INCLUDES_FILES" VARCHAR2(255),
    "EXCLUDES_FILES" VARCHAR2(255),
    "SYNC_ON_CREATE" NUMBER(3) DEFAULT 1 NOT NULL,
    "SYNC_ON_MODIFIED" NUMBER(3) DEFAULT 1 NOT NULL,
    "SYNC_ON_DELETE" NUMBER(3) DEFAULT 1 NOT NULL,
    "SYNC_ON_CTL_FILE" NUMBER(3) DEFAULT 0 NOT NULL,
    "DELETE_AFTER_SYNC" NUMBER(3) DEFAULT 0 NOT NULL,
    "BEFORE_COPY_SCRIPT" CLOB,
    "AFTER_COPY_SCRIPT" CLOB,
    "CREATE_TIME" TIMESTAMP NOT NULL,
    "LAST_UPDATE_BY" VARCHAR2(50),
    "LAST_UPDATE_TIME" TIMESTAMP NOT NULL,
    "DESCRIPTION" CLOB
)
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_FILE_TRIGGER"
    ADD CONSTRAINT "SYM_FILE_TRIGGER_PK" PRIMARY KEY ("TRIGGER_ID")
[source-000] - OracleSymmetricDialect - DDL applied: CREATE TABLE "SYM_FILE_TRIGGER_ROUTER"(
    "TRIGGER_ID" VARCHAR2(128) NOT NULL,
    "ROUTER_ID" VARCHAR2(50) NOT NULL,
    "ENABLED" NUMBER(3) DEFAULT 1 NOT NULL,
    "INITIAL_LOAD_ENABLED" NUMBER(3) DEFAULT 1 NOT NULL,
    "TARGET_BASE_DIR" VARCHAR2(255),
    "CONFLICT_STRATEGY" VARCHAR2(128) DEFAULT 'source_wins' NOT NULL,
    "CREATE_TIME" TIMESTAMP NOT NULL,
    "LAST_UPDATE_BY" VARCHAR2(50),
    "LAST_UPDATE_TIME" TIMESTAMP NOT NULL,
    "DESCRIPTION" CLOB
)
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_FILE_TRIGGER_ROUTER"
    ADD CONSTRAINT "SYM_FILE_TRIGGER_ROUTER_PK" PRIMARY KEY ("TRIGGER_ID", "ROUTER_ID")
[source-000] - OracleSymmetricDialect - DDL applied: CREATE TABLE "SYM_GROUPLET"(
    "GROUPLET_ID" VARCHAR2(50) NOT NULL,
    "GROUPLET_LINK_POLICY" CHAR(1) DEFAULT 'I' NOT NULL,
    "DESCRIPTION" VARCHAR2(255),
    "CREATE_TIME" TIMESTAMP NOT NULL,
    "LAST_UPDATE_BY" VARCHAR2(50),
    "LAST_UPDATE_TIME" TIMESTAMP NOT NULL
)
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_GROUPLET"
    ADD CONSTRAINT "SYM_GROUPLET_PK" PRIMARY KEY ("GROUPLET_ID")
[source-000] - OracleSymmetricDialect - DDL applied: CREATE TABLE "SYM_GROUPLET_LINK"(
    "GROUPLET_ID" VARCHAR2(50) NOT NULL,
    "EXTERNAL_ID" VARCHAR2(255) NOT NULL,
    "CREATE_TIME" TIMESTAMP NOT NULL,
    "LAST_UPDATE_BY" VARCHAR2(50),
    "LAST_UPDATE_TIME" TIMESTAMP NOT NULL
)
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_GROUPLET_LINK"
    ADD CONSTRAINT "SYM_GROUPLET_LINK_PK" PRIMARY KEY ("GROUPLET_ID", "EXTERNAL_ID")
[source-000] - OracleSymmetricDialect - DDL applied: CREATE TABLE "SYM_INCOMING_BATCH"(
    "BATCH_ID" NUMBER(38) NOT NULL,
    "NODE_ID" VARCHAR2(50) NOT NULL,
    "CHANNEL_ID" VARCHAR2(128),
    "STATUS" CHAR(2),
    "ERROR_FLAG" NUMBER(3) DEFAULT 0,
    "SQL_STATE" VARCHAR2(10),
    "SQL_CODE" NUMBER(22) DEFAULT 0 NOT NULL,
    "SQL_MESSAGE" CLOB,
    "LAST_UPDATE_HOSTNAME" VARCHAR2(255),
    "LAST_UPDATE_TIME" TIMESTAMP,
    "CREATE_TIME" TIMESTAMP,
    "SUMMARY" VARCHAR2(255),
    "IGNORE_COUNT" NUMBER(22) DEFAULT 0 NOT NULL,
    "BYTE_COUNT" NUMBER(38) DEFAULT 0 NOT NULL,
    "LOAD_FLAG" NUMBER(3) DEFAULT 0,
    "EXTRACT_COUNT" NUMBER(22) DEFAULT 0 NOT NULL,
    "SENT_COUNT" NUMBER(22) DEFAULT 0 NOT NULL,
    "LOAD_COUNT" NUMBER(22) DEFAULT 0 NOT NULL,
    "RELOAD_ROW_COUNT" NUMBER(22) DEFAULT 0 NOT NULL,
    "OTHER_ROW_COUNT" NUMBER(22) DEFAULT 0 NOT NULL,
    "DATA_ROW_COUNT" NUMBER(22) DEFAULT 0 NOT NULL,
    "EXTRACT_ROW_COUNT" NUMBER(22) DEFAULT 0 NOT NULL,
    "LOAD_ROW_COUNT" NUMBER(22) DEFAULT 0 NOT NULL,
    "DATA_INSERT_ROW_COUNT" NUMBER(22) DEFAULT 0 NOT NULL,
    "DATA_UPDATE_ROW_COUNT" NUMBER(22) DEFAULT 0 NOT NULL,
    "DATA_DELETE_ROW_COUNT" NUMBER(22) DEFAULT 0 NOT NULL,
    "EXTRACT_INSERT_ROW_COUNT" NUMBER(22) DEFAULT 0 NOT NULL,
    "EXTRACT_UPDATE_ROW_COUNT" NUMBER(22) DEFAULT 0 NOT NULL,
    "EXTRACT_DELETE_ROW_COUNT" NUMBER(22) DEFAULT 0 NOT NULL,
    "LOAD_INSERT_ROW_COUNT" NUMBER(22) DEFAULT 0 NOT NULL,
    "LOAD_UPDATE_ROW_COUNT" NUMBER(22) DEFAULT 0 NOT NULL,
    "LOAD_DELETE_ROW_COUNT" NUMBER(22) DEFAULT 0 NOT NULL,
    "NETWORK_MILLIS" NUMBER(22) DEFAULT 0 NOT NULL,
    "FILTER_MILLIS" NUMBER(22) DEFAULT 0 NOT NULL,
    "LOAD_MILLIS" NUMBER(22) DEFAULT 0 NOT NULL,
    "ROUTER_MILLIS" NUMBER(22) DEFAULT 0 NOT NULL,
    "EXTRACT_MILLIS" NUMBER(22) DEFAULT 0 NOT NULL,
    "TRANSFORM_EXTRACT_MILLIS" NUMBER(22) DEFAULT 0 NOT NULL,
    "TRANSFORM_LOAD_MILLIS" NUMBER(22) DEFAULT 0 NOT NULL,
    "LOAD_ID" NUMBER(38),
    "COMMON_FLAG" NUMBER(3) DEFAULT 0,
    "FALLBACK_INSERT_COUNT" NUMBER(22) DEFAULT 0 NOT NULL,
    "FALLBACK_UPDATE_COUNT" NUMBER(22) DEFAULT 0 NOT NULL,
    "IGNORE_ROW_COUNT" NUMBER(22) DEFAULT 0 NOT NULL,
    "MISSING_DELETE_COUNT" NUMBER(22) DEFAULT 0 NOT NULL,
    "SKIP_COUNT" NUMBER(22) DEFAULT 0 NOT NULL,
    "FAILED_ROW_NUMBER" NUMBER(22) DEFAULT 0 NOT NULL,
    "FAILED_LINE_NUMBER" NUMBER(22) DEFAULT 0 NOT NULL,
    "FAILED_DATA_ID" NUMBER(38) DEFAULT 0 NOT NULL
)
[source-000] - OracleSymmetricDialect - DDL applied: CREATE INDEX "SYM_IDX_IB_TIME_STATUS" ON "SYM_INCOMING_BATCH" ("CREATE_TIME", "STATUS")
[source-000] - OracleSymmetricDialect - DDL applied: CREATE INDEX "SYM_IDX_IB_IN_ERROR" ON "SYM_INCOMING_BATCH" ("ERROR_FLAG")
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_INCOMING_BATCH"
    ADD CONSTRAINT "SYM_INCOMING_BATCH_PK" PRIMARY KEY ("BATCH_ID", "NODE_ID")
[source-000] - OracleSymmetricDialect - DDL applied: CREATE TABLE "SYM_INCOMING_ERROR"(
    "BATCH_ID" NUMBER(38) NOT NULL,
    "NODE_ID" VARCHAR2(50) NOT NULL,
    "FAILED_ROW_NUMBER" NUMBER(38) NOT NULL,
    "FAILED_LINE_NUMBER" NUMBER(38) DEFAULT 0 NOT NULL,
    "TARGET_CATALOG_NAME" VARCHAR2(255),
    "TARGET_SCHEMA_NAME" VARCHAR2(255),
    "TARGET_TABLE_NAME" VARCHAR2(255) NOT NULL,
    "EVENT_TYPE" CHAR(1) NOT NULL,
    "BINARY_ENCODING" VARCHAR2(10) DEFAULT 'HEX' NOT NULL,
    "COLUMN_NAMES" CLOB NOT NULL,
    "PK_COLUMN_NAMES" CLOB NOT NULL,
    "ROW_DATA" CLOB,
    "OLD_DATA" CLOB,
    "CUR_DATA" CLOB,
    "RESOLVE_DATA" CLOB,
    "RESOLVE_IGNORE" NUMBER(3) DEFAULT 0,
    "CONFLICT_ID" VARCHAR2(50),
    "CREATE_TIME" TIMESTAMP,
    "LAST_UPDATE_BY" VARCHAR2(50),
    "LAST_UPDATE_TIME" TIMESTAMP NOT NULL
)
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_INCOMING_ERROR"
    ADD CONSTRAINT "SYM_INCOMING_ERROR_PK" PRIMARY KEY ("BATCH_ID", "NODE_ID", "FAILED_ROW_NUMBER")
[source-000] - OracleSymmetricDialect - DDL applied: CREATE TABLE "SYM_JOB"(
    "JOB_NAME" VARCHAR2(50) NOT NULL,
    "JOB_TYPE" VARCHAR2(10) NOT NULL,
    "REQUIRES_REGISTRATION" NUMBER(3) DEFAULT 1 NOT NULL,
    "JOB_EXPRESSION" CLOB,
    "DESCRIPTION" VARCHAR2(255),
    "DEFAULT_SCHEDULE" VARCHAR2(50),
    "DEFAULT_AUTO_START" NUMBER(3) DEFAULT 1 NOT NULL,
    "NODE_GROUP_ID" VARCHAR2(50) NOT NULL,
    "CREATE_BY" VARCHAR2(50),
    "CREATE_TIME" TIMESTAMP,
    "LAST_UPDATE_BY" VARCHAR2(50),
    "LAST_UPDATE_TIME" TIMESTAMP
)
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_JOB"
    ADD CONSTRAINT "SYM_JOB_PK" PRIMARY KEY ("JOB_NAME")
[source-000] - OracleSymmetricDialect - DDL applied: CREATE TABLE "SYM_LOAD_FILTER"(
    "LOAD_FILTER_ID" VARCHAR2(50) NOT NULL,
    "LOAD_FILTER_TYPE" VARCHAR2(10) NOT NULL,
    "SOURCE_NODE_GROUP_ID" VARCHAR2(50) NOT NULL,
    "TARGET_NODE_GROUP_ID" VARCHAR2(50) NOT NULL,
    "TARGET_CATALOG_NAME" VARCHAR2(255),
    "TARGET_SCHEMA_NAME" VARCHAR2(255),
    "TARGET_TABLE_NAME" VARCHAR2(255),
    "FILTER_ON_UPDATE" NUMBER(3) DEFAULT 1 NOT NULL,
    "FILTER_ON_INSERT" NUMBER(3) DEFAULT 1 NOT NULL,
    "FILTER_ON_DELETE" NUMBER(3) DEFAULT 1 NOT NULL,
    "BEFORE_WRITE_SCRIPT" CLOB,
    "AFTER_WRITE_SCRIPT" CLOB,
    "BATCH_COMPLETE_SCRIPT" CLOB,
    "BATCH_COMMIT_SCRIPT" CLOB,
    "BATCH_ROLLBACK_SCRIPT" CLOB,
    "HANDLE_ERROR_SCRIPT" CLOB,
    "CREATE_TIME" TIMESTAMP NOT NULL,
    "LAST_UPDATE_BY" VARCHAR2(50),
    "LAST_UPDATE_TIME" TIMESTAMP NOT NULL,
    "LOAD_FILTER_ORDER" NUMBER(22) DEFAULT 1 NOT NULL,
    "FAIL_ON_ERROR" NUMBER(3) DEFAULT 0 NOT NULL
)
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_LOAD_FILTER"
    ADD CONSTRAINT "SYM_LOAD_FILTER_PK" PRIMARY KEY ("LOAD_FILTER_ID")
[source-000] - OracleSymmetricDialect - DDL applied: CREATE TABLE "SYM_LOCK"(
    "LOCK_ACTION" VARCHAR2(50) NOT NULL,
    "LOCK_TYPE" VARCHAR2(50) NOT NULL,
    "LOCKING_SERVER_ID" VARCHAR2(255),
    "LOCK_TIME" TIMESTAMP,
    "SHARED_COUNT" NUMBER(22) DEFAULT 0 NOT NULL,
    "SHARED_ENABLE" NUMBER(22) DEFAULT 0 NOT NULL,
    "LAST_LOCK_TIME" TIMESTAMP,
    "LAST_LOCKING_SERVER_ID" VARCHAR2(255)
)
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_LOCK"
    ADD CONSTRAINT "SYM_LOCK_PK" PRIMARY KEY ("LOCK_ACTION")
[source-000] - OracleSymmetricDialect - DDL applied: CREATE TABLE "SYM_NODE"(
    "NODE_ID" VARCHAR2(50) NOT NULL,
    "NODE_GROUP_ID" VARCHAR2(50) NOT NULL,
    "EXTERNAL_ID" VARCHAR2(255) NOT NULL,
    "SYNC_ENABLED" NUMBER(3) DEFAULT 0,
    "SYNC_URL" VARCHAR2(255),
    "SCHEMA_VERSION" VARCHAR2(50),
    "SYMMETRIC_VERSION" VARCHAR2(50),
    "CONFIG_VERSION" VARCHAR2(50),
    "DATABASE_TYPE" VARCHAR2(50),
    "DATABASE_VERSION" VARCHAR2(50),
    "DATABASE_NAME" VARCHAR2(50),
    "BATCH_TO_SEND_COUNT" NUMBER(22) DEFAULT 0,
    "BATCH_IN_ERROR_COUNT" NUMBER(22) DEFAULT 0,
    "CREATED_AT_NODE_ID" VARCHAR2(50),
    "DEPLOYMENT_TYPE" VARCHAR2(50),
    "DEPLOYMENT_SUB_TYPE" VARCHAR2(50)
)
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_NODE"
    ADD CONSTRAINT "SYM_NODE_PK" PRIMARY KEY ("NODE_ID")
[source-000] - OracleSymmetricDialect - DDL applied: CREATE TABLE "SYM_NODE_COMMUNICATION"(
    "NODE_ID" VARCHAR2(50) NOT NULL,
    "QUEUE" VARCHAR2(25) DEFAULT 'default' NOT NULL,
    "COMMUNICATION_TYPE" VARCHAR2(10) NOT NULL,
    "LOCK_TIME" TIMESTAMP,
    "LOCKING_SERVER_ID" VARCHAR2(255),
    "LAST_LOCK_TIME" TIMESTAMP,
    "LAST_LOCK_MILLIS" NUMBER(38) DEFAULT 0,
    "SUCCESS_COUNT" NUMBER(38) DEFAULT 0,
    "FAIL_COUNT" NUMBER(38) DEFAULT 0,
    "SKIP_COUNT" NUMBER(38) DEFAULT 0,
    "TOTAL_SUCCESS_COUNT" NUMBER(38) DEFAULT 0,
    "TOTAL_FAIL_COUNT" NUMBER(38) DEFAULT 0,
    "TOTAL_SUCCESS_MILLIS" NUMBER(38) DEFAULT 0,
    "TOTAL_FAIL_MILLIS" NUMBER(38) DEFAULT 0,
    "BATCH_TO_SEND_COUNT" NUMBER(38) DEFAULT 0,
    "NODE_PRIORITY" NUMBER(22) DEFAULT 0
)
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_NODE_COMMUNICATION"
    ADD CONSTRAINT "SYM_NODE_COMMUNICATION_PK" PRIMARY KEY ("NODE_ID", "QUEUE", "COMMUNICATION_TYPE")
[source-000] - OracleSymmetricDialect - DDL applied: CREATE TABLE "SYM_NODE_CHANNEL_CTL"(
    "NODE_ID" VARCHAR2(50) NOT NULL,
    "CHANNEL_ID" VARCHAR2(128) NOT NULL,
    "SUSPEND_ENABLED" NUMBER(3) DEFAULT 0,
    "IGNORE_ENABLED" NUMBER(3) DEFAULT 0,
    "LAST_EXTRACT_TIME" TIMESTAMP
)
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_NODE_CHANNEL_CTL"
    ADD CONSTRAINT "SYM_NODE_CHANNEL_CTL_PK" PRIMARY KEY ("NODE_ID", "CHANNEL_ID")
[source-000] - OracleSymmetricDialect - DDL applied: CREATE TABLE "SYM_NODE_GROUP"(
    "NODE_GROUP_ID" VARCHAR2(50) NOT NULL,
    "DESCRIPTION" VARCHAR2(255),
    "CREATE_TIME" TIMESTAMP,
    "LAST_UPDATE_BY" VARCHAR2(50),
    "LAST_UPDATE_TIME" TIMESTAMP
)
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_NODE_GROUP"
    ADD CONSTRAINT "SYM_NODE_GROUP_PK" PRIMARY KEY ("NODE_GROUP_ID")
[source-000] - OracleSymmetricDialect - DDL applied: CREATE TABLE "SYM_NODE_GROUP_CHANNEL_WND"(
    "NODE_GROUP_ID" VARCHAR2(50) NOT NULL,
    "CHANNEL_ID" VARCHAR2(128) NOT NULL,
    "START_TIME" TIMESTAMP NOT NULL,
    "END_TIME" TIMESTAMP NOT NULL,
    "ENABLED" NUMBER(3) DEFAULT 0 NOT NULL
)
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_NODE_GROUP_CHANNEL_WND"
    ADD CONSTRAINT "SYM_NODE_GROUP_CHANNEL_WND_PK" PRIMARY KEY ("NODE_GROUP_ID", "CHANNEL_ID", "START_TIME", "END_TIME")
[source-000] - OracleSymmetricDialect - DDL applied: CREATE TABLE "SYM_NODE_GROUP_LINK"(
    "SOURCE_NODE_GROUP_ID" VARCHAR2(50) NOT NULL,
    "TARGET_NODE_GROUP_ID" VARCHAR2(50) NOT NULL,
    "DATA_EVENT_ACTION" CHAR(1) DEFAULT 'W' NOT NULL,
    "SYNC_CONFIG_ENABLED" NUMBER(3) DEFAULT 1 NOT NULL,
    "IS_REVERSIBLE" NUMBER(3) DEFAULT 0 NOT NULL,
    "CREATE_TIME" TIMESTAMP,
    "LAST_UPDATE_BY" VARCHAR2(50),
    "LAST_UPDATE_TIME" TIMESTAMP
)
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_NODE_GROUP_LINK"
    ADD CONSTRAINT "SYM_NODE_GROUP_LINK_PK" PRIMARY KEY ("SOURCE_NODE_GROUP_ID", "TARGET_NODE_GROUP_ID")
[source-000] - OracleSymmetricDialect - DDL applied: CREATE TABLE "SYM_NODE_HOST"(
    "NODE_ID" VARCHAR2(50) NOT NULL,
    "HOST_NAME" VARCHAR2(60) NOT NULL,
    "INSTANCE_ID" VARCHAR2(60),
    "IP_ADDRESS" VARCHAR2(50),
    "OS_USER" VARCHAR2(50),
    "OS_NAME" VARCHAR2(50),
    "OS_ARCH" VARCHAR2(50),
    "OS_VERSION" VARCHAR2(50),
    "AVAILABLE_PROCESSORS" NUMBER(22) DEFAULT 0,
    "FREE_MEMORY_BYTES" NUMBER(38) DEFAULT 0,
    "TOTAL_MEMORY_BYTES" NUMBER(38) DEFAULT 0,
    "MAX_MEMORY_BYTES" NUMBER(38) DEFAULT 0,
    "JAVA_VERSION" VARCHAR2(50),
    "JAVA_VENDOR" VARCHAR2(255),
    "JDBC_VERSION" VARCHAR2(255),
    "SYMMETRIC_VERSION" VARCHAR2(50),
    "TIMEZONE_OFFSET" VARCHAR2(6),
    "HEARTBEAT_TIME" TIMESTAMP,
    "LAST_RESTART_TIME" TIMESTAMP NOT NULL,
    "CREATE_TIME" TIMESTAMP NOT NULL
)
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_NODE_HOST"
    ADD CONSTRAINT "SYM_NODE_HOST_PK" PRIMARY KEY ("NODE_ID", "HOST_NAME")
[source-000] - OracleSymmetricDialect - DDL applied: CREATE TABLE "SYM_NODE_HOST_CHANNEL_STATS"(
    "NODE_ID" VARCHAR2(50) NOT NULL,
    "HOST_NAME" VARCHAR2(60) NOT NULL,
    "CHANNEL_ID" VARCHAR2(128) NOT NULL,
    "START_TIME" TIMESTAMP NOT NULL,
    "END_TIME" TIMESTAMP NOT NULL,
    "DATA_ROUTED" NUMBER(38) DEFAULT 0,
    "DATA_UNROUTED" NUMBER(38) DEFAULT 0,
    "DATA_EVENT_INSERTED" NUMBER(38) DEFAULT 0,
    "DATA_EXTRACTED" NUMBER(38) DEFAULT 0,
    "DATA_BYTES_EXTRACTED" NUMBER(38) DEFAULT 0,
    "DATA_EXTRACTED_ERRORS" NUMBER(38) DEFAULT 0,
    "DATA_BYTES_SENT" NUMBER(38) DEFAULT 0,
    "DATA_SENT" NUMBER(38) DEFAULT 0,
    "DATA_SENT_ERRORS" NUMBER(38) DEFAULT 0,
    "DATA_LOADED" NUMBER(38) DEFAULT 0,
    "DATA_BYTES_LOADED" NUMBER(38) DEFAULT 0,
    "DATA_LOADED_ERRORS" NUMBER(38) DEFAULT 0,
    "DATA_LOADED_OUTGOING" NUMBER(38) DEFAULT 0,
    "DATA_BYTES_LOADED_OUTGOING" NUMBER(38) DEFAULT 0,
    "DATA_LOADED_OUTGOING_ERRORS" NUMBER(38) DEFAULT 0
)
[source-000] - OracleSymmetricDialect - DDL applied: CREATE INDEX "SYM_IDX_ND_HST_CHNL_STS" ON "SYM_NODE_HOST_CHANNEL_STATS" ("NODE_ID", "START_TIME", "END_TIME")
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_NODE_HOST_CHANNEL_STATS"
    ADD CONSTRAINT "SYM_NODE_HOST_CHANNEL_STATS_PK" PRIMARY KEY ("NODE_ID", "HOST_NAME", "CHANNEL_ID", "START_TIME", "END_TIME")
[source-000] - OracleSymmetricDialect - DDL applied: CREATE TABLE "SYM_NODE_HOST_JOB_STATS"(
    "NODE_ID" VARCHAR2(50) NOT NULL,
    "HOST_NAME" VARCHAR2(60) NOT NULL,
    "JOB_NAME" VARCHAR2(50) NOT NULL,
    "START_TIME" TIMESTAMP NOT NULL,
    "END_TIME" TIMESTAMP NOT NULL,
    "PROCESSED_COUNT" NUMBER(38) DEFAULT 0,
    "TARGET_NODE_ID" VARCHAR2(50),
    "TARGET_NODE_COUNT" NUMBER(22) DEFAULT 0
)
[source-000] - OracleSymmetricDialect - DDL applied: CREATE INDEX "SYM_IDX_ND_HST_JOB" ON "SYM_NODE_HOST_JOB_STATS" ("NODE_ID", "START_TIME", "END_TIME")
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_NODE_HOST_JOB_STATS"
    ADD CONSTRAINT "SYM_NODE_HOST_JOB_STATS_PK" PRIMARY KEY ("NODE_ID", "HOST_NAME", "JOB_NAME", "START_TIME", "END_TIME")
[source-000] - OracleSymmetricDialect - DDL applied: CREATE TABLE "SYM_NODE_HOST_STATS"(
    "NODE_ID" VARCHAR2(50) NOT NULL,
    "HOST_NAME" VARCHAR2(60) NOT NULL,
    "START_TIME" TIMESTAMP NOT NULL,
    "END_TIME" TIMESTAMP NOT NULL,
    "RESTARTED" NUMBER(38) DEFAULT 0 NOT NULL,
    "NODES_PULLED" NUMBER(38) DEFAULT 0,
    "TOTAL_NODES_PULL_TIME" NUMBER(38) DEFAULT 0,
    "NODES_PUSHED" NUMBER(38) DEFAULT 0,
    "TOTAL_NODES_PUSH_TIME" NUMBER(38) DEFAULT 0,
    "NODES_REJECTED" NUMBER(38) DEFAULT 0,
    "NODES_REGISTERED" NUMBER(38) DEFAULT 0,
    "NODES_LOADED" NUMBER(38) DEFAULT 0,
    "NODES_DISABLED" NUMBER(38) DEFAULT 0,
    "PURGED_DATA_ROWS" NUMBER(38) DEFAULT 0,
    "PURGED_DATA_EVENT_ROWS" NUMBER(38) DEFAULT 0,
    "PURGED_BATCH_OUTGOING_ROWS" NUMBER(38) DEFAULT 0,
    "PURGED_BATCH_INCOMING_ROWS" NUMBER(38) DEFAULT 0,
    "TRIGGERS_CREATED_COUNT" NUMBER(38),
    "TRIGGERS_REBUILT_COUNT" NUMBER(38),
    "TRIGGERS_REMOVED_COUNT" NUMBER(38)
)
[source-000] - OracleSymmetricDialect - DDL applied: CREATE INDEX "SYM_IDX_ND_HST_STS" ON "SYM_NODE_HOST_STATS" ("NODE_ID", "START_TIME", "END_TIME")
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_NODE_HOST_STATS"
    ADD CONSTRAINT "SYM_NODE_HOST_STATS_PK" PRIMARY KEY ("NODE_ID", "HOST_NAME", "START_TIME", "END_TIME")
[source-000] - OracleSymmetricDialect - DDL applied: CREATE TABLE "SYM_NODE_IDENTITY"(
    "NODE_ID" VARCHAR2(50) NOT NULL
)
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_NODE_IDENTITY"
    ADD CONSTRAINT "SYM_NODE_IDENTITY_PK" PRIMARY KEY ("NODE_ID")
[source-000] - OracleSymmetricDialect - DDL applied: CREATE TABLE "SYM_NODE_SECURITY"(
    "NODE_ID" VARCHAR2(50) NOT NULL,
    "NODE_PASSWORD" VARCHAR2(50) NOT NULL,
    "REGISTRATION_ENABLED" NUMBER(3) DEFAULT 0,
    "REGISTRATION_TIME" TIMESTAMP,
    "INITIAL_LOAD_ENABLED" NUMBER(3) DEFAULT 0,
    "INITIAL_LOAD_TIME" TIMESTAMP,
    "INITIAL_LOAD_END_TIME" TIMESTAMP,
    "INITIAL_LOAD_ID" NUMBER(38),
    "INITIAL_LOAD_CREATE_BY" VARCHAR2(255),
    "REV_INITIAL_LOAD_ENABLED" NUMBER(3) DEFAULT 0,
    "REV_INITIAL_LOAD_TIME" TIMESTAMP,
    "REV_INITIAL_LOAD_ID" NUMBER(38),
    "REV_INITIAL_LOAD_CREATE_BY" VARCHAR2(255),
    "FAILED_LOGINS" NUMBER(3) DEFAULT 0,
    "CREATED_AT_NODE_ID" VARCHAR2(50)
)
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_NODE_SECURITY"
    ADD CONSTRAINT "SYM_NODE_SECURITY_PK" PRIMARY KEY ("NODE_ID")
[source-000] - OracleSymmetricDialect - DDL applied: CREATE TABLE "SYM_MONITOR"(
    "MONITOR_ID" VARCHAR2(128) NOT NULL,
    "NODE_GROUP_ID" VARCHAR2(50) DEFAULT 'ALL' NOT NULL,
    "EXTERNAL_ID" VARCHAR2(255) DEFAULT 'ALL' NOT NULL,
    "TYPE" VARCHAR2(50) NOT NULL,
    "EXPRESSION" CLOB,
    "THRESHOLD" NUMBER(38) DEFAULT 0 NOT NULL,
    "RUN_PERIOD" NUMBER(22) DEFAULT 0 NOT NULL,
    "RUN_COUNT" NUMBER(22) DEFAULT 0 NOT NULL,
    "SEVERITY_LEVEL" NUMBER(22) DEFAULT 0 NOT NULL,
    "ENABLED" NUMBER(3) DEFAULT 0 NOT NULL,
    "CREATE_TIME" TIMESTAMP,
    "LAST_UPDATE_BY" VARCHAR2(50),
    "LAST_UPDATE_TIME" TIMESTAMP
)
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_MONITOR"
    ADD CONSTRAINT "SYM_MONITOR_PK" PRIMARY KEY ("MONITOR_ID")
[source-000] - OracleSymmetricDialect - DDL applied: CREATE TABLE "SYM_MONITOR_EVENT"(
    "MONITOR_ID" VARCHAR2(128) NOT NULL,
    "NODE_ID" VARCHAR2(50) NOT NULL,
    "EVENT_TIME" TIMESTAMP NOT NULL,
    "HOST_NAME" VARCHAR2(60),
    "TYPE" VARCHAR2(50) NOT NULL,
    "THRESHOLD" NUMBER(38) DEFAULT 0 NOT NULL,
    "EVENT_VALUE" NUMBER(38) DEFAULT 0 NOT NULL,
    "EVENT_COUNT" NUMBER(22) DEFAULT 0 NOT NULL,
    "SEVERITY_LEVEL" NUMBER(22) DEFAULT 0 NOT NULL,
    "IS_RESOLVED" NUMBER(3) DEFAULT 0 NOT NULL,
    "IS_NOTIFIED" NUMBER(3) DEFAULT 0 NOT NULL,
    "DETAILS" CLOB,
    "LAST_UPDATE_TIME" TIMESTAMP
)
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_MONITOR_EVENT"
    ADD CONSTRAINT "SYM_MONITOR_EVENT_PK" PRIMARY KEY ("MONITOR_ID", "NODE_ID", "EVENT_TIME")
[source-000] - OracleSymmetricDialect - DDL applied: CREATE TABLE "SYM_NOTIFICATION"(
    "NOTIFICATION_ID" VARCHAR2(128) NOT NULL,
    "NODE_GROUP_ID" VARCHAR2(50) DEFAULT 'ALL' NOT NULL,
    "EXTERNAL_ID" VARCHAR2(255) DEFAULT 'ALL' NOT NULL,
    "SEVERITY_LEVEL" NUMBER(22) DEFAULT 0 NOT NULL,
    "TYPE" VARCHAR2(50) NOT NULL,
    "EXPRESSION" CLOB,
    "ENABLED" NUMBER(3) DEFAULT 0 NOT NULL,
    "CREATE_TIME" TIMESTAMP,
    "LAST_UPDATE_BY" VARCHAR2(50),
    "LAST_UPDATE_TIME" TIMESTAMP
)
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_NOTIFICATION"
    ADD CONSTRAINT "SYM_NOTIFICATION_PK" PRIMARY KEY ("NOTIFICATION_ID")
[source-000] - OracleSymmetricDialect - DDL applied: CREATE TABLE "SYM_OUTGOING_BATCH"(
    "BATCH_ID" NUMBER(38) NOT NULL,
    "NODE_ID" VARCHAR2(50) NOT NULL,
    "CHANNEL_ID" VARCHAR2(128),
    "STATUS" CHAR(2),
    "ERROR_FLAG" NUMBER(3) DEFAULT 0,
    "SQL_STATE" VARCHAR2(10),
    "SQL_CODE" NUMBER(22) DEFAULT 0 NOT NULL,
    "SQL_MESSAGE" CLOB,
    "LAST_UPDATE_HOSTNAME" VARCHAR2(255),
    "LAST_UPDATE_TIME" TIMESTAMP,
    "CREATE_TIME" TIMESTAMP,
    "SUMMARY" VARCHAR2(255),
    "IGNORE_COUNT" NUMBER(22) DEFAULT 0 NOT NULL,
    "BYTE_COUNT" NUMBER(38) DEFAULT 0 NOT NULL,
    "LOAD_FLAG" NUMBER(3) DEFAULT 0,
    "EXTRACT_COUNT" NUMBER(22) DEFAULT 0 NOT NULL,
    "SENT_COUNT" NUMBER(22) DEFAULT 0 NOT NULL,
    "LOAD_COUNT" NUMBER(22) DEFAULT 0 NOT NULL,
    "RELOAD_ROW_COUNT" NUMBER(22) DEFAULT 0 NOT NULL,
    "OTHER_ROW_COUNT" NUMBER(22) DEFAULT 0 NOT NULL,
    "DATA_ROW_COUNT" NUMBER(22) DEFAULT 0 NOT NULL,
    "EXTRACT_ROW_COUNT" NUMBER(22) DEFAULT 0 NOT NULL,
    "LOAD_ROW_COUNT" NUMBER(22) DEFAULT 0 NOT NULL,
    "DATA_INSERT_ROW_COUNT" NUMBER(22) DEFAULT 0 NOT NULL,
    "DATA_UPDATE_ROW_COUNT" NUMBER(22) DEFAULT 0 NOT NULL,
    "DATA_DELETE_ROW_COUNT" NUMBER(22) DEFAULT 0 NOT NULL,
    "EXTRACT_INSERT_ROW_COUNT" NUMBER(22) DEFAULT 0 NOT NULL,
    "EXTRACT_UPDATE_ROW_COUNT" NUMBER(22) DEFAULT 0 NOT NULL,
    "EXTRACT_DELETE_ROW_COUNT" NUMBER(22) DEFAULT 0 NOT NULL,
    "LOAD_INSERT_ROW_COUNT" NUMBER(22) DEFAULT 0 NOT NULL,
    "LOAD_UPDATE_ROW_COUNT" NUMBER(22) DEFAULT 0 NOT NULL,
    "LOAD_DELETE_ROW_COUNT" NUMBER(22) DEFAULT 0 NOT NULL,
    "NETWORK_MILLIS" NUMBER(22) DEFAULT 0 NOT NULL,
    "FILTER_MILLIS" NUMBER(22) DEFAULT 0 NOT NULL,
    "LOAD_MILLIS" NUMBER(22) DEFAULT 0 NOT NULL,
    "ROUTER_MILLIS" NUMBER(22) DEFAULT 0 NOT NULL,
    "EXTRACT_MILLIS" NUMBER(22) DEFAULT 0 NOT NULL,
    "TRANSFORM_EXTRACT_MILLIS" NUMBER(22) DEFAULT 0 NOT NULL,
    "TRANSFORM_LOAD_MILLIS" NUMBER(22) DEFAULT 0 NOT NULL,
    "LOAD_ID" NUMBER(38),
    "COMMON_FLAG" NUMBER(3) DEFAULT 0,
    "FALLBACK_INSERT_COUNT" NUMBER(22) DEFAULT 0 NOT NULL,
    "FALLBACK_UPDATE_COUNT" NUMBER(22) DEFAULT 0 NOT NULL,
    "IGNORE_ROW_COUNT" NUMBER(22) DEFAULT 0 NOT NULL,
    "MISSING_DELETE_COUNT" NUMBER(22) DEFAULT 0 NOT NULL,
    "SKIP_COUNT" NUMBER(22) DEFAULT 0 NOT NULL,
    "TOTAL_EXTRACT_MILLIS" NUMBER(22) DEFAULT 0 NOT NULL,
    "TOTAL_LOAD_MILLIS" NUMBER(22) DEFAULT 0 NOT NULL,
    "EXTRACT_JOB_FLAG" NUMBER(3) DEFAULT 0,
    "EXTRACT_START_TIME" TIMESTAMP,
    "TRANSFER_START_TIME" TIMESTAMP,
    "LOAD_START_TIME" TIMESTAMP,
    "FAILED_DATA_ID" NUMBER(38) DEFAULT 0 NOT NULL,
    "FAILED_LINE_NUMBER" NUMBER(38) DEFAULT 0 NOT NULL,
    "CREATE_BY" VARCHAR2(255)
)
[source-000] - OracleSymmetricDialect - DDL applied: CREATE INDEX "SYM_IDX_OB_NODE_STATUS" ON "SYM_OUTGOING_BATCH" ("NODE_ID", "STATUS")
[source-000] - OracleSymmetricDialect - DDL applied: CREATE INDEX "SYM_IDX_OB_STATUS" ON "SYM_OUTGOING_BATCH" ("STATUS")
[source-000] - OracleSymmetricDialect - DDL applied: CREATE INDEX "SYM_IDX_OB_IN_ERROR" ON "SYM_OUTGOING_BATCH" ("ERROR_FLAG")
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_OUTGOING_BATCH"
    ADD CONSTRAINT "SYM_OUTGOING_BATCH_PK" PRIMARY KEY ("BATCH_ID", "NODE_ID")
[source-000] - OracleSymmetricDialect - DDL applied: CREATE TABLE "SYM_PARAMETER"(
    "EXTERNAL_ID" VARCHAR2(255) NOT NULL,
    "NODE_GROUP_ID" VARCHAR2(50) NOT NULL,
    "PARAM_KEY" VARCHAR2(80) NOT NULL,
    "PARAM_VALUE" CLOB,
    "CREATE_TIME" TIMESTAMP,
    "LAST_UPDATE_BY" VARCHAR2(50),
    "LAST_UPDATE_TIME" TIMESTAMP
)
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_PARAMETER"
    ADD CONSTRAINT "SYM_PARAMETER_PK" PRIMARY KEY ("EXTERNAL_ID", "NODE_GROUP_ID", "PARAM_KEY")
[source-000] - OracleSymmetricDialect - DDL applied: CREATE TABLE "SYM_REGISTRATION_REDIRECT"(
    "REGISTRANT_EXTERNAL_ID" VARCHAR2(255) NOT NULL,
    "REGISTRATION_NODE_ID" VARCHAR2(50) NOT NULL
)
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_REGISTRATION_REDIRECT"
    ADD CONSTRAINT "SYM_REGISTRATION_REDIRECT_PK" PRIMARY KEY ("REGISTRANT_EXTERNAL_ID")
[source-000] - OracleSymmetricDialect - DDL applied: CREATE TABLE "SYM_REGISTRATION_REQUEST"(
    "NODE_GROUP_ID" VARCHAR2(50) NOT NULL,
    "EXTERNAL_ID" VARCHAR2(255) NOT NULL,
    "STATUS" CHAR(2) NOT NULL,
    "HOST_NAME" VARCHAR2(60) NOT NULL,
    "IP_ADDRESS" VARCHAR2(50) NOT NULL,
    "ATTEMPT_COUNT" NUMBER(22) DEFAULT 0,
    "REGISTERED_NODE_ID" VARCHAR2(50),
    "ERROR_MESSAGE" CLOB,
    "CREATE_TIME" TIMESTAMP NOT NULL,
    "LAST_UPDATE_BY" VARCHAR2(50),
    "LAST_UPDATE_TIME" TIMESTAMP NOT NULL
)
[source-000] - OracleSymmetricDialect - DDL applied: CREATE INDEX "SYM_IDX_REG_REQ_1" ON "SYM_REGISTRATION_REQUEST" ("NODE_GROUP_ID", "EXTERNAL_ID", "STATUS", "HOST_NAME", "IP_ADDRESS")
[source-000] - OracleSymmetricDialect - DDL applied: CREATE INDEX "SYM_IDX_REG_REQ_2" ON "SYM_REGISTRATION_REQUEST" ("STATUS")
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_REGISTRATION_REQUEST"
    ADD CONSTRAINT "SYM_REGISTRATION_REQUEST_PK" PRIMARY KEY ("NODE_GROUP_ID", "EXTERNAL_ID", "CREATE_TIME")
[source-000] - OracleSymmetricDialect - DDL applied: CREATE TABLE "SYM_ROUTER"(
    "ROUTER_ID" VARCHAR2(50) NOT NULL,
    "TARGET_CATALOG_NAME" VARCHAR2(255),
    "TARGET_SCHEMA_NAME" VARCHAR2(255),
    "TARGET_TABLE_NAME" VARCHAR2(255),
    "SOURCE_NODE_GROUP_ID" VARCHAR2(50) NOT NULL,
    "TARGET_NODE_GROUP_ID" VARCHAR2(50) NOT NULL,
    "ROUTER_TYPE" VARCHAR2(50) DEFAULT 'default' NOT NULL,
    "ROUTER_EXPRESSION" CLOB,
    "SYNC_ON_UPDATE" NUMBER(3) DEFAULT 1 NOT NULL,
    "SYNC_ON_INSERT" NUMBER(3) DEFAULT 1 NOT NULL,
    "SYNC_ON_DELETE" NUMBER(3) DEFAULT 1 NOT NULL,
    "USE_SOURCE_CATALOG_SCHEMA" NUMBER(3) DEFAULT 1 NOT NULL,
    "CREATE_TIME" TIMESTAMP NOT NULL,
    "LAST_UPDATE_BY" VARCHAR2(50),
    "LAST_UPDATE_TIME" TIMESTAMP NOT NULL,
    "DESCRIPTION" CLOB
)
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_ROUTER"
    ADD CONSTRAINT "SYM_ROUTER_PK" PRIMARY KEY ("ROUTER_ID")
[source-000] - OracleSymmetricDialect - DDL applied: CREATE TABLE "SYM_SEQUENCE"(
    "SEQUENCE_NAME" VARCHAR2(50) NOT NULL,
    "CURRENT_VALUE" NUMBER(38) DEFAULT 0 NOT NULL,
    "INCREMENT_BY" NUMBER(22) DEFAULT 1 NOT NULL,
    "MIN_VALUE" NUMBER(38) DEFAULT 1 NOT NULL,
    "MAX_VALUE" NUMBER(38) DEFAULT 9999999999 NOT NULL,
    "CYCLE_FLAG" NUMBER(3) DEFAULT 0,
    "CACHE_SIZE" NUMBER(22) DEFAULT 0 NOT NULL,
    "CREATE_TIME" TIMESTAMP,
    "LAST_UPDATE_BY" VARCHAR2(50),
    "LAST_UPDATE_TIME" TIMESTAMP NOT NULL
)
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_SEQUENCE"
    ADD CONSTRAINT "SYM_SEQUENCE_PK" PRIMARY KEY ("SEQUENCE_NAME")
[source-000] - OracleSymmetricDialect - DDL applied: CREATE TABLE "SYM_TABLE_RELOAD_REQUEST"(
    "TARGET_NODE_ID" VARCHAR2(50) NOT NULL,
    "SOURCE_NODE_ID" VARCHAR2(50) NOT NULL,
    "TRIGGER_ID" VARCHAR2(128) NOT NULL,
    "ROUTER_ID" VARCHAR2(50) NOT NULL,
    "CREATE_TIME" TIMESTAMP NOT NULL,
    "CREATE_TABLE" NUMBER(3) DEFAULT 0 NOT NULL,
    "DELETE_FIRST" NUMBER(3) DEFAULT 0 NOT NULL,
    "RELOAD_SELECT" CLOB,
    "BEFORE_CUSTOM_SQL" CLOB,
    "RELOAD_TIME" TIMESTAMP,
    "LOAD_ID" NUMBER(38),
    "PROCESSED" NUMBER(3) DEFAULT 0 NOT NULL,
    "CHANNEL_ID" VARCHAR2(128),
    "LAST_UPDATE_BY" VARCHAR2(50),
    "LAST_UPDATE_TIME" TIMESTAMP NOT NULL
)
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_TABLE_RELOAD_REQUEST"
    ADD CONSTRAINT "SYM_TABLE_RELOAD_REQUEST_PK" PRIMARY KEY ("TARGET_NODE_ID", "SOURCE_NODE_ID", "TRIGGER_ID", "ROUTER_ID", "CREATE_TIME")
[source-000] - OracleSymmetricDialect - DDL applied: CREATE TABLE "SYM_TABLE_RELOAD_STATUS"(
    "LOAD_ID" NUMBER(38) NOT NULL,
    "SOURCE_NODE_ID" VARCHAR2(50) NOT NULL,
    "TARGET_NODE_ID" VARCHAR2(50) NOT NULL,
    "START_TIME" TIMESTAMP,
    "END_TIME" TIMESTAMP,
    "COMPLETED" NUMBER(3) DEFAULT 0 NOT NULL,
    "CANCELLED" NUMBER(3) DEFAULT 0 NOT NULL,
    "FULL_LOAD" NUMBER(3) DEFAULT 0 NOT NULL,
    "START_DATA_BATCH_ID" NUMBER(38),
    "END_DATA_BATCH_ID" NUMBER(38),
    "SETUP_BATCH_COUNT" NUMBER(38) DEFAULT 0 NOT NULL,
    "DATA_BATCH_COUNT" NUMBER(38) DEFAULT 0 NOT NULL,
    "FINALIZE_BATCH_COUNT" NUMBER(38) DEFAULT 0 NOT NULL,
    "SETUP_BATCH_LOADED" NUMBER(38) DEFAULT 0 NOT NULL,
    "DATA_BATCH_LOADED" NUMBER(38) DEFAULT 0 NOT NULL,
    "FINALIZE_BATCH_LOADED" NUMBER(38) DEFAULT 0 NOT NULL,
    "TABLE_COUNT" NUMBER(38) DEFAULT 0 NOT NULL,
    "ROWS_LOADED" NUMBER(38) DEFAULT 0 NOT NULL,
    "ROWS_COUNT" NUMBER(38) DEFAULT 0 NOT NULL,
    "ERROR_FLAG" NUMBER(3) DEFAULT 0 NOT NULL,
    "SQL_STATE" VARCHAR2(10),
    "SQL_CODE" NUMBER(22) DEFAULT 0 NOT NULL,
    "SQL_MESSAGE" CLOB,
    "LAST_UPDATE_BY" VARCHAR2(50),
    "LAST_UPDATE_TIME" TIMESTAMP NOT NULL
)
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_TABLE_RELOAD_STATUS"
    ADD CONSTRAINT "SYM_TABLE_RELOAD_STATUS_PK" PRIMARY KEY ("LOAD_ID", "SOURCE_NODE_ID")
[source-000] - OracleSymmetricDialect - DDL applied: CREATE TABLE "SYM_TRANSFORM_TABLE"(
    "TRANSFORM_ID" VARCHAR2(50) NOT NULL,
    "SOURCE_NODE_GROUP_ID" VARCHAR2(50) NOT NULL,
    "TARGET_NODE_GROUP_ID" VARCHAR2(50) NOT NULL,
    "TRANSFORM_POINT" VARCHAR2(10) NOT NULL,
    "SOURCE_CATALOG_NAME" VARCHAR2(255),
    "SOURCE_SCHEMA_NAME" VARCHAR2(255),
    "SOURCE_TABLE_NAME" VARCHAR2(255) NOT NULL,
    "TARGET_CATALOG_NAME" VARCHAR2(255),
    "TARGET_SCHEMA_NAME" VARCHAR2(255),
    "TARGET_TABLE_NAME" VARCHAR2(255),
    "UPDATE_FIRST" NUMBER(3) DEFAULT 0,
    "UPDATE_ACTION" VARCHAR2(255) DEFAULT 'UPDATE_COL' NOT NULL,
    "DELETE_ACTION" VARCHAR2(10) NOT NULL,
    "TRANSFORM_ORDER" NUMBER(22) DEFAULT 1 NOT NULL,
    "COLUMN_POLICY" VARCHAR2(10) DEFAULT 'SPECIFIED' NOT NULL,
    "CREATE_TIME" TIMESTAMP,
    "LAST_UPDATE_BY" VARCHAR2(50),
    "LAST_UPDATE_TIME" TIMESTAMP,
    "DESCRIPTION" CLOB
)
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_TRANSFORM_TABLE"
    ADD CONSTRAINT "SYM_TRANSFORM_TABLE_PK" PRIMARY KEY ("TRANSFORM_ID", "SOURCE_NODE_GROUP_ID", "TARGET_NODE_GROUP_ID")
[source-000] - OracleSymmetricDialect - DDL applied: CREATE TABLE "SYM_TRANSFORM_COLUMN"(
    "TRANSFORM_ID" VARCHAR2(50) NOT NULL,
    "INCLUDE_ON" CHAR(1) DEFAULT '*' NOT NULL,
    "TARGET_COLUMN_NAME" VARCHAR2(128) NOT NULL,
    "SOURCE_COLUMN_NAME" VARCHAR2(128),
    "PK" NUMBER(3) DEFAULT 0,
    "TRANSFORM_TYPE" VARCHAR2(50) DEFAULT 'copy',
    "TRANSFORM_EXPRESSION" CLOB,
    "TRANSFORM_ORDER" NUMBER(22) DEFAULT 1 NOT NULL,
    "CREATE_TIME" TIMESTAMP,
    "LAST_UPDATE_BY" VARCHAR2(50),
    "LAST_UPDATE_TIME" TIMESTAMP,
    "DESCRIPTION" CLOB
)
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_TRANSFORM_COLUMN"
    ADD CONSTRAINT "SYM_TRANSFORM_COLUMN_PK" PRIMARY KEY ("TRANSFORM_ID", "INCLUDE_ON", "TARGET_COLUMN_NAME")
[source-000] - OracleSymmetricDialect - DDL applied: CREATE TABLE "SYM_TRIGGER"(
    "TRIGGER_ID" VARCHAR2(128) NOT NULL,
    "SOURCE_CATALOG_NAME" VARCHAR2(255),
    "SOURCE_SCHEMA_NAME" VARCHAR2(255),
    "SOURCE_TABLE_NAME" VARCHAR2(255) NOT NULL,
    "CHANNEL_ID" VARCHAR2(128) NOT NULL,
    "RELOAD_CHANNEL_ID" VARCHAR2(128) DEFAULT 'reload' NOT NULL,
    "SYNC_ON_UPDATE" NUMBER(3) DEFAULT 1 NOT NULL,
    "SYNC_ON_INSERT" NUMBER(3) DEFAULT 1 NOT NULL,
    "SYNC_ON_DELETE" NUMBER(3) DEFAULT 1 NOT NULL,
    "SYNC_ON_INCOMING_BATCH" NUMBER(3) DEFAULT 0 NOT NULL,
    "NAME_FOR_UPDATE_TRIGGER" VARCHAR2(255),
    "NAME_FOR_INSERT_TRIGGER" VARCHAR2(255),
    "NAME_FOR_DELETE_TRIGGER" VARCHAR2(255),
    "SYNC_ON_UPDATE_CONDITION" CLOB,
    "SYNC_ON_INSERT_CONDITION" CLOB,
    "SYNC_ON_DELETE_CONDITION" CLOB,
    "CUSTOM_BEFORE_UPDATE_TEXT" CLOB,
    "CUSTOM_BEFORE_INSERT_TEXT" CLOB,
    "CUSTOM_BEFORE_DELETE_TEXT" CLOB,
    "CUSTOM_ON_UPDATE_TEXT" CLOB,
    "CUSTOM_ON_INSERT_TEXT" CLOB,
    "CUSTOM_ON_DELETE_TEXT" CLOB,
    "EXTERNAL_SELECT" CLOB,
    "TX_ID_EXPRESSION" CLOB,
    "CHANNEL_EXPRESSION" CLOB,
    "EXCLUDED_COLUMN_NAMES" CLOB,
    "INCLUDED_COLUMN_NAMES" CLOB,
    "SYNC_KEY_NAMES" CLOB,
    "USE_STREAM_LOBS" NUMBER(3) DEFAULT 0 NOT NULL,
    "USE_CAPTURE_LOBS" NUMBER(3) DEFAULT 0 NOT NULL,
    "USE_CAPTURE_OLD_DATA" NUMBER(3) DEFAULT 1 NOT NULL,
    "USE_HANDLE_KEY_UPDATES" NUMBER(3) DEFAULT 1 NOT NULL,
    "STREAM_ROW" NUMBER(3) DEFAULT 0 NOT NULL,
    "CREATE_TIME" TIMESTAMP NOT NULL,
    "LAST_UPDATE_BY" VARCHAR2(50),
    "LAST_UPDATE_TIME" TIMESTAMP NOT NULL,
    "DESCRIPTION" CLOB
)
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_TRIGGER"
    ADD CONSTRAINT "SYM_TRIGGER_PK" PRIMARY KEY ("TRIGGER_ID")
[source-000] - OracleSymmetricDialect - DDL applied: CREATE TABLE "SYM_TRIGGER_HIST"(
    "TRIGGER_HIST_ID" NUMBER(22) NOT NULL,
    "TRIGGER_ID" VARCHAR2(128) NOT NULL,
    "SOURCE_TABLE_NAME" VARCHAR2(255) NOT NULL,
    "SOURCE_CATALOG_NAME" VARCHAR2(255),
    "SOURCE_SCHEMA_NAME" VARCHAR2(255),
    "NAME_FOR_UPDATE_TRIGGER" VARCHAR2(255),
    "NAME_FOR_INSERT_TRIGGER" VARCHAR2(255),
    "NAME_FOR_DELETE_TRIGGER" VARCHAR2(255),
    "TABLE_HASH" NUMBER(38) DEFAULT 0 NOT NULL,
    "TRIGGER_ROW_HASH" NUMBER(38) DEFAULT 0 NOT NULL,
    "TRIGGER_TEMPLATE_HASH" NUMBER(38) DEFAULT 0 NOT NULL,
    "COLUMN_NAMES" CLOB NOT NULL,
    "PK_COLUMN_NAMES" CLOB NOT NULL,
    "LAST_TRIGGER_BUILD_REASON" CHAR(1) NOT NULL,
    "ERROR_MESSAGE" CLOB,
    "CREATE_TIME" TIMESTAMP NOT NULL,
    "INACTIVE_TIME" TIMESTAMP
)
[source-000] - OracleSymmetricDialect - DDL applied: CREATE INDEX "SYM_IDX_TRIGG_HIST_1" ON "SYM_TRIGGER_HIST" ("TRIGGER_ID", "INACTIVE_TIME")
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_TRIGGER_HIST"
    ADD CONSTRAINT "SYM_TRIGGER_HIST_PK" PRIMARY KEY ("TRIGGER_HIST_ID")
[source-000] - OracleSymmetricDialect - DDL applied: CREATE TABLE "SYM_TRIGGER_ROUTER"(
    "TRIGGER_ID" VARCHAR2(128) NOT NULL,
    "ROUTER_ID" VARCHAR2(50) NOT NULL,
    "ENABLED" NUMBER(3) DEFAULT 1 NOT NULL,
    "INITIAL_LOAD_ORDER" NUMBER(22) DEFAULT 1 NOT NULL,
    "INITIAL_LOAD_SELECT" CLOB,
    "INITIAL_LOAD_DELETE_STMT" CLOB,
    "PING_BACK_ENABLED" NUMBER(3) DEFAULT 0 NOT NULL,
    "CREATE_TIME" TIMESTAMP NOT NULL,
    "LAST_UPDATE_BY" VARCHAR2(50),
    "LAST_UPDATE_TIME" TIMESTAMP NOT NULL,
    "DESCRIPTION" CLOB
)
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_TRIGGER_ROUTER"
    ADD CONSTRAINT "SYM_TRIGGER_ROUTER_PK" PRIMARY KEY ("TRIGGER_ID", "ROUTER_ID")
[source-000] - OracleSymmetricDialect - DDL applied: CREATE TABLE "SYM_TRIGGER_ROUTER_GROUPLET"(
    "GROUPLET_ID" VARCHAR2(50) NOT NULL,
    "TRIGGER_ID" VARCHAR2(128) NOT NULL,
    "ROUTER_ID" VARCHAR2(50) NOT NULL,
    "APPLIES_WHEN" CHAR(1) NOT NULL,
    "CREATE_TIME" TIMESTAMP NOT NULL,
    "LAST_UPDATE_BY" VARCHAR2(50),
    "LAST_UPDATE_TIME" TIMESTAMP NOT NULL
)
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_TRIGGER_ROUTER_GROUPLET"
    ADD CONSTRAINT "SYM_TRIGGER_ROUTER_GROUPLET_PK" PRIMARY KEY ("GROUPLET_ID", "TRIGGER_ID", "ROUTER_ID", "APPLIES_WHEN")
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_CONFLICT"
    ADD CONSTRAINT "SYM_FK_CF_2_GRP_LNK" FOREIGN KEY ("SOURCE_NODE_GROUP_ID", "TARGET_NODE_GROUP_ID") REFERENCES "SYM_NODE_GROUP_LINK" ("SOURCE_NODE_GROUP_ID", "TARGET_NODE_GROUP_ID")
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_FILE_TRIGGER_ROUTER"
    ADD CONSTRAINT "SYM_FK_FTR_2_FTRG" FOREIGN KEY ("TRIGGER_ID") REFERENCES "SYM_FILE_TRIGGER" ("TRIGGER_ID")
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_FILE_TRIGGER_ROUTER"
    ADD CONSTRAINT "SYM_FK_FTR_2_RTR" FOREIGN KEY ("ROUTER_ID") REFERENCES "SYM_ROUTER" ("ROUTER_ID")
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_GROUPLET_LINK"
    ADD CONSTRAINT "SYM_FK_GPLTLNK_2_GPLT" FOREIGN KEY ("GROUPLET_ID") REFERENCES "SYM_GROUPLET" ("GROUPLET_ID")
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_NODE_GROUP_LINK"
    ADD CONSTRAINT "SYM_FK_LNK_2_GRP_SRC" FOREIGN KEY ("SOURCE_NODE_GROUP_ID") REFERENCES "SYM_NODE_GROUP" ("NODE_GROUP_ID")
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_NODE_GROUP_LINK"
    ADD CONSTRAINT "SYM_FK_LNK_2_GRP_TGT" FOREIGN KEY ("TARGET_NODE_GROUP_ID") REFERENCES "SYM_NODE_GROUP" ("NODE_GROUP_ID")
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_NODE_IDENTITY"
    ADD CONSTRAINT "SYM_FK_IDENT_2_NODE" FOREIGN KEY ("NODE_ID") REFERENCES "SYM_NODE" ("NODE_ID")
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_NODE_SECURITY"
    ADD CONSTRAINT "SYM_FK_SEC_2_NODE" FOREIGN KEY ("NODE_ID") REFERENCES "SYM_NODE" ("NODE_ID")
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_ROUTER"
    ADD CONSTRAINT "SYM_FK_RT_2_GRP_LNK" FOREIGN KEY ("SOURCE_NODE_GROUP_ID", "TARGET_NODE_GROUP_ID") REFERENCES "SYM_NODE_GROUP_LINK" ("SOURCE_NODE_GROUP_ID", "TARGET_NODE_GROUP_ID")
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_TRANSFORM_TABLE"
    ADD CONSTRAINT "SYM_FK_TT_2_GRP_LNK" FOREIGN KEY ("SOURCE_NODE_GROUP_ID", "TARGET_NODE_GROUP_ID") REFERENCES "SYM_NODE_GROUP_LINK" ("SOURCE_NODE_GROUP_ID", "TARGET_NODE_GROUP_ID")
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_TRIGGER"
    ADD CONSTRAINT "SYM_FK_TRG_2_CHNL" FOREIGN KEY ("CHANNEL_ID") REFERENCES "SYM_CHANNEL" ("CHANNEL_ID")
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_TRIGGER"
    ADD CONSTRAINT "SYM_FK_TRG_2_RLD_CHNL" FOREIGN KEY ("RELOAD_CHANNEL_ID") REFERENCES "SYM_CHANNEL" ("CHANNEL_ID")
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_TRIGGER_ROUTER"
    ADD CONSTRAINT "SYM_FK_TR_2_TRG" FOREIGN KEY ("TRIGGER_ID") REFERENCES "SYM_TRIGGER" ("TRIGGER_ID")
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_TRIGGER_ROUTER"
    ADD CONSTRAINT "SYM_FK_TR_2_RTR" FOREIGN KEY ("ROUTER_ID") REFERENCES "SYM_ROUTER" ("ROUTER_ID")
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_TRIGGER_ROUTER_GROUPLET"
    ADD CONSTRAINT "SYM_FK_TRGPLT_2_GPLT" FOREIGN KEY ("GROUPLET_ID") REFERENCES "SYM_GROUPLET" ("GROUPLET_ID")
[source-000] - OracleSymmetricDialect - DDL applied: ALTER TABLE "SYM_TRIGGER_ROUTER_GROUPLET"
    ADD CONSTRAINT "SYM_FK_TRGPLT_2_TR" FOREIGN KEY ("TRIGGER_ID", "ROUTER_ID") REFERENCES "SYM_TRIGGER_ROUTER" ("TRIGGER_ID", "ROUTER_ID")
[source-000] - ClusterService - This node picked a server id of symdssrc
[source-000] - TriggerRouterService - Synchronizing triggers
[source-000] - TriggerRouterService - Done synchronizing triggers
[source-000] - OracleSymmetricDialect - Done with auto update of SymmetricDS tables
[source-000] - ConfigurationService - Auto-configuring config channel
[source-000] - ConfigurationService - Auto-configuring reload channel
[source-000] - ConfigurationService - Auto-configuring monitor channel
[source-000] - ConfigurationService - Auto-configuring heartbeat channel
[source-000] - ConfigurationService - Auto-configuring default channel
[source-000] - ConfigurationService - Auto-configuring dynamic channel
[source-000] - ExtensionService - Found 0 extension points from the database that will be registered
[source-000] - ClientExtensionService - Found 7 extension points from spring that will be registered
[source-000] - AbstractSymmetricEngine - Inserting rows for node, security, identity and group for registration server
[source-000] - AbstractSymmetricEngine - Done initializing SymmetricDS database
[oracle@symdssrc bin]$

The above steps will create new tables name starting with SYM_ in the SCOTT schema and few indexes and it might create few triggers used for replication.

Register target database from Source

./symadmin -engine source-000 open-registration dest 001

[oracle@symdssrc bin]$ ./symadmin -engine source-000 open-registration dest 001
Log output will be written to /home/oracle/symds/symmetric-server-3.12.10/logs/symmetric.log
[] - AbstractCommandLauncher - Option: name=engine, value={source-000}
[] - SymmetricUtils -
   _____                              __       _       ____   _____
  / ___/ __  _____ __  ___ __  ___  _/ /_ ____(_)___  / __ | / ___/
  \__ \ / / / / _ `_ \/ _ `_ \/ _ \/_ __// __/ / __/ / / / / \__ \
 ___/ // /_/ / // // / // // /  __// /  / / / / /_  / /_/ / ___/ /
/____/ \__  /_//_//_/_//_//_/\___/ \_/ /_/ /_/\__/ /_____/ /____/
      /____/
+-----------------------------------------------------------------+
| Copyright (C) 2007-2021 JumpMind, Inc.                          |
|                                                                 |
| Licensed under the GNU General Public License version 3.        |
| This software comes with ABSOLUTELY NO WARRANTY.                |
| See http://www.gnu.org/licenses/gpl.html                        |
+-----------------------------------------------------------------+
[source-000] - AbstractSymmetricEngine - Initializing connection to database
[source-000] - JdbcDatabasePlatformFactory - Detected database 'Oracle', version '11', protocol 'oracle'
[source-000] - JdbcDatabasePlatformFactory - The IDatabasePlatform being used is org.jumpmind.db.platform.oracle.OracleDatabasePlatform
[source-000] - OracleSymmetricDialect - The DbDialect being used is org.jumpmind.symmetric.db.oracle.OracleSymmetricDialect
[source-000] - ExtensionService - Found 0 extension points from the database that will be registered
[source-000] - StagingManager - The staging directory was initialized at the following location: /home/oracle/symds/symmetric-server-3.12.10/tmp/source-000
[source-000] - ExtensionService - Found 0 extension points from the database that will be registered
[source-000] - ClientExtensionService - Found 7 extension points from spring that will be registered
[source-000] - RegistrationService - Just opened registration for external id of 001 and a node group of dest and a node id of 001
Opened registration for node group of 'dest' external ID of '001'
[oracle@symdssrc bin]$
 

Symmetricds table configuration for replication

The below script has to be executed for the data synchronization configuration between source to target. On target we will only create the table structure and initial load of data will happen to target once we start the service on source and target

insert into sym_node_group_link (source_node_group_id, target_node_group_id,data_event_action) values ('source', 'dest', 'P');
insert into sym_channel (channel_id, processing_order, max_batch_size,enabled, description) values('ho_sync_capricon', 1, 100000, 1, 'outbound channel');
insert into sym_trigger (trigger_id, source_table_name, channel_id, last_update_time, create_time,sync_on_incoming_batch) values ('outbound_tr_t1', 'TEST1','ho_sync_capricon',sysdate,sysdate,1);
insert into sym_trigger (trigger_id, source_table_name, channel_id, last_update_time, create_time,sync_on_incoming_batch) values ('outbound_tr_t2', 'TEST2','ho_sync_capricon',sysdate,sysdate,1);
insert into sym_trigger (trigger_id, source_table_name, channel_id, last_update_time, create_time,sync_on_incoming_batch) values ('outbound_tr_t3', 'TEST3','ho_sync_capricon',sysdate,sysdate,1);
insert into sym_router (router_id,source_node_group_id,target_node_group_id,router_type,create_time,last_update_time) values('ho-capricon', 'source', 'dest', 'default',current_timestamp, current_timestamp);
insert into sym_trigger_router (trigger_id,router_id,initial_load_order,last_update_time,create_time) values('outbound_tr_t1','ho-capricon', 1, current_timestamp, current_timestamp);
insert into sym_trigger_router (trigger_id,router_id,initial_load_order,last_update_time,create_time) values('outbound_tr_t2','ho-capricon', 1, current_timestamp, current_timestamp);
insert into sym_trigger_router (trigger_id,router_id,initial_load_order,last_update_time,create_time) values('outbound_tr_t3','ho-capricon', 1, current_timestamp, current_timestamp);

The above scripts updates the symmetric tables sym_node_group_link, sym_channel, sym_trigger,sym_trigger_router tables with the information on triggers, trigger routes & group link properties for the objects we replicate from source to target.

For initial load we are updating below tables in SCOTT schema this enables the initial load from source to target.

update SYM_NODE_SECURITY set initial_load_enabled=1 where node_id=001;

update SYM_NODE set sync_enabled=1 where node_id=001;
 

commit;

Execute the above SQL statements for starting the initial load of table data from source to target database

Initial Load via SymmetricDS

An initial load is the process of seeding tables at a target node with data from a source node. Instead of capturing data, data is selected from the source table using a SQL statement and then it is streamed to the client.

The store nodes were pre-configured to do an initial load after registration. However, it is worth noting that Initial Loads can be sent using the following commands:

..bin/symadmin --engine corp-000 reload-node 001

[oracle@symdssrc bin]# ./symadmin --engine source-000 reload-node 001
Log output will be written to /home/oracle/symdshome/symmetric-server-3.12.10/logs/symmetric.log
[] - AbstractCommandLauncher - Option: name=engine, value={source-000}
[] - SymmetricUtils -
   _____                              __       _       ____   _____
  / ___/ __  _____ __  ___ __  ___  _/ /_ ____(_)___  / __ | / ___/
  \__ \ / / / / _ `_ \/ _ `_ \/ _ \/_ __// __/ / __/ / / / / \__ \
 ___/ // /_/ / // // / // // /  __// /  / / / / /_  / /_/ / ___/ /
/____/ \__  /_//_//_/_//_//_/\___/ \_/ /_/ /_/\__/ /_____/ /____/
      /____/
+-----------------------------------------------------------------+
| Copyright (C) 2007-2021 JumpMind, Inc.                          |
|                                                                 |
| Licensed under the GNU General Public License version 3.        |
| This software comes with ABSOLUTELY NO WARRANTY.                |
| See http://www.gnu.org/licenses/gpl.html                        |
+-----------------------------------------------------------------+
[source-000] - AbstractSymmetricEngine - Initializing connection to database
[source-000] - JdbcDatabasePlatformFactory - Detected database 'Oracle', version '11', protocol 'oracle'
[source-000] - JdbcDatabasePlatformFactory - The IDatabasePlatform being used is org.jumpmind.db.platform.oracle.OracleDatabasePlatform
[source-000] - OracleSymmetricDialect - The DbDialect being used is org.jumpmind.symmetric.db.oracle.OracleSymmetricDialect
[source-000] - ExtensionService - Found 0 extension points from the database that will be registered
[source-000] - StagingManager - The staging directory was initialized at the following location: /home/oracle/symdshome/symmetric-server-3.12.10/tmp/source-000
[source-000] - ExtensionService - Found 0 extension points from the database that will be registered
[source-000] - ClientExtensionService - Found 7 extension points from spring that will be registered
Successfully enabled initial load for node 001
[oracle@symdssrc bin]#
 

Start SymmetricDS services @ source & Target server

First Start the service @ source and then on target from Oracle OS user

Source command –

Goto the path - /home/oracle/symdshome/symmetric-server-3.12.10/bin

Execute the command

nohup ./sym > /home/oracle/symdshome/symmetric-server-3.12.10/sym_06242021.log 2>&1 &

To monitor the symmetricds status you can tail the log file found on source location

tail -f /home/oracle/symdshome/symmetric-server-3.12.10/bin/sym_06242021.log

tail -f /home/oracle/symdshome/symmetric-server-3.12.10/logs/symmetric.log

Start services at the target server from Oracle OS user

Goto the location - /home/oracle/symds/symmetric-server-3.12.10/bin
./sym_service start

tail -f /home/oracle/symds/symmetric-server-3.12.10/logs/symmetric.log 

Source & Target Startup details in below logs. 

 [oracle@symdssrc bin]$ nohup ./sym > sym_06242021.log 2>&1 &
[1] 75574
[oracle@symdssrc bin]$

Target services startup traces.

[root@symds bin]# ./sym_service start
Waiting for server to start
Waiting for server to start
......
Started
[root@symds bin]# ./sym_service status
Installed: true
Running: true
Wrapper PID: 34978
Wrapper Running: true
Server PID: 34996
Server Running: true
 

Once the services are started review the logs mentioned for any errors related to source-000 & dest-001 engines.

SymmetricDS logs & traces are seen below,

Log output will be written to /home/oracle/symdshome/symmetric-server-3.12.10/logs/symmetric.log
[startup] - SymmetricUtils -
   _____                              __       _       ____   _____
  / ___/ __  _____ __  ___ __  ___  _/ /_ ____(_)___  / __ | / ___/
  \__ \ / / / / _ `_ \/ _ `_ \/ _ \/_ __// __/ / __/ / / / / \__ \
 ___/ // /_/ / // // / // // /  __// /  / / / / /_  / /_/ / ___/ /
/____/ \__  /_//_//_/_//_//_/\___/ \_/ /_/ /_/\__/ /_____/ /____/
      /____/
+-----------------------------------------------------------------+
| Copyright (C) 2007-2021 JumpMind, Inc.                          |
|                                                                 |
| Licensed under the GNU General Public License version 3.        |
| This software comes with ABSOLUTELY NO WARRANTY.                |
| See http://www.gnu.org/licenses/gpl.html                        |
+-----------------------------------------------------------------+
[startup] - SymmetricWebServer - About to start SymmetricDS web server on 0.0.0.0:31415:HTTP/1.1
[startup] - SymmetricEngineHolder - Current directory is /home/oracle/symdshome/symmetric-server-3.12.10
[startup] - SymmetricEngineHolder - Starting in single-server mode
[source-000] - AbstractSymmetricEngine - Initializing connection to database
[startup] - SymmetricWebServer - Joining the web server main thread
[source-000] - JdbcDatabasePlatformFactory - Detected database 'Oracle', version '11', protocol 'oracle'
[source-000] - JdbcDatabasePlatformFactory - The IDatabasePlatform being used is org.jumpmind.db.platform.oracle.OracleDatabasePlatform
[source-000] - OracleSymmetricDialect - The DbDialect being used is org.jumpmind.symmetric.db.oracle.OracleSymmetricDialect
[source-000] - ExtensionService - Found 0 extension points from the database that will be registered
[source-000] - StagingManager - The staging directory was initialized at the following location: /home/oracle/symdshome/symmetric-server-3.12.10/tmp/source-000
[source-000] - ExtensionService - Found 0 extension points from the database that will be registered
[source-000] - ClientExtensionService - Found 8 extension points from spring that will be registered
[source-000] - AbstractSymmetricEngine - Initializing SymmetricDS database
[source-000] - OracleSymmetricDialect - Checking if SymmetricDS tables need created or altered
[source-000] - AbstractSymmetricEngine - Done initializing SymmetricDS database
[source-000] - AbstractSymmetricEngine - SymmetricDS database version : 3.12.10
[source-000] - AbstractSymmetricEngine - SymmetricDS software version : 3.12.10
[source-000] - AbstractSymmetricEngine - Starting registered node [group=source, id=000, nodeId=000]
[source-000] - ClusterService - This node picked a server id of symdssrc
[source-000] - TriggerRouterService - Synchronizing triggers
[source-000] - TriggerRouterService - Done synchronizing triggers
[source-000] - RouterJob - Starting Routing on periodic schedule: every 5000ms with the first run at 2021-06-24T18:39:02.413+0000
[source-000] - PushJob - Starting Push on periodic schedule: every 10000ms with the first run at 2021-06-24T18:39:02.420+0000
[source-000] - PullJob - Starting Pull on periodic schedule: every 10000ms with the first run at 2021-06-24T18:39:02.421+0000
[source-000] - JobManager - Job Offline Push not configured for auto start
[source-000] - JobManager - Job Offline Pull not configured for auto start
[source-000] - OutgoingPurgeJob - Starting job 'Purge Outgoing' with cron expression: '0 0 */4 * * *'
[source-000] - IncomingPurgeJob - Starting job 'Purge Incoming' with cron expression: '0 0 */4 * * *'
[source-000] - StatisticFlushJob - Starting job 'Stat Flush' with cron expression: '0 0/5 * * * *'
[source-000] - SyncTriggersJob - Starting job 'SyncTriggers' with cron expression: '0 0 0 * * *'
[source-000] - HeartbeatJob - Starting Heartbeat on periodic schedule: every 900000ms with the first run at 2021-06-24T18:39:02.429+0000
[source-000] - WatchdogJob - Starting Watchdog on periodic schedule: every 3600000ms with the first run at 2021-06-24T18:39:02.429+0000
[source-000] - StageManagementJob - Starting job 'Stage Management' with cron expression: '0 0 * * * *'
[source-000] - JobManager - Job Refresh Cache not configured for auto start
[source-000] - JobManager - Job File Sync Tracker not configured for auto start
[source-000] - JobManager - Job File Sync Pull not configured for auto start
[source-000] - JobManager - Job File Sync Push not configured for auto start
[source-000] - InitialLoadExtractorJob - Starting Initial Load Extract on periodic schedule: every 10000ms with the first run at 2021-06-24T18:39:02.432+0000
[source-000] - MonitorJob - Starting Monitor on periodic schedule: every 60000ms with the first run at 2021-06-24T18:39:02.432+0000
[source-000] - JobManager - Job Report Status not configured for auto start
[source-000] - JobManager - Job Log Miner not configured for auto start
[source-000] - InitialLoadJob - Starting Initial Load Queue on periodic schedule: every 10000ms with the first run at 2021-06-24T18:39:02.433+0000
[source-000] - AbstractSymmetricEngine - SymmetricDS Node STARTED:
         nodeId=000
         groupId=source
         type=server
         subType=null
         name=source-000
         softwareVersion=3.12.10
         databaseName=Oracle
         databaseVersion=11.2
         driverName=Oracle JDBC driver
         driverVersion=18.3.0.0.0
         uptime=0 sec.
[source-000] - DataGapFastDetector - Full gap analysis is running
[source-000] - NodeCommunicationService - pull will use 10 threads
[source-000] - DataGapFastDetector - Querying data in gaps from database took 10 ms
[source-000] - DataGapFastDetector - Full gap analysis is done after 11 ms
[source-000] - NodeCommunicationService - push will use 10 threads
[source-000] - RouterService - Routed 1 data events in 125 ms
[source-000] - PushService - Push data sent to dest:001:001
[source-000] - PushService - Pushed data to node dest:001:001. 1 data and 1 batches were processed. (sym_node_host)
[oracle@symdssrc symmetric-server-3.12.10]$
 

Target server Symmetric services traces, 

2021-06-24 17:46:09,960 INFO [startup] [SymmetricUtils] [main]
   _____                              __       _       ____   _____
  / ___/ __  _____ __  ___ __  ___  _/ /_ ____(_)___  / __ | / ___/
  \__ \ / / / / _ `_ \/ _ `_ \/ _ \/_ __// __/ / __/ / / / / \__ \
 ___/ // /_/ / // // / // // /  __// /  / / / / /_  / /_/ / ___/ /
/____/ \__  /_//_//_/_//_//_/\___/ \_/ /_/ /_/\__/ /_____/ /____/
      /____/
+-----------------------------------------------------------------+
| Copyright (C) 2007-2021 JumpMind, Inc.                          |
|                                                                 |
| Licensed under the GNU General Public License version 3.        |
| This software comes with ABSOLUTELY NO WARRANTY.                |
| See http://www.gnu.org/licenses/gpl.html                        |
+-----------------------------------------------------------------+
2021-06-24 17:46:10,077 INFO [startup] [SymmetricWebServer] [main] About to start SymmetricDS web server on 0.0.0.0:31415:HTTP/1.1
2021-06-24 17:46:10,516 INFO [startup] [SymmetricEngineHolder] [main] Current directory is /home/oracle/symds/symmetric-server-3.12.10
2021-06-24 17:46:10,516 INFO [startup] [SymmetricEngineHolder] [main] Starting in single-server mode
2021-06-24 17:46:10,770 INFO [dest-001] [AbstractSymmetricEngine] [symmetric-engine-startup-1] Initializing connection to database
2021-06-24 17:46:12,521 INFO [dest-001] [JdbcDatabasePlatformFactory] [symmetric-engine-startup-1] Detected database 'Oracle', version '11', protocol 'oracle'
2021-06-24 17:46:12,547 INFO [dest-001] [JdbcDatabasePlatformFactory] [symmetric-engine-startup-1] The IDatabasePlatform being used is org.jumpmind.db.platform.oracle.OracleDatabasePlatform
2021-06-24 18:26:54,143 INFO [startup] [AbstractCommandLauncher] [main] Option: name=max-idle-time, value={90000}
2021-06-24 18:26:54,151 INFO [startup] [AbstractCommandLauncher] [main] Option: name=no-log-console, value={}
2021-06-24 18:26:54,306 INFO [startup] [SymmetricUtils] [main]
   _____                              __       _       ____   _____
  / ___/ __  _____ __  ___ __  ___  _/ /_ ____(_)___  / __ | / ___/
  \__ \ / / / / _ `_ \/ _ `_ \/ _ \/_ __// __/ / __/ / / / / \__ \
 ___/ // /_/ / // // / // // /  __// /  / / / / /_  / /_/ / ___/ /
/____/ \__  /_//_//_/_//_//_/\___/ \_/ /_/ /_/\__/ /_____/ /____/
      /____/
+-----------------------------------------------------------------+
| Copyright (C) 2007-2021 JumpMind, Inc.                          |
|                                                                 |
| Licensed under the GNU General Public License version 3.        |
| This software comes with ABSOLUTELY NO WARRANTY.                |
| See http://www.gnu.org/licenses/gpl.html                        |
+-----------------------------------------------------------------+
2021-06-24 18:26:54,428 INFO [startup] [SymmetricWebServer] [main] About to start SymmetricDS web server on 0.0.0.0:31415:HTTP/1.1
2021-06-24 18:26:54,890 INFO [startup] [SymmetricEngineHolder] [main] Current directory is /home/oracle/symds/symmetric-server-3.12.10
2021-06-24 18:26:54,890 INFO [startup] [SymmetricEngineHolder] [main] Starting in single-server mode
2021-06-24 18:26:55,216 INFO [dest-001] [AbstractSymmetricEngine] [symmetric-engine-startup-1] Initializing connection to database
2021-06-24 18:26:57,424 INFO [dest-001] [JdbcDatabasePlatformFactory] [symmetric-engine-startup-1] Detected database 'Oracle', version '11', protocol 'oracle'
2021-06-24 18:26:57,468 INFO [dest-001] [JdbcDatabasePlatformFactory] [symmetric-engine-startup-1] The IDatabasePlatform being used is org.jumpmind.db.platform.oracle.OracleDatabasePlatform
2021-06-24 18:26:57,474 INFO [startup] [SymmetricWebServer] [main] Joining the web server main thread
2021-06-24 18:26:57,777 INFO [dest-001] [OracleSymmetricDialect] [symmetric-engine-startup-1] The DbDialect being used is org.jumpmind.symmetric.db.oracle.OracleSymmetricDialect
2021-06-24 18:26:57,901 INFO [dest-001] [ExtensionService] [symmetric-engine-startup-1] Found 0 extension points from the database that will be registered
2021-06-24 18:26:57,916 INFO [dest-001] [StagingManager] [symmetric-engine-startup-1] The staging directory was initialized at the following location: tmp/dest-001
2021-06-24 18:26:58,688 INFO [dest-001] [ExtensionService] [symmetric-engine-startup-1] Found 0 extension points from the database that will be registered
2021-06-24 18:26:58,689 INFO [dest-001] [ClientExtensionService] [symmetric-engine-startup-1] Found 8 extension points from spring that will be registered
2021-06-24 18:26:58,705 INFO [dest-001] [AbstractSymmetricEngine] [symmetric-engine-startup-1] Initializing SymmetricDS database
2021-06-24 18:26:59,328 INFO [dest-001] [OracleSymmetricDialect] [symmetric-engine-startup-1] Checking if SymmetricDS tables need created or altered
2021-06-24 18:27:01,524 INFO [dest-001] [AbstractSymmetricEngine] [symmetric-engine-startup-1] Done initializing SymmetricDS database
2021-06-24 18:27:01,524 INFO [dest-001] [AbstractSymmetricEngine] [symmetric-engine-startup-1] SymmetricDS database version : 3.12.10
2021-06-24 18:27:01,524 INFO [dest-001] [AbstractSymmetricEngine] [symmetric-engine-startup-1] SymmetricDS software version : 3.12.10
2021-06-24 18:27:01,614 INFO [dest-001] [AbstractSymmetricEngine] [symmetric-engine-startup-1] Starting registered node [group=dest, id=001, nodeId=001]
2021-06-24 18:27:01,617 INFO [dest-001] [ClusterService] [symmetric-engine-startup-1] This node picked a server id of symds
2021-06-24 18:27:01,617 INFO [dest-001] [TriggerRouterService] [symmetric-engine-startup-1] Synchronizing triggers
2021-06-24 18:27:01,664 INFO [dest-001] [TriggerRouterService] [symmetric-engine-startup-1] Done synchronizing triggers
2021-06-24 18:27:01,685 INFO [dest-001] [RouterJob] [symmetric-engine-startup-1] Starting Routing on periodic schedule: every 5000ms with the first run at 2021-06-24T18:27:09.051+0000
2021-06-24 18:27:01,689 INFO [dest-001] [PushJob] [symmetric-engine-startup-1] Starting Push on periodic schedule: every 10000ms with the first run at 2021-06-24T18:27:09.055+0000
2021-06-24 18:27:01,690 INFO [dest-001] [PullJob] [symmetric-engine-startup-1] Starting Pull on periodic schedule: every 10000ms with the first run at 2021-06-24T18:27:09.056+0000
2021-06-24 18:27:01,690 INFO [dest-001] [JobManager] [symmetric-engine-startup-1] Job Offline Push not configured for auto start
2021-06-24 18:27:01,690 INFO [dest-001] [JobManager] [symmetric-engine-startup-1] Job Offline Pull not configured for auto start
2021-06-24 18:27:01,694 INFO [dest-001] [OutgoingPurgeJob] [symmetric-engine-startup-1] Starting job 'Purge Outgoing' with cron expression: '0 0 */4 * * *'
2021-06-24 18:27:01,695 INFO [dest-001] [IncomingPurgeJob] [symmetric-engine-startup-1] Starting job 'Purge Incoming' with cron expression: '0 0 */4 * * *'
2021-06-24 18:27:01,696 INFO [dest-001] [StatisticFlushJob] [symmetric-engine-startup-1] Starting job 'Stat Flush' with cron expression: '0 0/5 * * * *'
2021-06-24 18:27:01,697 INFO [dest-001] [SyncTriggersJob] [symmetric-engine-startup-1] Starting job 'SyncTriggers' with cron expression: '0 0 0 * * *'
2021-06-24 18:27:01,698 INFO [dest-001] [HeartbeatJob] [symmetric-engine-startup-1] Starting Heartbeat on periodic schedule: every 900000ms with the first run at 2021-06-24T18:27:09.064+0000
2021-06-24 18:27:01,698 INFO [dest-001] [WatchdogJob] [symmetric-engine-startup-1] Starting Watchdog on periodic schedule: every 3600000ms with the first run at 2021-06-24T18:27:09.064+0000
2021-06-24 18:27:01,699 INFO [dest-001] [StageManagementJob] [symmetric-engine-startup-1] Starting job 'Stage Management' with cron expression: '0 0 * * * *'
2021-06-24 18:27:01,699 INFO [dest-001] [JobManager] [symmetric-engine-startup-1] Job Refresh Cache not configured for auto start
2021-06-24 18:27:01,699 INFO [dest-001] [JobManager] [symmetric-engine-startup-1] Job File Sync Tracker not configured for auto start
2021-06-24 18:27:01,700 INFO [dest-001] [JobManager] [symmetric-engine-startup-1] Job File Sync Pull not configured for auto start
2021-06-24 18:27:01,700 INFO [dest-001] [JobManager] [symmetric-engine-startup-1] Job File Sync Push not configured for auto start
2021-06-24 18:27:01,700 INFO [dest-001] [InitialLoadExtractorJob] [symmetric-engine-startup-1] Starting Initial Load Extract on periodic schedule: every 10000ms with the first run at 2021-06-24T18:27:09.066+0000
2021-06-24 18:27:01,700 INFO [dest-001] [MonitorJob] [symmetric-engine-startup-1] Starting Monitor on periodic schedule: every 60000ms with the first run at 2021-06-24T18:27:09.066+0000
2021-06-24 18:27:01,701 INFO [dest-001] [JobManager] [symmetric-engine-startup-1] Job Report Status not configured for auto start
2021-06-24 18:27:01,701 INFO [dest-001] [JobManager] [symmetric-engine-startup-1] Job Log Miner not configured for auto start
2021-06-24 18:27:01,701 INFO [dest-001] [InitialLoadJob] [symmetric-engine-startup-1] Starting Initial Load Queue on periodic schedule: every 10000ms with the first run at 2021-06-24T18:27:09.067+0000
2021-06-24 18:27:01,704 INFO [dest-001] [AbstractSymmetricEngine] [symmetric-engine-startup-1] SymmetricDS Node STARTED:
         nodeId=001
         groupId=dest
         type=server
         subType=null
         name=dest-001
         softwareVersion=3.12.10
         databaseName=Oracle
         databaseVersion=11.2
         driverName=Oracle JDBC driver
         driverVersion=18.3.0.0.0
         uptime=0 sec.
2021-06-24 18:27:07,281 INFO [dest-001] [ConfigurationChangedDatabaseWriterFilter] [dest-001-dataloader-1] About to refresh the cache of node security because new configuration came through the data loader
2021-06-24 18:27:07,397 INFO [dest-001] [DataLoaderService] [qtp932582590-16] 2 data and 2 batches loaded during push request from source:000:000
2021-06-24 18:27:09,086 INFO [dest-001] [NodeCommunicationService] [dest-001-job-3] pull will use 10 threads
2021-06-24 18:27:09,088 INFO [dest-001] [DataGapFastDetector] [dest-001-job-1] Full gap analysis is running
2021-06-24 18:27:09,099 INFO [dest-001] [DataGapFastDetector] [dest-001-job-1] Querying data in gaps from database took 7 ms
2021-06-24 18:27:09,100 INFO [dest-001] [DataGapFastDetector] [dest-001-job-1] Full gap analysis is done after 8 ms
2021-06-24 18:29:16,964 INFO [dest-001] [DataLoaderService] [qtp932582590-15] 1 data and 1 batches loaded during push request from source:000:000

 

Any errors related to source and destination engines can be identified from the above log traces.

Testing the SYMMETRICDS replication with table from source to target.

As per our example we are performing the test in SCOTT1 user for the table TEST2.

Step -1 - Review the source and target database schemas and tables.

Source database details - 

 

Target database details –


Step -2 -Insert data into source and check how it replicates at target database.

 

Logs/Traces from the source & Target shows that 3 data/1 batch is processed.

Step -3 – Verify the source & Target symmetric logs.

Verify the timestamp of the SQLPLUS Commit and the traces from symmetricDS source server logs above where 3 data/1 batch data proccessed of Test2.

Target logs shows the 3 data rows/1 batch loaded to table TEST2 from source-000.


Step -4 – Check the data sync status –

 Query the destination/target database for data sync status.

 

The rows are replicated at target.

Note: DML changes are replicated, DDL changes doesn’t get replicated via SymmetricDS.

 

References - Blogs - 

https://www.symmetricds.org/doc/3.12/html/tutorials.html#_initial_load

https://www.jumpmind.com/downloads/symmetricds/preview/3.11/user-guide.html#_preface

https://oracleprolab.com/oracle-database-data-synchronization-using-symmetricds-oracle-ee-oracle-xe-table-data-replication/