OpenLogReplicator basically works a redo log file parser. All information it operates on comes from database redo logs (online or archived). This is a list of information it can read from redo log, parse and sent as JSON message:
- INSERT operation (including multiple row INSERT, but not direct path – INSERT /*+append*/);
- UPDATE operation;
- DELETE operation (including multiple row DELETE).
Tables with following parameters are supported:
- null/not null columns;
- invisible columns;
- columns with null and default values;
- up to 1000 columns (database maximum);
- row chaining/migration;
- partial rollbacks (rollback to savepoint);
- partitioned tables;
- tables with rowdependencies.
Transactions that are rolled back are not processed. Transactions are processed as soon as they are committed (not earlier).
List of supported column types (with internal Oracle codes):
- 1 – varchar2/nvarchar2 (list of supported character sets);
- 2 – number/float;
- 12 – date;
- 23 – raw;
- 96 – char/nchar (list of supported character sets);
- 100 – binary_float;
- 101 – binary_double;
- 180 – timestamp;
- 181 – timestamp with time zone.
If a table contains column types which are not supported – “?” value is presented in JSON output.
DDL operations (including truncate table, truncate partitions, etc) are not supported. This means that the log parser module just ignores them. The schema of the table that is replicated is static thought whole run of the program – it is read only once when you start OpenLogReplicator.
This means that if you run some DDL operations like drop column and then add the column again with a different type – the program would have no idea about it. Later every INSERT operation might be parsed and sent to output treating the value of the new added column as if the type did not change. This means that you might receive some rubbish. Technically it not possible to tell that the column type has changed – other than just processing DDL when the DDL was actually run. Binary written one value of type NUMERIC can be a valid VARCHAR2 value too.
To prevent such situations please stop & start the program after performing every type of DDL operation. Before stopping please make sure that all transactions are replicated. The proper way of using it with DDL operations with replication is:
- Make sure all transactions are read and processed;
- Stop OpenLogReplicator
- Make DDL changes (but no DML operations)
- Start OpenLogReplicator