<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Oracle - dbi Blog</title>
	<atom:link href="https://www.dbi-services.com/blog/category/oracle/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.dbi-services.com/blog/category/oracle/</link>
	<description></description>
	<lastBuildDate>Thu, 15 Oct 2026 15:37:49 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/05/cropped-favicon_512x512px-min-32x32.png</url>
	<title>Oracle - dbi Blog</title>
	<link>https://www.dbi-services.com/blog/category/oracle/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>How to detect a suspended GoldenGate extract</title>
		<link>https://www.dbi-services.com/blog/how-to-detect-a-suspended-goldengate-extract/</link>
					<comments>https://www.dbi-services.com/blog/how-to-detect-a-suspended-goldengate-extract/#respond</comments>
		
		<dc:creator><![CDATA[Julien Delattre]]></dc:creator>
		<pubDate>Mon, 19 Oct 2026 06:59:00 +0000</pubDate>
				<category><![CDATA[GoldenGate]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[26ai]]></category>
		<category><![CDATA[adminclient]]></category>
		<category><![CDATA[eventactions]]></category>
		<category><![CDATA[extract]]></category>
		<category><![CDATA[Monitoring]]></category>
		<category><![CDATA[ogg]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[rest api]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=47510</guid>

					<description><![CDATA[<p>While testing EVENTACTIONS (SUSPEND) on an extract, I noticed that nothing in INFO tells you the process is suspended. The extract shows as RUNNING, the lag might look fine for a while, and yet it has stopped capturing. You may use SUSPEND on purpose (to pause an extract when a specific DDL goes by, for [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/how-to-detect-a-suspended-goldengate-extract/">How to detect a suspended GoldenGate extract</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">While testing <code>EVENTACTIONS (SUSPEND)</code> on an extract, I noticed that nothing in <code>INFO</code> tells you the process is suspended. The extract shows as <code>RUNNING</code>, the lag might look fine for a while, and yet it has stopped capturing. You may use <code>SUSPEND</code> on purpose (to pause an extract when a specific DDL goes by, for instance). Or someone else put it in a parameter file and you have to monitor the result. Either way, you need another way to know.</p>



<p class="wp-block-paragraph">In the end, <strong><code>SEND EXTRACT ... STATUS</code> is the only command that reports the suspended state</strong>, and it works the same way through the REST API, where the text is already parsed for you. A simpler check exists in the report file, generating an <code>OGG-01281</code>, but it has a limit I will show at the end.</p>



<p class="wp-block-paragraph">In this blog, I will run an <code>EXT1</code> extract capturing from <code>PDB1</code>. It has a DDL <code>EVENTACTIONS</code> trigger on a <code>CREATE USER</code> statement run in <code>PDB1</code>. The trigger suspends the extract whenever a user is created:</p>



<pre class="wp-block-code"><code>EXTRACT EXT1
USERIDALIAS pdb1 DOMAIN OracleGoldenGate
EXTTRAIL pdb1/e1
DDL INCLUDE ALL OBJTYPE 'USER' OPTYPE CREATE EVENTACTIONS (SUSPEND)
DDLOPTIONS REPORT
TABLE APP_PDB1.*;</code></pre>



<h2 id="extract-status-before-suspend" class="wp-block-heading">Extract status before <code>SUSPEND</code></h2>



<p class="wp-block-paragraph">Once started, the extract shows as <code>RUNNING</code> in <code>INFO ALL</code>:</p>



<pre class="wp-block-code"><code>OGG (http://vmogg:7810 ogg_test_01) 2&gt; INFO ALL
Program     Status      Group       Type                   Lag at Chkpt       Time Since Chkpt

EXTRACT     RUNNING     EXT1        INTEGRATED                  00:00:00           00:00:06</code></pre>



<p class="wp-block-paragraph"><code>SEND EXTRACT EXT1 STATUS</code> reports where the extract is in its life cycle. Here, the extract has nothing to capture, so the status is <code>At EOF</code>:</p>



<pre class="wp-block-code"><code>OGG (http://vmogg:7810 ogg_test_01) 2&gt; SEND EXTRACT EXT1 STATUS

Sending STATUS request to Extract group EXT1 ...

EXTRACT EXT1 (PID 21617)
  Current status: Recovery complete: At EOF

  Current read position:
  Redo thread #: 0
  Sequence #: 0
  RBA: 0
  Timestamp: 2026-09-26 06:26:24.000000
  SCN: 0.115334476 (115334476)
  Current write position:
  Sequence #: 11
  RBA: 6942
  Timestamp: 2026-09-26 06:26:20.463368
  Extract Trail: pdb1/e1</code></pre>



<h2 id="suspending-the-extract" class="wp-block-heading">Suspending the extract</h2>



<p class="wp-block-paragraph">Let’s create a user in <code>PDB1</code>, which matches the <code>DDL</code> rule:</p>



<pre class="wp-block-code"><code>SQL&gt; CREATE USER SUSPTEST IDENTIFIED BY "Suspend_Test_1";

User created.</code></pre>



<p class="wp-block-paragraph">Half a minute later, <code>INFO EXT1</code> still says <code>RUNNING</code> with a lag of 0 seconds, but the checkpoint was last updated 30 seconds ago:</p>



<pre class="wp-block-code"><code>OGG (http://vmogg:7810 ogg_test_01) 2&gt; INFO EXT1

Extract    EXT1      Last Started 2026-09-26 06:26   Status RUNNING
Checkpoint Lag       00:00:00 (updated 00:00:30 ago)
Process ID           21617
Log Read Checkpoint  Oracle Integrated Redo Logs, per-PDB
                     2026-09-26 06:26:18
                     SCN 0.115334462 (115334462)
Encryption Profile   LocalWallet
No Replicat groups found, but some coordinated threads may have been excluded.</code></pre>



<p class="wp-block-paragraph">Two minutes after the <code>CREATE USER</code>, the same command gives:</p>



<pre class="wp-block-code"><code>OGG (http://vmogg:7810 ogg_test_01) 2&gt; INFO EXT1

Extract    EXT1      Last Started 2026-09-26 06:26   Status RUNNING
Checkpoint Lag       00:00:00 (updated 00:02:00 ago)
Process ID           21617
Log Read Checkpoint  Oracle Integrated Redo Logs, per-PDB
                     2026-09-26 06:26:18
                     SCN 0.115334462 (115334462)
Encryption Profile   LocalWallet
No Replicat groups found, but some coordinated threads may have been excluded.</code></pre>



<p class="wp-block-paragraph">The status is still <code>RUNNING</code>, and <strong>the lag value does not grow</strong>: <code>Checkpoint Lag</code> stays at <code>00:00:00</code>. What grows is the time since the checkpoint was updated (<code>updated 00:00:30 ago</code>, then <code>updated 00:02:00 ago</code>), and the checkpoint position (<code>SCN 0.115334462</code>) never moves. That is a hint that something is wrong (or right), but nothing in this output says it is a suspend.</p>



<h2 id="send-extract-status-shows-the-suspended-state" class="wp-block-heading"><code>SEND EXTRACT STATUS</code> shows the suspended state</h2>



<p class="wp-block-paragraph">Now the same <code>SEND EXTRACT EXT1 STATUS</code> as before:</p>



<pre class="wp-block-code"><code>OGG (http://vmogg:7810 ogg_test_01) 2&gt; SEND EXTRACT EXT1 STATUS

Sending STATUS request to Extract group EXT1 ...

EXTRACT EXT1 (PID 21617)
  Current status: Recovery complete: Suspended, waiting to be resumed

  Current read position:
  Redo thread #: 1
  Sequence #: 3045
  RBA: 58777616
  Timestamp: 2026-09-26 06:26:27.000000
  SCN: 0.115334507 (115334507)
  Current write position:
  Sequence #: 11
  RBA: 6942
  Timestamp: 2026-09-26 06:26:20.463368
  Extract Trail: pdb1/e1</code></pre>



<p class="wp-block-paragraph">Comparing the two outputs, <strong>the only line that tells you the extract is suspended is <code>Current status</code></strong>:</p>



<ul class="wp-block-list">
<li>Before: <code>Current status: Recovery complete: At EOF</code>. It could have been some other message if it was still extracting.</li>



<li>After: <code>Current status: Recovery complete: Suspended, waiting to be resumed</code></li>
</ul>



<p class="wp-block-paragraph">Everything else in <code>INFO</code> is compatible with a healthy extract. To resume it, run <code>SEND EXTRACT EXT1 RESUME</code>.</p>



<h2 id="which-command-shows-the-suspend" class="wp-block-heading">Which command shows the suspend?</h2>



<p class="wp-block-paragraph"><code>STATUS EXTRACT</code> looks like the natural command, but it is not the same as <code>SEND EXTRACT ... STATUS</code>. On the suspended extract, <code>STATUS EXTRACT</code> gives:</p>



<pre class="wp-block-code"><code>OGG (http://vmogg:7810 ogg_test_01) 4&gt; STATUS EXTRACT EXT1
EXTRACT EXT1: RUNNING</code></pre>



<p class="wp-block-paragraph"><code>INFO EXT1 DETAIL</code> adds the trail, the outbound server SCNs and the file locations, but its header is the same as <code>INFO EXT1</code>:</p>



<pre class="wp-block-code"><code>OGG (http://vmogg:7810 ogg_test_01) 5&gt; INFO EXT1 DETAIL

Extract    EXT1      Last Started 2026-09-26 06:26   Status RUNNING
Checkpoint Lag       00:00:00 (updated 00:02:00 ago)
Process ID           21617
Log Read Checkpoint  Oracle Integrated Redo Logs, per-PDB
                     2026-09-26 06:26:18
                     SCN 0.115334462 (115334462)
Encryption Profile   LocalWallet

  Target Extract Trails:

  Trail Name                                       Seqno        RBA     Max MB Trail Type

  pdb1/e1                                             11       6942       2000 EXTTRAIL

Integrated Extract outbound server first scn: 0.115313606 (115313606)

Integrated Extract outbound server filtering start scn: 0.115313606 (115313606)</code></pre>



<figure class="wp-block-table"><table><thead><tr><th>Command</th><th>Before the suspend</th><th>After the suspend</th></tr></thead><tbody><tr><td><code>INFO ALL</code></td><td><code>RUNNING</code></td><td><code>RUNNING</code></td></tr><tr><td><code>INFO EXT1</code></td><td><code>RUNNING</code></td><td><code>RUNNING</code></td></tr><tr><td><code>INFO EXT1 DETAIL</code></td><td><code>RUNNING</code></td><td><code>RUNNING</code></td></tr><tr><td><code>STATUS EXTRACT EXT1</code></td><td><code>RUNNING</code></td><td><code>RUNNING</code></td></tr><tr><td><code>SEND EXTRACT EXT1 STATUS</code></td><td><code>Recovery complete: At EOF</code></td><td><code>Recovery complete: Suspended, waiting to be resumed</code></td></tr></tbody></table></figure>



<p class="wp-block-paragraph"><strong>Only <code>SEND EXTRACT ... STATUS</code> shows the suspend.</strong> <code>STATUS EXTRACT</code>, like <code>INFO</code>, just reports the state of the process.</p>



<h2 id="getting-the-status-with-the-rest-api" class="wp-block-heading">Getting the status with the REST API</h2>



<p class="wp-block-paragraph">The <code>SEND</code> commands are available through the <code>/services/{version}/extracts/{extract}/command</code> endpoint, and the response already contains the parsed status.</p>



<h3 id="with-the-oggrestapi-python-client" class="wp-block-heading">With the <code>oggrestapi</code> Python client</h3>



<p class="wp-block-paragraph">With the <a href="https://juliendelattre.com/tools/ogg-python-client/" target="_blank" rel="noopener noreferrer">GoldenGate Python client</a>, <code>execute_command_extract</code> sends the request. First, initialize the client:</p>



<pre class="wp-block-code"><code>&gt;&gt;&gt; from oggrestapi import OGGRestAPI
&gt;&gt;&gt; ogg_client = OGGRestAPI(
    url='http://vmogg:7810',
    username='ogg',
    password='ogg'
)
Connected to OGG REST API at http://vmogg:7810</code></pre>



<p class="wp-block-paragraph">Here is the raw output given by the <code>execute_command_extract</code> method:</p>



<pre class="wp-block-code"><code>&gt;&gt;&gt; resp = ogg_client.execute_command_extract('EXT1', data={'command': 'STATUS'})
&gt;&gt;&gt; resp
{'$schema': 'er:commandResult', 'reply': 'OKNODOT\tEXTRACT EXT1 (PID 41522)\n  Current status: Recovery complete: Suspended, waiting to be resumed\n\n  Current read position:\n  Redo thread #: 1\n  Sequence #: 3047\n  RBA: 92686352\n  Timestamp: 2026-09-26 08:48:41.000000\n  SCN: 0.115434621 (115434621)\n  Current write position:\n  Sequence #: 1\n  RBA: 5679\n  Timestamp: 2026-09-26 08:48:37.669072\n  Extract Trail: pdb1/r1\n\n', 'replyData': {'$schema': 'er:statusResult', 'status': {'groupName': 'EXT1', 'processId': '41522', 'processType': 'extract', 'status': 'Recovery complete: Suspended, waiting to be resumed', 'extractReadingPosition': &#091;{'$schema': 'dbms:positionInfo', 'position': {'redoThread': 1, 'csn': 115434621, 'seqno': 3047, 'rba': 92686352, 'timestamp': '2026-09-26T08:48:41.000Z'}}], 'extractWritingPosition': &#091;{'$schema': 'ogg:trailPosition', 'sequence': 1, 'offset': 5679, 'name': 'r1', 'path': 'pdb1/'}]}}}</code></pre>



<p class="wp-block-paragraph">In GoldenGate REST API, the status is available in <code>replyData.status.status</code>:</p>



<pre class="wp-block-code"><code>&gt;&gt;&gt; resp&#091;'replyData']&#091;'status']&#091;'status']
'Recovery complete: Suspended, waiting to be resumed'</code></pre>



<p class="wp-block-paragraph">To avoid repeating the <code>replyData</code> navigation everywhere, custom methods are available in <code>oggrestapi</code>:</p>



<pre class="wp-block-code"><code>def get_extract_status_detail(self, extract):
    result = self.execute_command_extract(extract, data={'command': 'STATUS'})
    return str(result.get('replyData', {}).get('status', {}).get('status', ''))

def is_extract_suspended(self, extract):
    return 'suspended' in self.get_extract_status_detail(extract).lower()</code></pre>



<pre class="wp-block-code"><code>&gt;&gt;&gt; ogg_client.get_extract_status_detail('EXT1')
'Recovery complete: Suspended, waiting to be resumed'

&gt;&gt;&gt; ogg_client.is_extract_suspended('EXT1')
True</code></pre>



<h3 id="with-the-requests-module" class="wp-block-heading">With the <code>requests</code> module</h3>



<p class="wp-block-paragraph">Without the client, send <code>STATUS</code> as the command with the <code>requests</code> library:</p>



<pre class="wp-block-code"><code>import requests

url = 'http://vmogg:7810/services/v2/extracts/EXT1'
auth = ('ogg', 'ogg')

response = requests.post(f'{url}/command', auth=auth, json={'command': 'STATUS'}).json()&#091;'response']</code></pre>



<p class="wp-block-paragraph">The response contains the same <code>replyData</code> field, with the status already extracted:</p>



<pre class="wp-block-code"><code>&gt;&gt;&gt; response&#091;'replyData']&#091;'status']&#091;'status']
'Recovery complete: Suspended, waiting to be resumed'</code></pre>



<p class="wp-block-paragraph">Note that this is not the same as the <code>info/status</code> endpoint, which returns the process state as <code>INFO</code> does. It says <code>running</code> for a suspended extract, but it holds the two values behind the lag line of <code>INFO</code>:</p>



<pre class="wp-block-code"><code>&gt;&gt;&gt; requests.get(f'{url}/info/status', auth=auth).json()&#091;'response']
{'$schema': 'ogg:extractStatus', 'status': 'running', 'processId': 21617, 'lastStarted': '2026-09-26T06:26:09.798Z', 'lag': 0, 'sinceLagReported': 125, 'position': '0.115334462'}</code></pre>



<p class="wp-block-paragraph"><code>lag</code> is the checkpoint lag of <code>INFO</code>, and <strong><code>sinceLagReported</code> is the <code>updated ... ago</code> value in seconds</strong>.</p>



<h3 id="adding-a-lag-check" class="wp-block-heading">Adding a lag check</h3>



<p class="wp-block-paragraph">For a monitoring script, the status can be paired with a lag check. <code>get_extract_status</code> costs a single <code>GET</code> call, and a healthy extract keeps updating its checkpoint. A large <code>sinceLagReported</code> is a cheap first filter before sending the <code>STATUS</code> command:</p>



<pre class="wp-block-code"><code>&gt;&gt;&gt; status = ogg_client.get_extract_status('EXT1')
&gt;&gt;&gt; status&#091;'status'] == 'running' and status&#091;'sinceLagReported'] &gt; 60 and ogg_client.is_extract_suspended('EXT1')
True</code></pre>



<p class="wp-block-paragraph">When this returns <code>True</code>, you have a running extract that has not moved for more than a minute and that reports itself as suspended. Whether you should then resume it depends on why the <code>SUSPEND</code> was there in the first place. An alert is usually the right answer. If you do want to resume it from the script, it is another <code>execute_command_extract</code> call:</p>



<pre class="wp-block-code"><code>&gt;&gt;&gt; ogg_client.execute_command_extract('EXT1', data={'command': 'RESUME'})</code></pre>



<h2 id="a-simpler-check-ogg-01281-in-the-report" class="wp-block-heading">A simpler check: <code>OGG-01281</code> in the report</h2>



<p class="wp-block-paragraph">The suspend also leaves a trace in the extract report file, with the <code>OGG-01281</code> message:</p>



<pre class="wp-block-code"><code>2026-09-26 06:26:29  INFO    OGG-00487  DDL operation included &#091;INCLUDE ALL OBJTYPE 'USER' OPTYPE CREATE EVENTACTIONS (SUSPEND)], optype &#091;CREATE], objtype &#091;USER], objowner "", objname "SUSPTEST".

2026-09-26 06:26:30  INFO    OGG-01281  Processed SUSPEND event from DDL on object name SUSPTEST, DDL seqno 0, marker seqno 0.</code></pre>



<p class="wp-block-paragraph">Is this message specific to <code>SUSPEND</code>? To check it, I ran the same <code>DDL</code> rule with other <code>EVENTACTIONS</code>, recreating the user each time:</p>



<pre class="wp-block-code"><code># DDL INCLUDE ALL OBJTYPE 'USER' OPTYPE CREATE EVENTACTIONS (ROLLOVER)
2026-09-26 06:29:32  INFO    OGG-01285  Processed ROLLOVER event from DDL on object name SUSPTEST, DDL seqno 0, marker seqno 0.

# DDL INCLUDE ALL OBJTYPE 'USER' OPTYPE CREATE EVENTACTIONS (LOG INFO)
2026-09-26 06:30:37  INFO    OGG-06117  Processed LOG event from DDL on object name SUSPTEST, DDL seqno 0, marker seqno 0.

# DDL INCLUDE ALL OBJTYPE 'USER' OPTYPE CREATE EVENTACTIONS (LOG WARNING)
2026-09-26 06:31:40  WARNING OGG-06118  Processed LOG event from DDL on object name SUSPTEST, DDL seqno 0, marker seqno 0.</code></pre>



<p class="wp-block-paragraph"><code>ROLLOVER</code> raises <code>OGG-01285</code>, and <code>LOG</code> raises <code>OGG-06117</code> (or <code>OGG-06118</code> with <code>WARNING</code>). <code>IGNORE</code> raises nothing at all beyond the <code>OGG-00487</code> line. So <strong><code>OGG-01281</code> is only raised by <code>SUSPEND</code></strong>.</p>



<p class="wp-block-paragraph">The limit of this check is that the report is a history, not a state. When resuming the extract, the <code>OGG-01281</code> line stays in the report, and a new message is written after it:</p>



<pre class="wp-block-code"><code>2026-09-26 06:26:30  INFO    OGG-01281  Processed SUSPEND event from DDL on object name SUSPTEST, DDL seqno 0, marker seqno 0.
2026-09-26 06:28:29  INFO    OGG-01824  Resume processing from SUSPEND state for process EXT1.</code></pre>



<p class="wp-block-paragraph"><strong>Finding <code>OGG-01281</code> in the report does not mean the extract is suspended now.</strong> You have to check that no <code>OGG-01824</code> comes after it. On top of that, the report is rolled over at each restart of the extract, so it only covers the current run. With the REST API, the report is available through <code>get_extract_report</code>, whose <code>lines</code> key contains the list of lines:</p>



<pre class="wp-block-code"><code>&gt;&gt;&gt; report = ogg_client.get_extract_report('EXT1', 'EXT1.rpt')
&gt;&gt;&gt; &#091;line for line in report&#091;'lines'] if 'OGG-01281' in line or 'OGG-01824' in line]
&#091;'2026-09-26 06:26:30  INFO    OGG-01281  Processed SUSPEND event from DDL on object name SUSPTEST, DDL seqno 0, marker seqno 0.']</code></pre>



<p class="wp-block-paragraph">This is useful to find out when and why the extract was suspended, since the message contains the object that triggered it. But to know whether it is suspended right now, <code>STATUS</code> is the reliable way.</p>



<h2 id="the-full-check-in-one-script" class="wp-block-heading">The full check in one script</h2>



<p class="wp-block-paragraph">Here is a small script with everything seen in this blog. It runs the lag check, the suspend check, and the log analysis to find the culprit, then prints an info message.</p>



<pre class="wp-block-code"><code>from oggrestapi import OGGRestAPI

ogg_client = OGGRestAPI(url='http://vmogg:7810', username='ogg', password='ogg')

extract = 'EXT1'
status = ogg_client.get_extract_status(extract)

# Lag check: a running extract whose checkpoint has not moved for a minute
if status&#091;'status'] == 'running' and status&#091;'sinceLagReported'] &gt; 60:
    # Suspend check
    if ogg_client.is_extract_suspended(extract):
        # Log analysis: the last OGG-01281 or OGG-01824 tells who suspended it
        report = ogg_client.get_extract_report(extract, f'{extract}.rpt')
        events = &#091;line for line in report&#091;'lines'] if 'OGG-01281' in line or 'OGG-01824' in line]
        if events and 'OGG-01281' in events&#091;-1]:
            print(f'INFO: {extract} is suspended. Culprit: {events&#091;-1]}')
        else:
            print(f'INFO: {extract} is suspended, but no OGG-01281 in the current report')
    else:
        print(f'INFO: {extract} is not suspended, but its checkpoint has not moved for {status&#091;"sinceLagReported"]} seconds')
else:
    print(f'INFO: {extract} is not suspended')</code></pre>



<pre class="wp-block-code"><code>INFO: EXT1 is suspended. Culprit: 2026-09-26 06:26:30  INFO    OGG-01281  Processed SUSPEND event from DDL on object name SUSPTEST, DDL seqno 0, marker seqno 0.</code></pre>



<h2 id="what-about-replicats" class="wp-block-heading">What about replicats?</h2>



<p class="wp-block-paragraph">It works the same way for a replicat. I tested it with an integrated replicat applying the trail of <code>EXT1</code>, with <code>DDL INCLUDE ALL OBJTYPE 'USER' OPTYPE CREATE EVENTACTIONS (SUSPEND)</code> in its parameter file. <code>INFO</code> reports <code>RUNNING</code>, and <code>SEND REPLICAT REP1 STATUS</code> reports the suspended state. <code>is_replicat_suspended</code> returns <code>True</code>, and <code>SEND REPLICAT REP1 RESUME</code> resumes it with an <code>OGG-01824</code>.</p>



<p class="wp-block-paragraph">The suspend is still logged with <code>OGG-01281</code>, but <strong>the culprit is not named</strong>. The replicat suspends before applying the DDL, so the report says <code>object name N/A</code>. The user name only appears in the <code>OGG-00487</code> line after the resume operation:</p>



<pre class="wp-block-code"><code>2026-09-26 08:56:19  INFO    OGG-01281  Processed SUSPEND event from DDL on object name N/A in file /u01/app/ogg/deployments/ogg_test_01/var/lib/data/pdb1/q1000000000, RBA 5284.
2026-09-26 08:58:02  INFO    OGG-01824  Resume processing from SUSPEND state for process REP1.
2026-09-26 08:58:02  INFO    OGG-00487  DDL operation included &#091;INCLUDE ALL OBJTYPE 'USER' OPTYPE CREATE EVENTACTIONS (SUSPEND)], optype &#091;CREATE], objtype &#091;USER], objowner "", objname "SUSPTEST".</code></pre>



<h2 id="summary" class="wp-block-heading">Summary</h2>



<p class="wp-block-paragraph">To know whether a GoldenGate extract is suspended by an <code>EVENTACTIONS (SUSPEND)</code> rule:</p>



<ul class="wp-block-list">
<li>Do not rely on <code>INFO ALL</code>, <code>INFO</code>, <code>INFO DETAIL</code> or <code>STATUS EXTRACT</code>. They all report <code>RUNNING</code>, and the checkpoint lag stays the same. Only the <code>updated ... ago</code> value grows.</li>



<li>Run <code>SEND EXTRACT EXT1 STATUS</code> in the <code>adminclient</code>: <code>Current status: Recovery complete: Suspended, waiting to be resumed</code> appears when the extract is suspended.</li>



<li>In a script, use <code>is_extract_suspended</code> from the Python client, or send the same <code>STATUS</code> command to <code>/services/v2/extracts/EXT1/command</code> and read <code>replyData.status.status</code>.</li>



<li>Filter with <code>sinceLagReported</code> from <code>info/status</code> (for instance more than 60 seconds) before sending the <code>STATUS</code> command.</li>



<li>Use <code>OGG-01281</code> in the report to find out when and why the extract was suspended, and check that no <code>OGG-01824</code> came after it.</li>



<li>Resume with <code>SEND EXTRACT EXT1 RESUME</code>, or with the <code>RESUME</code> command through <code>execute_command_extract</code>.</li>
</ul>
<p>L’article <a href="https://www.dbi-services.com/blog/how-to-detect-a-suspended-goldengate-extract/">How to detect a suspended GoldenGate extract</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.dbi-services.com/blog/how-to-detect-a-suspended-goldengate-extract/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Import order matters for GoldenGate instantiation filtering</title>
		<link>https://www.dbi-services.com/blog/import-order-matters-for-goldengate-instantiation-filtering/</link>
					<comments>https://www.dbi-services.com/blog/import-order-matters-for-goldengate-instantiation-filtering/#respond</comments>
		
		<dc:creator><![CDATA[Julien Delattre]]></dc:creator>
		<pubDate>Thu, 15 Oct 2026 15:37:47 +0000</pubDate>
				<category><![CDATA[GoldenGate]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[19c]]></category>
		<category><![CDATA[DataPump]]></category>
		<category><![CDATA[expdp]]></category>
		<category><![CDATA[extract]]></category>
		<category><![CDATA[impdp]]></category>
		<category><![CDATA[Initial load]]></category>
		<category><![CDATA[instantiation]]></category>
		<category><![CDATA[migration]]></category>
		<category><![CDATA[ogg]]></category>
		<category><![CDATA[Partitioning]]></category>
		<category><![CDATA[replicat]]></category>
		<category><![CDATA[scn]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=47906</guid>

					<description><![CDATA[<p>When migrating a large database with GoldenGate, most of the volume is sometimes in old partitions which no longer change. A common shortcut is to move them first with expdp/impdp, even before GoldenGate is set up. Everything else, the active partitions and the non-partitioned tables, is exported once the extract is running, with PREPARECSN set. [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/import-order-matters-for-goldengate-instantiation-filtering/">Import order matters for GoldenGate instantiation filtering</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">When migrating a large database with GoldenGate, most of the volume is sometimes in old partitions which no longer change. A common shortcut is to move them first with <code>expdp</code>/<code>impdp</code>, even before GoldenGate is set up. Everything else, the active partitions and the non-partitioned tables, is exported once the extract is running, with <code>PREPARECSN</code> set. <a href="https://www.dbi-services.com/blog/goldengate-instantiation-csn-explained/" target="_blank" rel="noopener noreferrer">Instantiation filtering</a> then makes the replicat skip what Data Pump already loaded.</p>



<p class="wp-block-paragraph">However, there is an important aspect here: <code>dba_apply_instantiated_objects</code> has <strong>one row per table</strong>. Every <code>impdp</code> overwrites it, and there is no way for GoldenGate or Data Pump to know which import should be considered the correct one for populating the <code>dba_apply_instantiated_objects</code> view. The old partitions and the live data of a table share that row, so in a multi-import initial load the last import always wins.</p>



<h2 id="standard-scenario-importing-old-partitions-first" class="wp-block-heading">Standard scenario: importing old partitions first</h2>



<p class="wp-block-paragraph">The old partitions of all partitioned tables are moved first, in one dump, before GoldenGate is involved. Since no GoldenGate extract exists yet, <code>PREPARECSN</code> has not run either:</p>



<pre class="wp-block-code"><code>$ expdp sales/***@PDB1 dumpfile=old_part.dmp tables=SALES.ORDERS_PART:P_OLD,SALES.ITEMS_PART:P_OLD
. . exported "SALES"."ITEMS_PART":"P_OLD"                 5.523 KB       5 rows
. . exported "SALES"."ORDERS_PART":"P_OLD"                5.523 KB       5 rows
Job "SALES"."SYS_EXPORT_TABLE_01" successfully completed at Sun Oct 11 13:52:08 2026 elapsed 0 00:00:10

$ impdp sales/***@PDB2 dumpfile=old_part.dmp
. . imported "SALES"."ITEMS_PART":"P_OLD"                 5.523 KB       5 rows
. . imported "SALES"."ORDERS_PART":"P_OLD"                5.523 KB       5 rows
Job "SALES"."SYS_IMPORT_FULL_01" successfully completed at Sun Oct 11 13:52:12 2026 elapsed 0 00:00:02</code></pre>



<p class="wp-block-paragraph">Querying the instantiation view on the target returns nothing, as expected:</p>



<pre class="wp-block-code"><code>SQL&gt; SELECT source_database, source_object_name, instantiation_scn
FROM dba_apply_instantiated_objects
WHERE source_object_owner = 'SALES';

no rows selected</code></pre>



<p class="wp-block-paragraph">Data Pump only populates this view when the table was prepared with <code>PREPARECSN</code> before the export. These first imports are invisible to GoldenGate.</p>



<h3 id="starting-the-extract" class="wp-block-heading">Starting the extract</h3>



<p class="wp-block-paragraph">The extract connects to <code>PDB1</code> and captures the <code>SALES</code> schema into the trail <code>pt</code>. It is added, registered and started in the <code>adminclient</code>, logged in to <code>PDB1</code>. The registration SCN is where capture begins:</p>



<pre class="wp-block-code"><code>OGG (http://localhost:7810 ogg_test_01) 2&gt; DBLOGIN USERIDALIAS oggadmin_pdb1 DOMAIN OracleGoldenGate
Successfully logged into database PDB1.

OGG (http://localhost:7810 ogg_test_01 as oggadmin_pdb1@CDB01/PDB1) 3&gt; ADD EXTRACT EXTPT, INTEGRATED TRANLOG, BEGIN NOW
2026-10-11T13:52:13Z  INFO    OGG-08100  Integrated Extract added.

OGG (http://localhost:7810 ogg_test_01 as oggadmin_pdb1@CDB01/PDB1) 4&gt; REGISTER EXTRACT EXTPT DATABASE
2026-10-11T13:52:14Z  INFO    OGG-02003  Extract group EXTPT successfully registered with database at SCN 189554050.

OGG (http://localhost:7810 ogg_test_01 as oggadmin_pdb1@CDB01/PDB1) 5&gt; ADD EXTTRAIL pt, EXTRACT EXTPT
2026-10-11T13:52:14Z  INFO    OGG-08100  EXTTRAIL added.

OGG (http://localhost:7810 ogg_test_01 as oggadmin_pdb1@CDB01/PDB1) 6&gt; VIEW PARAMS EXTPT
EXTRACT EXTPT
USERIDALIAS oggadmin_pdb1 DOMAIN OracleGoldenGate
EXTTRAIL pt
TABLE SALES.*;

OGG (http://localhost:7810 ogg_test_01 as oggadmin_pdb1@CDB01/PDB1) 7&gt; START EXTRACT EXTPT
2026-10-11T13:52:14Z  INFO    OGG-00975  Extract group EXTPT starting.
2026-10-11T13:52:14Z  INFO    OGG-15426  Extract group EXTPT started.</code></pre>



<p class="wp-block-paragraph">Some workload follows on the live data, before <code>PREPARECSN</code>:</p>



<pre class="wp-block-code"><code>SQL&gt; INSERT INTO sales.orders_part VALUES (1001, 'ACTIVE');

1 row created.

SQL&gt; INSERT INTO sales.orders_part VALUES (1002, 'ACTIVE');

1 row created.

SQL&gt; INSERT INTO sales.items_part VALUES (1001, 'ACTIVE');

1 row created.

SQL&gt; INSERT INTO sales.items_part VALUES (1002, 'ACTIVE');

1 row created.

SQL&gt; INSERT INTO sales.customers VALUES (4, 'LIVE');

1 row created.

SQL&gt; COMMIT;

Commit complete.</code></pre>



<p class="wp-block-paragraph">Then the schema is prepared in the <code>adminclient</code>. <code>ADD SCHEMATRANDATA ... ALLCOLS</code> sets <code>PREPARECSN</code> on the schema in <code>NOWAIT</code> mode:</p>



<pre class="wp-block-code"><code>OGG (http://localhost:7810 ogg_test_01) 2&gt; DBLOGIN USERIDALIAS oggadmin_pdb1 DOMAIN OracleGoldenGate
Successfully logged into database PDB1.

OGG (http://localhost:7810 ogg_test_01 as oggadmin_pdb1@CDB01/PDB1) 3&gt; ADD SCHEMATRANDATA SALES ALLCOLS
2026-10-11T13:52:15Z  INFO    OGG-01788  SCHEMATRANDATA has been added on schema "SALES".
2026-10-11T13:52:15Z  INFO    OGG-01976  SCHEMATRANDATA for scheduling columns has been added on schema "SALES".
2026-10-11T13:52:15Z  INFO    OGG-01977  SCHEMATRANDATA for all columns has been added on schema "SALES".
2026-10-11T13:52:15Z  INFO    OGG-10154  Schema level PREPARECSN set to mode NOWAIT on schema "SALES"</code></pre>



<h3 id="exporting-and-importing-the-live-data" class="wp-block-heading">Exporting and importing the live data</h3>



<p class="wp-block-paragraph">The active partitions are exported next, in a single <code>expdp</code>, deliberately <strong>without</strong> <code>FLASHBACK_SCN</code>. Data Pump chooses a consistent SCN itself, for each table:</p>



<pre class="wp-block-code"><code>$ expdp sales/***@PDB1 dumpfile=active_part.dmp tables=SALES.ORDERS_PART:P_ACTIVE,SALES.ITEMS_PART:P_ACTIVE
FLASHBACK automatically enabled to preserve database integrity.
. . exported "SALES"."ITEMS_PART":"P_ACTIVE"                5.5 KB       2 rows
. . exported "SALES"."ORDERS_PART":"P_ACTIVE"               5.5 KB       2 rows
Job "SALES"."SYS_EXPORT_TABLE_01" successfully completed at Sun Oct 11 13:52:29 2026 elapsed 0 00:00:12</code></pre>



<p class="wp-block-paragraph">Live inserts after that export are therefore not in the dump:</p>



<pre class="wp-block-code"><code>SQL&gt; INSERT INTO sales.orders_part VALUES (1003, 'ACTIVE');

1 row created.

SQL&gt; INSERT INTO sales.items_part VALUES (1003, 'ACTIVE');

1 row created.

SQL&gt; COMMIT;

Commit complete.</code></pre>



<p class="wp-block-paragraph">Every other table goes in a third export, at the schema level, excluding the partitioned tables. Any number of normal tables fits in this one export, and a new partitioned table is added to the exclusion:</p>



<pre class="wp-block-code"><code>$ cat rest.par
dumpfile=rest.dmp
schemas=SALES
exclude=TABLE:"IN ('ORDERS_PART','ITEMS_PART')"</code></pre>



<pre class="wp-block-code"><code>$ expdp sales/***@PDB1 parfile=rest.par
FLASHBACK automatically enabled to preserve database integrity.
. . exported "SALES"."CUSTOMERS"                          5.515 KB       4 rows
Job "SALES"."SYS_EXPORT_SCHEMA_01" successfully completed at Sun Oct 11 13:52:55 2026 elapsed 0 00:00:24</code></pre>



<p class="wp-block-paragraph">A live insert after this export is not in the dump either:</p>



<pre class="wp-block-code"><code>SQL&gt; INSERT INTO sales.customers VALUES (5, 'LIVE');

1 row created.

SQL&gt; COMMIT;

Commit complete.</code></pre>



<p class="wp-block-paragraph">The partitioned tables already exist on the target, so the active partitions are appended. A regular import creates the normal tables:</p>



<pre class="wp-block-code"><code>$ impdp sales/***@PDB2 dumpfile=active_part.dmp table_exists_action=append
Table "SALES"."ORDERS_PART" exists. Data will be appended to existing table but all dependent metadata will be skipped due to table_exists_action of append
Table "SALES"."ITEMS_PART" exists. Data will be appended to existing table but all dependent metadata will be skipped due to table_exists_action of append
. . imported "SALES"."ITEMS_PART":"P_ACTIVE"                5.5 KB       2 rows
. . imported "SALES"."ORDERS_PART":"P_ACTIVE"               5.5 KB       2 rows
Job "SALES"."SYS_IMPORT_FULL_01" successfully completed at Sun Oct 11 13:53:00 2026 elapsed 0 00:00:03

$ impdp sales/***@PDB2 dumpfile=rest.dmp
. . imported "SALES"."CUSTOMERS"                          5.515 KB       4 rows
Job "SALES"."SYS_IMPORT_FULL_01" successfully completed at Sun Oct 11 13:53:04 2026 elapsed 0 00:00:02</code></pre>



<p class="wp-block-paragraph">The instantiation view now has one row per table. The partitioned tables have SCNs from the second export, while <code>CUSTOMERS</code> has one from the third export:</p>



<pre class="wp-block-code"><code>SQL&gt; SELECT source_database, source_object_name, instantiation_scn
FROM dba_apply_instantiated_objects
WHERE source_object_owner = 'SALES'
ORDER BY source_object_name;

SOURCE_DATABASE SOURCE_OBJECT_NAME INSTANTIATION_SCN
--------------- ------------------ -----------------
PDB1            CUSTOMERS                  189585331
PDB1            ITEMS_PART                 189572011
PDB1            ORDERS_PART                189572008

3 rows selected.</code></pre>



<h3 id="replicat-with-instantiation-filtering" class="wp-block-heading">Replicat with instantiation filtering</h3>



<p class="wp-block-paragraph">Each instantiation SCN applies to the whole table, and we use instantiation filtering in the replicat. It is added and started in the <code>adminclient</code>:</p>



<pre class="wp-block-code"><code>OGG (http://localhost:7810 ogg_test_01) 2&gt; DBLOGIN USERIDALIAS oggadmin_pdb2 DOMAIN OracleGoldenGate
Successfully logged into database PDB2.

OGG (http://localhost:7810 ogg_test_01 as oggadmin_pdb2@CDB02/PDB2) 3&gt; ADD REPLICAT REPPT, INTEGRATED, EXTTRAIL pt, CHECKPOINTTABLE OGGADMIN.CHECKPOINT
2026-10-11T13:53:05Z  INFO    OGG-08100  Integrated Replicat added.

OGG (http://localhost:7810 ogg_test_01 as oggadmin_pdb2@CDB02/PDB2) 4&gt; VIEW PARAMS REPPT
REPLICAT REPPT
DBOPTIONS ENABLE_INSTANTIATION_FILTERING
USERIDALIAS oggadmin_pdb2 DOMAIN OracleGoldenGate
MAP SALES.*, TARGET SALES.*;

OGG (http://localhost:7810 ogg_test_01 as oggadmin_pdb2@CDB02/PDB2) 5&gt; START REPLICAT REPPT
2026-10-11T13:53:05Z  INFO    OGG-00975  Replicat group REPPT starting.
2026-10-11T13:53:05Z  INFO    OGG-15445  Replicat group REPPT started.</code></pre>



<p class="wp-block-paragraph">Once the replicat has caught up, the target tables have the same number of rows as the source:</p>



<pre class="wp-block-code"><code>SQL&gt; SELECT COUNT(*) FROM sales.orders_part;

COUNT(*)
--------
       8

1 row selected.

SQL&gt; SELECT COUNT(*) FROM sales.items_part;

COUNT(*)
--------
       8

1 row selected.

SQL&gt; SELECT COUNT(*) FROM sales.customers;

COUNT(*)
--------
       5

1 row selected.</code></pre>



<p class="wp-block-paragraph">In the <code>adminclient</code>, we can see the transaction done after creating the extract, on each table:</p>



<pre class="wp-block-code"><code>OGG (http://localhost:7810 ogg_test_01) 2&gt; STATS REPLICAT REPPT, TOTAL, TABLE SALES.*

Sending STATS TOTAL TABLE SALES.* request to Replicat group REPPT ...


Start of statistics at 2026-10-11 13:53:18.


Integrated Replicat statistics:

        Total transactions                                 2.00
        Redirected                                         0.00
        Replicated procedures                              0.00
        DDL operations                                     0.00
        Stored procedures                                  0.00
        Datatype functionality                             0.00
        Operation type functionality                       0.00
        Event actions                                      0.00
        Database compatibility                             0.00
        Direct transactions ratio                          0.00%

Replicating from SALES.ORDERS_PART to PDB2.SALES.ORDERS_PART:

*** Total statistics since 2026-10-11 13:53:07 ***
    Total inserts                              1.00
    Total updates                              0.00
    Total deletes                              0.00
    Total upserts                              0.00
    Total discards                             0.00
    Total operations                           1.00

Replicating from SALES.ITEMS_PART to PDB2.SALES.ITEMS_PART:

*** Total statistics since 2026-10-11 13:53:07 ***
    Total inserts                              1.00
    Total updates                              0.00
    Total deletes                              0.00
    Total upserts                              0.00
    Total discards                             0.00
    Total operations                           1.00

Replicating from SALES.CUSTOMERS to PDB2.SALES.CUSTOMERS:

*** Total statistics since 2026-10-11 13:53:07 ***
    Total inserts                              1.00
    Total updates                              0.00
    Total deletes                              0.00
    Total upserts                              0.00
    Total discards                             0.00
    Total operations                           1.00

End of statistics.</code></pre>



<p class="wp-block-paragraph">The only inserts are the three rows added after the exports, one per table. There is no <code>ORA-00001</code>: the rows inserted before the exports were replayed from the trail and skipped by the instantiation filtering. Without <code>ENABLE_INSTANTIATION_FILTERING</code> they would have hit the primary key.</p>



<p class="wp-block-paragraph"><code>FLASHBACK_SCN</code> is not needed here. The replicat compares commit CSNs against <code>instantiation_scn</code>, not against the export’s flashback point. You only need <code>PREPARECSN</code> to have run before the export of the live data.</p>



<p class="wp-block-paragraph">Foreign keys between tables that are in different exports are something to keep in mind.</p>



<h2 id="wrong-order-importing-old-partitions-after" class="wp-block-heading">Wrong order: importing old partitions after</h2>



<p class="wp-block-paragraph">What happens if, for some reason, you run the initial load of the active partitions first, with <code>PREPARECSN</code> and instantiation filtering, and then migrate the old partitions? Let’s try this, by first adding <code>trandata</code>:</p>



<pre class="wp-block-code"><code>OGG (http://localhost:7810 ogg_test_01) 2&gt; DBLOGIN USERIDALIAS oggadmin_pdb1 DOMAIN OracleGoldenGate
Successfully logged into database PDB1.

OGG (http://localhost:7810 ogg_test_01 as oggadmin_pdb1@CDB01/PDB1) 3&gt; ADD TRANDATA SALES.ORDERS_PART PREPARECSN NOWAIT
2026-10-11T13:53:42Z  INFO    OGG-15132  Logging of supplemental redo data enabled for table SALES.ORDERS_PART.
2026-10-11T13:53:42Z  INFO    OGG-15133  TRANDATA for scheduling columns has been added on table SALES.ORDERS_PART.
2026-10-11T13:53:42Z  INFO    OGG-15438  Enabling logical replication (with all keys) on auto capture table SALES.ORDERS_PART.
2026-10-11T13:53:42Z  INFO    OGG-15135  TRANDATA for instantiation CSN has been added on table SALES.ORDERS_PART.</code></pre>



<p class="wp-block-paragraph">The old partitions are exported before the extract exists:</p>



<pre class="wp-block-code"><code>$ expdp sales/***@PDB1 dumpfile=b_old.dmp tables=SALES.ORDERS_PART:P_OLD
FLASHBACK automatically enabled to preserve database integrity.
. . exported "SALES"."ORDERS_PART":"P_OLD"                5.523 KB       5 rows
Job "SALES"."SYS_EXPORT_TABLE_01" successfully completed at Sun Oct 11 13:53:55 2026 elapsed 0 00:00:11</code></pre>



<p class="wp-block-paragraph">The extract is then registered and started, as in the first scenario:</p>



<pre class="wp-block-code"><code>OGG (http://localhost:7810 ogg_test_01) 2&gt; DBLOGIN USERIDALIAS oggadmin_pdb1 DOMAIN OracleGoldenGate
Successfully logged into database PDB1.

OGG (http://localhost:7810 ogg_test_01 as oggadmin_pdb1@CDB01/PDB1) 3&gt; ADD EXTRACT EXTPT, INTEGRATED TRANLOG, BEGIN NOW
2026-10-11T13:53:57Z  INFO    OGG-08100  Integrated Extract added.

OGG (http://localhost:7810 ogg_test_01 as oggadmin_pdb1@CDB01/PDB1) 4&gt; REGISTER EXTRACT EXTPT DATABASE
2026-10-11T13:54:00Z  INFO    OGG-02003  Extract group EXTPT successfully registered with database at SCN 189596053.

OGG (http://localhost:7810 ogg_test_01 as oggadmin_pdb1@CDB01/PDB1) 5&gt; ADD EXTTRAIL pt, EXTRACT EXTPT
2026-10-11T13:54:00Z  INFO    OGG-08100  EXTTRAIL added.

OGG (http://localhost:7810 ogg_test_01 as oggadmin_pdb1@CDB01/PDB1) 6&gt; START EXTRACT EXTPT
2026-10-11T13:54:00Z  INFO    OGG-00975  Extract group EXTPT starting.
2026-10-11T13:54:00Z  INFO    OGG-15426  Extract group EXTPT started.</code></pre>



<p class="wp-block-paragraph">Rows <code>1001</code> and <code>1002</code> are inserted into <code>P_ACTIVE</code>, and the live data is exported. Row <code>1003</code> is inserted after the export:</p>



<pre class="wp-block-code"><code>$ expdp sales/***@PDB1 dumpfile=b_active.dmp tables=SALES.ORDERS_PART:P_ACTIVE
FLASHBACK automatically enabled to preserve database integrity.
. . exported "SALES"."ORDERS_PART":"P_ACTIVE"               5.5 KB       2 rows
Job "SALES"."SYS_EXPORT_TABLE_01" successfully completed at Sun Oct 11 13:54:09 2026 elapsed 0 00:00:08</code></pre>



<p class="wp-block-paragraph">This time, on the target, <strong>the live data is imported first</strong>:</p>



<pre class="wp-block-code"><code>$ impdp sales/***@PDB2 dumpfile=b_active.dmp
. . imported "SALES"."ORDERS_PART":"P_ACTIVE"               5.5 KB       2 rows
Job "SALES"."SYS_IMPORT_FULL_01" successfully completed at Sun Oct 11 13:54:14 2026 elapsed 0 00:00:02</code></pre>



<p class="wp-block-paragraph">For now, the boundary is above the registration SCN <code>189596053</code>:</p>



<pre class="wp-block-code"><code>SQL&gt; SELECT source_object_name, instantiation_scn
FROM dba_apply_instantiated_objects
WHERE source_object_owner = 'SALES'
AND source_object_name = 'ORDERS_PART';

SOURCE_OBJECT_NAME INSTANTIATION_SCN
------------------ -----------------
ORDERS_PART                189610870

1 row selected.</code></pre>



<p class="wp-block-paragraph">The old partitions are then imported:</p>



<pre class="wp-block-code"><code>$ impdp sales/***@PDB2 dumpfile=b_old.dmp table_exists_action=append
Table "SALES"."ORDERS_PART" exists. Data will be appended to existing table but all dependent metadata will be skipped due to table_exists_action of append
. . imported "SALES"."ORDERS_PART":"P_OLD"                5.523 KB       5 rows
Job "SALES"."SYS_IMPORT_FULL_01" successfully completed at Sun Oct 11 13:54:17 2026 elapsed 0 00:00:01</code></pre>



<p class="wp-block-paragraph">If we check the table again, the boundary is now below the registration SCN, and more importantly below the instantiation SCN of the live data !</p>



<pre class="wp-block-code"><code>SQL&gt; SELECT source_object_name, instantiation_scn
FROM dba_apply_instantiated_objects
WHERE source_object_owner = 'SALES'
AND source_object_name = 'ORDERS_PART';

SOURCE_OBJECT_NAME INSTANTIATION_SCN
------------------ -----------------
ORDERS_PART                189594418

1 row selected.</code></pre>



<p class="wp-block-paragraph">This means that a replicat using instantiation filtering will not filter the transactions which happened before the first import. If we add the replicat in the <code>adminclient</code>, and start it:</p>



<pre class="wp-block-code"><code>OGG (http://localhost:7810 ogg_test_01) 2&gt; DBLOGIN USERIDALIAS oggadmin_pdb2 DOMAIN OracleGoldenGate
Successfully logged into database PDB2.

OGG (http://localhost:7810 ogg_test_01 as oggadmin_pdb2@CDB02/PDB2) 3&gt; ADD REPLICAT REPPT, INTEGRATED, EXTTRAIL pt, CHECKPOINTTABLE OGGADMIN.CHECKPOINT
2026-10-11T13:54:19Z  INFO    OGG-08100  Integrated Replicat added.

OGG (http://localhost:7810 ogg_test_01 as oggadmin_pdb2@CDB02/PDB2) 4&gt; START REPLICAT REPPT
2026-10-11T13:54:19Z  INFO    OGG-00975  Replicat group REPPT starting.
2026-10-11T13:54:19Z  INFO    OGG-15445  Replicat group REPPT started.</code></pre>



<p class="wp-block-paragraph">The replicat reads the instantiation SCN <code>189594418</code> from the target. It is now older than the live data export, so the transactions that export already contains are no longer filtered, and the replicat fails on the first trail record:</p>



<pre class="wp-block-code"><code>OGG (http://localhost:7810 ogg_test_01) 2&gt; INFO REPLICAT REPPT

Replicat   REPPT     Last Started 2026-10-11 13:54   Status ABENDED
INTEGRATED
Checkpoint Lag       00:00:00 (updated 00:00:19 ago)
Log Read Checkpoint  File pt000000000
                     First Record  RBA 0
Encryption Profile   LocalWallet</code></pre>



<p class="wp-block-paragraph">The replicat report shows the boundary and the error:</p>



<pre class="wp-block-code"><code>2026-10-11 13:54:25  INFO    OGG-10155  Instantiation CSN filtering is enabled on table SALES.ORDERS_PART at CSN 189,594,418.
2026-10-11 13:54:31  WARNING OGG-02544  Unhandled error (ORA-00001: unique constraint (.) violated
ORA-00001: unique constraint (SALES.SYS_C0010450) violated) while processing the record at SEQNO 0, RBA 1793 in Integrated mode. REPLICAT will retry in Direct mode.</code></pre>



<p class="wp-block-paragraph"><code>1001</code> and <code>1002</code> were already on the target from the live-data import, but their commit CSNs are now above the boundary.</p>



<h2 id="conclusion" class="wp-block-heading">Conclusion</h2>



<ul class="wp-block-list">
<li><code>instantiation_scn</code> is <strong>per table</strong>, not per partition. The last <code>impdp</code> will decide the boundary being used by instantiation filtering.</li>



<li><code>impdp</code> overwrites it <strong>unconditionally</strong>, with no warning.</li>



<li>When using instantiation filtering, always import the dump which should contain the boundary <strong>last</strong>.</li>



<li>Keep in mind that, depending on the context of your real replication, another instantiation method might be needed. Foreign keys, DDL replication, or many aspects a GoldenGate replication might need to address, were not covered in this blog.</li>
</ul>
<p>L’article <a href="https://www.dbi-services.com/blog/import-order-matters-for-goldengate-instantiation-filtering/">Import order matters for GoldenGate instantiation filtering</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.dbi-services.com/blog/import-order-matters-for-goldengate-instantiation-filtering/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Removing instantiation filtering from a GoldenGate replicat</title>
		<link>https://www.dbi-services.com/blog/removing-instantiation-filtering-from-a-goldengate-replicat/</link>
					<comments>https://www.dbi-services.com/blog/removing-instantiation-filtering-from-a-goldengate-replicat/#respond</comments>
		
		<dc:creator><![CDATA[Julien Delattre]]></dc:creator>
		<pubDate>Mon, 12 Oct 2026 06:59:00 +0000</pubDate>
				<category><![CDATA[GoldenGate]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[26ai]]></category>
		<category><![CDATA[checkpoint]]></category>
		<category><![CDATA[csn]]></category>
		<category><![CDATA[DataPump]]></category>
		<category><![CDATA[enable_instantiation_filtering]]></category>
		<category><![CDATA[instantiation]]></category>
		<category><![CDATA[ogg]]></category>
		<category><![CDATA[replicat]]></category>
		<category><![CDATA[rest api]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=47507</guid>

					<description><![CDATA[<p>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 [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/removing-instantiation-filtering-from-a-goldengate-replicat/">Removing instantiation filtering from a GoldenGate replicat</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">In a recent blog, I explained <a href="https://www.dbi-services.com/blog/goldengate-instantiation-csn-explained/" target="_blank" rel="noopener noreferrer">how instantiation filtering works</a>. <code>DBOPTIONS ENABLE_INSTANTIATION_FILTERING</code> 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.</p>



<p class="wp-block-paragraph">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: <strong>how to confirm, before editing the parameter file, that the replicat has cleared the boundary for every table it maps?</strong></p>



<h2 id="which-scn-should-i-check-" class="wp-block-heading">Which SCN should I check ?</h2>



<p class="wp-block-paragraph">To summarize what needs to be checked: <strong>it is safe to remove <code>DBOPTIONS ENABLE_INSTANTIATION_FILTERING</code> once the replicat last applied CSN is greater than the instantiation CSN of every table it maps.</strong></p>



<p class="wp-block-paragraph">To answer this question, you have two sources of information:</p>



<ul class="wp-block-list">
<li>The per-table boundary, stored in <code>dba_apply_instantiated_objects</code>, with one row per source object.</li>



<li>The replicat last applied CSN, stored in the checkpoint table in the <code>log_csn</code> column.</li>
</ul>



<h2 id="sql-check" class="wp-block-heading">SQL check</h2>



<p class="wp-block-paragraph">Read the boundaries first:</p>



<pre class="wp-block-code"><code>SQL&gt; 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</code></pre>



<p class="wp-block-paragraph">Then read the replicat last applied CSN from its checkpoint table:</p>



<pre class="wp-block-code"><code>SELECT group_name, log_csn FROM oggadmin.checkpoint WHERE group_name = 'REP1';</code></pre>



<p class="wp-block-paragraph">You can safely remove <code>ENABLE_INSTANTIATION_FILTERING</code> when <code>log_csn</code> is greater than the <strong>highest</strong> <code>instantiation_scn</code> among the tables it maps. A one-shot verdict, scoped to a single source database:</p>



<pre class="wp-block-code"><code>SELECT 'REP1' AS group_name,
c.log_csn,
MAX(o.instantiation_scn) AS max_boundary,
CASE WHEN c.log_csn &gt; 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;</code></pre>



<p class="wp-block-paragraph">Before a replicat starts for the first time, <code>log_csn</code> is <code>NULL</code> and the verdict is <code>NOT YET</code>:</p>



<pre class="wp-block-code"><code>GROUP_NAME LOG_CSN MAX_BOUNDARY VERDICT
---------- ------- ------------ -------
REP1                   52642820 NOT YET</code></pre>



<p class="wp-block-paragraph">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.</p>



<p class="wp-block-paragraph"><strong>WARNING:</strong> A replicat that has never started has no checkpoint row at all, so <code>log_csn</code> 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 <strong>left joins</strong> the checkpoint table. A missing row gives a <code>NULL</code> <code>log_csn</code>, and the verdict falls to <code>NOT YET</code> instead of the query returning no row at all.</p>



<p class="wp-block-paragraph">After some time, once the replicat catches up with the initial load, the same query returns:</p>



<pre class="wp-block-code"><code>GROUP_NAME LOG_CSN  MAX_BOUNDARY VERDICT
---------- -------- ------------ --------------
REP1       52643651     52642820 SAFE TO REMOVE</code></pre>



<p class="wp-block-paragraph">You can now delete the <code>DBOPTIONS ENABLE_INSTANTIATION_FILTERING</code> parameter and restart your replicat.</p>



<h2 id="adminclient-check" class="wp-block-heading"><code>adminclient</code> check</h2>



<p class="wp-block-paragraph">From the <code>adminclient</code>, <code>INFO REPLICAT REP1, DETAIL</code> reports the applied CSN without using <code>sqlplus</code>:</p>



<pre class="wp-block-code"><code>OGG&gt; INFO REPLICAT REP1, DETAIL
...
Last Committed Transaction CSN value: 52643651</code></pre>



<p class="wp-block-paragraph">Compare that number against the <code>instantiation_scn</code> from the view exactly as above.</p>



<h2 id="rest-api-check" class="wp-block-heading">REST API check</h2>



<p class="wp-block-paragraph">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 <a href="https://docs.oracle.com/en/database/goldengate/core/26/oggra/op-services-version-replicats-replicat-command-post.html" target="_blank" rel="noopener noreferrer">POST /services/{version}/replicats/{replicat}/command</a> endpoint. Using <code>execute_command_replicat</code> in the <a href="https://juliendelattre.com/tools/ogg-python-client/" target="_blank" rel="noopener noreferrer"><code>oggrestapi</code></a> Python client:</p>



<pre class="wp-block-code"><code>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&#091;"reply"])
print(output)</code></pre>



<pre class="wp-block-code"><code>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</code></pre>



<p class="wp-block-paragraph">To be truly automated, <code>Last Committed Transaction CSN value</code> has to be parsed out:</p>



<pre class="wp-block-code"><code>import re

match = re.search(r"Last Committed Transaction CSN value: (\d+)", output)
applied_csn = int(match.group(1))
print(applied_csn)</code></pre>



<pre class="wp-block-code"><code>52646310</code></pre>



<h2 id="information-in-the-report-file" class="wp-block-heading">Information in the report file</h2>



<p class="wp-block-paragraph">When starting a replicat during an initial load, the report file is filled with the following lines:</p>



<pre class="wp-block-code"><code>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.</code></pre>



<ul class="wp-block-list">
<li>If the trail the replicat reads on that start contains records <strong>below</strong> a boundary, it filters them, and these lines appear.</li>



<li>If the trail begins <strong>at or after</strong> the boundary, nothing is filtered and <strong>no line appears at all</strong>.</li>
</ul>



<h2 id="performance-impact-of-leaving-enable_instantiation_filtering" class="wp-block-heading">Performance impact of leaving <code>ENABLE_INSTANTIATION_FILTERING</code></h2>



<p class="wp-block-paragraph">When migrating a database online with GoldenGate, you want your replicat to catch up quickly. I tested whether keeping <code>ENABLE_INSTANTIATION_FILTERING</code> in the parameter file had any effect on the lag of a replicat. I found no significant statistical evidence of this.</p>



<h2 id="summary" class="wp-block-heading">Summary</h2>



<ul class="wp-block-list">
<li><code>ENABLE_INSTANTIATION_FILTERING</code> is <strong>safe to remove</strong> when the replicat <code>log_csn</code> (last applied CSN) is above the <code>instantiation_scn</code> of every table it maps.</li>



<li>Get the applied CSN from <code>oggadmin.checkpoint.log_csn</code> (<code>sqlplus</code>), <code>INFO REPLICAT REP1, DETAIL</code> (<code>adminclient</code>), or <code>execute_command_replicat("REP1", data={"command": "INFO", "arguments": "DETAIL"})</code> over REST, which returns the same information.</li>



<li>The <code><a class="ogg-code-link" href="https://juliendelattre.com/tools/goldengate-error-code-explorer/OGG-10155/" target="_blank" rel="noopener noreferrer">OGG-10155</a>/10185/10186</code> report lines appear <strong>only when the replicat filters records on that start</strong>.</li>
</ul>
<p>L’article <a href="https://www.dbi-services.com/blog/removing-instantiation-filtering-from-a-goldengate-replicat/">Removing instantiation filtering from a GoldenGate replicat</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.dbi-services.com/blog/removing-instantiation-filtering-from-a-goldengate-replicat/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>GoldenGate 26ai AutoSchema TYPEMAP: overriding the default datatype mapping</title>
		<link>https://www.dbi-services.com/blog/goldengate-26ai-autoschema-typemap-overriding-the-default-datatype-mapping/</link>
					<comments>https://www.dbi-services.com/blog/goldengate-26ai-autoschema-typemap-overriding-the-default-datatype-mapping/#respond</comments>
		
		<dc:creator><![CDATA[Julien Delattre]]></dc:creator>
		<pubDate>Thu, 08 Oct 2026 06:20:00 +0000</pubDate>
				<category><![CDATA[GoldenGate]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[26ai]]></category>
		<category><![CDATA[autoschema]]></category>
		<category><![CDATA[autoschemaoptions]]></category>
		<category><![CDATA[datatype]]></category>
		<category><![CDATA[Initial load]]></category>
		<category><![CDATA[microservices]]></category>
		<category><![CDATA[ogg]]></category>
		<category><![CDATA[postgresql]]></category>
		<category><![CDATA[replicat]]></category>
		<category><![CDATA[typemap]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=47671</guid>

					<description><![CDATA[<p>In my blog about the new automatic schema evolution feature in GoldenGate 26ai, I was replicating the following table from Oracle to PostgreSQL: The replicat created a PostgreSQL table from an Oracle one during an initial load. It worked, but one choice was not mine: the NUMBER primary key became a varchar(50). Automatic Schema Evolution [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/goldengate-26ai-autoschema-typemap-overriding-the-default-datatype-mapping/">GoldenGate 26ai AutoSchema TYPEMAP: overriding the default datatype mapping</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">In my blog about the new <a href="https://www.dbi-services.com/blog/goldengate-26ai-automatic-schema-evolution-creating-missing-tables-during-an-initial-load/" target="_blank" rel="noopener noreferrer">automatic schema evolution</a> feature in GoldenGate 26ai, I was replicating the following table from Oracle to PostgreSQL:</p>



<pre class="wp-block-code"><code>CREATE TABLE autosch.t1 (
    id NUMBER PRIMARY KEY,
    name VARCHAR2(50),
    amount NUMBER(10,2),
    created DATE DEFAULT SYSDATE,
    note VARCHAR2(20) DEFAULT 'added'
);</code></pre>



<p class="wp-block-paragraph">The replicat created a PostgreSQL table from an Oracle one during an initial load. It worked, but one choice was not mine: the <code>NUMBER</code> primary key became a <code>varchar(50)</code>. <strong>Automatic Schema Evolution</strong> takes its datatypes from a <strong>default mapping</strong>, and the <code>TYPEMAP</code> option is how you override it.</p>



<p class="wp-block-paragraph">Automatic schema evolution is a <strong>preview feature</strong> in GoldenGate 26ai: its syntax, messages and behavior can change before it becomes generally available, so the results below apply to the 23.26.3 release I tested.</p>



<h2 id="where-the-default-mapping-comes-from" class="wp-block-heading">Where the default mapping comes from</h2>



<p class="wp-block-paragraph">Each GoldenGate 26ai home ships the default mappings as one JSON file per source database and per target database. They are in <code>$OGG_HOME/lib/utl/autoschema/MappingJSON</code>, where <code>MappingGenerator.py</code> combines a source and a target file. For this example, the files are <code>AutoSchemaOracleSourceMappings.json</code> and <code>AutoSchemaPostgreSQLTargetMappings.json</code>.</p>



<p class="wp-block-paragraph">Reading the two JSON files for an Oracle source and a PostgreSQL target, the default mappings that matter for the example table are:</p>



<figure class="wp-block-table"><table><thead><tr><th>Oracle source type</th><th>PostgreSQL target type</th></tr></thead><tbody><tr><td><code>number(precision,scale)</code></td><td><code>decimal(precision,scale)</code></td></tr><tr><td><code>number</code></td><td><code>varchar(precision)</code>, if the source data length is at most 10485760</td></tr><tr><td><code>number</code></td><td><code>text</code>, if the value is still too large to be accommodated</td></tr><tr><td><code>date</code></td><td><code>timestamp(precision)</code></td></tr></tbody></table></figure>



<p class="wp-block-paragraph">A <code>NUMBER</code> <strong>without</strong> precision maps to <code>varchar</code>, and a <code>NUMBER(p,s)</code> maps to <code>decimal(p,s)</code>. This is why the key of my source table did not become a number.</p>



<p class="wp-block-paragraph">For each test below, I drop <code>autosch.t1</code> on PostgreSQL and start a new replicat, always named <code>REPTM</code>, on the same file.</p>



<h2 id="overriding-one-type" class="wp-block-heading">Overriding one type</h2>



<p class="wp-block-paragraph"><code>AUTOSCHEMAOPTIONS TYPEMAP</code> must be written on a separate line, next to <code>DDL AUTOSCHEMA INCLUDE ALL</code>. The source type and the target type are separated by an <strong>equal sign</strong>. The option maps every occurrence of the source type to the given target type. <strong>Both types must be enclosed in single quotes</strong>, otherwise the replicat abends with <code>OGG-30694</code>:</p>



<pre class="wp-block-code"><code>REPLICAT REPTM
TARGETDB ogg_pg_01 USERIDALIAS pgalias DOMAIN OracleGoldenGate
DDL AUTOSCHEMA INCLUDE ALL
AUTOSCHEMAOPTIONS TYPEMAP 'number' = 'bigint'
MAP AUTOSCH.*, TARGET AUTOSCH.*;</code></pre>



<p class="wp-block-paragraph">The replicat report logs that the override was read:</p>



<pre class="wp-block-code"><code>2026-09-19T15:23:47.078+0000  INFO    OGG-30632  Oracle GoldenGate Delivery for PostgreSQL, REPTM.prm:  AutoSchemaOptions TypeMap is used, TypeNameMap: number -&gt; bigint.</code></pre>



<p class="wp-block-paragraph">The table created in PostgreSQL, seen with <code>\d autosch.t1</code> in <code>psql</code>, now shows a <em><code>bigint</code> as primary key</em></p>



<pre class="wp-block-code"><code>ogg_test_pg=# \d autosch.t1
                            Table "autosch.t1"
 Column  |              Type              | Collation | Nullable | Default
---------+--------------------------------+-----------+----------+---------
 id      | bigint                         |           | not null |
 name    | character varying(50)          |           |          |
 amount  | numeric(10,2)                  |           |          |
 created | timestamp(0) without time zone |           |          |
 note    | character varying(20)          |           |          |
Indexes:
    "t1_pkey" PRIMARY KEY, btree (id)</code></pre>



<p class="wp-block-paragraph">The <code>amount</code> column type did not change, since <code>'number'</code> matches the source type <code>NUMBER</code> without precision. <code>NUMBER(10,2)</code> is another source type, and is not affected by the <code>TYPEMAP</code> instruction.</p>



<h2 id="mapping-several-types-with-autoschemaoptions" class="wp-block-heading">Mapping several types with <code>AUTOSCHEMAOPTIONS</code></h2>



<p class="wp-block-paragraph">When mapping multiple types, each mapping needs a dedicated <code>AUTOSCHEMAOPTIONS</code> line:</p>



<pre class="wp-block-code"><code>DDL AUTOSCHEMA INCLUDE ALL
AUTOSCHEMAOPTIONS TYPEMAP 'number' = 'bigint'
AUTOSCHEMAOPTIONS TYPEMAP 'date' = 'date'
AUTOSCHEMAOPTIONS TYPEMAP 'number(10,2)' = 'real'</code></pre>



<p class="wp-block-paragraph">Every entry is logged separately:</p>



<pre class="wp-block-code"><code>2026-09-19T16:29:07.403+0000  INFO    OGG-30632  Oracle GoldenGate Delivery for PostgreSQL, REPTM.prm:  AutoSchemaOptions TypeMap is used, TypeNameMap: date -&gt; date.
2026-09-19T16:29:07.403+0000  INFO    OGG-30632  Oracle GoldenGate Delivery for PostgreSQL, REPTM.prm:  AutoSchemaOptions TypeMap is used, TypeNameMap: number -&gt; bigint.
2026-09-19T16:29:07.403+0000  INFO    OGG-30632  Oracle GoldenGate Delivery for PostgreSQL, REPTM.prm:  AutoSchemaOptions TypeMap is used, TypeNameMap: number\(10,2\) -&gt; real.</code></pre>



<p class="wp-block-paragraph">And this is the resulting table:</p>



<pre class="wp-block-code"><code> Column  |         Type          | Collation | Nullable | Default
---------+-----------------------+-----------+----------+---------
 id      | bigint                |           | not null |
 name    | character varying(50) |           |          |
 amount  | real                  |           |          |
 created | date                  |           |          |
 note    | character varying(20) |           |          |</code></pre>



<p class="wp-block-paragraph">All three overrides are applied. An interesting feature is that the replicat logs an <code>OGG-03056</code> warning about the target column being smaller than the source column:</p>



<pre class="wp-block-code"><code>2026-09-19T16:29:07.419+0000  WARNING OGG-03056  Oracle GoldenGate Delivery for PostgreSQL, REPTM.prm:  Source table AUTOSCH.T1 column CREATED data size exceeds the maximum target table autosch.t1 column created size. Automatic truncation is enabled for all tables/columns without further warnings.</code></pre>



<p class="wp-block-paragraph">As expected, <strong>mapping <code>DATE</code> to a PostgreSQL <code>date</code> loses the time part</strong>, and it can be seen in the target table:</p>



<pre class="wp-block-code"><code> id | name  | amount |  created   | note
----+-------+--------+------------+-------
  1 | row 1 |  10.25 | 2026-09-19 | added
  2 | row 2 |   20.5 | 2026-09-19 | added</code></pre>



<p class="wp-block-paragraph">An Oracle <code>DATE</code> carries a time, so the default <code>timestamp(0)</code> mapping is the right one.</p>



<h2 id="autoschemaoptions-at-the-map-level" class="wp-block-heading"><code>AUTOSCHEMAOPTIONS</code> at the <code>MAP</code> level</h2>



<p class="wp-block-paragraph">The same option can be set on a <code>MAP</code> statement, between parentheses. It then only applies to the tables of that <code>MAP</code> statement instead of the whole replicat:</p>



<pre class="wp-block-code"><code>MAP AUTOSCH.*, TARGET AUTOSCH.*, AUTOSCHEMAOPTIONS (TYPEMAP 'number' = 'bigint');</code></pre>



<pre class="wp-block-code"><code>2026-09-19T16:29:33.344+0000  INFO    OGG-06506  Oracle GoldenGate Delivery for PostgreSQL, REPTM.prm:  Wildcard MAP resolved (entry AUTOSCH.*): MAP "AUTOSCH"."T1", TARGET AUTOSCH."T1", AUTOSCHEMAOPTIONS (TYPEMAP 'number' = 'bigint').
2026-09-19T16:29:33.344+0000  INFO    OGG-30632  Oracle GoldenGate Delivery for PostgreSQL, REPTM.prm:  AutoSchemaOptions TypeMap is used, TypeNameMap: number -&gt; bigint.</code></pre>



<p class="wp-block-paragraph">The table has a <code>bigint</code> key again. In this case, the other <code>number</code> columns outside of the <code>MAP</code> statement would keep the default <code>varchar(50)</code> mapping.</p>



<h2 id="remapping-a-single-column" class="wp-block-heading">Remapping a single column</h2>



<p class="wp-block-paragraph">To change a single column, write the column name on the left side of the equal sign, instead of specifying the source type. The two forms work, first with the full name of the column:</p>



<pre class="wp-block-code"><code>AUTOSCHEMAOPTIONS TYPEMAP AUTOSCH.T1.NAME = 'text'</code></pre>



<p class="wp-block-paragraph">And at the <code>MAP</code> level, with the column name alone:</p>



<pre class="wp-block-code"><code>MAP AUTOSCH.T1, TARGET AUTOSCH.T1, AUTOSCHEMAOPTIONS (TYPEMAP NAME = 'text');</code></pre>



<p class="wp-block-paragraph">Both give the same table, with only <code>name</code> changed into <code>text</code>:</p>



<pre class="wp-block-code"><code> Column  |              Type              | Collation | Nullable | Default
---------+--------------------------------+-----------+----------+---------
 id      | character varying(50)          |           | not null |
 name    | text                           |           |          |
 amount  | numeric(10,2)                  |           |          |
 created | timestamp(0) without time zone |           |          |
 note    | character varying(20)          |           |          |</code></pre>



<p class="wp-block-paragraph">To remap several columns on the same <code>MAP</code>, separate the mappings with <strong>commas</strong> inside the parentheses, and write <code>TYPEMAP</code> only once:</p>



<pre class="wp-block-code"><code>MAP AUTOSCH.T1, TARGET AUTOSCH.T1, AUTOSCHEMAOPTIONS (TYPEMAP NAME = 'text', NOTE = 'text');</code></pre>



<pre class="wp-block-code"><code> Column  |              Type              | Collation | Nullable | Default
---------+--------------------------------+-----------+----------+---------
 id      | character varying(50)          |           | not null |
 name    | text                           |           |          |
 amount  | numeric(10,2)                  |           |          |
 created | timestamp(0) without time zone |           |          |
 note    | text                           |           |          |</code></pre>



<p class="wp-block-paragraph">A type and a column can be mixed in the same list. For example, <code>AUTOSCHEMAOPTIONS (TYPEMAP 'number' = 'bigint', NAME = 'text')</code> gives a <code>bigint</code> key and a <code>text</code> name.</p>



<h2 id="to-summarize" class="wp-block-heading">To summarize</h2>



<ul class="wp-block-list">
<li>The default mapping files are located in <code>$OGG_HOME/lib/utl/autoschema/MappingJSON</code>. Check them before letting a replicat create tables. A <code>NUMBER</code> without precision becomes a <code>varchar</code> on PostgreSQL, for instance.</li>



<li>The override syntax is <code>AUTOSCHEMAOPTIONS TYPEMAP 'source_type' = 'target_type'</code>. Use an equal sign, both types in single quotes, and one mapping per line.</li>



<li>A source type is matched as written. An override on <code>'number'</code> does not change a <code>NUMBER(10,2)</code> column, which needs a separate <code>'number(10,2)'</code> entry.</li>



<li>On a <code>MAP</code>, put the option between parentheses to limit it to those tables. For one column, use <code>AUTOSCH.T1.NAME = 'text'</code> globally or <code>NAME = 'text'</code> on the <code>MAP</code>.</li>



<li>Pay attention to <code>OGG-03056</code> warnings: a target type smaller than the source, like <code>DATE</code> to <code>date</code>, truncates the data without stopping the initial load.</li>
</ul>
<p>L’article <a href="https://www.dbi-services.com/blog/goldengate-26ai-autoschema-typemap-overriding-the-default-datatype-mapping/">GoldenGate 26ai AutoSchema TYPEMAP: overriding the default datatype mapping</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.dbi-services.com/blog/goldengate-26ai-autoschema-typemap-overriding-the-default-datatype-mapping/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Archiving 5 TB from Oracle into SQL Server: views, indexes and compression (part 2)</title>
		<link>https://www.dbi-services.com/blog/archiving-5-tb-from-oracle-into-sql-server-views-indexes-and-compression-part-2/</link>
					<comments>https://www.dbi-services.com/blog/archiving-5-tb-from-oracle-into-sql-server-views-indexes-and-compression-part-2/#respond</comments>
		
		<dc:creator><![CDATA[Louis Tochon]]></dc:creator>
		<pubDate>Wed, 07 Oct 2026 06:20:08 +0000</pubDate>
				<category><![CDATA[Database management]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[migration]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=47235</guid>

					<description><![CDATA[<p>Translating 4,000 Oracle views, rebuilding indexes offline on Standard Edition, and compressing clustered index to save 1T.</p>
<p>L’article <a href="https://www.dbi-services.com/blog/archiving-5-tb-from-oracle-into-sql-server-views-indexes-and-compression-part-2/">Archiving 5 TB from Oracle into SQL Server: views, indexes and compression (part 2)</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">At the end of&nbsp;<a href="https://www.dbi-services.com/blog/archiving-5-tb-from-oracle-into-sql-server-a-migration-logbook-part-1/">part 1</a>&nbsp;the data was across, at 42,170 rows per second into a database that could not answer a single question. Every nonclustered index disabled, the largest tables loaded as heaps with no primary key, every foreign key switched off, and 4,784 views that mostly did not compile.</p>



<p class="wp-block-paragraph">This part is about putting it back: <strong>translating the views</strong>, <strong>rebuilding the keys and indexes under a Standard Edition licence</strong> that makes every build offline, <strong>and compressing 3.2 TB of heaps</strong> that turned out to be mostly empty space.</p>



<p class="wp-block-paragraph">The logbook resumes at day 5.</p>



<h2 id="h-day-5-four-thousand-views-to-convert" class="wp-block-heading">Day 5. Four thousand views to convert</h2>



<p class="wp-block-paragraph">4,658 of the 4,784 views live in a single schema, and nobody needed all of them. We went through the list with the client first and kept the ones that actually matter to the business, which brought the scope down to about 710. SSMA converted around 600 of those on its own.</p>



<p class="wp-block-paragraph">SSMA fails mostly on <code>CONNECT BY</code>, <code>START WITH</code> and <code>SYS_CONNECT_BY_PATH</code>. For some easy cases, <code>DECODE</code> to <code>CASE</code> and <code>NVL</code> handles it well, for the record. For more complex use case, we needed to find an automatic solution process. So first, we discussed with the client to know which view were critical and needed to be migrated. Then, with this list, we leveraged the power of AI to help us converting the remaining views based on the following workflow:</p>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="786" height="1024" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/09/image-45-786x1024.png" alt="" class="wp-image-47241" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/09/image-45-786x1024.png 786w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/09/image-45-230x300.png 230w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/09/image-45-768x1001.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/09/image-45.png 1120w" sizes="(max-width: 786px) 100vw, 786px" /></figure>



<h3 id="h-the-workflow" class="wp-block-heading">The workflow</h3>



<p class="wp-block-paragraph">SSMA converts what it can. The failures get extracted from <code>dba_views </code>into files. Then, and this is the step that changes the economics, they get<strong> classified by pattern in the Oracle source</strong> rather than one at a time by error message.</p>



<p class="wp-block-paragraph">Translation itself was done in batches of one family at a time, outside production, on extracted files, <strong>with an AI assistant</strong> and a context file describing the type mapping decisions, the column types of the referenced tables and the target version. Then human review, tests against Oracle and finally, deployment.</p>



<p class="wp-block-paragraph">The catalogue of families is the real deliverable. Eight of them closed the great majority of the cases:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Family</th><th>Verdict</th></tr></thead><tbody><tr><td><code>+</code> concatenation on numerics (<code>col + '_' + col</code>)</td><td><code>CONCAT</code></td></tr><tr><td>Untyped NULL in a UNION, cast to <code>numeric(38,10)</code> against a <code>datetime2</code> sibling</td><td>retype the cast</td></tr><tr><td>Call to a package function that was never migrated</td><td>inline it if possible</td></tr><tr><td><code>ssma_oracle.*</code> helper functions</td><td>install the extension pack</td></tr><tr><td>XML extraction (<code>.extract().getStringVal()</code>)</td><td>rewrite part of the query</td></tr><tr><td><code>TO_TIMESTAMP_TZ</code></td><td>rewrite part of the query</td></tr><tr><td>Date arithmetic landing in float</td><td>redefine type mapping</td></tr><tr><td><code>CONNECT BY</code> used as a generator</td><td>materialise the level connectors</td></tr></tbody></table></figure>



<p class="wp-block-paragraph"><strong><span style="text-decoration: underline">And a word on the AI</span></strong>, since that is the part people ask about. <strong>No data ever left the environment</strong>: only the view definitions were processed, and every test against the live database was run by hand so we kept control of the process. We could have added MCP connectors and let a local model run the tests itself, but with the number of days allocated to the project and the small number of views left to fix, doing it manually was simpler. Around 85 percent of the views <strong>wanted by the client</strong> had already come through SSMA.</p>



<h2 id="h-day-6-putting-the-indexes-back-and-making-the-database-smaller" class="wp-block-heading">Day 6. Putting the indexes back and making the database smaller</h2>



<h3 id="h-recovering-what-i-had-thrown-away" class="wp-block-heading">Recovering what I had thrown away</h3>



<p class="wp-block-paragraph">The primary keys I dropped to load into heaps had left no trace on the SQL Server side. Nothing in <code>sys.indexes</code>, no disabled definition, nothing.</p>



<h3 id="h-what-standard-edition-costs" class="wp-block-heading">What Standard Edition costs</h3>



<p class="wp-block-paragraph">Index builds are offline and single-threaded. The table is locked for the duration, metadata reads queue behind it, but we managed to run 4 builds in parallel. <code>SORT_IN_TEMPDB = OFF</code> for the clustered builds. The sort covers the entire table, and 36 GB of tempdb was never going to hold a 900 GB sort.</p>



<p class="wp-block-paragraph">Meanwhile <code>percent_complete</code> sits at 0 for the whole build, with the serene confidence of something that has never been asked to account for itself. It works for <code>BACKUP DATABASE</code>. It does not work here. Real progress lives in <code><a href="https://learn.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-objects/sys-dm-exec-query-profiles-transact-sql?view=sql-server-ver17">sys.dm_exec_query_profile</a>s</code>, operator by operator :</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; title: ; notranslate">
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT physical_operator_name, row_count, estimate_row_count,
       CAST(row_count*100.0/NULLIF(estimate_row_count,0) AS decimal(5,1)) AS pct
FROM sys.dm_exec_query_profiles WITH (NOLOCK)
WHERE session_id = &lt;spid of the build&gt; 
ORDER BY node_id;

</pre></div>

<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" width="399" height="87" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/09/image-46.png" alt="" class="wp-image-47252" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/09/image-46.png 399w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/09/image-46-300x65.png 300w" sizes="(max-width: 399px) 100vw, 399px" /></figure>
</div>


<p class="wp-block-paragraph">Those are not three parallel counters. They are three sequential phases of one pipeline, and only one of them moves at a time. The scan reads the source table, and while it runs its percentage is the only honest progress figure available. The sort is a blocking operator: it cannot emit a single row until it has consumed all 31.9 million, so it stays at zero through the whole scan and then through the whole sort. That is the blind spot. Once the scan reaches 100 percent you get a long stretch where all three counters report nothing while the server works flat out, and if the sort spills to disk that stretch can outlast the other two phases combined. Index Insert starts moving only when the sort begins handing rows over, and it is the first number that means the end is actually in sight.</p>



<h3 id="h-why-compress-and-what-it-returned" class="wp-block-heading">Why compress, and what it returned</h3>



<p class="wp-block-paragraph">On a read-only database, PAGE compression has no recurring write cost. You keep the read benefit and pay nothing back. The argument is rarely this clean.</p>



<p class="wp-block-paragraph">Compression trades CPU for I/O, and on an archive that trade is one-sided. These pages are read rarely, and when they are, nothing heavy is competing for the processor, so the decompression cost lands on a machine with nothing better to do. What you get back is density: more rows per page, which means fewer reads to find the one row somebody asked for and more of the table sitting in memory at once.</p>



<p class="wp-block-paragraph">The data was unusually well suited to it, for a reason worth spelling out. These tables carry roughly 200 numeric columns, mostly null, plus five <code>nvarchar(200)</code> aggregation labels that repeat endlessly. Here is the part that surprises people: <strong>a fixed-length numeric column that is NULL still occupies its full width</strong> in SQL Server. “Mostly null” saves nothing before compression. It is precisely why the heap was that large, and precisely what the page dictionary destroys.</p>



<p class="wp-block-paragraph">The allocated space per row tells the story:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Table</th><th>Rows</th><th>GB (heap)</th><th>bytes allocated per row</th></tr></thead><tbody><tr><td>TABLE1</td><td>251,777,518</td><td>960.5</td><td>~4,100</td></tr><tr><td>TABLE2</td><td>229,881,717</td><td>876.9</td><td>~4,100</td></tr><tr><td>TABLE3</td><td>343,997,550</td><td>874.8</td><td>~2,700</td></tr><tr><td>TABLE4</td><td>447,972,849</td><td>227.9</td><td>~550</td></tr><tr><td>TABLE5</td><td>519,727,931</td><td>120.2</td><td>~250</td></tr><tr><td>TABLE6</td><td>505,819,544</td><td>117.0</td><td>~250</td></tr></tbody></table></figure>



<p class="wp-block-paragraph"><strong>Three tables hold 2.7 TB of the 3.2 TB total</strong>. At around 4 KB of allocated space per row against an 8 KB page, the top two fit around two rows per page and waste most of what is left.</p>



<p class="wp-block-paragraph">Then the first build, on 505,819,544 rows with a five-column primary key:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; title: ; notranslate">
ALTER TABLE &lt;TABLE6&gt;
ADD CONSTRAINT PK_TABLE6 PRIMARY KEY CLUSTERED
    (&lt;COLUMNS_NAME&gt;)
WITH (DATA_COMPRESSION = PAGE, SORT_IN_TEMPDB = OFF);

</pre></div>


<p class="wp-block-paragraph"><strong>117 GB to 30.7 GB. A ratio of 3.81.</strong></p>



<figure class="wp-block-image size-full"><img decoding="async" width="721" height="121" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/09/image-47.png" alt="" class="wp-image-47258" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/09/image-47.png 721w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/09/image-47-300x50.png 300w" sizes="(max-width: 721px) 100vw, 721px" /></figure>



<p class="wp-block-paragraph">Finally, as you can see above, more than 2.5 T have been reclaimed (datafiles were full with the heaps). Compression has made huge benefits and that means less data on disks, which means fewer pages to take in the buffer (less IO).</p>



<h3 id="h-the-script-that-puts-everything-back" class="wp-block-heading">The script that puts everything back</h3>



<p class="wp-block-paragraph">Across every schema that is two cursors, one rebuilding the disabled indexes with compression and one re-enabling the foreign keys. It is driven by the same&nbsp;<code>#Schemas</code>&nbsp;table as the disable script in part 1:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; title: ; notranslate">
SET NOCOUNT ON;
DECLARE @Execute bit = 0;   -- 0 = preview ; 1 = execute
  
DECLARE @cmd nvarchar(max);
DECLARE @n   int = 0;
  
DECLARE reb_cur CURSOR LOCAL FAST_FORWARD FOR
    SELECT N&#039;ALTER INDEX &#039; + QUOTENAME(i.name)
         + N&#039; ON &#039; + QUOTENAME(s.name) + N&#039;.&#039; + QUOTENAME(t.name)
         + N&#039; REBUILD WITH (DATA_COMPRESSION = PAGE);&#039;
    FROM   sys.indexes  i
    JOIN   sys.tables   t ON i.object_id = t.object_id
    JOIN   sys.schemas  s ON t.schema_id = s.schema_id
    WHERE  s.name IN (SELECT schema_name FROM #Schemas)
      AND  i.is_disabled = 1          
    ORDER BY s.name, t.name, i.name;
  
OPEN reb_cur;
FETCH NEXT FROM reb_cur INTO @cmd;
WHILE @@FETCH_STATUS = 0
BEGIN
    SET @n += 1;
    PRINT @cmd;
    IF @Execute = 1
    BEGIN
        BEGIN TRY EXEC sys.sp_executesql @cmd; END TRY
        BEGIN CATCH PRINT N&#039;   -- FAILED: &#039; + ERROR_MESSAGE(); END CATCH
    END
    FETCH NEXT FROM reb_cur INTO @cmd;
END
CLOSE reb_cur;
DEALLOCATE reb_cur;
  
PRINT N&#039;---&#039;;
PRINT CONVERT(nvarchar(10), @n) + N&#039; index &#039;
    + CASE WHEN @Execute = 1 THEN N&#039;rebuilt.&#039; ELSE N&#039;to be rebuilt (preview).&#039; END;
GO
  
  
SET NOCOUNT ON;
DECLARE @Execute bit = 1;   -- 0 = preview ; 1 = executer
  
DECLARE @cmd nvarchar(max);
DECLARE @n   int = 0;
  
DECLARE fkc_cur CURSOR LOCAL FAST_FORWARD FOR
    SELECT N&#039;ALTER TABLE &#039; + QUOTENAME(s.name) + N&#039;.&#039; + QUOTENAME(t.name)
         + N&#039; WITH NOCHECK CHECK CONSTRAINT &#039; + QUOTENAME(fk.name) + N&#039;;&#039;
    FROM   sys.foreign_keys fk
    JOIN   sys.tables  t ON fk.parent_object_id = t.object_id
    JOIN   sys.schemas s ON t.schema_id = s.schema_id
    WHERE  s.name IN (SELECT schema_name FROM #Schemas);
  
OPEN fkc_cur;
FETCH NEXT FROM fkc_cur INTO @cmd;
WHILE @@FETCH_STATUS = 0
BEGIN
    SET @n += 1;
    PRINT @cmd;
    IF @Execute = 1
    BEGIN
        BEGIN TRY EXEC sys.sp_executesql @cmd; END TRY
        BEGIN CATCH PRINT N&#039;   -- FAILED : &#039; + ERROR_MESSAGE(); END CATCH
    END
    FETCH NEXT FROM fkc_cur INTO @cmd;
END
CLOSE fkc_cur;
DEALLOCATE fkc_cur;
  
PRINT N&#039;---&#039;;
PRINT CONVERT(nvarchar(10), @n) + N&#039; FK &#039;
    + CASE WHEN @Execute = 1 THEN N&#039;activated and validated.&#039; ELSE N&#039;to be activated (preview).&#039; END;
GO

</pre></div>


<h3 id="h-the-foreign-keys-which-turned-out-to-be-free" class="wp-block-heading">The foreign keys, which turned out to be free</h3>



<p class="wp-block-paragraph">All 6,072 foreign keys were already back, active and marked not trusted, because the loading script re-enabled them with <code>NOCHECK</code>. Revalidating them with <code>WITH CHECK</code> would mean full joins against the largest tables in the database.</p>



<p class="wp-block-paragraph">On a read-only archive whose source integrity <strong>was enforced by Oracle</strong> for fifteen years, that buys one thing: the optimizer regains the right to eliminate redundant joins. Worth having on a schema of deeply nested views, not worth days of scanning here. They stayed not trusted.</p>



<h2 id="h-day-7-testing-600-views" class="wp-block-heading">Day 7. Testing 600 views</h2>



<p class="wp-block-paragraph">The principle is simple: run every view, record what happened, and never lose the record. Each one gets a <code>SELECT TOP (100) *</code> inside a <code>TRY/CATCH</code>, so a view that fails is logged rather than fatal, and the outcome lands in a table with its duration in milliseconds. The cursor only picks up views that are not already recorded, which means an interrupted run resumes where it stopped instead of starting over, and the duration column is what you sort on once it is done:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; title: ; notranslate">
SET NOCOUNT ON;
 
IF OBJECT_ID(&#039;dbo.ViewTestResults&#039;) IS NULL
    CREATE TABLE dbo.ViewTestResults (
        schema_name  sysname,
        view_name    sysname,
        statut       varchar(20),
        duree_ms     int,
        message      nvarchar(2048),
        tested_at    datetime2 DEFAULT SYSDATETIME(),
        CONSTRAINT PK_ViewTestResults PRIMARY KEY (schema_name, view_name)
    );
 
DECLARE @sch sysname, @vue sysname, @sql nvarchar(max), @t0 datetime2, @ms int, @i int = 0, @n int;
 
SELECT @n = COUNT(*)
FROM   sys.views v JOIN sys.schemas s ON v.schema_id = s.schema_id
WHERE  s.name = &#039;SCDAT&#039;
  AND  NOT EXISTS (SELECT 1 FROM dbo.ViewTestResults r
                   WHERE r.schema_name = s.name AND r.view_name = v.name);
 
RAISERROR(&#039;=== %d view remaining ===&#039;, 0, 1, @n) WITH NOWAIT;
 
DECLARE c CURSOR FAST_FORWARD FOR
  SELECT s.name, v.name
  FROM   sys.views v JOIN sys.schemas s ON v.schema_id = s.schema_id
  WHERE  s.name = &#039;SCDAT&#039;
    AND  NOT EXISTS (SELECT 1 FROM dbo.ViewTestResults r
                     WHERE r.schema_name = s.name AND r.view_name = v.name)
  ORDER  BY v.name;
 
OPEN c;
FETCH NEXT FROM c INTO @sch, @vue;
WHILE @@FETCH_STATUS = 0
BEGIN
    SET @i += 1;
    RAISERROR(&#039;&#x5B;%d/%d] %s.%s&#039;, 0, 1, @i, @n, @sch, @vue) WITH NOWAIT;
 
    SET @t0 = SYSDATETIME();
    BEGIN TRY
        SET @sql = N&#039;SELECT TOP (100) * FROM &#039; + QUOTENAME(@sch) + N&#039;.&#039; + QUOTENAME(@vue) + N&#039;;&#039;;
        EXEC sp_executesql @sql;
        SET @ms = DATEDIFF(MILLISECOND, @t0, SYSDATETIME());
        INSERT dbo.ViewTestResults (schema_name, view_name, statut, duree_ms, message)
        VALUES (@sch, @vue, &#039;OK&#039;, @ms, NULL);
    END TRY
    BEGIN CATCH
        SET @ms = DATEDIFF(MILLISECOND, @t0, SYSDATETIME());
        INSERT dbo.ViewTestResults (schema_name, view_name, statut, duree_ms, message)
        VALUES (@sch, @vue, &#039;FAILED&#039;, @ms, ERROR_MESSAGE());
        RAISERROR(&#039;    -&gt; FAILED: %s&#039;, 0, 1, @vue) WITH NOWAIT;
    END CATCH
 
    FETCH NEXT FROM c INTO @sch, @vue;
END
CLOSE c; DEALLOCATE c;
 
RAISERROR(&#039;=== Done ===&#039;, 0, 1) WITH NOWAIT;
 
-- summary
SELECT statut, COUNT(*) AS nb, SUM(duree_ms) AS duree_totale_ms
FROM dbo.ViewTestResults GROUP BY statut;
 
-- failed
SELECT schema_name, view_name, duree_ms, message
FROM dbo.ViewTestResults WHERE statut=&#039;FAILED&#039; ORDER BY view_name;
 
-- all
SELECT schema_name, view_name, statut, duree_ms
FROM dbo.ViewTestResults ORDER BY duree_ms DESC;

</pre></div>


<p class="wp-block-paragraph">The result looked excellent: <strong>604 views OK, zero errors</strong>, against real data. Six skipped because they are not implemented to be run without an explicit filter added. <code>SELECT TOP 100 *</code> without a filter <strong>is not a representative test</strong> but still confirms that definition and joins are working fine. So: test with the filter the users will actually write. A view that only misbehaves when queried in a way nobody queries it is not a broken view, but you cannot know that from a green tick.</p>



<h2 id="h-day-8-closing-the-hatch" class="wp-block-heading">Day 8. Closing the hatch</h2>



<p class="wp-block-paragraph">Database set to read-only, final backup taken and user&#8217;s specific queries tested with success, the story now comes to a happy end.</p>



<h2 id="h-what-i-would-tell-the-next-person" class="wp-block-heading">What I would tell the next person</h2>



<p class="wp-block-paragraph">An archive migration is not a cheap application migration. It is a different decision set, and read-only is the input that drives most of it. 25,000 triggers are pointless, PAGE compression free, and untrusted foreign keys perfectly acceptable. It even tells you how to index: broadly and in advance, because nobody can tell you which row an auditor will want in three years. Before anything else, ask what the target will be used for. The answer rewrites the plan before the first byte moves.</p>



<p class="wp-block-paragraph">Measure, and distrust anything that presents itself as progress. The SSMA counter refreshes per batch and sits still for minutes at a time. <code>percent_complete </code>stays at zero for an entire index build. A green tick on<code> SELECT TOP 100</code> confirms that the joins resolve and nothing beyond that. In every one of those cases the real number was sitting in a DMV.</p>



<p class="wp-block-paragraph">On views, the conversion rate is the least useful number in the report. What made four thousand views a finite piece of work was not the translation but the two steps around it: agreeing the real scope with the client first, then classifying what remained by pattern in the Oracle source rather than one error message at a time. <strong>An AI assistant</strong> translates a family of twenty views very well. It validates nothing, and the test against the source stays yours.</p>



<p class="wp-block-paragraph">Compression on an archive is the rare decision with nothing to weigh against it. 117 GB down to 30.7 GB on the first table, <strong>more than 2.5 TB</strong> reclaimed across the set, and not a single write to pay it back with. If your heap is mostly null numeric columns, it is bigger than you think, and it will compress better than you expect.</p>
<p>L’article <a href="https://www.dbi-services.com/blog/archiving-5-tb-from-oracle-into-sql-server-views-indexes-and-compression-part-2/">Archiving 5 TB from Oracle into SQL Server: views, indexes and compression (part 2)</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.dbi-services.com/blog/archiving-5-tb-from-oracle-into-sql-server-views-indexes-and-compression-part-2/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>GoldenGate AI Service bug confirmed in the Maximum Input Characters setting</title>
		<link>https://www.dbi-services.com/blog/goldengate-ai-service-bug-confirmed-in-the-maximum-input-characters-setting/</link>
					<comments>https://www.dbi-services.com/blog/goldengate-ai-service-bug-confirmed-in-the-maximum-input-characters-setting/#respond</comments>
		
		<dc:creator><![CDATA[Julien Delattre]]></dc:creator>
		<pubDate>Tue, 06 Oct 2026 05:25:17 +0000</pubDate>
				<category><![CDATA[GoldenGate]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[26]]></category>
		<category><![CDATA[26ai]]></category>
		<category><![CDATA[ai service]]></category>
		<category><![CDATA[embeddings]]></category>
		<category><![CDATA[gemini]]></category>
		<category><![CDATA[maximum]]></category>
		<category><![CDATA[microservices]]></category>
		<category><![CDATA[ogg]]></category>
		<category><![CDATA[Troubleshooting]]></category>
		<category><![CDATA[vector]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=47756</guid>

					<description><![CDATA[<p>In a previous blog, I noted that there might be a bug with the Maximum Input Characters setting in GoldenGate 26ai AI Service. The bug was confirmed by Oracle, so let’s see what it is exactly. Bug found in GoldenGate 26ai AI Service Maximum Input Characters is a setting in the AI Service. You can [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/goldengate-ai-service-bug-confirmed-in-the-maximum-input-characters-setting/">GoldenGate AI Service bug confirmed in the Maximum Input Characters setting</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">In a <a href="https://www.dbi-services.com/blog/goldengate-26ai-ai-service-full-setup-with-a-free-gemini-key/" target="_blank" rel="noopener noreferrer">previous blog</a>, I noted that there might be a bug with the <code>Maximum Input Characters</code> setting in GoldenGate 26ai AI Service. The bug was confirmed by Oracle, so let’s see what it is exactly.</p>



<h2 id="bug-found-in-goldengate-26ai-ai-service" class="wp-block-heading">Bug found in GoldenGate 26ai AI Service</h2>



<p class="wp-block-paragraph"><code>Maximum Input Characters</code> is a setting in the AI Service. You can set it when registering a new model in the web UI.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="700" height="580" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/001_goldengate-26ai-ai-service-max-input-add-model-dialog.png" alt="" class="wp-image-47758" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/001_goldengate-26ai-ai-service-max-input-add-model-dialog.png 700w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/001_goldengate-26ai-ai-service-max-input-add-model-dialog-300x249.png 300w" sizes="auto, (max-width: 700px) 100vw, 700px" /></figure>
</div>


<p class="wp-block-paragraph">In the <a href="https://docs.oracle.com/en/database/goldengate/core/26/coredoc/sm-ads-ai-providers-and-models.html" target="_blank" rel="noopener noreferrer">Oracle documentation</a>, the parameter is described as a cap on how much text is sent to the embedding model before it leaves GoldenGate. This ensures that an <code>@AISERVICE</code> mapping cannot send more than intended, and does not reach a token limit, or increase your consumption.</p>



<p class="wp-block-paragraph">If this setting worked, a model with <code>Maximum Input Characters</code> set to <code>1</code> should truncate any input to a single character before calling the AI Service. This is not what I found when testing it.</p>



<h2 id="proof-of-the-bug" class="wp-block-heading">Proof of the bug</h2>



<h3 id="model-registration" class="wp-block-heading">Model registration</h3>



<p class="wp-block-paragraph">I registered two AI Service models against the same Gemini provider and the same remote model (<code>gemini-embedding-001</code>). They differ only in <code>Maximum Input Characters</code>: one set to <code>1000</code>, the other to <code>1</code>.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="900" height="620" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/002_goldengate-26ai-ai-service-max-input-model-max1000.png" alt="" class="wp-image-47759" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/002_goldengate-26ai-ai-service-max-input-model-max1000.png 900w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/002_goldengate-26ai-ai-service-max-input-model-max1000-300x207.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/002_goldengate-26ai-ai-service-max-input-model-max1000-768x529.png 768w" sizes="auto, (max-width: 900px) 100vw, 900px" /></figure>
</div>

<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="900" height="620" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/003_goldengate-26ai-ai-service-max-input-model-max1.png" alt="" class="wp-image-47760" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/003_goldengate-26ai-ai-service-max-input-model-max1.png 900w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/003_goldengate-26ai-ai-service-max-input-model-max1-768x529.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/003_goldengate-26ai-ai-service-max-input-model-max1-300x207.png 300w" sizes="auto, (max-width: 900px) 100vw, 900px" /></figure>
</div>


<p class="wp-block-paragraph">If I query both models with the REST API, I can see the settings properly saved, in <code>limits.maxInputCharacters</code>:</p>



<pre class="wp-block-code"><code>{
    "id": "gemini_embed_max1000",
    "name": "gemini-embedding-max1000",
    "type": "remote",
    "enabled": true,
    "loaded": false,
    "description": "Model with 1000 character limit",
    "capabilities": &#091;
        "embed"
    ],
    "providerId": "gemini",
    "remoteModelName": "gemini-embedding-001",
    "parameters": {},
    "limits": {
        "maxInputCharacters": 1000
    }
}</code></pre>



<pre class="wp-block-code"><code>{
    "id": "gemini_embed_max1",
    "name": "gemini-embedding-max1",
    "type": "remote",
    "enabled": true,
    "loaded": false,
    "description": "Model with 1 character limit",
    "capabilities": &#091;
        "embed"
    ],
    "providerId": "gemini",
    "remoteModelName": "gemini-embedding-001",
    "parameters": {},
    "limits": {
        "maxInputCharacters": 1
    }
}</code></pre>



<h3 id="replicat-used-in-the-test" class="wp-block-heading">Replicat used in the test</h3>



<p class="wp-block-paragraph">I built an <code>EXTAI</code>/<code>REPAI</code> pair between <code>PDB1.APP_PDB1.PRODUCTS</code> on the source and <code>PDB26.APP_PDB26.PRODUCTS</code> on the target. Its <code>COLMAP</code> maps the <code>description</code> column through three separate <code>@AISERVICE</code> calls into three different <code>VECTOR(3072, FLOAT32)</code> columns:</p>



<pre class="wp-block-code"><code>MAP PDB1.APP_PDB1.PRODUCTS, TARGET APP_PDB26.PRODUCTS,
COLMAP (
    USEDEFAULTS,
    desc_vector_max1000 = @AISERVICE(embed, 'gemini_embed_max1000', description),
    desc_vector_max1000_run2 = @AISERVICE(embed, 'gemini_embed_max1000', description),
    desc_vector_max1 = @AISERVICE(embed, 'gemini_embed_max1', description));</code></pre>



<p class="wp-block-paragraph">The first two calls use the same model (<code>gemini_embed_max1000</code>). This is to show the baseline argument that the same input, embedded with the same model twice, produce the same vector. The third call uses the 1 character model, to test the bug.</p>



<h2 id="baseline-and-embedding-noise" class="wp-block-heading">Baseline and embedding noise</h2>



<p class="wp-block-paragraph">The truncation is only relevant if identical inputs reliably produce identical output. Before comparing vectors across models, I first confirmed the embedding had no noise, by inserting the same 100 character <code>description</code> into two source rows and let both flow through the pipeline:</p>



<pre class="wp-block-code"><code>INSERT INTO app_pdb1.products (id, name, description) VALUES (101, 'AI Service Max Input Chars Test Row 1', 'GoldenGate 26ai AI Service test row for comparing embeddings across the max1000 and max1 test models');
INSERT INTO app_pdb1.products (id, name, description) VALUES (102, 'AI Service Max Input Chars Test Row 2', 'GoldenGate 26ai AI Service test row for comparing embeddings across the max1000 and max1 test models');
COMMIT;</code></pre>



<p class="wp-block-paragraph">Then, I compared the <code>gemini_embed_max1000</code> vector between the two rows. I also compared the two separate <code>@AISERVICE</code> calls to the same model within row 101 itself. Both come back with a cosine distance of <code>0</code>:</p>



<pre class="wp-block-code"><code>SQL&gt; SELECT VECTOR_DISTANCE(a.desc_vector_max1000, b.desc_vector_max1000, COSINE) dist_101_vs_102_same_input
FROM app_pdb26.products a, app_pdb26.products b
WHERE a.id = 101
AND b.id = 102;

DIST_101_VS_102_SAME_INPUT
--------------------------
                         0
</code></pre>



<p class="wp-block-paragraph">The conclusion is that <code>gemini-embedding-001</code> is deterministic for identical input. Now, if the <code>max1</code> vector is identical to the <code>max1000</code> vector, we can rule out embedding noise.</p>



<h2 id="does-the-1-character-limit-change-anything" class="wp-block-heading">Does the 1 character limit change anything?</h2>



<p class="wp-block-paragraph">With the same transaction, let’s look at the two different <code>@AISERVICE</code> calls, against a model capped at 1000 characters and one capped at 1:</p>



<pre class="wp-block-code"><code>SQL&gt; SELECT id, VECTOR_DISTANCE(desc_vector_max1000, desc_vector_max1, COSINE) dist_max1000_vs_max1, VECTOR_DISTANCE(desc_vector_max1000, desc_vector_max1000_run2, COSINE) dist_max1000_vs_rerun
FROM app_pdb26.products
WHERE id IN (101, 102);

ID  DIST_MAX1000_VS_MAX1 DIST_MAX1000_VS_RERUN
--- -------------------- ---------------------
101                    0                     0
102                    0                     0</code></pre>



<p class="wp-block-paragraph">On both models, the distance between the resulting vectors is zero. If the <code>Maximum Input Characters</code> were enforced, the <strong>vectors should be different</strong> between both models. This proves that the <code>Maximum Input Characters</code> setting saved as <code>1</code> had no effect on what was sent to Gemini.</p>



<p class="wp-block-paragraph">GoldenGate even has a <a href="https://docs.oracle.com/en/middleware/goldengate/core/23.26/error-messages/" target="_blank" rel="noopener noreferrer">documented warning</a> for a situation where the input would exceed the limit. <code>OGG-30677</code> is defined as <code>@AISERVICE source column {0} contains {1} characters, exceeding model {2}'s maximum input limit of {3} characters</code>. But in my case, the warning never appeared in the log files.</p>



<h2 id="what-can-break" class="wp-block-heading">What can break?</h2>



<p class="wp-block-paragraph">I added a fourth <code>@AISERVICE</code> call to the same replicat, mapping a <code>CLOB</code> column (<code>big_description</code>) through the 1000 character model. I then tried pushing progressively larger inputs.</p>



<p class="wp-block-paragraph">With 100000 characters, the <code>countTokens</code> endpoint reports this input at 23679 tokens, way more than the documented <code>inputTokenLimit</code> of <code>gemini-embedding-001</code>. It applied without any error and produced a real 3072 dimension vector, distinct from every other vector in this blog.</p>



<pre class="wp-block-code"><code>SQL&gt; SELECT id, VECTOR_DIMS(desc_vector_bigtest) dims
FROM app_pdb26.products
WHERE id = 103;

ID  DIMS
--- ----
103 3072</code></pre>



<p class="wp-block-paragraph">Here, we can see that even the documented token limit of your provider might not stop the AI Service to work.</p>



<h3 id="reaching-quota-limit" class="wp-block-heading">Reaching quota limit</h3>



<p class="wp-block-paragraph">On top of the per-request token limit, depending on your billing settings, you might have a usage quota on the API key. A request can be rejected by Gemini, and this error is raised in <code>AIService.log</code>:</p>



<pre class="wp-block-code"><code>{
    "error": {
        "code": 429,
        "message": "You exceeded your current quota, please check your plan and billing details. For more information on this error, head to: https://ai.google.dev/gemini-api/docs/rate-limits. To monitor your current usage, head to: https://ai.dev/rate-limit. ",
        "status": "RESOURCE_EXHAUSTED"
    }
}</code></pre>



<p class="wp-block-paragraph">And in this case, the replicat abends with the following error:</p>



<pre class="wp-block-code"><code>2026-09-27 08:22:21  WARNING OGG-30679  Response from EMBED endpoint using model gemini_embed_max1000 returned error: code REMOTE_INFERENCE_FAILED, message 'HTTP 429 - Too Many Requests: {
  "error": {
    "code": 429,
    "message": "You exceeded your current quota, please check your plan and billing details. For more information on this error, head to: https://ai.google.dev/gemini-api/docs/rate-limits. To monitor your current usage, head to: https://ai.dev/rate-limit. ",
    "status": "RESOURCE_EXHAUSTED"
  }
}
'.

2026-09-27 08:22:21  WARNING OGG-01431  Canceled grouped transaction on PDB26.APP_PDB26.PRODUCTS, Mapping error.
2026-09-27 08:22:27  ERROR   OGG-01668  PROCESS ABENDING.</code></pre>



<h2 id="summary" class="wp-block-heading">Summary</h2>



<p class="wp-block-paragraph"><code>Maximum Input Characters</code> does not protect a replicat from an oversized <code>@AISERVICE</code> mapping. Because of this, the only real limit to your embeddings in GoldenGate is a usage quota. This can affect your replication, whether you rely on the setting for functional truncation or to lower your costs. Until the bug is fixed, be careful when using the AI Service!</p>
<p>L’article <a href="https://www.dbi-services.com/blog/goldengate-ai-service-bug-confirmed-in-the-maximum-input-characters-setting/">GoldenGate AI Service bug confirmed in the Maximum Input Characters setting</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.dbi-services.com/blog/goldengate-ai-service-bug-confirmed-in-the-maximum-input-characters-setting/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>GoldenGate 26ai automatic schema evolution: creating missing tables during an initial load</title>
		<link>https://www.dbi-services.com/blog/goldengate-26ai-automatic-schema-evolution-creating-missing-tables-during-an-initial-load/</link>
					<comments>https://www.dbi-services.com/blog/goldengate-26ai-automatic-schema-evolution-creating-missing-tables-during-an-initial-load/#respond</comments>
		
		<dc:creator><![CDATA[Julien Delattre]]></dc:creator>
		<pubDate>Mon, 05 Oct 2026 05:00:44 +0000</pubDate>
				<category><![CDATA[GoldenGate]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[26ai]]></category>
		<category><![CDATA[autoschema]]></category>
		<category><![CDATA[ddl]]></category>
		<category><![CDATA[Initial load]]></category>
		<category><![CDATA[microservices]]></category>
		<category><![CDATA[ogg]]></category>
		<category><![CDATA[postgresql]]></category>
		<category><![CDATA[replicat]]></category>
		<category><![CDATA[schema evolution]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=47508</guid>

					<description><![CDATA[<p>For as long as I have used GoldenGate, an initial load had one prerequisite: the target tables must already exist. Data Pump takes care of it between two Oracle databases. For anything else, you write the CREATE TABLE statements yourself, with the datatypes you choose, or choose another initial load method. The Automatic Schema Evolution [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/goldengate-26ai-automatic-schema-evolution-creating-missing-tables-during-an-initial-load/">GoldenGate 26ai automatic schema evolution: creating missing tables during an initial load</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">For as long as I have used GoldenGate, an initial load had one prerequisite: <strong>the target tables must already exist</strong>. Data Pump takes care of it between two Oracle databases. For anything else, you write the <code>CREATE TABLE</code> statements yourself, with the datatypes you choose, or choose another initial load method. The <strong>Automatic Schema Evolution</strong> feature launched in <a href="https://docs.oracle.com/en/database/goldengate/core/26/release-notes/new-features.html#GUID-F48FEF44-A714-4216-8BA0-4A7B9A220CBA" target="_blank" rel="noopener noreferrer">GoldenGate 26ai</a> promises to <em>“automatically detect and propagate supported schema changes as part of the replication flow”</em>. I wanted to see it work, so I tried it from an Oracle 19c PDB to a PostgreSQL database.</p>



<p class="wp-block-paragraph">And it works. The replicat creates the missing table itself, with a default datatype mapping, and loads the rows in the target.</p>



<p class="wp-block-paragraph">Automatic schema evolution is a <strong>preview feature</strong> in GoldenGate 26ai: its syntax, messages and behavior can change before it becomes generally available, so the results below apply to the 23.26.3 release I tested.</p>



<h2 id="how-it-works" class="wp-block-heading">How it works</h2>



<p class="wp-block-paragraph">The feature replicates table structure changes between databases of the same or of different types. The exception is Oracle to Oracle, where regular DDL replication is the solution. It also creates tables during an initial load. The replicat must be 26ai or higher, but the extract writing the trail can be 19c or higher. On a live trail, the replicat also adds a column that appears on the source. The documentation lists <code>ADD COLUMN</code> as the one supported <code>ALTER TABLE</code>. But <strong>an initial load never alters an existing table</strong>: it leaves it alone or, with <code>OPTYPE RECREATE</code>, drops and recreates it.</p>



<p class="wp-block-paragraph">The replicat does not need anything from the source database. It builds the <code>CREATE TABLE</code> statement from the <strong>Table Definition Record</strong> (TDR) that GoldenGate already writes in the trail file.</p>



<p class="wp-block-paragraph"><code>AUTOSCHEMA</code> is a replicat-only option of <code>DDL</code>: the <code>DDL</code> parameter of the extract does not accept it. I put <code>DDL AUTOSCHEMA INCLUDE ALL</code> in the extract’s parameter file. The extract abends at startup with the same parsing error as an unrecognized keyword:</p>



<pre class="wp-block-code"><code>2026-09-26T05:54:27Z  ERROR   OGG-10151  (EXTPGL.prm) line 3: Parsing error, parameter &#091;DDL] has unrecognized keyword or extra value "AUTOSCHEMA".</code></pre>



<p class="wp-block-paragraph">That makes sense given what the feature does. It creates missing tables on the target, and the extract never touches the target database.</p>



<h2 id="the-setup" class="wp-block-heading">The setup</h2>



<ul class="wp-block-list">
<li>Source: Oracle 19c, <code>PDB1</code>, schema <code>AUTOSCH</code>, table <code>AUTOSCH.T1</code> with 5 rows, managed by the 26ai deployment <code>ogg_test_01</code> in GoldenGate <code>23.26.3.0.0</code>.</li>



<li>Target: PostgreSQL 16, database <code>pgstore</code>, an empty schema <code>autosch</code>, managed by a <strong>separate</strong> deployment <code>ogg_pg_01</code> from GoldenGate for PostgreSQL <code>23.26.3.0.1</code>.</li>
</ul>



<p class="wp-block-paragraph">The source table:</p>



<pre class="wp-block-code"><code>CREATE TABLE autosch.t1 (
    id NUMBER PRIMARY KEY,
    name VARCHAR2(50),
    amount NUMBER(10,2),
    created DATE DEFAULT SYSDATE
);</code></pre>



<p class="wp-block-paragraph">For the initial load, on the <code>ogg_test_01</code> deployment, <code>EXTPGL</code> is added as a <code>SOURCEISTABLE</code> extract.</p>



<pre class="wp-block-code"><code>OGG (http://localhost:7810 ogg_test_01) 2&gt; DBLOGIN USERIDALIAS pdb1 DOMAIN OracleGoldenGate
Successfully logged into database PDB1.

OGG (http://localhost:7810 ogg_test_01 as pdb1@CDB01/PDB1) 3&gt; ADD EXTRACT EXTPGL, SOURCEISTABLE
2026-09-26T05:53:26Z  INFO    OGG-08100  Extract added.

OGG (http://localhost:7810 ogg_test_01 as pdb1@CDB01/PDB1) 4&gt; EDIT PARAMS EXTPGL
2026-09-26T05:53:26Z  INFO    OGG-10183  Parameter file EXTPGL.prm passed validity check.

OGG (http://localhost:7810 ogg_test_01 as pdb1@CDB01/PDB1) 5&gt; VIEW PARAMS EXTPGL
EXTRACT EXTPGL
USERIDALIAS pdb1 DOMAIN OracleGoldenGate
EXTFILE p1 MEGABYTES 100 PURGE
TABLE AUTOSCH.T1;

OGG (http://localhost:7810 ogg_test_01 as pdb1@CDB01/PDB1) 6&gt; START EXTRACT EXTPGL
2026-09-26T05:53:26Z  INFO    OGG-00975  Extract group EXTPGL starting.
2026-09-26T05:53:26Z  INFO    OGG-15426  Extract group EXTPGL started.</code></pre>



<p class="wp-block-paragraph">The extract report confirms the 5 rows went out to the file:</p>



<pre class="wp-block-code"><code>Report at 2026-09-26 05:53:26 (activity since 2026-09-26 05:53:26)

Output to p1:

From table AUTOSCH.T1:
       #                   inserts:         5
       #                   updates:         0
       #                   deletes:         0
       #                   upserts:         0
       #                  discards:         0</code></pre>



<p class="wp-block-paragraph">The target is a separate deployment, <code>ogg_pg_01</code>, from the Oracle GoldenGate for PostgreSQL binaries. A distribution path delivers the <code>p1</code> trail from <code>ogg_test_01</code> to <code>ogg_pg_01</code>. The replicat there, <code>REPPGL</code>, is added straight against the trail name, with <code>EXTSEQNO 0</code> telling it where to start reading. The checkpoint table is <code>oggadmin.checkpoint</code>:</p>



<pre class="wp-block-code"><code>OGG (http://localhost:7859 ogg_pg_01) 2&gt; DBLOGIN USERIDALIAS pgalias DOMAIN OracleGoldenGate
Successfully logged into database.

OGG (http://localhost:7859 ogg_pg_01 as pgalias@pgstore) 3&gt; ADD REPLICAT REPPGL, EXTFILE p1, EXTSEQNO 0, CHECKPOINTTABLE oggadmin.checkpoint
2026-09-26T09:14:42Z  INFO    OGG-30509  Connected to database server using ODBC DSN: ogg_pg_01 with SSLMODE 'disable'
2026-09-26T09:14:42Z  INFO    OGG-08100  Replicat added.</code></pre>



<h2 id="baseline-without-the-feature" class="wp-block-heading">Baseline: without the feature</h2>



<p class="wp-block-paragraph"><code>REPPGL</code>’s parameter file starts with just a <code>MAP</code>, no <code>DDL</code> clause at all:</p>



<pre class="wp-block-code"><code>REPLICAT REPPGL
TARGETDB ogg_pg_01 USERIDALIAS pgalias DOMAIN OracleGoldenGate
MAP AUTOSCH.*, TARGET AUTOSCH.*;</code></pre>



<p class="wp-block-paragraph">With this replicat, the initial load stops on the first table, as it always did:</p>



<pre class="wp-block-code"><code>2026-09-26 05:52:11  WARNING OGG-00869  Could not retrieve definition for table AUTOSCH.T1.
2026-09-26 05:52:11  ERROR   OGG-00199  Table AUTOSCH.T1 does not exist in target database.</code></pre>



<h2 id="enabling-automatic-schema-evolution" class="wp-block-heading">Enabling automatic schema evolution</h2>



<p class="wp-block-paragraph">The feature is called <code>AUTOSCHEMA</code>, but as a parameter on a line by itself, it is rejected:</p>



<pre class="wp-block-code"><code>2026-09-26T05:52:30Z  ERROR   OGG-10141  (REPPGL.prm) line 3 column 1: Parsing error, value "AUTOSCHEMA" syntax error.
2026-09-26T05:52:30Z  ERROR   OGG-10184  Parameter file REPPGL.prm failed validity check.</code></pre>



<p class="wp-block-paragraph"><code>AUTOSCHEMA</code> is an <strong>option of the <code>DDL</code> parameter</strong>, followed by the usual <code>INCLUDE</code> and <code>EXCLUDE</code> clauses:</p>



<pre class="wp-block-code"><code>REPLICAT REPPGL
TARGETDB ogg_pg_01 USERIDALIAS pgalias DOMAIN OracleGoldenGate
DDL AUTOSCHEMA INCLUDE ALL
MAP AUTOSCH.*, TARGET AUTOSCH.*;</code></pre>



<p class="wp-block-paragraph">The replicat starts and announces the feature, then finds the table missing and creates it:</p>



<pre class="wp-block-code"><code>2026-09-26 05:52:41  INFO    OGG-30684  The Automatic Schema Evolution feature is enabled. Please refer to the GoldenGate documentation for the supported operations, the datatype mappings, and the corresponding parameter options to enable/disable/override the functionality.
2026-09-26 05:52:41  WARNING OGG-00869  Could not retrieve definition for table AUTOSCH.T1.
2026-09-26 05:52:41  WARNING OGG-30633  Table AUTOSCH.T1 does not exist in target database, AutoSchema will attempt to create the missing table.
2026-09-26 05:52:41  INFO    OGG-02756  The definition for table AUTOSCH.T1 is obtained from the trail file.</code></pre>



<p class="wp-block-paragraph">The same warning <code>OGG-00869</code> as in the baseline is still there. But it is followed by <code>OGG-30633</code> and by <code>OGG-02756</code>, which shows that the definition comes from the trail file. In PostgreSQL:</p>



<pre class="wp-block-code"><code>pgstore=# \d autosch.t1
                            Table "autosch.t1"
 Column  |              Type              | Collation | Nullable | Default
---------+--------------------------------+-----------+----------+---------
 id      | character varying(50)          |           | not null |
 name    | character varying(50)          |           |          |
 amount  | numeric(10,2)                  |           |          |
 created | timestamp(0) without time zone |           |          |
Indexes:
    "t1_pkey" PRIMARY KEY, btree (id)

pgstore=# select * from autosch.t1 order by 1;
 id | name  | amount |       created
----+-------+--------+---------------------
 1  | row 1 |  10.25 | 2026-09-26 05:43:53
 2  | row 2 |  20.50 | 2026-09-26 05:43:53
 3  | row 3 |  30.75 | 2026-09-26 05:43:53
 4  | row 4 |  41.00 | 2026-09-26 05:43:53
 5  | row 5 |  51.25 | 2026-09-26 05:43:53
(5 rows)</code></pre>



<p class="wp-block-paragraph"><strong>The table was created, the primary key too, and the 5 rows were loaded.</strong> This is the default datatype mapping at work:</p>



<figure class="wp-block-table"><table><thead><tr><th>Oracle column</th><th>PostgreSQL column</th></tr></thead><tbody><tr><td><code>ID NUMBER</code> (primary key)</td><td><code>character varying(50)</code></td></tr><tr><td><code>NAME VARCHAR2(50)</code></td><td><code>character varying(50)</code></td></tr><tr><td><code>AMOUNT NUMBER(10,2)</code></td><td><code>numeric(10,2)</code></td></tr><tr><td><code>CREATED DATE</code></td><td><code>timestamp(0) without time zone</code></td></tr></tbody></table></figure>



<p class="wp-block-paragraph">The primary key is the surprise: a <code>NUMBER</code> without precision becomes a <code>varchar</code> on PostgreSQL. Check the mapping before you let a replicat create tables that an application will query. It can be overridden, which is the subject of another post.</p>



<h2 id="what-happens-when-the-table-already-exists" class="wp-block-heading">What happens when the table already exists</h2>



<p class="wp-block-paragraph">Between two loads, I added a column to the source table (<code>ALTER TABLE autosch.t1 ADD (note VARCHAR2(20) DEFAULT 'added')</code>). I also inserted a stray row in the PostgreSQL table. Then I reran <code>EXTPGL</code> and pointed the same <code>REPPGL</code>, still with <code>DDL AUTOSCHEMA INCLUDE ALL</code>, at the new file. It did <strong>not</strong> change the existing table:</p>



<pre class="wp-block-code"><code>2026-09-26 05:53:26  INFO    OGG-06511  Using following columns in default map by name: id, name, amount, created.
2026-09-26 05:53:26  WARNING OGG-01004  Canceled grouped transaction on table autosch.t1. Database error 3505685, (SQLState = 23000 SQLError = 3,505,685 SQLErrorHex = 00357e15 SQLErrorText = &#091;Oracle]&#091;ODBC PostgreSQL Wire Protocol driver]&#091;PostgreSQL]ERROR: VERROR; duplicate key value violates unique constraint "t1_pkey"(Detail Key (id)=(1) already exists.; sautosch; tt1; nt1_pkey; File nbtinsert.c; Line 666; Routine _bt_check_unique; )).
2026-09-26 05:53:26  ERROR   OGG-01296  Error mapping from AUTOSCH.T1 to autosch.t1.</code></pre>



<p class="wp-block-paragraph">The new source column <code>NOTE</code> is silently left out of the column mapping: <strong>an initial load does not alter an existing table</strong>. The load then abends on <code>duplicate key value violates unique constraint "t1_pkey"</code>, as the rows are already there. So <code>DDL AUTOSCHEMA INCLUDE ALL</code> creates <strong>missing</strong> tables only.</p>



<p class="wp-block-paragraph">The documentation says that for an initial load trail, <code>DDL AUTOSCHEMA</code> <em>“automatically creates or replaces target tables”</em>. It does not say how to get the replacement. The replicat binary has a <code>RECREATE</code> token, and it is a DDL <strong>operation type</strong>, so it goes in the <code>INCLUDE</code> filter:</p>



<pre class="wp-block-code"><code>DDL AUTOSCHEMA INCLUDE ALL OPTYPE RECREATE</code></pre>



<h3 id="testing-recreate" class="wp-block-heading">Testing <code>RECREATE</code></h3>



<p class="wp-block-paragraph">To see what <code>RECREATE</code> does, I prepare a PostgreSQL table that already exists. It has a column that is not on the source and a row that is not in the load:</p>



<pre class="wp-block-code"><code>CREATE TABLE autosch.t1 (
  id varchar(50) PRIMARY KEY,
  name varchar(50),
  amount numeric(10,2),
  created timestamp(0),
  legacy text
);
INSERT INTO autosch.t1 (id, name, legacy)
VALUES ('99', 'stray row', 'pre-existing');</code></pre>



<p class="wp-block-paragraph">The initial load is delivered the way the documentation describes it:</p>



<ul class="wp-block-list">
<li>A <code>SOURCEISTABLE</code> extract writes the 5 rows of <code>AUTOSCH.T1</code> to the extract file <code>ci</code>.</li>



<li>A distribution path sends <code>ci</code> to the receiver of the PostgreSQL deployment, as the trail <code>di</code>.</li>



<li>A replicat reads the trail <code>di</code> with <code>DDLOPTIONS REPORT</code> and an explicit <code>MAP AUTOSCH.T1, TARGET AUTOSCH.T1;</code>.</li>
</ul>



<p class="wp-block-paragraph">With <code>DDL AUTOSCHEMA INCLUDE ALL</code>, the replicat recognizes the initial load by itself. It builds a <code>RECREATE</code> operation from the table definition record, then <strong>excludes it</strong>: <code>INCLUDE ALL</code> does not cover that operation type.</p>



<pre class="wp-block-code"><code>2026-10-03 13:11:47  INFO    OGG-00489  DDL is of mapped scope, after mapping new operation &#091; /* AutoSchema */ create table "autosch"."t1" (ID varchar(50) not null, NAME varchar(50), AMOUNT decimal(10,2), CREATED timestamp(0), primary key(ID)) (size 150)].
2026-10-03 13:11:47  INFO    OGG-00488  DDL operation excluded &#091;not included by any filter], optype &#091;RECREATE], objtype &#091;TABLE], objowner "autosch", objname "t1".</code></pre>



<p class="wp-block-paragraph">The 5 rows are loaded into the existing table, next to the stray row, and the <code>legacy</code> column is still there:</p>



<pre class="wp-block-code"><code> id |   name    | amount |       created       |    legacy
----+-----------+--------+---------------------+--------------
 1  | row 1     |  10.25 | 2026-09-26 09:11:40 |
 2  | row 2     |  20.50 | 2026-09-26 09:11:40 |
 3  | row 3     |  30.75 | 2026-09-26 09:11:40 |
 4  | row 4     |  41.00 | 2026-09-26 09:11:40 |
 5  | row 5     |  51.25 | 2026-09-26 09:11:40 |
 99 | stray row |        |                     | pre-existing
(6 rows)</code></pre>



<h3 id="second-run-with-the-recreate-filter" class="wp-block-heading">Second run with the <code>RECREATE</code> filter</h3>



<p class="wp-block-paragraph">The parameter file for this second run only differs from the previous one by the <code>OPTYPE RECREATE</code> filter:</p>



<pre class="wp-block-code"><code>REPLICAT REPPGL
TARGETDB ogg_pg_01 USERIDALIAS pgalias DOMAIN OracleGoldenGate
DDLOPTIONS REPORT
DDL AUTOSCHEMA INCLUDE ALL OPTYPE RECREATE
MAP AUTOSCH.T1, TARGET AUTOSCH.T1;</code></pre>



<p class="wp-block-paragraph">With this file and the same table reset, the replicat warns about what it is going to do, then drops the table:</p>



<pre class="wp-block-code"><code>2026-10-03 13:12:34  WARNING OGG-30687  The OPTYPE 'RECREATE' is specified with DDL AUTOSCHEMA option. Please note that the corresponding pre-existing tables will be attempted to be dropped and re-created, only when the REPLICAT is applying initial load trail files. In case of CDC trails, REPLICAT would attempt to create the tables, only when the corresponding tables do not exist already.
2026-10-03 13:12:34  INFO    OGG-00487  DDL operation included &#091;INCLUDE ALL OPTYPE RECREATE], optype &#091;RECREATE], objtype &#091;TABLE], objowner "autosch", objname "t1".
2026-10-03 13:12:34  INFO    OGG-30640  Table autosch.t1 is dropped successfully.
2026-10-03 13:12:34  INFO    OGG-00484  Executing DDL operation.
2026-10-03 13:12:34  INFO    OGG-00483  DDL operation successful.</code></pre>



<p class="wp-block-paragraph">The table is recreated from the table definition record and loaded, and <strong>the <code>legacy</code> column and the stray row are gone</strong>.</p>



<pre class="wp-block-code"><code>                            Table "autosch.t1"
 Column  |              Type              | Collation | Nullable | Default
---------+--------------------------------+-----------+----------+---------
 id      | character varying(50)          |           | not null |
 name    | character varying(50)          |           |          |
 amount  | numeric(10,2)                  |           |          |
 created | timestamp(0) without time zone |           |          |
Indexes:
    "t1_pkey" PRIMARY KEY, btree (id)

 id | name  | amount |       created
----+-------+--------+---------------------
 1  | row 1 |  10.25 | 2026-09-26 09:11:40
 2  | row 2 |  20.50 | 2026-09-26 09:11:40
 3  | row 3 |  30.75 | 2026-09-26 09:11:40
 4  | row 4 |  41.00 | 2026-09-26 09:11:40
 5  | row 5 |  51.25 | 2026-09-26 09:11:40
(5 rows)</code></pre>



<p class="wp-block-paragraph">No parameter tells the replicat that it applies an initial load: a trail written by a <code>SOURCEISTABLE</code> extract is enough. I got the same drop and recreate in three setups. The replicat was added on the trail with <code>EXTTRAIL</code>, added with <code>EXTFILE</code>, or reading a copy of the raw extract file. On a CDC trail, <code>RECREATE</code> does not drop anything, as the warning says.</p>



<h3 id="a-wildcard-map-breaks-recreate-on-postgresql" class="wp-block-heading">A wildcard <code>MAP</code> breaks <code>RECREATE</code> on PostgreSQL</h3>



<p class="wp-block-paragraph">The <code>MAP</code> of the previous test was explicit (<code>MAP AUTOSCH.T1, TARGET AUTOSCH.T1;</code>). The baseline of this post used <code>MAP AUTOSCH.*, TARGET AUTOSCH.*;</code>. I replaced it with the wildcard on the same table and the same trail, and nothing else changed:</p>



<pre class="wp-block-code"><code>REPLICAT REPPGL
TARGETDB ogg_pg_01 USERIDALIAS pgalias DOMAIN OracleGoldenGate
DDLOPTIONS REPORT
DDL AUTOSCHEMA INCLUDE ALL OPTYPE RECREATE
MAP AUTOSCH.*, TARGET AUTOSCH.*;</code></pre>



<p class="wp-block-paragraph">This time, <strong>the replicat never drops the table</strong>. There is no <code>OGG-30640</code> in the report, and the <code>CREATE TABLE</code> that follows abends because the table is still there:</p>



<pre class="wp-block-code"><code>2026-10-03 13:17:02  INFO    OGG-06506  Wildcard MAP resolved (entry AUTOSCH.*): MAP "AUTOSCH"."T1", TARGET AUTOSCH."T1".
2026-10-03 13:17:02  INFO    OGG-00487  DDL operation included &#091;INCLUDE ALL OPTYPE RECREATE], optype &#091;RECREATE], objtype &#091;TABLE], objowner "autosch", objname "T1".
2026-10-03 13:17:02  INFO    OGG-00484  Executing DDL operation.
2026-10-03 13:17:02  ERROR   OGG-00519  Fatal error executing DDL replication: error &#091;Error code &#091;6844183], &#091;Oracle]&#091;ODBC PostgreSQL Wire Protocol driver]&#091;PostgreSQL]ERROR: VERROR; relation "t1" already exists(File heap.c; Line 1167; Routine heap_create_with_catalog; )], no error handler present.
2026-10-03 13:17:02  ERROR   OGG-30538  Fatal error executing DDL statement &#091; /* AutoSchema */ create table "autosch"."t1" (ID varchar(50) not null, NAME varchar(50), AMOUNT decimal(10,2), CREATED timestamp(0), primary key(ID))].</code></pre>



<p class="wp-block-paragraph">The first line of the report explains it. The wildcard is resolved from the table name in the trail, so the target becomes <code>AUTOSCH."T1"</code>: the case of the source (uppercase on Oracle), and quoted. PostgreSQL stores an unquoted name in lowercase, so my existing table is <code>t1</code>, not <code>"T1"</code>. The replicat looks for <code>"T1"</code> to drop it, finds nothing, and the <code>CREATE TABLE</code> that follows hits the real <code>t1</code>. To check this, I created the existing table in PostgreSQL as <code>"T1"</code> (quoted, so uppercase). Then I ran the same wildcard replicat: <strong>this time the drop works</strong>.</p>



<pre class="wp-block-code"><code>2026-10-03 13:27:14  INFO    OGG-06506  Wildcard MAP resolved (entry AUTOSCH.*): MAP "AUTOSCH"."T1", TARGET AUTOSCH."T1".
2026-10-03 13:27:14  INFO    OGG-00487  DDL operation included &#091;INCLUDE ALL OPTYPE RECREATE], optype &#091;RECREATE], objtype &#091;TABLE], objowner "autosch", objname "T1".
2026-10-03 13:27:14  INFO    OGG-30640  Table autosch.T1 is dropped successfully.
2026-10-03 13:27:14  INFO    OGG-00483  DDL operation successful.</code></pre>



<p class="wp-block-paragraph">The names are matched exactly. With an explicit <code>MAP AUTOSCH.T1, TARGET AUTOSCH."T1";</code> on a lowercase <code>t1</code>, the replicat created a second table <code>"T1"</code> and left <code>t1</code> alone. Without quotes, the target of an explicit <code>MAP</code> is lowercased for PostgreSQL, which is why the first test dropped <code>t1</code>. So with <code>RECREATE</code> on PostgreSQL, the target name in the <code>MAP</code> must be spelled exactly like the existing table. Write <strong>one explicit <code>MAP</code> per table</strong>, unquoted for a lowercase table. The <code>RECREATE</code> parameter file with the explicit <code>MAP</code> above does exactly that.</p>



<h2 id="limitations" class="wp-block-heading">Limitations</h2>



<ul class="wp-block-list">
<li><p><strong><code>AUTOSCHEMA</code> is not for Oracle-to-Oracle replication.</strong> Pointing the same <code>DDL AUTOSCHEMA INCLUDE ALL</code> replicat at an Oracle target instead of PostgreSQL abends immediately:</p>
<div class="code-block-wrapper"><pre tabindex="0" data-language="text"><code>2026-09-26 05:54:11  ERROR   OGG-30624  AUTOSCHEMA is not allowed in an Oracle to Oracle replication scenario. Please use the DDL replication to control schema evolution.</code></pre></div>
<p>Between two Oracle databases, regular DDL replication is still the standard tool for schema evolution, and a GoldenGate initial load still has no automatic way to create the target table.</p></li>



<li><p>The trail must be format 19.1 or higher with Table Definition Records.</p></li>



<li><p><code>UNMAPPED</code> and <code>OTHER</code> scope are <strong>not valid with <code>AUTOSCHEMA</code></strong>. Adding <code>INCLUDE UNMAPPED</code> (or <code>INCLUDE OTHER</code>) next to <code>INCLUDE ALL</code> parses fine, but the replicat rejects it at startup:</p>
<div class="code-block-wrapper"><pre tabindex="0" data-language="text"><code>2026-09-26 07:12:06  ERROR   OGG-30689  The 'UNMAPPED' is not a valid DDL SCOPE to be used with Automatic Schema Evolution.</code></pre></div></li>
</ul>



<h2 id="to-summarize" class="wp-block-heading">To summarize</h2>



<ul class="wp-block-list">
<li>Automatic schema evolution is enabled on the replicat with <code>DDL AUTOSCHEMA INCLUDE ALL</code>.</li>



<li>During an initial load from Oracle to PostgreSQL, it creates the missing table and its primary key from the Table Definition Record of the trail (<code>OGG-30633</code>). Then it loads the rows.</li>



<li>The datatypes come from a default mapping: check it first, as a <code>NUMBER</code> primary key became a <code>varchar(50)</code>.</li>



<li>An initial load leaves an existing table alone. A column added on the source is not added on the target, and the rows are loaded into it.</li>



<li><code>DDL AUTOSCHEMA INCLUDE ALL OPTYPE RECREATE</code> drops and recreates an existing table, only when the trail is an initial load trail (<code>OGG-30640</code>). <code>INCLUDE ALL</code> alone excludes that operation (<code>OGG-00488</code>).</li>



<li>Use one explicit <code>MAP</code> per table with <code>RECREATE</code> on PostgreSQL. A wildcard <code>MAP</code> looks for the table under the source name in quotes and misses a lowercase table. The <code>CREATE TABLE</code> then abends with <code>relation "t1" already exists</code>.</li>



<li>It is not available between two Oracle databases. Pointing it at an Oracle target from an Oracle source abends with <code>OGG-30624</code>. An Oracle-to-Oracle initial load still needs the target table to already exist, exactly as before.</li>
</ul>
<p>L’article <a href="https://www.dbi-services.com/blog/goldengate-26ai-automatic-schema-evolution-creating-missing-tables-during-an-initial-load/">GoldenGate 26ai automatic schema evolution: creating missing tables during an initial load</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.dbi-services.com/blog/goldengate-26ai-automatic-schema-evolution-creating-missing-tables-during-an-initial-load/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>SOUG Day October 2026</title>
		<link>https://www.dbi-services.com/blog/soug-day-october-2026/</link>
					<comments>https://www.dbi-services.com/blog/soug-day-october-2026/#respond</comments>
		
		<dc:creator><![CDATA[Marc Wagner]]></dc:creator>
		<pubDate>Fri, 02 Oct 2026 19:47:51 +0000</pubDate>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[SOUG]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=47399</guid>

					<description><![CDATA[<p>What a great and interesting day I could spent today at the SOUG Day which took place at the SIX ConventionPoint in Zurich. Thanks to the whole SOUG team for the great organization and to all the speakers for the interesting sessions. Oracle Database Mission-critical Technologies by Ashish Ray (Oracle) In his presentation, Ashish definitively [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/soug-day-october-2026/">SOUG Day October 2026</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">What a great and interesting day I could spent today at the SOUG Day which took place at the SIX ConventionPoint in Zurich. Thanks to the whole SOUG team for the great organization and to all the speakers for the interesting sessions.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="768" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9951-1024x768.jpg" alt="" class="wp-image-47401" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9951-1024x768.jpg 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9951-300x225.jpg 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9951-768x576.jpg 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9951-1536x1152.jpg 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9951-2048x1536.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="768" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9953-1024x768.jpg" alt="" class="wp-image-47402" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9953-1024x768.jpg 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9953-300x225.jpg 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9953-768x576.jpg 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9953-1536x1152.jpg 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9953-2048x1536.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>


<a class="wp-block-read-more" href="https://www.dbi-services.com/blog/soug-day-october-2026/" target="_self">Read more<span class="screen-reader-text">: SOUG Day October 2026</span></a>


<h3>Oracle Database Mission-critical Technologies by Ashish Ray (Oracle)</h3>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="543" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9955-1024x543.jpg" alt="" class="wp-image-47412" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9955-1024x543.jpg 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9955-300x159.jpg 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9955-768x407.jpg 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9955-1536x814.jpg 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9955-2048x1085.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">In his presentation, Ashish definitively confirmed that the new driver is AI. We discuss about the roadmap and latest innovations in Oracle AI database.<br>Trusted AI is a very important case, as we need to have trust in the AI application to access the data, and this is not easy to accept.<br>Deep data security uniquely enables enterprises to declare flexible and powerful end-user specific data privacy rules in the database.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="768" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9956-1024x768.jpg" alt="" class="wp-image-47413" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9956-1024x768.jpg 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9956-300x225.jpg 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9956-768x576.jpg 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9956-1536x1152.jpg 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9956-2048x1536.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Extreme performance subject was also highlighted. Next-generation intelligent Data Architecture, with Exadata evolution, is very important.<br>Exadata Exascale, new modern storage architecture is the future and will certainly replace ASM. With Exascale, storage management tasks are moved directly onto the storage servers. It is the next generation storage.<br>We also addressed Exadata system software new features. 26.2 release has just been announced recently.</p>



<p class="wp-block-paragraph">The next big part is High availability and scalability. 26ai brings a lot in Maximum Availability Architecture (MAA) features. The great example is the how faster database role transitions in Oracle Data Guard now is. Comparing 19c and 26ai, for small configuration, the switchover duration was reduced from 76s to 22s, and failover duration from 80s to 15s. For large configuration, the duration drops down from 77s to 29s for switchover and 94s to 26s for failover. Ashish mentioned the great work of Ludovico teams. We can easily find this information in Ludovico blogs: <a href="https://www.ludovicocaldara.net/blog/dg-26ai-faster-role-transitions/">https://www.ludovicocaldara.net/blog/dg-26ai-faster-role-transitions/</a>.</p>



<p class="wp-block-paragraph">Ashish also recommended to have multiple standby per regions mentioning the recent event that happened in the world.</p>



<p class="wp-block-paragraph">We also spoke about Intelligent data protection with On-Premises ZDLRA (zero data loss recovery appliance) and ZRCV (zero data loss autonomous recovery service) in the cloud. It is so easy to enable automatic backup in the Cloud and choosing as backup destination autonomous recovery service, will guarantee customer RPO.</p>



<p class="wp-block-paragraph">Ashish also highlighted deployment flexibility across on-premises and the cloud with On-premises databases, exadata Cloud@Customer (hybrid cloud), public cloud exadata database service, &#8230;<br>ODA on premises, with Oracle Base Database Cloud@Customer,  has also now its public cloud solution. You can read more here.<br><a href="https://blogs.oracle.com/database/announcing-oracle-base-database-cloudcustomer">https://blogs.oracle.com/database/announcing-oracle-base-database-cloudcustomer</a></p>



<p class="wp-block-paragraph">Also know that exadata database-developer is available at no cost for develppers.</p>



<h3>What&#8217;s new in the third edition of troubleshooting Oracle Performance by Chris Antognini</h3>



<p class="wp-block-paragraph">Chris presented some great updates in terms of performance troubleshooting that 26ai is bringing. He wrote a third edition from his book, titled &#8220;Troubleshooting Oracle Performance&#8221; that will be available in December this year.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="768" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9964-1024x768.jpg" alt="" class="wp-image-47416" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9964-1024x768.jpg 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9964-300x225.jpg 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9964-768x576.jpg 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9964-1536x1152.jpg 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9964-2048x1536.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph"><br>We talked about several topics like:</p>



<p class="wp-block-paragraph"><strong>Signatures:</strong></p>



<ul class="wp-block-list">
<li>Signatures are used to recognize SQL statements that are equivalent from a functional point of view</li>



<li>DBMS_SQLTUNE.SQLTXT_TO_SIGNATURE</li>



<li>SYS.SQLLOG$ is containing the signature of SQL statements that were executed in the past
<ul class="wp-block-list">
<li>19.11 bug 32238935 mix of both literals and bind variables leads to a wrong computation o fthe force-matching signature</li>
</ul>
</li>
</ul>



<p class="wp-block-paragraph"><strong>Possibility in 23ai to push down group-by function when using union all (23+):</strong></p>



<ul class="wp-block-list">
<li>Push group by clauses inside views or inline views that contain union all operators</li>



<li>cost based query transformation</li>
</ul>



<p class="wp-block-paragraph"><strong>Subsumption of views and subqueries:</strong></p>



<ul class="wp-block-list">
<li>Purpose is to replace multiple query blocks that are created due to views, inline views or subqueries accessing the same tables with one query block</li>



<li>Purpose is to avoid double execution</li>
</ul>



<p class="wp-block-paragraph"><strong>DBMS_STATS: gather stale option specific when gathering object statistics at the database or schema level</strong></p>



<ul class="wp-block-list">
<li>only objects with stale statistics are processed</li>



<li>23.7 DBA_AUTO_STAT_OBJ_GATHER_DETAILS view with column REASON_TO_GATHER will give the reason why stats were gathered</li>
</ul>



<p class="wp-block-paragraph"><strong>Dynamic statistics/sampling and PL/SQL functions (23.8):</strong></p>



<ul class="wp-block-list">
<li>Sampling queries only call PL/SQL functions that are referenced in predicates</li>



<li>DYNAMIC_STATS preference: choose, on, off</li>
</ul>



<p class="wp-block-paragraph"><strong>Add verified SQL Plan baseline (23.3):</strong></p>



<ul class="wp-block-list">
<li>Let the database engine search for the best-known execution plan for a given SQL statement</li>



<li>New function ADD_VERIFIED_SQL_PLAN_BASELINE provided by DBMS_SPM package</li>



<li>Backported to 19c starting 19.22</li>
</ul>



<p class="wp-block-paragraph"><strong>Real-time SQL Plan Management (23):</strong></p>



<ul class="wp-block-list">
<li>verify during a hard parse if the exec plan is the same as one one contained in ASTS</li>



<li>AUTO_SPM_EVOLVE_TASK=AUTO</li>
</ul>



<p class="wp-block-paragraph"><strong>IN conditions with many expressions (23.4):</strong></p>



<ul class="wp-block-list">
<li>long lists of expressions frequently lead to performace problems, in condition with 64 or more expressions re implemetned differently when a full table sacn is executed</li>



<li>instead of using disjunctive predicates a key vector containing the expressions is created</li>
</ul>



<p class="wp-block-paragraph"><strong>Parallel executions downgrades:</strong></p>



<ul class="wp-block-list">
<li>downgrades are now outlined in real-time monitoring reports</li>



<li>x$qksxa_reason to find what the code means (degree of parallelism downgrade reason)</li>
</ul>



<p class="wp-block-paragraph"><strong>Logical Partition change tracking (23+):</strong></p>



<ul class="wp-block-list">
<li>For materialized view the database can track the staleness at the table and partition level</li>



<li>23 comes with logical PCT (partition change tracking) that means the database is able to use logical range partitions now</li>



<li>Logical PCT will help on faster refresh</li>
</ul>



<p class="wp-block-paragraph">I also would like to hightlight that Chris had really good demos.</p>



<h3>Beyond the Service Request: A view from the other side of the screen by Laurentiu Cotescu (Oracle)</h3>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="768" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9965-1024x768.jpg" alt="" class="wp-image-47421" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9965-1024x768.jpg 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9965-300x225.jpg 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9965-768x576.jpg 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9965-1536x1152.jpg 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9965-2048x1536.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Purpose of this presentation is for us to somehow meet the support guys, people working behind a Service Request.</p>



<p class="wp-block-paragraph">Laurentiu talked about Oracle EU Sovereign Cloud.<br>But What is Oracle EU Sovereign Cloud?<br>Oracle EU Sovereign Cloud enables commercial and public sector organizations to place sensitive data and applications in the cloud—in alignment with EU data privacy and sovereignty requirements.</p>



<p class="wp-block-paragraph">Laurentiu provided us some inside of oracle support. When we go to MOS and log a SR, Oracle support expect for fast handling to have following information already mentioned during SR creation: Problem summary, OCID&#8217;s, timestamp of the issue, exadata cloud versions, evidence with logs as of TFA logs, business impact. <br>Setting the right severity is also important:<br>Critical Outage -&gt; SEV 1<br>Significant Impairment -&gt; SEV 2<br>Technical issue -&gt; SEV 3<br>General Guidance -&gt; SEV 4</p>



<p class="wp-block-paragraph">Critical outage + system unavailable + production env -&gt; Most critical, management of oracle support will be informed.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
Product classification very important to have the SR going in the right queue.
</pre></div>


<p class="wp-block-paragraph">And what does Oracle Development? <br>Oracle Developpement is composed of product engineering behind software improvements and fixes. They will work with support on production issue, develop product capabilities and code fixes and fix delivery (patches and Release Updates).</p>



<p class="wp-block-paragraph">When the progress feels slow, what can we do?</p>



<ul class="wp-block-list">
<li>Option 1 &#8211; Trigger/initiate Chat widget, type agent to connect with a live agent
<ul class="wp-block-list">
<li>Describe the business impact, is there WA, explain the concern, &#8230;</li>
</ul>
</li>



<li>Option 2 &#8211; Request manager Actions from Details page
<ul class="wp-block-list">
<li>Front line manager or level 1 duty manager or level 2 director and duty (after 45 min of no reaction)</li>
</ul>
</li>
</ul>



<p class="wp-block-paragraph">How can we do Better together?</p>



<ul class="wp-block-list">
<li>Initiate zoom session (or any other conference system, just need to provide an invitation link) after several goes and back</li>



<li>Proactive Milestone SR procedural document &#8211; KB127520</li>



<li>Request manager action to ask for a consolidated ownership of all the SRs opened</li>



<li>Useful exchange with impact, context, evidence, &#8230;</li>
</ul>



<p class="wp-block-paragraph">Once SR is created, there is no more AI agent or chatbot. AI is only used as tool like AI parsers to help analyzing the logs.</p>



<h3>Upgrade to Oracle AI Database 26ai &#8211; Best Practices and more by Mike Dietrich</h3>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="768" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9966-1024x768.jpg" alt="" class="wp-image-47422" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9966-1024x768.jpg 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9966-300x225.jpg 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9966-768x576.jpg 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9966-1536x1152.jpg 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9966-2048x1536.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">As you know Mike Dietrich, we spoke a lot about patching and upgrade.</p>



<p class="wp-block-paragraph">Mike spoke about release strategy:</p>



<ul class="wp-block-list">
<li>11.2.0.4, 12.1, 12.2, 18c -&gt; 19c -&gt; 26ai upgrade (with downtime) or directly with datapump</li>



<li>23ai -&gt; 26ai release update (no downtime)</li>



<li>October 2025 Oracle AI Database 26ai version is named 23.26.0.0.0</li>



<li>January 2026 is named 23.26.1.0.0, see 1 for quarter and not months</li>



<li>Which will make July 2026 release name as been 23.26.3.0.0</li>



<li>What will be 2027? Let&#8217;s see what will come</li>



<li>For 26ai release schedule, see PNEWS1360</li>
</ul>



<p class="wp-block-paragraph">We also spoke about:</p>



<ul class="wp-block-list">
<li>Converting DB to PDB</li>



<li>To set <code>alter system set max_pdbs=3;</code> in order to prevent license violations (change spfile, it is very important)</li>



<li>Going to pdb no application changes, does not impact application only connection sqlplus / as sysdba connection might be impacted</li>



<li>Multitenant extra license when you have more than 3 PDBs</li>



<li>Recommendation for noncdb to pdb migration is to start with 3 databases and consolidate them early enough into Multitenant</li>



<li>It is important not to forget client / server interoperability, see KB141043. For security reason it is important to uplift the client. Same matrix applies to database link
<ul class="wp-block-list">
<li><code>select * from gv$session_connect_info; </code>to know client version</li>
</ul>
</li>



<li>Traditional auditing is desupported in 26ai
<ul class="wp-block-list">
<li>It is still possible for the database to generate audit records but you can not create new policies or change existing ones.</li>



<li> KB120309 for syntax to converter script</li>
</ul>
</li>
</ul>



<p class="wp-block-paragraph">For an upgrade:</p>



<ul class="wp-block-list">
<li>Look at the Upgrade guide</li>



<li>Use oradiff tool (<a href="https://oradiff.oracle.com">https://oradiff.oracle.com</a>) to compare 2 releases and know fixes covered. oradiff has a rest API.</li>



<li>Execute a dictionary check before upgrade KB150043</li>



<li>Ensure dictionary and fixed objects statistics.</li>



<li>Purge recyclebin and gather dictionary stats 24 hours before upgrade</li>
</ul>



<p class="wp-block-paragraph">How to upgrade and convert:</p>



<ul class="wp-block-list">
<li>Installation of Oracle home is simpler, gold images, use autoupgrade</li>



<li>Create container database first
<ul class="wp-block-list">
<li>character set, always choose AL32UTF8 to not take care of PDB character set and accept any</li>



<li>components, only install the components that is only needed, for faster upgrade and patching</li>



<li>compatible parameter, 23.6.0 (default), if downgrade would be needed first manually change it</li>



<li>unplug always possible in higher version but not to a lower compatible settings</li>



<li>new command: <code>alter database set downgrade compatibility to '23.9.0';</code></li>



<li>update the compatible parameter on the fly without restarting the database</li>



<li>cdb_registry to check component
<ul class="wp-block-list">
<li>pdb$seed might not be seeing
<ul class="wp-block-list">
<li><code>alter system set "_exclude_seed_cdb_view"=false;</code> to make it visible</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>



<p class="wp-block-paragraph">Use Autoupgrade tool for upgrade, non-cdb to pdb conversion and patching:</p>



<ul class="wp-block-list">
<li>1- plugin, 2- upgrade, 3- convert</li>



<li>Get it through KB123450</li>



<li>Or using <a href="http://www.oracle.com/goto/upgrade">www.oracle.com/goto/upgrade</a></li>
</ul>



<p class="wp-block-paragraph">It is important to know that DBUA is retired. Upgrade with autoupgrade is simple. Need a config file with all parameters<br>We can also easily collect autoupgrade logs with option -zip.</p>



<p class="wp-block-paragraph">Conversion to pdb is irreversible. Rollback options would be: backup/restore or copy data files or refreshable clone PDB.</p>



<p class="wp-block-paragraph">PDB creation does not propagate to the standby.</p>



<p class="wp-block-paragraph">tips for view parameter:<br><code>alter system set "_cursor_obsolete_treshold"=1024 comment="Added XXX";,</code> comment for _ paraameter<br><code>alter system set "_column_tracking_level"=1;</code></p>



<p class="wp-block-paragraph">By the way, here can you find Mike&#8217;s slides: <a href="https://mikedietrichde.com/slides/">https://mikedietrichde.com/slides/</a></p>



<h3>Upgrade, Patch, Repeat &#8211; Stay Secure and up to date with Oracle AutoUpgrade and Ansible by Martin Berger</h3>



<h3></h3>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="768" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9969-1024x768.jpg" alt="" class="wp-image-47428" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9969-1024x768.jpg 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9969-300x225.jpg 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9969-768x576.jpg 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9969-1536x1152.jpg 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9969-2048x1536.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Martin spoke about how security is important. Attackers comes at the oracle db using listener, privilege, sql inection, data exfiltration db links or datapump. This is why patching is so important and patch are more and more frequent.<br>For release and patch we have Release Update (RU),  Monthly Recommended Patch (MRP),  Critical Security Patch Update (CSPU) and Critical Patch Update (CPU).<br>To cover his explanation, Martin highlighted that there were 656 total fixes between 19.31 (MRP) and next month 19.32 (RU).<br>Martins also point how useful oradiff.oracle.com was.<br>When out of place upgrade is the prob move, the in-place is the classic way to do. Let&#8217;s push for out of the place upgrade, new home can be rollbacked and there is minimal downtime.<br></p>



<p class="wp-block-paragraph">Oracle autoupgrade and how to create new oracle home with autoupgrade:</p>



<ul class="wp-block-list">
<li>Get latest autoupgrade</li>



<li>Create MOS keystore</li>



<li>Get release update</li>



<li>Create db_home</li>
</ul>



<p class="wp-block-paragraph"> With autoupgrade we can patch OEM as well to 24.1, lastest autoupgrade version 26.5.260807 required.</p>



<p class="wp-block-paragraph">3 modes of autoupgrade: analyze, fixups and deploy (change only -mode option value)<br>Remaining tasks : timezone, gather dictionary statistics, compatible parameter (change when 100% no downgrade), use and drop restore point</p>



<p class="wp-block-paragraph">With Data Guard we can run standby-first patching.</p>



<p class="wp-block-paragraph">ansible : autoupgrade takes care of the database. Ansible handles everything else.<br>ansible is agentless, idempotent, declarative</p>



<p class="wp-block-paragraph">OLAM: Oracle Linux Automation Manager for automation and the oracle Autonomous Database for tracking.</p>



<p class="wp-block-paragraph">Martin did a great demo with OLAM and ansible.</p>



<h3>4 years Oracle 19c (Exadata sparse) Pluggable Database cloning, did it bring something by Jérôme Witt</h3>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="768" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9970-1024x768.jpg" alt="" class="wp-image-47433" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9970-1024x768.jpg 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9970-300x225.jpg 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9970-768x576.jpg 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9970-1536x1152.jpg 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9970-2048x1536.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Great presentation from my Collegue who spoke about various pluggable database cloning method and mainly with Exadata sparse.<br>This presentation comes from a real case customer project migrating from on premises to Exadata Cloud@Customer project, and migrating an existing cloning NetApp platform to an Oracle technlogy cloning method system using PDB cloning and Exdata Spare technology.</p>



<p class="wp-block-paragraph">Maintenance: </p>



<ul class="wp-block-list">
<li>PDB relocation</li>



<li>un-plug/plug</li>



<li>RTO in case of Disaster Recovery and all with automation</li>
</ul>



<p class="wp-block-paragraph"><br>Automation:</p>



<ul class="wp-block-list">
<li>centralized, highly-available scheduler</li>



<li>log, config management</li>



<li>CI pipelines</li>



<li>self-service</li>
</ul>



<p class="wp-block-paragraph">Jerôme explained PDB cloning techniques and method: PDB clone local vs remote, Non-CDB to PDB conversion, snapshot copy (storage based vs sparse) and refreshable clones</p>



<p class="wp-block-paragraph">Exadata Sparse Clone:</p>



<ul class="wp-block-list">
<li>Single source, multiple targets</li>



<li>small storage footing</li>



<li>one command line</li>



<li>transform sparse clone to full clone materialization process</li>



<li>3 cons: requires a Test-Master-Read-Only source, dependency on shared storage and capacity management for Oracle ASM (%DATA, %REDO, %SPARSE)</li>
</ul>



<p class="wp-block-paragraph">Finally Jérôme provided perfect Demos and provided also real-world challenges, experience coming from customer projects.</p>



<p class="wp-block-paragraph">Great explanation how to remote full clone in Oracle Data Guard environment (as for example STANDBY=NONE)</p>



<p class="wp-block-paragraph">Exadata sparse clone:</p>



<ul class="wp-block-list">
<li>Create a Test Master Read-Only (TMR)
<ul class="wp-block-list">
<li>Refreshable clone</li>



<li>Read-Only standby database</li>



<li>Read-Only full clone (full clone subset PDB)</li>
</ul>
</li>



<li>Provision sparse clones
<ul class="wp-block-list">
<li>Locally within same CDB</li>



<li>Remotely over database link</li>
</ul>
</li>



<li>Drop or Materialize sparse clone</li>



<li>Revert source PDB datafiles read-write
<ul class="wp-block-list">
<li><code>SQL&gt; DBMS_DNFS.RESTORE_DATAFILE_PERMISSIONS(pdb_name=&gt; 'PDB');</code></li>
</ul>
</li>



<li>Re-create / Refresh TMR</li>
</ul>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="768" height="1024" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9971-768x1024.jpg" alt="" class="wp-image-47434" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9971-768x1024.jpg 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9971-225x300.jpg 225w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9971-1152x1536.jpg 1152w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9971-1536x2048.jpg 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9971-scaled.jpg 1920w" sizes="auto, (max-width: 768px) 100vw, 768px" /></figure>



<p class="wp-block-paragraph">Jérôme successfully ran several nice demos:</p>



<ul class="wp-block-list">
<li>Demo remote full clone with Oracle Data Guard.</li>



<li>Demo create refreshable clone from Orale Data Guard (active) standby</li>



<li>Demo refresh refreshable clone from Oracle ADG standby</li>
</ul>



<h3>TNS Connections &#8211; what can be going wrong? by Axel Vom Stein</h3>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="768" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9974-1024x768.jpg" alt="" class="wp-image-47435" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9974-1024x768.jpg 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9974-300x225.jpg 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9974-768x576.jpg 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9974-1536x1152.jpg 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9974-2048x1536.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Axel introduced the presentation by reminding on the TCP basics connections and then presented a real case TCP issue troubleshooting: ncat, nestat, tcpdump, &#8230; tcpdump with wireshark analyses</p>



<p class="wp-block-paragraph">Transparent Network Substrate (TNS): Protocol TCP, TCPS, IPC, BEQ.<br>Listener endpoints: sqlnet.ora, tnsnames.ora, listener.ora</p>



<p class="wp-block-paragraph">What can go wrong:</p>



<ul class="wp-block-list">
<li>sqlnet.ora with EZCONNECT and HOSTNAME,</li>



<li>listener.ora with DEFAULT_SERVICE_LISTNER: no service, take this service</li>



<li>sqlnet.ora OUTBOUND_CONNECT_TIMEOUT overriden by tnsnames.ora CONNECT_TIMEOUT</li>



<li>sqlnet.ora EXPIRE_TIME can be mitigated with firewall configuration</li>



<li>listener configuration with dynamic and static registration</li>



<li>Service managed by DBMS_SERVICE or srvctl grid infra</li>



<li>listener name</li>



<li>listener USE_SID_AS_SERVICE and DEFAULT_SERVICE</li>



<li>TNS Connection with LISTENER and SCAN_LISTENER</li>



<li>Do not minimize the firewall configuration (with RAC, needs to configuration scan listener and listener)</li>



<li>TNS Connection timeouts (Data Guard address list in tnsnames.ora).<br>Pay attention on the connect_timeout, retry_count and retry_delay<br>transport_connect_timeout parameter</li>



<li>Duplicate tns names entries in tnsnames.ora (the last always wins)</li>



<li>IFILE with max 3 levels for tnsnames.ora, listener.ora and sqlnet.ora</li>



<li>TWO_TASK (linux) %LOCAL% (windows) variables</li>



<li>Encryption sqlnet.ora parameter</li>
</ul>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="768" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9975-1024x768.jpg" alt="" class="wp-image-47436" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9975-1024x768.jpg 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9975-300x225.jpg 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9975-768x576.jpg 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9975-1536x1152.jpg 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9975-2048x1536.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Analyze can be done with gv$session_connect_info and gv$session</p>



<p class="wp-block-paragraph">During the troubleshooting funny Oracle errors have been highlighted: ORA-28041, ORA-1699 error</p>



<h3>And what about the DJ?</h3>



<p class="wp-block-paragraph">At dbi services we can even have our expert shine as DJs! Thanks Clemens! Good job!</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="768" height="1024" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9952-768x1024.jpg" alt="" class="wp-image-47438" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9952-768x1024.jpg 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9952-225x300.jpg 225w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9952-1152x1536.jpg 1152w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9952-1536x2048.jpg 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/IMG_9952-scaled.jpg 1920w" sizes="auto, (max-width: 768px) 100vw, 768px" /></figure>
<p>L’article <a href="https://www.dbi-services.com/blog/soug-day-october-2026/">SOUG Day October 2026</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.dbi-services.com/blog/soug-day-october-2026/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>AI meets OEM, let&#8217;s test Oracle AI Database Assistant</title>
		<link>https://www.dbi-services.com/blog/ai-meets-oem-lets-test-oracle-ai-database-assistant/</link>
					<comments>https://www.dbi-services.com/blog/ai-meets-oem-lets-test-oracle-ai-database-assistant/#respond</comments>
		
		<dc:creator><![CDATA[Marc Wagner]]></dc:creator>
		<pubDate>Thu, 01 Oct 2026 09:15:38 +0000</pubDate>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[ai]]></category>
		<category><![CDATA[Oracle Enterprise Manager]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=47287</guid>

					<description><![CDATA[<p>I have been recently blogging on how I have setup Oracle Enterprise Manager 24ai lab, installed an agent and finally configured Oracle AI Database Assistant. It&#8217;s time for me to test it now. Product evolution AI integration in Oracle Enterprise Manager 24ai was quite evolving rapidly. In a nutshell Oracle AI Database Assistant will help [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/ai-meets-oem-lets-test-oracle-ai-database-assistant/">AI meets OEM, let&#8217;s test Oracle AI Database Assistant</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">I have been recently blogging on how I have setup Oracle Enterprise Manager 24ai lab, installed an agent and finally configured Oracle AI Database Assistant. It&#8217;s time for me to test it now.</p>



<span id="more-47287"></span>



<h3>Product evolution</h3>



<p class="wp-block-paragraph">AI integration in Oracle Enterprise Manager 24ai was quite evolving rapidly.</p>



<ul class="wp-block-list">
<li>Ask EM<br>Was first introduced with Enterprise Manager 24ai Release 1 Update 4.<br>Dependent of OCI Ops Insight for the chatbot functionality and processing.</li>



<li>Oracle AI Database Assistant<br>Was introduced in Enterprise Manager 24ai Release 1 Update 10.<br>Replacing Ask EM<br>Use of LLM provider: OCI GenAI or BYO LLM</li>



<li>MCP server<br>Enterprise Manager 24ai Release 1 Update 12 is now integrating a MCP server which will bring a brand of new possibilities.<br>The MCP server is directly built in OEM.</li>



<li>Finally Enterprise Manager 24ai Release 1 Update 13 will bring a new good feature:<br>Autocompletion suggestions. We just write on the prompt &#8220;oracle databases&#8221; and many suggestions might come : &#8220;Show Oracle Databases by average active sessions&#8221; or &#8220;Show Oracle Databases by CPU time&#8221;</li>
</ul>



<h3>In a nutshell</h3>



<p class="wp-block-paragraph">Oracle AI Database Assistant will help me interacting with OEM with Natural-Language questions, like &#8220;What happened to prod?&#8221;. The assistant will then understand my question and retrieves data directly from OMR (Oracle Management Repository). OMR is storing all data for all my targets related to their health, issues and performance.</p>



<p class="wp-block-paragraph">Oracle AI Database Assistant no longer depends on OCI Ops Insight. OCI Ops Insights subscription is not needed any more.</p>



<p class="wp-block-paragraph">Oracle AI Database Assistant will use LLM (Large-Language Model). Multiple LLM are supported:</p>



<ul class="wp-block-list">
<li>You can use the one from Enterprise Manager, so OEM as provider. Oracle AI Database Assistant will access directly OCI Generative AI.</li>



<li>Or you can bring your own LLM Provider. Two Models are supported : OpenAI or Ollama. To use external LLM provider you will need some additional access between OMS server and OCI.</li>
</ul>



<h3>Prerequisites</h3>



<p class="wp-block-paragraph">There is a few prerequisites to configure and use Oracle AI Database Assistant. I will remind them here, but please refer to my other blogs explaining how to configure Oracle AI Database Assistant for guidance with screenshots.</p>



<ul class="wp-block-list">
<li>Log as SYSMAN for configuring Oracle AI Database Assistant</li>



<li>Choice in LLM provider</li>



<li>To use Enterprise Manager provider one account in a supported region is needed
<ul class="wp-block-list">
<li>Japan Central (Osaka): ap-osaka-1</li>



<li>Germany Central (Frankfurt): eu-frankfurt-1</li>



<li>Brazil East (Sao Paulo): sa-saopaulo-1</li>



<li>UK South (London): uk-london-1</li>



<li>US Midwest (Chicago): us-chicago-1</li>
</ul>
</li>



<li>Oracle AI Database Assistant to be enabled in Enterprise Manager
<ul class="wp-block-list">
<li>Activated per default</li>



<li>Command line<br><code>emctl set property -name enable_genai_assistant -value false|true</code></li>
</ul>
</li>



<li>OCI policies so that Enterprise Manager can access the OCI Generative AI service<br><code>allow group to manage opsi-genai-em-session in compartment<br>allow group to use generative-ai-family in compartment</code></li>



<li>An OCI Named Credential for communication with OCI LLM service
<ul class="wp-block-list">
<li>Use of Enterprise Manager LLM provider</li>



<li>OCI Authentication through API key</li>
</ul>
</li>
</ul>



<p class="wp-block-paragraph">With Oracle AI Database Assistant, you can bring your own LLM Provider:</p>



<ul class="wp-block-list">
<li>Bring-Your-Own LLM Providers</li>



<li>OpenAI or Ollama</li>



<li>API Key for LLM provider authentication</li>



<li>Name of the model to be used</li>



<li>Model endpoint URL
<ul class="wp-block-list">
<li>OMS property oracle.sysman.llm.provider.allowedProviderUrls</li>
</ul>
</li>



<li>Network connectivity between OMS and the provider endpoint</li>
</ul>



<p class="wp-block-paragraph">And what about the cost? Oracle AI Database Assistant includes a complimentary allocation of AI tokens for OCI Generative AI models. The cost can be visible through the OCI Ops Insights service.Once the allocated tokens are consumed, extended cost charged to the OCI account based on the AI model and the OCI region. See following oracle documentations:<br><a href="https://www.oracle.com/cloud/price-list/#pricing-ai">https://www.oracle.com/cloud/price-list/#pricing-ai</a><br><a href="https://docs.oracle.com/en-us/iaas/Content/generative-ai/home.htm">https://docs.oracle.com/en-us/iaas/Content/generative-ai/home.htm</a></p>



<h3>Let&#8217;s do some further tests!</h3>



<p class="wp-block-paragraph">Let&#8217;s have fun and test the Oracle AI Database Assistant, now I could configure it.</p>



<h4>Asking for targets&#8230;</h4>



<p class="wp-block-paragraph">I first asked about status summary for all my targets. Answer was coherent with the OEM summary dashboard.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ada849e441e0&quot;}" data-wp-interactive="core/image" data-wp-key="6ada849e441e0" class="wp-block-image size-large wp-lightbox-container"><img loading="lazy" decoding="async" width="1024" height="560" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/target_status-1024x560.png" alt="" class="wp-image-47309" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/target_status-1024x560.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/target_status-300x164.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/target_status-768x420.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/target_status-1536x840.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/target_status.png 1603w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p class="wp-block-paragraph">I then asked to list the target that are down, which of course is ok as the host was not up and running.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ada849e4480e&quot;}" data-wp-interactive="core/image" data-wp-key="6ada849e4480e" class="wp-block-image size-full wp-lightbox-container"><img loading="lazy" decoding="async" width="519" height="371" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/target_down.png" alt="" class="wp-image-47311" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/target_down.png 519w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/target_down-300x214.png 300w" sizes="auto, (max-width: 519px) 100vw, 519px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p class="wp-block-paragraph">I then started the lab node.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ada849e44cf3&quot;}" data-wp-interactive="core/image" data-wp-key="6ada849e44cf3" class="wp-block-image size-large wp-lightbox-container"><img loading="lazy" decoding="async" width="1024" height="119" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/Start-node-1024x119.png" alt="" class="wp-image-47312" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/Start-node-1024x119.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/Start-node-300x35.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/Start-node-768x90.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/Start-node.png 1278w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ada849e451a3&quot;}" data-wp-interactive="core/image" data-wp-key="6ada849e451a3" class="wp-block-image size-large wp-lightbox-container"><img loading="lazy" decoding="async" width="1024" height="98" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/node-started-1024x98.png" alt="" class="wp-image-47313" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/node-started-1024x98.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/node-started-300x29.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/node-started-768x74.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/node-started.png 1222w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p class="wp-block-paragraph">I confirmed there is no more target down.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ada849e45681&quot;}" data-wp-interactive="core/image" data-wp-key="6ada849e45681" class="wp-block-image size-full wp-lightbox-container"><img loading="lazy" decoding="async" width="534" height="616" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/target_status-2.png" alt="" class="wp-image-47315" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/target_status-2.png 534w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/target_status-2-260x300.png 260w" sizes="auto, (max-width: 534px) 100vw, 534px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p class="wp-block-paragraph">I can see that no more targets are down. I took the opportunity to test the language wording, and as we can see, Oracle AI Database Assistant was not able to understand the situation, and my question &#8220;and now?&#8221; referring to make it (we would have been attracted to write him, but let&#8217;s use it <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> ) understand that I wanted the same previous questions was not understandable. We can only use specific OEM language.</p>



<p class="wp-block-paragraph">I could list the targets that are up. What is cool is that I do not need to make full sentences. &#8220;List target up&#8221; was enough for the assistant to understand the question.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ada849e45ba6&quot;}" data-wp-interactive="core/image" data-wp-key="6ada849e45ba6" class="wp-block-image size-full wp-lightbox-container"><img loading="lazy" decoding="async" width="525" height="484" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/target_status-3.png" alt="" class="wp-image-47317" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/target_status-3.png 525w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/target_status-3-300x277.png 300w" sizes="auto, (max-width: 525px) 100vw, 525px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p class="wp-block-paragraph">I could also ask to filter on host type, which was successfully.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ada849e46057&quot;}" data-wp-interactive="core/image" data-wp-key="6ada849e46057" class="wp-block-image size-full wp-lightbox-container"><img loading="lazy" decoding="async" width="532" height="479" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/target_status-4.png" alt="" class="wp-image-47324" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/target_status-4.png 532w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/target_status-4-300x270.png 300w" sizes="auto, (max-width: 532px) 100vw, 532px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<h4>Asking for documentation&#8230;</h4>



<p class="wp-block-paragraph">As we can see, the assistant will not provide me any OEM documentation, and the expected prompt stick on OEM data model language.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ada849e4657b&quot;}" data-wp-interactive="core/image" data-wp-key="6ada849e4657b" class="wp-block-image size-full wp-lightbox-container"><img loading="lazy" decoding="async" width="537" height="364" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/docs-query.png" alt="" class="wp-image-47326" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/docs-query.png 537w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/docs-query-300x203.png 300w" sizes="auto, (max-width: 537px) 100vw, 537px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<h4>Asking for incidents&#8230;</h4>



<p class="wp-block-paragraph">I could also successfully list open incidents.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ada849e46a2d&quot;}" data-wp-interactive="core/image" data-wp-key="6ada849e46a2d" class="wp-block-image size-full wp-lightbox-container"><img loading="lazy" decoding="async" width="531" height="471" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/incident.png" alt="" class="wp-image-47329" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/incident.png 531w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/incident-300x266.png 300w" sizes="auto, (max-width: 531px) 100vw, 531px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<h4>Asking for databases status&#8230;</h4>



<p class="wp-block-paragraph">I could list database target status, and also the assistant understand pdb, pluggable database.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ada849e46f00&quot;}" data-wp-interactive="core/image" data-wp-key="6ada849e46f00" class="wp-block-image size-full wp-lightbox-container"><img loading="lazy" decoding="async" width="533" height="476" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/list-database-1.png" alt="" class="wp-image-47332" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/list-database-1.png 533w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/list-database-1-300x268.png 300w" sizes="auto, (max-width: 533px) 100vw, 533px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ada849e4737c&quot;}" data-wp-interactive="core/image" data-wp-key="6ada849e4737c" class="wp-block-image size-full wp-lightbox-container"><img loading="lazy" decoding="async" width="633" height="710" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/list-database-2.png" alt="" class="wp-image-47333" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/list-database-2.png 633w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/list-database-2-267x300.png 267w" sizes="auto, (max-width: 633px) 100vw, 633px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p class="wp-block-paragraph">Asking the assistant to list databases that have currently problems, I could get as answer&#8230; All databases. We can easily understand that the assistant take word that it understands and that it can put in correlation with any data from the OMR without making a full analyse of the full question.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ada849e4786f&quot;}" data-wp-interactive="core/image" data-wp-key="6ada849e4786f" class="wp-block-image size-large wp-lightbox-container"><img loading="lazy" decoding="async" width="1024" height="299" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/database-problem-1024x299.png" alt="" class="wp-image-47334" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/database-problem-1024x299.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/database-problem-300x88.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/database-problem-768x224.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/database-problem-1536x448.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/database-problem.png 1601w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<h4>Asking for critical alerts&#8230;</h4>



<p class="wp-block-paragraph">I could also ask the assistant to list the critical alerts. This was working as expected. I was only a quite of surprised that asking the same for the last 24 hours, I got no data displayed. Which is incoherent knowing I have one running&#8230; We can see that the &#8220;last 24 hours&#8221; has been understood, as the filter &#8220;Last 24 hours&#8221; appeared.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ada849e47de6&quot;}" data-wp-interactive="core/image" data-wp-key="6ada849e47de6" class="wp-block-image size-large wp-lightbox-container"><img loading="lazy" decoding="async" width="1024" height="519" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/critical-alerts-2-1024x519.png" alt="" class="wp-image-47337" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/critical-alerts-2-1024x519.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/critical-alerts-2-300x152.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/critical-alerts-2-768x389.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/critical-alerts-2-1536x778.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/critical-alerts-2.png 1605w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p class="wp-block-paragraph">I stopped BITS999P_PDB1 Pluggable Database to see if it will been displayed in the critical alerts.</p>



<p class="wp-block-paragraph">Stopping PDB:</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1,13,20,24,28]">
[oracle@svl-orap-chz0-cl1n1 ~]$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Tue Sep 22 13:18:36 2026
Version 19.31.0.0.0

Copyright (c) 1982, 2026, Oracle.  All rights reserved.


Connected to:
Oracle Database 19c EE Extreme Perf Release 19.0.0.0.0 - Production
Version 19.31.0.0.0

SQL&gt; show pdbs

    CON_ID CON_NAME           OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
     2 PDB$SEED               READ ONLY  NO
     3 BITS999P_PDB1          READ WRITE NO

SQL&gt; alter session set container=BITS999P_PDB1;

Session altered.

SQL&gt; alter pluggable database close abort;

Pluggable database altered.

SQL&gt; show pdbs

    CON_ID CON_NAME           OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
     3 BITS999P_PDB1          MOUNTED

</pre>
<br>



<p class="wp-block-paragraph">Let&#8217;s check the critical alerts again.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="300" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/critical-alerts-pdb-stopped-1-1024x300.png" alt="" class="wp-image-47340" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/critical-alerts-pdb-stopped-1-1024x300.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/critical-alerts-pdb-stopped-1-300x88.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/critical-alerts-pdb-stopped-1-768x225.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/critical-alerts-pdb-stopped-1-1536x451.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/critical-alerts-pdb-stopped-1.png 1602w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Working as expected. I could even be more precise filtering on pluggable database only.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ada849e4847f&quot;}" data-wp-interactive="core/image" data-wp-key="6ada849e4847f" class="wp-block-image size-large wp-lightbox-container"><img loading="lazy" decoding="async" width="1024" height="305" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/critical-alerts-pdb-stopped-2-1024x305.png" alt="" class="wp-image-47341" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/critical-alerts-pdb-stopped-2-1024x305.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/critical-alerts-pdb-stopped-2-300x89.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/critical-alerts-pdb-stopped-2-768x229.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/critical-alerts-pdb-stopped-2-1536x458.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/critical-alerts-pdb-stopped-2.png 1603w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p class="wp-block-paragraph">I restarted the PDB:</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1,5]">
SQL&gt; alter pluggable database open;

Pluggable database altered.

SQL&gt; show pdbs

    CON_ID CON_NAME           OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
     3 BITS999P_PDB1          READ WRITE NO
SQL&gt;
</pre>
<br>



<p class="wp-block-paragraph">And I could confirm the alerts disappeared.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ada849e489aa&quot;}" data-wp-interactive="core/image" data-wp-key="6ada849e489aa" class="wp-block-image size-large wp-lightbox-container"><img loading="lazy" decoding="async" width="1024" height="301" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/critical-alerts-pdb-start_again-1-1024x301.png" alt="" class="wp-image-47343" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/critical-alerts-pdb-start_again-1-1024x301.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/critical-alerts-pdb-start_again-1-300x88.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/critical-alerts-pdb-start_again-1-768x226.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/critical-alerts-pdb-start_again-1-1536x452.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/critical-alerts-pdb-start_again-1.png 1598w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p class="wp-block-paragraph">Oh by the way, now my Data Guard alerts for last 24 hours filter is working. No idea why.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ada849e48e50&quot;}" data-wp-interactive="core/image" data-wp-key="6ada849e48e50" class="wp-block-image size-large wp-lightbox-container"><img loading="lazy" decoding="async" width="1024" height="301" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/critical-alerts-1-1-1024x301.png" alt="" class="wp-image-47344" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/critical-alerts-1-1-1024x301.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/critical-alerts-1-1-300x88.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/critical-alerts-1-1-768x225.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/critical-alerts-1-1-1536x451.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/critical-alerts-1-1.png 1605w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<h4>Asking what happened to my database&#8230;</h4>



<p class="wp-block-paragraph">I can ask what happened to a specific database in the last night, and the answer is totally coherent. We can see how the filters are appearing according to the content of my prompt: &#8220;Pluggable Database&#8221;, &#8220;BITS999P_PDB1&#8221;, &#8220;Last 1 day&#8221;.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="239" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/what-happened-database-1-1024x239.png" alt="" class="wp-image-47345" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/what-happened-database-1-1024x239.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/what-happened-database-1-300x70.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/what-happened-database-1-768x179.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/what-happened-database-1-1536x359.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/what-happened-database-1.png 1593w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Asking what happened to the PDB in the last 2 years, the filter automatically applied is &#8220;Last 60 minutes&#8221;. This might be related to a purge parameter, I guess&#8230; I have no explanation so far.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ada849e4942c&quot;}" data-wp-interactive="core/image" data-wp-key="6ada849e4942c" class="wp-block-image size-large wp-lightbox-container"><img loading="lazy" decoding="async" width="1024" height="252" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/what-happened-database-2-1024x252.png" alt="" class="wp-image-47346" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/what-happened-database-2-1024x252.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/what-happened-database-2-300x74.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/what-happened-database-2-768x189.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/what-happened-database-2-1536x377.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/what-happened-database-2.png 1579w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p class="wp-block-paragraph">Asking what is the status of BITS999P_PDB1, we can see that the assistant did not understand the question, but added some drop-down list, where I can choose data.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ada849e49916&quot;}" data-wp-interactive="core/image" data-wp-key="6ada849e49916" class="wp-block-image size-large wp-lightbox-container"><img loading="lazy" decoding="async" width="1024" height="305" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/status-of-database-BITS999P_PDB1-1-1024x305.png" alt="" class="wp-image-47347" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/status-of-database-BITS999P_PDB1-1-1024x305.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/status-of-database-BITS999P_PDB1-1-300x89.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/status-of-database-BITS999P_PDB1-1-768x229.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/status-of-database-BITS999P_PDB1-1-1536x458.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/status-of-database-BITS999P_PDB1-1.png 1593w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ada849e49db0&quot;}" data-wp-interactive="core/image" data-wp-key="6ada849e49db0" class="wp-block-image size-large wp-lightbox-container"><img loading="lazy" decoding="async" width="1024" height="306" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/status-of-database-BITS999P_PDB1-2-1024x306.png" alt="" class="wp-image-47348" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/status-of-database-BITS999P_PDB1-2-1024x306.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/status-of-database-BITS999P_PDB1-2-300x90.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/status-of-database-BITS999P_PDB1-2-768x229.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/status-of-database-BITS999P_PDB1-2-1536x459.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/status-of-database-BITS999P_PDB1-2.png 1597w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p class="wp-block-paragraph">Which will give me the possibility to get some valid information.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ada849e4a2f2&quot;}" data-wp-interactive="core/image" data-wp-key="6ada849e4a2f2" class="wp-block-image size-large wp-lightbox-container"><img loading="lazy" decoding="async" width="1024" height="303" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/status-of-database-BITS999P_PDB1-3-1024x303.png" alt="" class="wp-image-47349" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/status-of-database-BITS999P_PDB1-3-1024x303.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/status-of-database-BITS999P_PDB1-3-300x89.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/status-of-database-BITS999P_PDB1-3-768x227.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/status-of-database-BITS999P_PDB1-3-1536x454.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/status-of-database-BITS999P_PDB1-3.png 1582w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p class="wp-block-paragraph">I could also successfully query what happened to the PDB in a time frame. Which is a very good added value.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ada849e4a7bd&quot;}" data-wp-interactive="core/image" data-wp-key="6ada849e4a7bd" class="wp-block-image size-large wp-lightbox-container"><img loading="lazy" decoding="async" width="1024" height="305" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/why-database-down-1024x305.png" alt="" class="wp-image-47350" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/why-database-down-1024x305.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/why-database-down-300x89.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/why-database-down-768x229.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/why-database-down-1536x457.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/why-database-down.png 1606w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<h4>Asking for tablespace usage&#8230;</h4>



<p class="wp-block-paragraph">I also asked for pluggable database tablespace usage, for the same PDB. I could get an answer, which really is not that readable.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ada849e4acd3&quot;}" data-wp-interactive="core/image" data-wp-key="6ada849e4acd3" class="wp-block-image size-large wp-lightbox-container"><img loading="lazy" decoding="async" width="1024" height="300" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/tablespace-usage-1024x300.png" alt="" class="wp-image-47352" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/tablespace-usage-1024x300.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/tablespace-usage-300x88.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/tablespace-usage-768x225.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/tablespace-usage-1536x449.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/tablespace-usage.png 1600w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p class="wp-block-paragraph">But the more surprising is the assistant might not be so trustable. Let me explain why. Later on, I could see get coherent results for target status, incidents, but I could not get any information any more for the tablespace usage.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ada849e4b1e5&quot;}" data-wp-interactive="core/image" data-wp-key="6ada849e4b1e5" class="wp-block-image size-large wp-lightbox-container"><img loading="lazy" decoding="async" width="1024" height="872" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/prob_tablespace_BITS999P_PDB1_2-1024x872.png" alt="" class="wp-image-47354" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/prob_tablespace_BITS999P_PDB1_2-1024x872.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/prob_tablespace_BITS999P_PDB1_2-300x256.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/prob_tablespace_BITS999P_PDB1_2-768x654.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/prob_tablespace_BITS999P_PDB1_2.png 1128w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p class="wp-block-paragraph">Even if the metrics are available in OEM, see next pictures.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ada849e4b6b7&quot;}" data-wp-interactive="core/image" data-wp-key="6ada849e4b6b7" class="wp-block-image size-large wp-lightbox-container"><img loading="lazy" decoding="async" width="1024" height="618" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/prob_tablespace_BITS999P_PDB1_4-1024x618.png" alt="" class="wp-image-47356" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/prob_tablespace_BITS999P_PDB1_4-1024x618.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/prob_tablespace_BITS999P_PDB1_4-300x181.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/prob_tablespace_BITS999P_PDB1_4-768x464.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/prob_tablespace_BITS999P_PDB1_4.png 1169w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ada849e4bb44&quot;}" data-wp-interactive="core/image" data-wp-key="6ada849e4bb44" class="wp-block-image size-large wp-lightbox-container"><img loading="lazy" decoding="async" width="1024" height="690" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/prob_tablespace_BITS999P_PDB1_5-1024x690.png" alt="" class="wp-image-47357" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/prob_tablespace_BITS999P_PDB1_5-1024x690.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/prob_tablespace_BITS999P_PDB1_5-300x202.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/prob_tablespace_BITS999P_PDB1_5-768x518.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/prob_tablespace_BITS999P_PDB1_5.png 1304w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<h3>To wrap up&#8230;</h3>



<p class="wp-block-paragraph">Following is the pros and cons I see in this new Oracle AI assistant.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6ada849e4c0bc&quot;}" data-wp-interactive="core/image" data-wp-key="6ada849e4c0bc" class="wp-block-image size-full wp-lightbox-container"><img loading="lazy" decoding="async" width="1025" height="517" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/image-4.png" alt="" class="wp-image-47359" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/image-4.png 1025w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/image-4-300x151.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/image-4-768x387.png 768w" sizes="auto, (max-width: 1025px) 100vw, 1025px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p class="wp-block-paragraph">When I think it is a good startup, with an assistant that will help to get more quickly the health, issue and performance on any target monitored by OEM, the tool still need to improve the stability and the trust we can put on him.</p>
<p>L’article <a href="https://www.dbi-services.com/blog/ai-meets-oem-lets-test-oracle-ai-database-assistant/">AI meets OEM, let&#8217;s test Oracle AI Database Assistant</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.dbi-services.com/blog/ai-meets-oem-lets-test-oracle-ai-database-assistant/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Deleting GoldenGate trail files via the REST API (OGG-30375)</title>
		<link>https://www.dbi-services.com/blog/deleting-goldengate-trail-files-via-the-rest-api-ogg-30375/</link>
					<comments>https://www.dbi-services.com/blog/deleting-goldengate-trail-files-via-the-rest-api-ogg-30375/#respond</comments>
		
		<dc:creator><![CDATA[Julien Delattre]]></dc:creator>
		<pubDate>Thu, 01 Oct 2026 06:23:00 +0000</pubDate>
				<category><![CDATA[GoldenGate]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[26]]></category>
		<category><![CDATA[26ai]]></category>
		<category><![CDATA[Automation]]></category>
		<category><![CDATA[ogg]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[REST-API]]></category>
		<category><![CDATA[trail]]></category>
		<category><![CDATA[Troubleshooting]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=47085</guid>

					<description><![CDATA[<p>When automating your GoldenGate deployments, or tearing down a test environment, handling trail files is important. In fact, deleting an extract or a replicat does not delete the trail files it was writing to or reading from. It leaves the trail resource itself behind too, causing confusion (or worse) later. Indeed, a fresh extract writing [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/deleting-goldengate-trail-files-via-the-rest-api-ogg-30375/">Deleting GoldenGate trail files via the REST API (OGG-30375)</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">When automating your GoldenGate deployments, or tearing down a test environment, handling trail files is important. In fact, deleting an extract or a replicat does not delete the trail files it was writing to or reading from. It leaves the trail resource itself behind too, causing confusion (or worse) later.</p>



<p class="wp-block-paragraph">Indeed, a fresh extract writing to the same trail name/path keeps appending after the old sequence numbers instead of restarting at <code>000000000</code>. A fresh replicat starts reading from <code>000000000</code> by default. If you don’t remove the trail files when re-creating an extract and replicat pair, the extract will do its job. However, the new replicat has no way to tell leftover files apart from new ones. It will read whatever is still sitting in <code>000000000</code> and onward as if it were live data.</p>



<p class="wp-block-paragraph">The <code>adminclient</code> does have a command for this, <code>PURGE EXTTRAIL</code>, but it only works once nothing is using the trail anymore:</p>



<pre class="wp-block-code"><code>OGG (http://vmogg:7810 ogg_test_01) 3&gt; purge exttrail PDB1/aa

Error: Cannot purge trail 'PDB1/aa', the trail is in use by EXTRACT 'EOGG375'</code></pre>



<p class="wp-block-paragraph">From the <code>adminclient</code>, you need to delete the extract first. Then, <code>PURGE EXTTRAIL</code> removes every sequence file and the trail resource:</p>



<pre class="wp-block-code"><code>OGG (http://vmogg:7810 ogg_test_01) 2&gt; purge exttrail PDB1/aa
2026-09-20T13:52:35Z  INFO    OGG-00957  Purged old extract file 'PDB1/aa000000000'. Purge rule: Purging all files for trail 'PDB1/aa'.
2026-09-20T13:52:35Z  INFO    OGG-00957  Purged old extract file 'PDB1/aa000000001'. Purge rule: Purging all files for trail 'PDB1/aa'.
&#091;...]
2026-09-20T13:52:35Z  INFO    OGG-00957  Purged old extract file 'PDB1/aa000000035'. Purge rule: Purging all files for trail 'PDB1/aa'.</code></pre>



<p class="wp-block-paragraph">So from an interactive session, <code>PURGE EXTTRAIL</code> is the easy way. But when automating, the REST API is often easier to handle, so let’s see how it should be done with it.</p>



<h2 id="deleting-a-trail" class="wp-block-heading">Deleting a trail</h2>



<p class="wp-block-paragraph">Calling the <a href="https://docs.oracle.com/en/database/goldengate/core/26/oggra/rest-endpoints.html" target="_blank" rel="noopener noreferrer"><code>DELETE /services/{version}/trails/{trail}</code></a> endpoint seems like a good call. Let’s try this first, on a trail still attached to a stopped (but not deleted) extract, using the <code>delete_trail</code> method of the <a href="https://juliendelattre.com/tools/ogg-python-client/" target="_blank" rel="noopener noreferrer"><code>oggrestapi</code></a> Python package:</p>



<pre class="wp-block-code"><code>from oggrestapi import OGGRestAPI

client = OGGRestAPI(
    url="http://vmogg:7810",
    username="ogg",
    password="ogg"
)

client.delete_trail(trail="aa", path_query="PDB1")</code></pre>



<pre class="wp-block-code"><code>RuntimeError: ERROR (code 400) - http://vmogg:7810/services/v2/trails/aa: Unable to delete trail resource 'PDB1/aa' because there are processes using it.</code></pre>



<p class="wp-block-paragraph">This is expected: a trail still referenced by a process cannot be deleted. Delete the extract, then retry:</p>



<pre class="wp-block-code"><code>RuntimeError: ERROR (code 500) - http://vmogg:7810/services/v2/trails/aa: There was a problem updating the Administration Service resources.</code></pre>



<p class="wp-block-paragraph">On a <strong>non-empty</strong> trail, once the process that was using it is gone, this call still fails with an <code>OGG-30375</code> error (code <code>500</code>) and a generic <code>There was a problem updating the Administration Service resources</code>.</p>



<p class="wp-block-paragraph">To delete a trail with the GoldenGate REST API, you must first empty the trail sequence. Once the trail sequence is empty, the trail resource is automatically deleted. The method <code>delete_trail_sequence_collection()</code>, mapping <a href="https://docs.oracle.com/en/database/goldengate/core/26/oggra/rest-endpoints.html" target="_blank" rel="noopener noreferrer"><code>DELETE /services/{version}/trails/{trail}/sequences</code></a>, does this in one call: it takes a sequence range, <code>first</code> and <code>last</code>, as named keyword arguments:</p>



<pre class="wp-block-code"><code>result = client.delete_trail_sequence_collection(
    trail="aa",
    path="PDB1",
    first=0,
    last=999999999
)
&#091;(m&#091;"code"], m&#091;"title"]) for m in result&#091;"messages"]]</code></pre>



<pre class="wp-block-code"><code>&#091;('OGG-30282', "Using actual highest sequence number '000000001' instead of last sequence number '999999999' specified in the request for trail 'PDB1/aa'."), ('OGG-30277', "Successfully deleted '2' of '2' trail sequences for trail 'PDB1/aa'."), ('OGG-30282', "Using actual highest sequence number '000000001' instead of last sequence number '999999999' specified in the request for trail 'PDB1/aa'."), ('OGG-30277', "Successfully deleted '2' of '2' trail sequences for trail 'PDB1/aa'.")]</code></pre>



<p class="wp-block-paragraph">An oversized value for <code>last</code> is a safe way to delete “everything”. Both <code>first</code> and <code>last</code> are required: omitting either one fails with an <code>OGG-12104</code> error (no “from <code>first</code> to the end” shortcut).</p>



<h2 id="background-operations-of-purge-exttrail" class="wp-block-heading">Background operations of <code>PURGE EXTTRAIL</code></h2>



<p class="wp-block-paragraph"><code>PURGE EXTTRAIL</code> from the <code>adminclient</code> does not call this endpoint. Tracing its requests through <code>restapi.log</code> shows it calling the generic command endpoint instead, <code>POST /services/{version}/commands/execute</code>, equivalent of the <code>execute_command</code> method, with a <code>purge</code> command:</p>



<pre class="wp-block-code"><code>data = {
    "name": "purge",
    "purgeType": "trails",
    "trails": &#091;{"name": "aa", "path": "PDB1"}],
    "useCheckpoints": False,
    "keep": &#091;{"type": "min", "units": "files", "value": 0}],
}

result = client.execute_command(data=data)
&#091;(m&#091;"code"], m&#091;"title"]) for m in result&#091;"messages"]]</code></pre>



<pre class="wp-block-code"><code>&#091;('OGG-00957', "Purged old extract file 'PDB1/aa000000000'. Purge rule: Purging all files for trail 'PDB1/aa'."), ('OGG-00957', "Purged old extract file 'PDB1/aa000000001'. Purge rule: Purging all files for trail 'PDB1/aa'.")]</code></pre>



<p class="wp-block-paragraph"><code>keep</code> with <code>value: 0</code> means “keep zero files”, or <em>purge everything</em>. It has the same end result as <code>delete_trail_sequence_collection()</code>, but with one <code>OGG-00957</code> message per file instead of the range-clamp/success pair.</p>



<p class="wp-block-paragraph">Whether it’s from the <code>adminclient</code> or with the REST API, the procedure to delete trail files is the same: make sure processes are deleted before deleting their trail files, and delete them one by one or with a purge command.</p>
<p>L’article <a href="https://www.dbi-services.com/blog/deleting-goldengate-trail-files-via-the-rest-api-ogg-30375/">Deleting GoldenGate trail files via the REST API (OGG-30375)</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.dbi-services.com/blog/deleting-goldengate-trail-files-via-the-rest-api-ogg-30375/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Page Caching using Disk: Enhanced 
Lazy Loading (feed)

Served from: www.dbi-services.com @ 2026-10-22 23:48:14 by W3 Total Cache
-->