In a recent blog, I explained how instantiation filtering works. DBOPTIONS ENABLE_INSTANTIATION_FILTERING makes a replicat discard any record whose commit CSN is at or below a table’s instantiation CSN. It applies everything above it. This replicat parameter should be kept during the whole initial load process.
At some point the replicat has processed past the instantiation boundary for every table, and the filter has nothing left to do. Let’s answer the subsequent and very practical question: how to confirm, before editing the parameter file, that the replicat has cleared the boundary for every table it maps?
Which SCN should I check ?
To summarize what needs to be checked: it is safe to remove DBOPTIONS ENABLE_INSTANTIATION_FILTERING once the replicat last applied CSN is greater than the instantiation CSN of every table it maps.
To answer this question, you have two sources of information:
- The per-table boundary, stored in
dba_apply_instantiated_objects, with one row per source object. - The replicat last applied CSN, stored in the checkpoint table in the
log_csncolumn.
SQL check
Read the boundaries first:
SELECT source_database, source_object_owner, source_object_name, instantiation_scn
FROM dba_apply_instantiated_objects
ORDER BY instantiation_scn DESC;
SOURCE_DATABASE SOURCE_OBJECT_OWNER SOURCE_OBJECT_NAME INSTANTIATION_SCN
---------------- -------------------- ------------------- -----------------
PDB1 APP_PDB1 SALES 52642820
PDB1 APP_PDB1 ORDERS 52642649
Then read the replicat last applied CSN from its checkpoint table:
SELECT group_name, log_csn
FROM oggadmin.checkpoint
WHERE group_name = 'REP1';
You can safely remove ENABLE_INSTANTIATION_FILTERING when log_csn is greater than the highest instantiation_scn among the tables it maps. A one-shot verdict, scoped to a single source database:
SELECT 'REP1' AS group_name,
c.log_csn,
MAX(o.instantiation_scn) AS max_boundary,
CASE WHEN c.log_csn > MAX(o.instantiation_scn) THEN 'SAFE TO REMOVE' ELSE 'NOT YET' END AS verdict
FROM dba_apply_instantiated_objects o
LEFT JOIN oggadmin.checkpoint c ON c.group_name = 'REP1'
WHERE o.source_database = 'PDB1'
GROUP BY c.log_csn;
Before a replicat starts for the first time, log_csn is NULL and the verdict is NOT YET:
GROUP_NAME LOG_CSN MAX_BOUNDARY VERDICT
----------- -------- ------------- -------
REP1 52642820 NOT YET
A replicat may map more than one source database, or only a subset of the instantiated objects. Then narrow the join to the objects applied.
WARNING: A replicat that has never started has no checkpoint row at all, so log_csn returns nothing. Treat that as “not safe”: there is no applied position, so it cannot have cleared anything. The verdict query above handles this case. It starts from the instantiated objects and left joins the checkpoint table. A missing row gives a NULL log_csn, and the verdict falls to NOT YET instead of the query returning no row at all.
After some time, once the replicat catches up with the initial load, the same query returns:
GROUP_NAME LOG_CSN MAX_BOUNDARY VERDICT
----------- --------- ------------- --------------
REP1 52643651 52642820 SAFE TO REMOVE
You can now cleanly delete the DBOPTIONS ENABLE_INSTANTIATION_FILTERING parameter and restart your replicat.
adminclient check
From the adminclient, INFO REPLICAT REP1, DETAIL reports the applied CSN without using sqlplus:
OGG> INFO REPLICAT REP1, DETAIL
...
Last Committed Transaction CSN value: 52643651
Compare that number against the instantiation_scn from the view exactly as above.
REST API check
The CSN is reachable over the REST API, just not from a GET endpoint. You need to execute a command against the replicat using the POST /services/{version}/replicats/{replicat}/command endpoint. Using execute_command_replicat in the oggrestapi Python client:
from oggrestapi import OGGRestAPI
client = OGGRestAPI(url="http://localhost:7810", username="ogg", password="ogg")
resp = client.execute_command_replicat("REP1", data={"command": "INFO", "arguments": "DETAIL"})
output = "".join(r["reply"])
print(output)
Replicat REP1 Last Started 2026-09-20 13:29 Status RUNNING
Checkpoint Lag 00:00:00 (updated 00:00:02 ago)
Process ID 102660
Log Read Checkpoint File aa000000002
2026-09-20 13:30:17.000000 RBA 18926
Encryption Profile LocalWallet
Current Log BSN value: 52643543
Last Committed Transaction CSN value: 52646310
Extract Source Begin End
aa000000002 2020-01-01 00:00 2026-09-20 13:30:17.00
aa000000000 * Initialized * 2020-01-01 00:00:00.00
aa000000000 * Initialized * First Record
To be truly automated, Last Committed Transaction CSN value has to be parsed out:
import re
match = re.search(r"Last Committed Transaction CSN value: (\d+)", output)
applied_csn = int(match.group(1))
print(applied_csn)
52646310
Information in the report file
When starting a replicat during an initial load, the report file is filled with the following lines:
OGG-10155 Instantiation CSN filtering is enabled on table PDB1.APP_PDB1.ORDERS at CSN 52,642,649.
OGG-10185 Instantiation CSN filtering on table PDB1.APP_PDB1.ORDERS has started at CSN 52642649.
OGG-10186 Instantiation CSN filtering on table PDB1.APP_PDB1.ORDERS has ended, now passing transactions starting at CSN 52642649.
- If the trail the replicat reads on that start contains records below a boundary, it filters them, and these lines appear.
- If the trail begins at or after the boundary, nothing is filtered and no line appears at all.
Performance impact of leaving ENABLE_INSTANTIATION_FILTERING
When migrating a database online with GoldenGate, you want your replicat to catch up quickly. I tested whether keeping ENABLE_INSTANTIATION_FILTERING in the parameter file had any effect on the lag of a replicat. I found no significant statistical evidence of this.
Summary
ENABLE_INSTANTIATION_FILTERINGis safe to remove when the replicatlog_csn(last applied CSN) is above theinstantiation_scnof every table it maps.- Get the applied CSN from
oggadmin.checkpoint.log_csn(sqlplus),INFO REPLICAT REP1, DETAIL(adminclient), orexecute_command_replicat("REP1", data={"command": "INFO", "arguments": "DETAIL"})over REST, which returns the same information. - The
OGG-10155/10185/10186report lines appear only when the replicat filters records on that start.