Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

The replication is a row-based one; that is, the changes are mined row-by-row on the mine. Thus while any SQL issued on the source database can change arbitrary number of rows, Dbvisit does not care about the actual SQL issued, only about the changes made to individual rows.
The major consequence is that the SQL issued at the apply database is not the same issued against mine – instead, each SQL updates/deletes/inserts exactly one row, applying just one change. Thus if the SQL actually affects zero or more than one rows, data divergence occurred.
Another type of conflict is any error reported by Oracle – this can range from usual primary key or foreign key violation (another type of data divergence) to purely technical reasons (cannot extend datafile).
The last type of conflict is lock timeout – if the apply waits for a row lock more than WATCHDOG_TIMEOUT seconds, a conflict is also reported.
Note that when applying a row-change, previous values of the row at apply are checked (by means of adding them to the where clause). This effectively detects if the data in that row are inconsistent between mine and apply, and this is reported as a conflict, "0 rows updated/deleted." This can happen for update or delete only (there is no previous row to check for insert) and due to its special role, it can be handled differently.

Configuring conflict handling

The response to a conflict can be configured before the conflict occurs. The configuration can be specified for each replicated table and for each operation type separately, and for the special case ("data" divergence) mentioned above.
The options are as follows:

Operations

"Data" handler

"Error" handler

Update

discard

retry

overwrite

pause

abort

newer

older

sql

plsql

error

discard

retry

overwrite

pause

abort

plsql

error

Delete

discard

retry

overwrite

pause

abort

newer

older

sql

plsql

error

discard

retry

overwrite

pause

abort

plsql

error

Insert

n/a

discard

retry

overwrite

pause

abort

plsql

error

Transaction

n/a

discard

retry

overwrite

pause

abort

plsql

error

...

  • log: the conflict is logged, and a error plog is created with the offending statement
  • nolog: the conflict is not logged
  • fast_nolog: the conflict is not logged and it may be omitted from conflict counters altogether
  • log_transaction: the conflict is logged, and a error plog is created with the offending transaction
  • default: same as log

See the command chapter or use HELP SET_CONFLICT_HANDLERS for the exact syntax.
Use SHOW_CONFLICT_HANDLERS to query current settings of handlers.

Available handlers

  • DISCARD: ignore the offending SQL and continue with the next one
  • OVERWRITE: do not check old values, try again with just primary key in the where clause (thus this will fail if there is no row at all on apply with the PK value)
  • NEWER,OLDER: look into target table (by primary key) and get values of specified columns (usually dates or number sequence). If the source row is newer/older, the operation becomes OVERWRITE, otherwise DISCARD.
  • PLSQL: call user-specied PL/SQL function. The function must have prototype:

f(apply_old_data table%rowtype, has_found_apply_row boolean, primary_key_data table%rowtype, new_data table%rowtype) return number;
The return values are:

  • 0: discard
  • 1: overwrite
  • 2: retry
  • 3: the PL/SQL function resolved the conflict by itself and made all necessary changes.

The function must not issue a commit, as the transaction may be yet rolled back, if a rollback happened on source.

  • RETRY: wait a few seconds (set by variable RETRY_TIME ) and try again
  • PAUSE: wait for manual user resolution
  • ABORT: kill apply process
  • ERROR: rollback the transaction, continue applying other transactions

Handling current conflict

If the apply was paused due to a conflict, or it is retrying in a loop the same SQL again and again, you can instruct it about what to do next using the command:

RESOLVE CONFLICT id AS resolution

The conflict id is the number shown in the status bar, the resolution can be:

  • IGNORE: skip the transaction
  • RETRY: try again
  • ABORT: abort the apply process
  • RESTART: rollback and restart the transaction
  • ROLLBACK:rollbacks the transaction

Handling errors on source database, partially executed statements

The mine (and then apply as well) process follow the changes as they are written to redo logs by Oracle. This also defines it's (sometime peculiar) behavior in case of errors, statement rollbacks, statement restarts etc. In general:

...

Align

Conflicts and conflict resolution is important in database replication. When a conflict occurs it means there is a potential for the data between the source and target databases to be out of sync. This is also referred to as data divergence.

The default rule of conflict is to "retry" the SQL command that is causing the conflict and this is the recommended method. This ensures that the replication is paused so that it can be investigated why the conflict occurred to ensure there is no data divergence between source and target. After the investigation, if it is deemed necessary, then a conflict rule can be set with command SET_CONFLICT_HANDLERS to change the default "retry" behaviour.

Dbvisit Replicate has build in conflict detection and conflict resolution features that assist with ensuring data divergence does not occur.

Dbvisit Replicate offers:

  1. Conflict detection to ensure that when there is a possibility of data divergence, a notification or alert is triggered.
  2. Conflict resolution to ensure that when a conflict occurs, enough information about the conflict is shown so that the conflict can be resolved.
  3. Conflict handling to be able to set predefined rules to say what to do when a conflict occurs.
  4. Listing of conflicts to see the SQL that is causing the conflict with the "LIST CONFLICT" command.

All of the conflict detection, handling, resolution and listing is done from one central place - The Dbvisit Replicate console (dbvrep).

This section discusses all the options and commands around conflict detection and conflict resolution.

Learning more

To understand more about conflicts, it is important to understand The 3 Fundamentals of Oracle Replication