<?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>Julien Delattre, auteur/autrice sur dbi Blog</title>
	<atom:link href="https://www.dbi-services.com/blog/author/juliendelattre/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.dbi-services.com/blog/author/juliendelattre/</link>
	<description></description>
	<lastBuildDate>Thu, 13 Aug 2026 11:34:37 +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>Julien Delattre, auteur/autrice sur dbi Blog</title>
	<link>https://www.dbi-services.com/blog/author/juliendelattre/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Checking Long Running Transactions in GoldenGate</title>
		<link>https://www.dbi-services.com/blog/checking-long-running-transactions-in-goldengate/</link>
					<comments>https://www.dbi-services.com/blog/checking-long-running-transactions-in-goldengate/#respond</comments>
		
		<dc:creator><![CDATA[Julien Delattre]]></dc:creator>
		<pubDate>Mon, 17 Aug 2026 06:11:00 +0000</pubDate>
				<category><![CDATA[GoldenGate]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[ogg]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[restapi]]></category>
		<category><![CDATA[transactions]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=45630</guid>

					<description><![CDATA[<p>When doing complex operations with GoldenGate, checking for long running transactions is mandatory if you don’t want to miss transactions. Let’s look at two ways of retrieving such information, first with the adminclient, and then with the REST API. When and why should I worry about long running transactions ? In a standard extract life-cycle, [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/checking-long-running-transactions-in-goldengate/">Checking Long Running Transactions in GoldenGate</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 doing complex operations with GoldenGate, checking for long running transactions is mandatory if you don’t want to miss transactions. Let’s look at two ways of retrieving such information, first with the <code>adminclient</code>, and then with the REST API.</p>



<h2 id="h-when-and-why-should-i-worry-about-long-running-transactions" class="wp-block-heading">When and why should I worry about long running transactions ?</h2>



<p class="wp-block-paragraph">In a standard extract life-cycle, you should not be worrying about long running transactions. In fact, the only time you should think about these is when you plan an extract migration. By this, I mean moving an ongoing extract to a new GoldenGate environment.</p>



<p class="wp-block-paragraph">This could be the case if you are moving the extract to a new GoldenGate deployment, whether it’s because of a version upgrade, system change or architecture change.</p>



<p class="wp-block-paragraph">Another candidate scenario would be if you wanted to rename an extract.</p>



<h2 id="h-checking-for-long-running-transactions-with-the-adminclient" class="wp-block-heading">Checking for Long Running Transactions with the <code>adminclient</code></h2>



<p class="wp-block-paragraph">To check for long running transactions in the source database, you can use the <code>adminclient</code> and the <code>showtrans tabular</code> option of the <code>send</code> command.</p>



<pre class="wp-block-code"><code>OGG (https://vmogg ogg_test_01) 1&gt; send extract ext showtrans tabular

Sending showtrans tabular request to Extract group EXT ...



XID                     Items    Extract   Redo Thread  Start Time           SCN                               Redo Seq  Redo RBA            Status
------------------------------------------------------------------------------------------------------------------------------------------------------
0.17.18.1700953         0        EXT       1            2026-06-06:08:04:12  629.3084780551 (2704619209735)    48911     156909584           Running</code></pre>



<p class="wp-block-paragraph"><strong>WARNING:</strong> This command will query the database for <strong>ALL</strong> active transactions ! There is absolutely no filter in place to only show transactions that are relevant for the extract you are targeting. To confirm this, let’s look in the database to get more information about this transaction.</p>



<pre class="wp-block-code"><code>-- Query to get the schema associated with a specific transaction, based on the XID column from the OGG output above
SELECT s.username, t.xidusn, t.xidslot, t.xidsqn, t.start_time, t.start_scn
FROM v$transaction t
JOIN v$session s ON t.ses_addr = s.saddr
WHERE t.xidusn = 17
AND t.xidslot = 18
AND t.xidsqn = 1700953;

USERNAME       XIDUSN     XIDSLOT      XIDSQN START_TIME          START_SCN
---------  ----------  ----------  ---------- ------------------- ----------------
DBIBLOG            17          18     1700953 06/06/26 08:04:12   2704619209735</code></pre>



<p class="wp-block-paragraph">But if I look at the extract parameter file, the <code>DBIBLOG</code> schema is not even being extracted.</p>



<pre class="wp-block-code"><code>OGG (https://vmogg ogg_test_01) 1&gt; view params EXT
EXTRACT EXT
USERIDALIAS source_cdb DOMAIN OracleGoldenGate
EXTTRAIL pdb1/aa
SOURCECATALOG PDB1
TABLE APP_SCHEMA.*;</code></pre>



<p class="wp-block-paragraph">Of course, the <code>DBIBLOG</code> user might be editing data in the <code>APP_SCHEMA</code> schema, but there is no way to know for sure just by looking at the output of <code>adminclient</code> command above.</p>



<p class="wp-block-paragraph">When searching for long running transactions, you should retrieve the <code>START_SCN</code> of the transaction. In the example given above, the <code>START_SCN</code> is <code>2704619209735</code>.</p>



<p class="wp-block-paragraph">Now that we have the <code>START_SCN</code>, we can check if the extract has already processed it or not by looking at the checkpoint information. From the <code>adminclient</code>, run the <code>info extract EXT showch</code> command:</p>



<pre class="wp-block-code"><code>OGG (https://vmogg ogg_test_01) 1&gt; info extract EXT showch

Extract    EXT       Last Started 2026-06-06 07:45   Status RUNNING
Description          'Test extract'
Checkpoint Lag       00:01:45 (updated 00:00:32 ago)
Process ID           11711
Log Read Checkpoint  Oracle Integrated Redo Logs
                     2026-06-06:09:01:45
                     SCN 629.3086233843 (2704620663027)
Settings Profile     ogg:managedProcessSettings:dbiDefault


Current Checkpoint Detail:

Read Checkpoint #1

  Oracle Integrated Redo Log

  Startup Checkpoint (starting position in the data source):
    Timestamp: 2026-06-06:07:45:45.000000
    SCN: 0.0 (0)

  Recovery Checkpoint (position of oldest unprocessed transaction in the data source):
    Timestamp: 2026-06-06:08:04:13.000000
    SCN: 629.3084780551 (2704619209735)

  Current Checkpoint (position of last record read in the data source):
    Timestamp: 2026-06-06:09:01:45.000000
    SCN: 629.3086233843 (2704620663027)

  BR Startup Recovery Checkpoint:
    Timestamp: 2026-06-02 10:17:33.403806
    SCN: 0.0 (0)

  BR Begin Recovery Checkpoint:
    Timestamp: 2026-06-06 08:04:13.000000
    SCN: 629.3084780551 (2704619209735)

  BR End Recovery Checkpoint:
    Timestamp: 2026-06-06 08:08:45.000000
    SCN: 629.3084879559 (2704619308743)

Write Checkpoint #1

  GGS Log Trail

  Current Checkpoint (current write position):
    Sequence #: 41
    RBA: 50476
...</code></pre>



<p class="wp-block-paragraph">If we put side to side the <code>START_SCN</code> of the long running transaction and the <code>SCN</code> of the recovery checkpoint, we can see that they are exactly the same (<code>2704619209735</code>). This is expected, and it means that the extract has not yet processed this transaction.</p>



<pre class="wp-block-code"><code># From SQL query on the source database
USERNAME       XIDUSN     XIDSLOT      XIDSQN START_TIME          START_SCN
---------  ----------  ----------  ---------- ------------------- ----------------
DBIBLOG            17          18     1700953 06/06/26 08:04:12   2704619209735

# From adminclient
  Recovery Checkpoint (position of oldest unprocessed transaction in the data source):
    Timestamp: 2026-06-06:08:04:13.000000
    SCN: 629.3084780551 (2704619209735)</code></pre>



<p class="wp-block-paragraph">If you wanted to <strong>move the extract</strong> to another GoldenGate installation or <strong>rename it</strong>, this would be the <code>SCN</code> at which you would need to start the new extract to avoid missing transactions.</p>



<h2 id="h-checking-for-long-running-transactions-from-the-rest-api" class="wp-block-heading">Checking for Long Running Transactions from the REST API</h2>



<p class="wp-block-paragraph">If you are trying to <strong>automate</strong> the process of checking for long running transactions, using the <code>adminclient</code> might not be the best option. In fact, the display of long running transactions in the <code>adminclient</code> is not designed to be easily parsed by scripts.</p>



<p class="wp-block-paragraph">Fortunately, you can also <strong>check for long running transactions</strong> using the official <strong>GoldenGate REST API</strong>. The endpoint that you need to call is <code>GET /services/{version}/connections/{connection}/activeTransactions</code>. It is described in the GoldenGate <a href="https://docs.oracle.com/en/database/goldengate/core/26/oggra/op-services-version-connections-connection-activetransactions-get.html" target="_blank" rel="noreferrer noopener">REST API documentation</a>.</p>



<p class="wp-block-paragraph">The endpoint path parameters explain why the transactions shown in the output are not specific to the endpoint. In GoldenGate, a <code>connection</code> is database specific. Combine the domain name and the alias name with a dot separator to form the <code>connection</code> name. In my case, the <code>connection</code> name is <code>OracleGoldenGate.source_cdb</code>.</p>



<p class="wp-block-paragraph">In Python, let’s see two ways of getting the same information:</p>



<ul class="wp-block-list">
<li>Using the production-ready Python client I presented in <a href="https://www.dbi-services.com/blog/production-ready-goldengate-rest-client-in-python/" target="_blank" rel="noreferrer noopener">another blog</a>.</li>



<li>Using the <code>requests</code> library to call the REST API directly.</li>
</ul>



<p class="wp-block-paragraph">Using the Python client, you can just call the <code>get_active_transactions</code> method as follows:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
from oggrestapi import OGGRestAPI

ogg_client = OGGRestAPI(
    url=&quot;https://vmogg:7809&quot;,
    username=&quot;ogg&quot;,
)

active_transactions = ogg_client.get_active_transactions(&#039;OracleGoldenGate.source_cdb&#039;)

&amp;gt;&amp;gt;&amp;gt; active_transactions
{&#039;activeTransactions&#039;: &#x5B;{&#039;txnStartScn&#039;: 2704619209735, &#039;txnStatus&#039;: &#039;ACTIVE&#039;, &#039;txnStartDate&#039;: &#039;2026-06-06T08:04:12.000Z&#039;, &#039;sid&#039;: 834, &#039;serialNum&#039;: 16450, &#039;instanceId&#039;: 1, &#039;userName&#039;: &#039;DBIBLOG&#039;, &#039;osUser&#039;: &#039;oracle&#039;, &#039;sessionStatus&#039;: &#039;INACTIVE&#039;, &#039;logonTime&#039;: &#039;2026-06-06T08:04:11.456Z&#039;}], &#039;currentScn&#039;: {&#039;csn&#039;: 2704620465717, &#039;currentDate&#039;: &#039;2026-06-06T08:27:45.717Z&#039;, &#039;userName&#039;: &#039;SYS&#039;}, &#039;$schema&#039;: &#039;ogg:activeTransactions&#039;}
</pre></div>


<p class="wp-block-paragraph">Otherwise, with the <code>requests</code> library, you can call the <code>activeTransactions</code> endpoint as follows:</p>



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

connection_name = "OracleGoldenGate.source_cdb"
# Basic configuration
# Direct connection (no reverse proxy)
# url = f"https://vmogg:7809/services/v2/connections/{connection_name}/activeTransactions"
# NGINX reverse proxy
url = f"https://vmogg/services/ogg_test_01/adminsrvr/v2/connections/{connection_name}/activeTransactions"

auth = ("ogg", "ogg_password")
response = requests.get(
    url,
    auth=auth
)</code></pre>



<p class="wp-block-paragraph">Here is an example of the output that you should get when looking at the <code>response.json()</code> value:</p>



<pre class="wp-block-code"><code>&gt;&gt;&gt; active_transactions = response.json()&#091;'response']
&gt;&gt;&gt; active_transactions
{'activeTransactions': &#091;{'txnStartScn': 2704619209735, 'txnStatus': 'ACTIVE', 'txnStartDate': '2026-06-06T08:04:12.000Z', 'sid': 834, 'serialNum': 16450, 'instanceId': 1, 'userName': 'DBIBLOG', 'osUser': 'oracle', 'sessionStatus': 'INACTIVE', 'logonTime': '2026-06-06T08:04:11.456Z'}], 'currentScn': {'csn': 2704620465717, 'currentDate': '2026-06-06T08:27:45.717Z', 'userName': 'SYS'}, '$schema': 'ogg:activeTransactions'}</code></pre>



<p class="wp-block-paragraph">Or using the <code>json.dumps()</code> method to get a more readable output:</p>



<pre class="wp-block-code"><code>&gt;&gt;&gt; import json
&gt;&gt;&gt; print(json.dumps(active_transactions, indent=4))
{
    "activeTransactions": &#091;
        {
            "txnStartScn": 2704619209735,
            "txnStatus": "ACTIVE",
            "txnStartDate": "2026-06-06T08:04:12.000Z",
            "sid": 834,
            "serialNum": 16450,
            "instanceId": 1,
            "userName": "DBIBLOG",
            "osUser": "oracle",
            "sessionStatus": "INACTIVE",
            "logonTime": "2026-06-06T08:04:11.456Z"
        }
    ],
    "currentScn": {
        "csn": 2704620465717,
        "currentDate": "2026-06-06T08:27:45.717Z",
        "userName": "SYS"
    },
    "$schema": "ogg:activeTransactions"
}</code></pre>



<p class="wp-block-paragraph">Using the REST API, the information is more complete and easier to parse. As mentioned before, retrieving the <code>SCN</code> at which the transaction started is sometimes necessary. In that case, you can get it from the following command:</p>



<pre class="wp-block-code"><code>&gt;&gt;&gt; start_scn = active_transactions&#091;'activeTransactions']&#091;0]&#091;'txnStartScn']
&gt;&gt;&gt; start_scn
2704619209735</code></pre>



<p class="wp-block-paragraph">If you have multiple long running transactions, you should retrieve the minimum value for the <code>txnStartScn</code> to be sure to get the <code>SCN</code> of the oldest long running transaction.</p>



<pre class="wp-block-code"><code>&gt;&gt;&gt; start_scns = &#091;txn&#091;'txnStartScn'] for txn in active_transactions&#091;'activeTransactions']]
&gt;&gt;&gt; min(start_scns)
2704619209735</code></pre>



<p class="wp-block-paragraph">Now that we’ve retrieved the <code>START_SCN</code> of the long running transaction, we should check the checkpoint information.</p>



<p class="wp-block-paragraph">Using the Python client, you can call the <code>get_extract_checkpoint</code> method as follows:</p>



<pre class="wp-block-code"><code>&gt;&gt;&gt; extract_checkpoints = ogg_client.get_extract_checkpoint('EXT')
&gt;&gt;&gt; extract_checkpoints
{'$schema': 'ogg:extractCheckpoints', 'current': {'input': &#091;{'starting': {'timestamp': '2026-06-06T07:45:45.000Z', 'thread': 1, 'sequence': 0, 'offset': 0, 'csn': None, 'name': None}, 'recovery': {'timestamp': '2026-06-06T08:04:13.000Z', 'thread': 1, 'sequence': 48911, 'offset': 156909584, 'csn': 2704619209735, 'name': None}, 'current': {'timestamp': '2026-06-06T09:01:45.000Z', 'thread': 1, 'sequence': 0, 'offset': 0, 'csn': 2704620663027, 'name': None}, 'boundedRecoveryPrevious': {'timestamp': '2026-06-02 10:17:33.404Z', 'thread': 0, 'sequence': 0, 'offset': 0, 'csn': None, 'name': None}, 'boundedRecoveryBegin': {'timestamp': '2026-06-06T08:04:13.000Z', 'thread': 0, 'sequence': 48911, 'offset': 156909584, 'csn': 2704619209735, 'name': None}, 'boundedRecoveryEnd': {'timestamp': '2026-06-06T08:08:45.000Z', 'thread': 1, 'sequence': 48912, 'offset': 156918384, 'csn': 2704619308743, 'name': None}}]}</code></pre>



<p class="wp-block-paragraph">Or, using the <code>requests</code> library:</p>



<pre class="wp-block-code"><code>response = requests.get(
    "https://vmogg/services/ogg_test_01/adminsrvr/v2/extracts/EXT/checkpoint",
    auth=auth
)

extract_checkpoints = response.json()&#091;'response']</code></pre>



<p class="wp-block-paragraph">Here is a more readable output from the checkpoint information:</p>



<pre class="wp-block-code"><code>&gt;&gt;&gt; print(json.dumps(extract_checkpoints, indent=4))
{
    "$schema": "ogg:extractCheckpoints",
    "current": {
        "input": &#091;
            {
                "starting": {
                    "timestamp": "2026-06-06T07:45:45.000Z",
                    "thread": 1,
                    "sequence": 0,
                    "offset": 0,
                    "csn": null,
                    "name": null
                },
                "recovery": {
                    "timestamp": "2026-06-06T08:04:13.000Z",
                    "thread": 1,
                    "sequence": 48911,
                    "offset": 156909584,
                    "csn": 2704619209735,
                    "name": null
                },
                "current": {
                    "timestamp": "2026-06-06T09:01:45.000Z",
                    "thread": 1,
                    "sequence": 0,
                    "offset": 0,
                    "csn": 2704620663027,
                    "name": null
                },
                "boundedRecoveryPrevious": {
                    "timestamp": "2026-06-02T10:17:33.404Z",
                    "thread": 0,
                    "sequence": 0,
                    "offset": 0,
                    "csn": null,
                    "name": null
                },
                "boundedRecoveryBegin": {
                    "timestamp": "2026-06-06T08:04:13.000Z",
                    "thread": 0,
                    "sequence": 48911,
                    "offset": 156909584,
                    "csn": 2704619209735,
                    "name": null
                },
                "boundedRecoveryEnd": {
                    "timestamp": "2026-06-06T08:08:45.000Z",
                    "thread": 1,
                    "sequence": 48912,
                    "offset": 156918384,
                    "csn": 2704619308743,
                    "name": null
                }
            }
        ]
    }
}</code></pre>



<p class="wp-block-paragraph">And to finish with, from the json, you can retrieve the <code>SCN</code> of the recovery checkpoint:</p>



<pre class="wp-block-code"><code>&gt;&gt;&gt; recovery_checkpoint_scn = extract_checkpoints&#091;'current']&#091;'input']&#091;0]&#091;'recovery']&#091;'csn']
&gt;&gt;&gt; recovery_checkpoint_scn
2704619209735</code></pre>



<p class="wp-block-paragraph">Whether it’s to rename or move an extract, you now know why you should check long running transactions in GoldenGate, and how to do it from the <code>adminclient</code> and the REST API.</p>
<p>L’article <a href="https://www.dbi-services.com/blog/checking-long-running-transactions-in-goldengate/">Checking Long Running Transactions in GoldenGate</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/checking-long-running-transactions-in-goldengate/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>DB2 SQL1598N Licensing Error When Upgrading GoldenGate</title>
		<link>https://www.dbi-services.com/blog/db2-sql1598n-licensing-error-when-upgrading-goldengate/</link>
					<comments>https://www.dbi-services.com/blog/db2-sql1598n-licensing-error-when-upgrading-goldengate/#respond</comments>
		
		<dc:creator><![CDATA[Julien Delattre]]></dc:creator>
		<pubDate>Thu, 13 Aug 2026 06:18:00 +0000</pubDate>
				<category><![CDATA[GoldenGate]]></category>
		<category><![CDATA[26]]></category>
		<category><![CDATA[26ai]]></category>
		<category><![CDATA[CLI]]></category>
		<category><![CDATA[clidriver]]></category>
		<category><![CDATA[DB2]]></category>
		<category><![CDATA[db2cli]]></category>
		<category><![CDATA[Error]]></category>
		<category><![CDATA[execsql]]></category>
		<category><![CDATA[IBM]]></category>
		<category><![CDATA[Licensing]]></category>
		<category><![CDATA[ogg]]></category>
		<category><![CDATA[sql1598n]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=46175</guid>

					<description><![CDATA[<p>While upgrading GoldenGate to 26ai for a DB2 z/OS source, I had to update the IBM Data Server Driver for ODBC and CLI (CLI Driver, in short) alongside it. Since I realized that DB2 driver know-how was rare in companies, I figured it would be worth writing a blog about the topic. In this GoldenGate [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/db2-sql1598n-licensing-error-when-upgrading-goldengate/">DB2 SQL1598N Licensing Error When Upgrading GoldenGate</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 upgrading GoldenGate to 26ai for a DB2 z/OS source, I had to update the <em><a href="https://www.ibm.com/support/pages/db2-odbc-cli-driver-download-and-installation-information" target="_blank" rel="noreferrer noopener">IBM Data Server Driver for ODBC and CLI</a></em> (<em><strong>CLI Driver</strong></em>, in short) alongside it. Since I realized that DB2 driver know-how was rare in companies, I figured it would be worth writing a blog about the topic.</p>



<p class="wp-block-paragraph">In this GoldenGate upgrade, the previous driver was version 11.1 and the target version was 12.1. After installing the new driver, <code>db2cli execsql</code> commands that previously worked started failing with the following error:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
db2cli execsql -db &amp;lt;database_alias&amp;gt; -user &amp;lt;username&amp;gt; -passwd &amp;lt;password&amp;gt; \
  -inputsql /home/oracle/input.sql
</pre></div>


<p class="wp-block-paragraph">Where <code>/home/oracle/input.sql</code> just contains a trivial test query:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
select 1 from sysibm.sysdummy1;
</pre></div>


<p class="wp-block-paragraph">The <code>sysibm.sysdummy1</code> table is DB2’s equivalent of Oracle’s <code>DUAL</code>, so this is about the simplest query you can run to check connectivity. It failed with the following error:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
SQLError: 1 = 0 (SQL_SUCCESS)
SQLGetDiagRec: SQLState : 42968
NativeError : -1598
DiagMsg: &#x5B;IBM]&#x5B;CLI Driver] SQL1598N An attempt to connect to the database server failed because of a licensing problem. SQLSTATE=42968
</pre></div>


<h2 id="h-what-sql1598n-means" class="wp-block-heading">What SQL1598N means</h2>



<p class="wp-block-paragraph"><code>SQL1598N</code> means the DB2 client does not have a valid license to connect to this database. The CLI driver loaded fine. But when it tried to establish an authenticated connection the server rejected it on licensing grounds.</p>



<p class="wp-block-paragraph">This is distinct from a connection failure or an authentication failure.</p>



<h2 id="h-root-cause" class="wp-block-heading">Root cause</h2>



<p class="wp-block-paragraph">It might not be obvious for Oracle-accustomed DBAs, but the <strong>DB2 CLI Driver does not ship with a license file</strong> for connecting to DB2 for z/OS. A separate license file named <code>db2consv_zs.lic</code> must be placed manually in the <code>clidriver/license/</code> directory of the driver installation.</p>



<p class="wp-block-paragraph">The critical point is that <strong>the license file is version-specific and cannot be reused across driver versions</strong>. The license file that worked with driver 11.1 is not valid for driver 12.1. After upgrading the driver, the new installation directory does not contain the license file in the <code>license/</code> folder, and copying the old license file into it will not resolve the error.</p>



<h2 id="h-observed-behavior" class="wp-block-heading">Observed behavior</h2>



<p class="wp-block-paragraph">The error was reproducible every time the same command was run against the new driver. For reference, a successful run against a properly licensed driver returns:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
FetchAll: Columns: 1
1
1
FetchAll: 1 rows fetched.
</pre></div>


<h2 id="h-license-file-location" class="wp-block-heading">License file location</h2>



<p class="wp-block-paragraph">It is important to keep in mind that the license file belongs in the <code>license/</code> subdirectory of the CLI driver installation. With CLI driver 11.1, the path looked like:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
/opt/ibm/db2_odbc_cli_11_1/clidriver/license/db2consv_zs.lic
</pre></div>


<p class="wp-block-paragraph">After upgrading to 12.1, the <strong>new driver</strong> has its own separate installation directory with <strong>its own <code>license/</code> subdirectory</strong>. Placing the old 11.1 license file there will not work &#8211; the file is tied to the driver version.</p>



<h2 id="h-how-to-fix-the-issue" class="wp-block-heading">How to fix the issue ?</h2>



<p class="wp-block-paragraph">Since the old file is unusable, you must obtain a new license file matching the installed driver version from IBM. Essentially, you have two options here:</p>



<ul class="wp-block-list">
<li><strong>Contact your DB2 engineers</strong>: if someone on the team manages IBM software licenses, they should be able to provide the correct <code>db2consv_zs.lic</code> for the version you installed.</li>



<li><strong>Open a case with IBM customer support</strong>: IBM will provide the appropriate license file for the new driver version.</li>
</ul>



<p class="wp-block-paragraph">Once you have the correct file, place it in the <code>clidriver/license/</code> directory of the new driver installation and retry the same <code>db2cli execsql</code> command given above. No restart is required.</p>



<p class="wp-block-paragraph">DB2 CLI drivers are not that complicated to use and to debug. However, there are a few fundamentals that GoldenGate administrators should know before attempting a migration. Renewing the license file is one of them.</p>
<p>L’article <a href="https://www.dbi-services.com/blog/db2-sql1598n-licensing-error-when-upgrading-goldengate/">DB2 SQL1598N Licensing Error When Upgrading GoldenGate</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/db2-sql1598n-licensing-error-when-upgrading-goldengate/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>GoldenGate Extract Abending on NFS Trail: OGG-02897 / OGG-01668 Input/Output Error</title>
		<link>https://www.dbi-services.com/blog/goldengate-extract-abending-on-nfs-trail-ogg-02897-ogg-01668-input-output-error/</link>
					<comments>https://www.dbi-services.com/blog/goldengate-extract-abending-on-nfs-trail-ogg-02897-ogg-01668-input-output-error/#respond</comments>
		
		<dc:creator><![CDATA[Julien Delattre]]></dc:creator>
		<pubDate>Mon, 10 Aug 2026 06:02:00 +0000</pubDate>
				<category><![CDATA[GoldenGate]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[19]]></category>
		<category><![CDATA[19c]]></category>
		<category><![CDATA[26]]></category>
		<category><![CDATA[26ai]]></category>
		<category><![CDATA[Error]]></category>
		<category><![CDATA[extract]]></category>
		<category><![CDATA[NFS]]></category>
		<category><![CDATA[ogg]]></category>
		<category><![CDATA[ogg-01668]]></category>
		<category><![CDATA[ogg-02897]]></category>
		<category><![CDATA[trail]]></category>
		<category><![CDATA[Troubleshooting]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=46068</guid>

					<description><![CDATA[<p>While working on a client’s GoldenGate 26ai environment, I ran into a NFS-related replication issue that could have been serious, had it happened in production. Here is what happened and how the issue was fixed. The client’s GoldenGate extract was running on a dedicated server, capturing changes from an Oracle 19c source database. Trail files [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/goldengate-extract-abending-on-nfs-trail-ogg-02897-ogg-01668-input-output-error/">GoldenGate Extract Abending on NFS Trail: OGG-02897 / OGG-01668 Input/Output Error</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 working on a client’s GoldenGate 26ai environment, I ran into a NFS-related replication issue that could have been serious, had it happened in production. Here is what happened and how the issue was fixed.</p>



<p class="wp-block-paragraph">The client’s GoldenGate extract was running on a dedicated server, capturing changes from an Oracle 19c source database. Trail files were written on an NFS. Depending on the configuration, this is officially supported by Oracle, and works rather well.</p>



<h2 id="h-ogg-02897-ogg-01668-input-output-error" class="wp-block-heading"><code>OGG-02897</code> / <code>OGG-01668</code> Input/Output Error</h2>



<p class="wp-block-paragraph">On a Monday morning, however, the extract was <code>ABENDED</code>. The extract had been down since Saturday night, with the following error messages:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
2026-06-07T00:19:11.404+0200  ERROR   OGG-02897  Oracle GoldenGate Capture for Oracle, EXT.prm:  Failed to synchronize trail file. Error detail: Could not sync &quot;PDB1/aa000000009&quot; (error 5, Input/output error).
2026-06-07T00:19:11.404+0200  ERROR   OGG-01668  Oracle GoldenGate Capture for Oracle, EXT.prm:  PROCESS ABENDING.
</pre></div>


<p class="wp-block-paragraph">The extract was failing with an <code>OGG-02897</code> error. The OS-level error, <code>errno 5: Input/output error</code>, did not seem to indicate any good news for us. Needless to say that restarting the extract did not fix the issue.</p>



<h2 id="h-root-cause-analysis" class="wp-block-heading">Root Cause Analysis</h2>



<p class="wp-block-paragraph">A firewall upgrade had taken place that Saturday night. The firewall between the GoldenGate server and the NFS server was upgraded, and it briefly went down during the operation.</p>



<p class="wp-block-paragraph">The real problem was what happened after the firewall came back up: some extracts caught up and managed to restart properly, while other were left in this <code>ABENDED</code> state, unable to restart. For these extracts, I/O operations kept failing even though the network path was healthy again.</p>



<h2 id="h-solution-remount-the-nfs" class="wp-block-heading">Solution: Remount the NFS</h2>



<p class="wp-block-paragraph">The solution was to stop all GoldenGate processes whose trail files were generated on the NFS, including all the processes which were running fine, and then unmount and remount the NFS filesystem.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
# Unmount the NFS path
umount /path/to/nfs

# Remount all filesystems defined in /etc/fstab, including the NFS
mount -a
</pre></div>


<p class="wp-block-paragraph">Once that came back up, I restarted the extracts from the <code>adminclient</code> and they all started successfully.</p>



<p class="wp-block-paragraph">In this case, the firewall upgrade happened during the night with no GoldenGate-aware procedure in place. Next time, a scheduled GoldenGate maintenance spanning over the firewall upgrade window will probably avoid crashing multiple replications during the week-end, or worse.</p>
<p>L’article <a href="https://www.dbi-services.com/blog/goldengate-extract-abending-on-nfs-trail-ogg-02897-ogg-01668-input-output-error/">GoldenGate Extract Abending on NFS Trail: OGG-02897 / OGG-01668 Input/Output Error</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-extract-abending-on-nfs-trail-ogg-02897-ogg-01668-input-output-error/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>MongoDB OIDC Authentication with Okta</title>
		<link>https://www.dbi-services.com/blog/mongodb-oidc-authentication-with-okta/</link>
					<comments>https://www.dbi-services.com/blog/mongodb-oidc-authentication-with-okta/#respond</comments>
		
		<dc:creator><![CDATA[Julien Delattre]]></dc:creator>
		<pubDate>Thu, 06 Aug 2026 06:58:00 +0000</pubDate>
				<category><![CDATA[MongoDB]]></category>
		<category><![CDATA[Authentication]]></category>
		<category><![CDATA[ldap]]></category>
		<category><![CDATA[Mongo]]></category>
		<category><![CDATA[mongodb]]></category>
		<category><![CDATA[OAUTH2]]></category>
		<category><![CDATA[oidc]]></category>
		<category><![CDATA[okta]]></category>
		<category><![CDATA[Security]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=45678</guid>

					<description><![CDATA[<p>Since version 7.0.11, MongoDB natively supports OpenID Connect (OIDC) authentication. This move was part of MongoDB’s cloud strategy, since cloud environments use OIDC a lot for authentication and authorization. In version 8.0, MongoDB deprecated LDAP authentication and authorization, making it clear that OIDC is the future for MongoDB authentication. In this blog, I will present [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/mongodb-oidc-authentication-with-okta/">MongoDB OIDC Authentication with Okta</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">Since <strong>version 7.0.11</strong>, MongoDB natively supports <strong>OpenID Connect (OIDC) authentication</strong>. This move was part of MongoDB’s cloud strategy, since cloud environments use OIDC a lot for authentication and authorization. In version 8.0, MongoDB <a href="https://www.mongodb.com/docs/v8.0/core/LDAP-deprecation/#std-label-ldap-deprecation" target="_blank" rel="noreferrer noopener">deprecated LDAP authentication and authorization</a>, making it clear that OIDC is the future for MongoDB authentication. In this blog, I will present how to set up OIDC authentication for MongoDB in a self-managed environment with Okta.</p>



<h2 id="h-what-is-openid-connect-oidc" class="wp-block-heading">What is OpenID Connect (OIDC) ?</h2>



<p class="wp-block-paragraph">OpenID Connect (OIDC) is an <strong>authentication protocol</strong> built on top of the OAuth 2.0 framework. It allows clients (like <code>mongosh</code>) to check the identity of the user based on the authentication performed by an authorization server (like Okta). It also provides a standardized way of obtaining user profile information, resolving the authorization part of the connection.</p>



<h2 id="h-oidc-use-cases-in-mongodb" class="wp-block-heading">OIDC use cases in MongoDB</h2>



<p class="wp-block-paragraph">MongoDB supports OIDC authentication for both:</p>



<ul class="wp-block-list">
<li>Users : <strong><em>Workforce Identity Federation</em></strong></li>



<li>Applications : <strong><em>Workload Identity Federation</em></strong></li>
</ul>



<p class="wp-block-paragraph">In this blog, I will focus on the first use case.</p>



<h2 id="h-prerequisites" class="wp-block-heading">Prerequisites</h2>



<p class="wp-block-paragraph">Before setting up OIDC authentication for MongoDB, you will need the following:</p>



<ul class="wp-block-list">
<li><strong>MongoDB Enterprise Edition</strong>. OIDC authentication is only available in the Enterprise Edition of MongoDB. Alternatively, you can use Percona Server for MongoDB, which also supports OIDC authentication.</li>



<li><strong>Version 7.0.11 or later</strong> of MongoDB.</li>



<li>A working <strong>Okta tenant</strong>. A 30-day trial can be obtained <a href="https://www.okta.com/free-trial/" target="_blank" rel="noreferrer noopener">here</a>.</li>
</ul>



<p class="wp-block-paragraph">Throughout this blog, I will use very generic names (dbiapp, dbiauth, etc.) to make sure you are not missing on configuration aspects. Some of these names will be used when configuring OIDC in MongoDB.</p>



<h2 id="h-configure-oidc-in-okta" class="wp-block-heading">Configure OIDC in Okta</h2>



<h3 id="h-create-an-application-in-okta" class="wp-block-heading">Create an application in Okta</h3>



<p class="wp-block-paragraph">Start by creating an application in Okta. From the Admin Console (available at <a href="https://trial-1234567-admin.okta.com/admin/dashboard" target="_blank" rel="noreferrer noopener">https://trial-1234567-admin.okta.com/admin/dashboard</a>), navigate to Applications &gt; Applications and click on <em><strong>Create App Integration</strong></em>. Then, select <strong><em>OIDC &#8211; OpenID Connect</em></strong> as the sign-in method and <em><strong>Native</strong></em> as the application type. Click on <em><strong>Next</strong></em>.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img fetchpriority="high" decoding="async" width="704" height="984" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_applications_panel.png" alt="" class="wp-image-45684" style="width:500px" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_applications_panel.png 704w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_applications_panel-215x300.png 215w" sizes="(max-width: 704px) 100vw, 704px" /></figure>
</div>

<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img decoding="async" width="1024" height="447" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_applications_screen-1024x447.png" alt="" class="wp-image-45685" style="width:500px" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_applications_screen-1024x447.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_applications_screen-300x131.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_applications_screen-768x335.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_applications_screen.png 1110w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
</div>

<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img decoding="async" width="1024" height="806" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_create_new_app-1024x806.png" alt="" class="wp-image-45687" style="width:800px" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_create_new_app-1024x806.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_create_new_app-300x236.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_create_new_app-768x604.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_create_new_app-1536x1209.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_create_new_app.png 1850w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<h3 id="h-configuring-the-application" class="wp-block-heading">Configuring the application</h3>



<p class="wp-block-paragraph">In the application configuration screen, fill in an application name (mine will be called <code>dbiapp</code>), and select <em><strong>Grant types</strong></em> among these three choices:</p>



<ul class="wp-block-list">
<li><strong>Authorization Code</strong>: Activated by default, cannot be deactivated.</li>



<li><strong>Device Authorization</strong>: Required if you have no browser access when using <code>mongosh</code>. The shell will display a URL with which you will authenticate.</li>



<li><strong>Refresh Token</strong>: If enabled, the MongoDB driver caches the refresh token and renews the access token when it expires.</li>
</ul>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="470" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_new_native_app_refresh-1024x470.png" alt="" class="wp-image-45688" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_new_native_app_refresh-1024x470.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_new_native_app_refresh-300x138.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_new_native_app_refresh-768x353.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_new_native_app_refresh-1536x706.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_new_native_app_refresh.png 1820w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<p class="wp-block-paragraph">Then fill in the <em><strong>Sign-in redirect URIs</strong></em> with the following URL : <a href="http://localhost:27097/redirect" target="_blank" rel="noreferrer noopener">http://localhost:27097/redirect</a></p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="194" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_new_native_app_signin_url-1024x194.png" alt="" class="wp-image-45689" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_new_native_app_signin_url-1024x194.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_new_native_app_signin_url-300x57.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_new_native_app_signin_url-768x146.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_new_native_app_signin_url-1536x292.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_new_native_app_signin_url.png 1748w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<p class="wp-block-paragraph">Finally, in the Assignments section, you can choose between multiple <em><strong>Controlled access</strong></em> options:</p>



<ul class="wp-block-list">
<li>Allow everyone in your organization to access</li>



<li>Limit access to selected groups</li>



<li>Skip group assignment for now</li>
</ul>



<p class="wp-block-paragraph">In this blog, I will choose <em><strong>Allow everyone in your organization to access</strong></em>. In production environments, you might choose something else. Make sure <strong><em>Enable immediate access with&nbsp;Federation Broker Mode</em></strong> is enabled, and click on <strong><em>Save</em></strong>.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="389" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_new_native_app_access-1024x389.png" alt="" class="wp-image-45690" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_new_native_app_access-1024x389.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_new_native_app_access-300x114.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_new_native_app_access-768x291.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_new_native_app_access-1536x583.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_new_native_app_access.png 1750w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">You should now land on the newly created application page. Copy the Client ID displayed on the screen, you will need it later.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="802" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_app_client_id-1-1024x802.png" alt="" class="wp-image-45692" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_app_client_id-1-1024x802.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_app_client_id-1-300x235.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_app_client_id-1-768x601.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_app_client_id-1.png 1494w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<h3 id="h-authorization-server-configuration" class="wp-block-heading">Authorization server configuration</h3>



<p class="wp-block-paragraph">In the navigation panel, click on <em><strong>Security &gt; API</strong></em>, and <strong><em>Add Authorization Server</em></strong>.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="592" height="670" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_api_auth_srv.png" alt="" class="wp-image-45693" style="width:400px" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_api_auth_srv.png 592w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_api_auth_srv-265x300.png 265w" sizes="auto, (max-width: 592px) 100vw, 592px" /></figure>
</div>


<p class="wp-block-paragraph">Choose a name for the Authorization Server (mine will be named <code>dbiauth</code>), and paste the <em><strong>Client ID</strong></em> retrieved earlier in the <em><strong>Audience</strong></em> field.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="465" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_add_auth_srv-1-1024x465.png" alt="" class="wp-image-45695" style="width:600px" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_add_auth_srv-1-1024x465.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_add_auth_srv-1-300x136.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_add_auth_srv-1-768x349.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_add_auth_srv-1.png 1364w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<p class="wp-block-paragraph">From the newly created authorization server, copy the Issuer Metadata URI, from <code>https</code> until <code>.well-known</code> (excluded). You should have something like <code>https://trial-1234567.okta.com/oauth2/aus27qkm93wcRptbz412</code>.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="700" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_auth_srv_issuer_metadata_uri-1024x700.png" alt="" class="wp-image-45696" style="width:700px" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_auth_srv_issuer_metadata_uri-1024x700.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_auth_srv_issuer_metadata_uri-300x205.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_auth_srv_issuer_metadata_uri-768x525.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_auth_srv_issuer_metadata_uri.png 1494w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<h3 id="h-add-a-group-claim" class="wp-block-heading">Add a group claim</h3>



<p class="wp-block-paragraph">Staying on the authorization server summary, click on the <em><strong>Claims</strong></em> tab, and then on <em><strong>Add Claim</strong></em>.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="492" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_auth_claims_add_claim-1024x492.png" alt="" class="wp-image-45698" style="width:600px" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_auth_claims_add_claim-1024x492.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_auth_claims_add_claim-300x144.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_auth_claims_add_claim-768x369.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_auth_claims_add_claim.png 1086w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<p class="wp-block-paragraph">You can choose any name for the claim. I will call it <code>dbiclaim</code>. The rest of the claim should be configured as follows, with the <em><strong>Filter</strong></em> set to <strong><em>Matches regex</em></strong>, using <code>.*</code> as filter.</p>



<p class="wp-block-paragraph"><strong><em>WARNING</em></strong>: Make sure the filter is <code>.*</code>, not <code>*.*</code> or <code>*.</code> ! Otherwise, it could lead to <code>MongoServerError: Authentication failed.</code> errors.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="682" height="548" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/Screenshot-2026-07-25-at-17.06.42.png" alt="" class="wp-image-45722" style="width:700px" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/Screenshot-2026-07-25-at-17.06.42.png 682w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/Screenshot-2026-07-25-at-17.06.42-300x241.png 300w" sizes="auto, (max-width: 682px) 100vw, 682px" /></figure>
</div>


<h3 id="h-configure-an-access-policy" class="wp-block-heading">Configure an access policy</h3>



<p class="wp-block-paragraph">Now, in the <strong><em>Access Policies</em></strong> tab of the authorization server, click on <strong><em>Add Policy</em></strong>.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="573" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_auth_access_policies-1024x573.png" alt="" class="wp-image-45704" style="width:600px" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_auth_access_policies-1024x573.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_auth_access_policies-300x168.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_auth_access_policies-768x430.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_auth_access_policies.png 1490w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<p class="wp-block-paragraph">You can choose the name of the policy that you want (mine is called <code>dbipolicy</code>), and you must add a <strong><em>Description</em></strong>. Set <em><strong>Assign to</strong></em> to <em><strong>All clients</strong></em>.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="557" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_add_policy-1024x557.png" alt="" class="wp-image-45705" style="width:500px" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_add_policy-1024x557.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_add_policy-300x163.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_add_policy-768x418.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_add_policy.png 1258w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<p class="wp-block-paragraph">After creating the policy, click on <em><strong>Add rule</strong></em>.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="454" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_dbipolicy-1024x454.png" alt="" class="wp-image-45708" style="width:700px" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_dbipolicy-1024x454.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_dbipolicy-300x133.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_dbipolicy-768x341.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_dbipolicy-1536x682.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_dbipolicy.png 1938w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<p class="wp-block-paragraph">This is the part where you should be customizing the rule based on your internal security policies. I will name my rule <code>dbirule</code>, and keep everything default except for the <em><strong>Refresh token</strong></em> lifetime, which is set to <em><strong>Unlimited</strong></em>.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="870" height="1024" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_dbirule-870x1024.png" alt="" class="wp-image-45710" style="width:600px" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_dbirule-870x1024.png 870w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_dbirule-255x300.png 255w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_dbirule-768x904.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_dbirule.png 1216w" sizes="auto, (max-width: 870px) 100vw, 870px" /></figure>
</div>


<h3 id="h-create-a-group-and-a-user" class="wp-block-heading">Create a group and a user</h3>



<p class="wp-block-paragraph">If you already use Okta, you should have existing groups and users. But for the purpose of the blog, let’s create a group and a user. Navigate on the left to <strong><em>Directory &gt; Groups</em></strong>, and click on <em><strong>Add Group</strong></em>.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="522" height="538" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_groups_tab.png" alt="" class="wp-image-45711" style="width:300px" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_groups_tab.png 522w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_groups_tab-291x300.png 291w" sizes="auto, (max-width: 522px) 100vw, 522px" /></figure>
</div>

<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="248" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_groups_add_group-1024x248.png" alt="" class="wp-image-45712" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_groups_add_group-1024x248.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_groups_add_group-300x73.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_groups_add_group-768x186.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_groups_add_group-1536x372.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_groups_add_group.png 1848w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<p class="wp-block-paragraph">MongoDB names the group <code>OIDC</code>, without stating whether it is the only name supported or not. But you can choose your own name. I will call the group <code>dbigroup</code>.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="1230" height="444" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_add_group_dbigroup.png" alt="" class="wp-image-45725" style="width:500px" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_add_group_dbigroup.png 1230w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_add_group_dbigroup-300x108.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_add_group_dbigroup-1024x370.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_add_group_dbigroup-768x277.png 768w" sizes="auto, (max-width: 1230px) 100vw, 1230px" /></figure>
</div>


<p class="wp-block-paragraph">After creating the group, add a user in the <em><strong>Directory &gt; People</strong></em> section, clicking on <strong><em>Add Person</em></strong>.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="518" height="452" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_people_tab.png" alt="" class="wp-image-45714" style="width:300px" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_people_tab.png 518w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_people_tab-300x262.png 300w" sizes="auto, (max-width: 518px) 100vw, 518px" /></figure>
</div>

<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="841" height="1024" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_add_person_dbigroups-841x1024.png" alt="" class="wp-image-45726" style="width:600px" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_add_person_dbigroups-841x1024.png 841w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_add_person_dbigroups-246x300.png 246w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_add_person_dbigroups-768x935.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/okta_add_person_dbigroups.png 1224w" sizes="auto, (max-width: 841px) 100vw, 841px" /></figure>
</div>


<p class="wp-block-paragraph">There are two important aspects here:</p>



<ul class="wp-block-list">
<li>Use an email for the <em><strong>Username</strong></em> field.</li>



<li>Add the <code>dbigroup</code> group to the <strong><em>Groups</em></strong>.</li>
</ul>



<p class="wp-block-paragraph">Before continuing, <strong>make sure the user is activated</strong> following the procedure received by email</p>



<h2 id="h-configure-mongodb-for-oidc-authentication" class="wp-block-heading">Configure MongoDB for OIDC authentication</h2>



<p class="wp-block-paragraph"><strong>Stop</strong> your MongoDB 7.0.11+ Enterprise Edition instance, and <strong>edit the configuration file</strong> by adding the following <code>setParameter</code> section:</p>



<ul class="wp-block-list">
<li><code>authenticationMechanisms</code>: set it to <code>MONGODB-OIDC</code> if you want to enable only OIDC authentication, or <code>MONGODB-OIDC,SCRAM-SHA-256</code> if you want to keep authentication with password for previous users.</li>



<li><code>issuer</code>: use the <em><strong>Issuer Metadata URI</strong></em> copied after creating the authorization server (<code>https://trial-1234567.okta.com/oauth2/aus27qkm93wcRptbz412</code>)</li>



<li><code>audience</code> and <code>clientId</code>: for both fields, use the <em><strong>Client ID</strong></em> associated with the application created at the very beginning (<code>0oa89cvj16d4WFKrX307</code>, for instance)</li>



<li><code>authNamePrefix</code>: <code>okta-issuer</code></li>



<li><code>authorizationClaim</code>: use the name of the claim created on the authorization server. In my case, it is <code>dbiclaim</code>.</li>
</ul>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
# Paste this at the end of your MongoDB configuration file
setParameter:
   authenticationMechanisms: &quot;MONGODB-OIDC&quot;
   oidcIdentityProviders: &#039;&#x5B; {
      &quot;issuer&quot;: &quot;https://trial-1234567.okta.com/oauth2/aus27qkm93wcRptbz412&quot;,
      &quot;audience&quot;: &quot;0oa89cvj16d4WFKrX307&quot;,
      &quot;authNamePrefix&quot;: &quot;okta-issuer&quot;,
      &quot;authorizationClaim&quot;: &quot;dbiclaim&quot;,
      &quot;clientId&quot;: &quot;0oa89cvj16d4WFKrX307&quot;
   } ]&#039;
</pre></div>


<p class="wp-block-paragraph">After changing the configuration file, you can <strong>restart your MongoDB instance</strong>. If <code>security.authorization</code> is not <code>enabled</code> yet, you should set it now and make sure you have a user able to create roles.</p>



<p class="wp-block-paragraph">Log in with a privileged user to your MongoDB instance, and create a new role for OIDC authentication. The role name should be based on <code>authNamePrefix</code> (<code>okta-issuer</code>) and the group name (<code>dbigroup</code>). In this blog, I will create the <code>okta-issuer/dbigroup</code> role.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
use admin
db.createRole( {
   role: &quot;okta-issuer/dbigroup&quot;,
   privileges: &#x5B; ],
   roles: &#x5B; &quot;readWriteAnyDatabase&quot; ]
} )
</pre></div>


<p class="wp-block-paragraph">Now, any member of the <code>dbigroup</code> group should be able to log in with <code>mongosh</code> or any other connection tool, with the following parameters:</p>



<ul class="wp-block-list">
<li><code>--authenticationMechanism</code> flag set to <code>MONGODB-OIDC</code>. This parameter value is the official MongoDB parameter.</li>



<li><code>--oidcFlows</code> flag set to <code>device-auth</code>. This can be used in environments where <code>mongosh</code> will not be able to launch a browser.</li>
</ul>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
# Change the MONGO_URI accordingly
MONGO_URI=&quot;mongodb://127.0.0.1:27017&quot;
mongosh &quot;$MONGO_URI&quot; --authenticationMechanism MONGODB-OIDC --oidcFlows=device-auth
</pre></div>


<p class="wp-block-paragraph">After a few seconds, you will receive the URL to complete authentication:</p>



<pre class="wp-block-code"><code>mongodb@mongodb-lab-01:/home/mongodb/ &#091;mdb02] mongosh "$MONGO_URI" --authenticationMechanism MONGODB-OIDC --oidcFlows=device-auth
Current Mongosh Log ID:	6a64a98717240b2e9d9df8a2
Connecting to:		mongodb://127.0.0.1:27017/?directConnection=true&amp;serverSelectionTimeoutMS=2000&amp;authMechanism=MONGODB-OIDC&amp;appName=mongosh+2.9.2

Visit the following URL to complete authentication: https://trial-1234567.okta.com/activate
Enter the following code on that page: RQXFMWTF
Waiting...</code></pre>



<p class="wp-block-paragraph">You can now open the link given (<code>https://trial-1234567.okta.com/activate</code>), and it will ask for the activation code (<code>RQXFMWTF</code>).</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="397" height="417" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/Screenshot-2026-07-25-at-17.09.30.png" alt="" class="wp-image-45727" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/Screenshot-2026-07-25-at-17.09.30.png 397w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/Screenshot-2026-07-25-at-17.09.30-286x300.png 286w" sizes="auto, (max-width: 397px) 100vw, 397px" /></figure>
</div>


<p class="wp-block-paragraph">Once the device is activated, the <code>mongosh</code> prompt will succeed:</p>



<pre class="wp-block-code"><code>mongodb@mongodb-lab-01:/home/mongodb/ &#091;mdb02] mongosh "$MONGO_URI" --authenticationMechanism MONGODB-OIDC --oidcFlows=device-auth
Current Mongosh Log ID:	6a64a98717240b2e9d9df8a2
Connecting to:		mongodb://127.0.0.1:27017/?directConnection=true&amp;serverSelectionTimeoutMS=2000&amp;authMechanism=MONGODB-OIDC&amp;appName=mongosh+2.9.2

Visit the following URL to complete authentication: https://trial-1234567.okta.com/activate
Enter the following code on that page: RQXFMWTF
Waiting...
Using MongoDB:		8.0.26
Using Mongosh:		2.9.2

Enterprise test&gt;</code></pre>



<p class="wp-block-paragraph">And if you run the <code>db.runCommand({connectionStatus:1})</code> command, you will see the OIDC connection information:</p>



<pre class="wp-block-code"><code>Enterprise test&gt; db.runCommand({connectionStatus:1})
{
  authInfo: {
    authenticatedUsers: &#091; { user: 'okta-issuer/dbiblog@dbi-services.com', db: '$external' } ],
    authenticatedUserRoles: &#091;
      { role: 'okta-issuer/Everyone', db: 'admin' },
      { role: 'okta-issuer/dbigroup', db: 'admin' },
      { role: 'readWriteAnyDatabase', db: 'admin' }
    ]
  },
  ok: 1
}</code></pre>



<h2 id="h-adapt-dmk-to-work-with-oidc" class="wp-block-heading">Adapt DMK to work with OIDC</h2>



<p class="wp-block-paragraph">If you use the <a href="https://dbi-services.gitbook.io/dmk-mongodb">MongoDB DMK</a>, you should either adapt the <code>msp</code> alias or create a new <code>msoidc</code> alias to connect to your instances. To do so, edit the local configuration file of DMK with the <code>dmkl</code> alias:</p>



<pre class="wp-block-code"><code># Option 1: change the msp alias
alias::msp::novar_noforce::'ms --authenticationMechanism MONGODB-OIDC --oidcFlows=device-auth'::

# Option 2: add a new msoidc alias
alias::msoidc::novar_noforce::'ms --authenticationMechanism MONGODB-OIDC --oidcFlows=device-auth'::</code></pre>
<p>L’article <a href="https://www.dbi-services.com/blog/mongodb-oidc-authentication-with-okta/">MongoDB OIDC Authentication with Okta</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/mongodb-oidc-authentication-with-okta/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Simplified Distribution Path Creation in GoldenGate 26.3</title>
		<link>https://www.dbi-services.com/blog/simplified-distribution-path-creation-in-goldengate-26-3/</link>
					<comments>https://www.dbi-services.com/blog/simplified-distribution-path-creation-in-goldengate-26-3/#respond</comments>
		
		<dc:creator><![CDATA[Julien Delattre]]></dc:creator>
		<pubDate>Mon, 03 Aug 2026 06:20:00 +0000</pubDate>
				<category><![CDATA[GoldenGate]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[26]]></category>
		<category><![CDATA[26ai]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[distribution]]></category>
		<category><![CDATA[ogg]]></category>
		<category><![CDATA[path]]></category>
		<category><![CDATA[receiver]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[restapi]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=46172</guid>

					<description><![CDATA[<p>The&#160;23.26.3.0.0&#160;release update of GoldenGate 26ai (July 2026) ships a small but welcome usability change, listed in the&#160;New Enhancements&#160;section of the release notes: Bug 39415027: Generic &#8211; Simplified Distribution and Receiver Service Path Configuration Enhanced the Create Distribution and Receiver Service Paths experience by introducing Simple and Advanced configuration modes. The simplified view displays only the [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/simplified-distribution-path-creation-in-goldengate-26-3/">Simplified Distribution Path Creation in GoldenGate 26.3</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">The&nbsp;<code>23.26.3.0.0</code>&nbsp;release update of GoldenGate 26ai (July 2026) ships a small but welcome usability change, listed in the&nbsp;<em><strong>New Enhancements</strong></em>&nbsp;section of the release notes:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>Bug 39415027: Generic &#8211; Simplified Distribution and Receiver Service Path Configuration</strong></p>



<p class="wp-block-paragraph">Enhanced the Create Distribution and Receiver Service Paths experience by introducing Simple and Advanced configuration modes. The simplified view displays only the required settings by default, while advanced options remain available for users who need additional configuration.</p>
</blockquote>



<p class="wp-block-paragraph">Anyone who has created a distribution path from the web UI knows the form used to be long. I already walked through the full setup in a&nbsp;<a href="https://www.dbi-services.com/blog/create-distribution-paths-in-nginx-secured-goldengate-26ai/" target="_blank" rel="noreferrer noopener">previous blog on distribution paths in NGINX-secured deployments</a>. This enhancement simplifies the creation form for most common use cases.</p>



<p class="wp-block-paragraph">In this blog, I want to look at what changes: first in the web UI, then what the hidden fields default to, and finally whether anything changes at the REST API level.</p>



<h2 id="h-what-changes-in-the-web-ui" class="wp-block-heading">What changes in the web UI</h2>



<p class="wp-block-paragraph">This enhancement is in fact&nbsp;<strong>two separate changes</strong>, shipped together.</p>



<p class="wp-block-paragraph">First, the&nbsp;<strong>form collapsed to a single step</strong>. In&nbsp;<code>23.26.2</code>&nbsp;and earlier version of GoldenGate, creating a path was a six-step process:&nbsp;<em>Path Information</em>,&nbsp;<em>Source Options</em>,&nbsp;<em>Target Options</em>,&nbsp;<em>Advanced Options</em>,&nbsp;<em>Filtering Options</em>&nbsp;and&nbsp;<em>Managed Options</em>.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="1024" height="1019" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/ogg_blog_nginx_dist_path_1-1024x1019-3a55af10.png" alt="" class="wp-image-46176" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/ogg_blog_nginx_dist_path_1-1024x1019-3a55af10.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/ogg_blog_nginx_dist_path_1-1024x1019-3a55af10-300x300.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/ogg_blog_nginx_dist_path_1-1024x1019-3a55af10-150x150.png 150w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/ogg_blog_nginx_dist_path_1-1024x1019-3a55af10-768x764.png 768w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<p class="wp-block-paragraph">Starting with&nbsp;<code>23.26.3.0.0</code>, these steps are gone. Instead, there are now only&nbsp;<strong>two steps: a configuration page, and a review page.</strong>&nbsp;Most of what used to be spread across the six screens now lives on the first page; the rest (the managed, format and network tuning options) moved onto the&nbsp;<em><strong>Review</strong></em>&nbsp;page, which is interactive rather than a read-only summary.</p>



<p class="wp-block-paragraph">The second change is that this single page has a&nbsp;<strong>Default / Advanced toggle</strong>. This is the part the release notes mention:</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="480" height="175" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/dist-path-default-advanced-toggle.png" alt="" class="wp-image-46177" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/dist-path-default-advanced-toggle.png 480w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/dist-path-default-advanced-toggle-300x109.png 300w" sizes="auto, (max-width: 480px) 100vw, 480px" /></figure>
</div>


<p class="wp-block-paragraph"><strong>Default mode</strong>: only the required settings are displayed, like path name, source (extract and trail) and target (host, port, protocol and target trail).</p>



<p class="wp-block-paragraph"><strong>Advanced mode</strong>: the same single page, but every optional field is revealed: air gap security, trail file size, target type, HPE NonStop toggle, format options and network options. The reverse proxy toggle, encryption and filtering checkboxes are present in both modes (see below).</p>



<p class="wp-block-paragraph">Switching to Advanced in&nbsp;<code>23.26.3</code>&nbsp;does&nbsp;<strong>not</strong>&nbsp;bring back the six steps. It stays on one page, revealing the hidden fields. Here are the two forms:</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="480" height="735" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/dist-path-default-mode-ogg.png" alt="" class="wp-image-46178" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/dist-path-default-mode-ogg.png 480w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/dist-path-default-mode-ogg-196x300.png 196w" sizes="auto, (max-width: 480px) 100vw, 480px" /></figure>
</div>

<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="480" height="840" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/dist-path-advanced-mode-ogg.png" alt="" class="wp-image-46179" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/dist-path-advanced-mode-ogg.png 480w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/dist-path-advanced-mode-ogg-171x300.png 171w" sizes="auto, (max-width: 480px) 100vw, 480px" /></figure>
</div>


<p class="wp-block-paragraph"><em><strong>NB</strong></em>: The same&nbsp;<strong>Default / Advanced mechanism</strong>&nbsp;applies to the&nbsp;<strong>Receiver Service</strong>&nbsp;path creation form.</p>



<h2 id="h-what-do-the-hidden-fields-default-to" class="wp-block-heading">What do the hidden fields default to?</h2>



<p class="wp-block-paragraph">When Default mode hides a field, nothing is left blank. GoldenGate will silently apply a default value when calling the REST API. Knowing these defaults will help you decide whether to use the Default or the Advanced mode. Here is the list of what Advanced mode reveals.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Field only editable in Advanced</th><th class="has-text-align-left" data-align="left">Applies to</th><th class="has-text-align-left" data-align="left">Default value</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left">Air Gap Security Enabled</td><td class="has-text-align-left" data-align="left">all protocols</td><td class="has-text-align-left" data-align="left">Disabled</td></tr><tr><td class="has-text-align-left" data-align="left">Trail Size (MB)</td><td class="has-text-align-left" data-align="left">all protocols</td><td class="has-text-align-left" data-align="left">2000 MB</td></tr><tr><td class="has-text-align-left" data-align="left">Target Type (Manager / Collector / Receiver Service)</td><td class="has-text-align-left" data-align="left"><code>ogg</code></td><td class="has-text-align-left" data-align="left">Manager</td></tr><tr><td class="has-text-align-left" data-align="left">Target is HPE NonStop</td><td class="has-text-align-left" data-align="left"><code>ogg</code></td><td class="has-text-align-left" data-align="left">Disabled</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">So a path created in Default mode always gets a 2000 MB trail, no air gap security, and (for an&nbsp;<code>ogg</code>&nbsp;target) a Manager target type. If any of those needs to change, you should switch to Advanced mode.</p>



<h3 id="h-the-review-step-carries-the-managed-and-tuning-options" class="wp-block-heading">The Review step carries the managed and tuning options</h3>



<p class="wp-block-paragraph">The second step (<strong>Review</strong>) is not a read-only summary. It always shows a summary of the path&nbsp;<em>and</em>&nbsp;an editable&nbsp;<strong>Managed Options</strong>&nbsp;section. In Advanced mode, it also shows&nbsp;<strong>Format options</strong>&nbsp;and a large&nbsp;<strong>Network Options</strong>&nbsp;section. The Default/Advanced mode toggle also changes what you see here:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Section on the Review step</th><th class="has-text-align-left" data-align="left">Default</th><th class="has-text-align-left" data-align="left">Advanced</th><th class="has-text-align-left" data-align="left">Notable defaults</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left">Managed Options (Critical, Auto Restart, retries, delay)</td><td class="has-text-align-left" data-align="left">Shown</td><td class="has-text-align-left" data-align="left">Shown</td><td class="has-text-align-left" data-align="left">Auto Restart&nbsp;<strong>on</strong>, 10 retries, 2 minute delay; Critical&nbsp;<strong>off</strong></td></tr><tr><td class="has-text-align-left" data-align="left">Format options (target format Type)</td><td class="has-text-align-left" data-align="left">Hidden</td><td class="has-text-align-left" data-align="left">Shown</td><td class="has-text-align-left" data-align="left">Target Type = Default</td></tr><tr><td class="has-text-align-left" data-align="left">Network Options (compression, TCP tuning, buffers, keep-alive)</td><td class="has-text-align-left" data-align="left">Hidden</td><td class="has-text-align-left" data-align="left">Shown</td><td class="has-text-align-left" data-align="left">Compression off, EOF delay 10 tenths, checkpoint frequency 10, DSCP / TOS DEFAULT, TCP_NODELAY on</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">To summarize,&nbsp;<strong>auto restart is on by default</strong>&nbsp;(10 retries, 2 minute delay) and you can adjust it without leaving Default mode. The network tuning parameters (compression, EOF delay, DSCP / TOS, TCP flags, socket buffers) keep their usual defaults unless you switch to Advanced mode and change them.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="480" height="519" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/dist-path-review-default.png" alt="" class="wp-image-46180" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/dist-path-review-default.png 480w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/dist-path-review-default-277x300.png 277w" sizes="auto, (max-width: 480px) 100vw, 480px" /></figure>
</div>

<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="480" height="913" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/dist-path-review-advanced.png" alt="" class="wp-image-46181" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/dist-path-review-advanced.png 480w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/dist-path-review-advanced-158x300.png 158w" sizes="auto, (max-width: 480px) 100vw, 480px" /></figure>
</div>


<h3 id="h-default-mode-nbsp-does-not-mean-nbsp-no-security" class="wp-block-heading"><em>Default mode</em>&nbsp;does not mean&nbsp;<em>no security</em></h3>



<p class="wp-block-paragraph">The distribution path creation form is also adapted to the protocol you choose. Selecting the&nbsp;<strong>Target Protocol</strong>&nbsp;changes which fields appear, in both modes:</p>



<ul class="wp-block-list">
<li><strong><code>ogg</code></strong>&nbsp;is the classic mode, without authentication fields. Advanced adds the Target Type and the HPE NonStop toggle.</li>



<li><strong><code>ws</code></strong>&nbsp;and&nbsp;<strong><code>wss</code></strong>: both add a reverse proxy toggle (disabled by default) and a&nbsp;<strong>Target Authentication Method</strong>: Certificate is the pre-selected value for&nbsp;<code>wss</code>. Switching to UserID Alias shows&nbsp;<code>Domain: Network</code>&nbsp;(greyed out, not editable) and an&nbsp;<code>Alias</code>&nbsp;dropdown (the same reserved&nbsp;<code>Network</code>&nbsp;domain used for path connection credentials).</li>
</ul>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="480" height="825" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/dist-path-default-mode-wss-cert.png" alt="" class="wp-image-46182" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/dist-path-default-mode-wss-cert.png 480w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/08/dist-path-default-mode-wss-cert-175x300.png 175w" sizes="auto, (max-width: 480px) 100vw, 480px" /></figure>
</div>


<p class="wp-block-paragraph">Since GoldenGate 26ai, the default for trail file size is no longer 500 MB but 2000 MB. If you are fine with a 2000 MB trail, no air gap, a Manager target (for&nbsp;<code>ogg</code>&nbsp;protocol), and the default auto restart behaviour, you can keep the default mode. Switch to Advanced when you want a different trail size, air gap setup, a Collector or Receiver Service target, HPE NonStop, a specific target format, or any of the network tuning options.</p>



<h2 id="h-nothing-changes-in-goldengate-rest-api" class="wp-block-heading">Nothing changes in GoldenGate REST API</h2>



<p class="wp-block-paragraph">The Default / Advanced switch is&nbsp;<strong>purely a web UI convenience</strong>. It changes which fields the form renders, not what GoldenGate stores or how you create a path programmatically. The REST endpoints are unchanged:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Operation</th><th class="has-text-align-left" data-align="left">Verb</th><th class="has-text-align-left" data-align="left">Endpoint</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left">Create distribution path</td><td class="has-text-align-left" data-align="left"><code>POST</code></td><td class="has-text-align-left" data-align="left"><code>/services/{version}/sources/{distpath}</code></td></tr><tr><td class="has-text-align-left" data-align="left">Update distribution path</td><td class="has-text-align-left" data-align="left"><code>PATCH</code></td><td class="has-text-align-left" data-align="left"><code>/services/{version}/sources/{distpath}</code></td></tr><tr><td class="has-text-align-left" data-align="left">Create receiver (collector) path</td><td class="has-text-align-left" data-align="left"><code>POST</code></td><td class="has-text-align-left" data-align="left"><code>/services/{version}/targets/{path}</code></td></tr><tr><td class="has-text-align-left" data-align="left">Update receiver path</td><td class="has-text-align-left" data-align="left"><code>PATCH</code></td><td class="has-text-align-left" data-align="left"><code>/services/{version}/targets/{path}</code></td></tr></tbody></table></figure>



<p class="wp-block-paragraph">If you automate distribution path creation (I will publish a blog about this soon) in your environments,&nbsp;<strong>nothing changes</strong>. The payload you send is identical before and after patching to&nbsp;<code>23.26.3.0.0</code>.</p>



<p class="wp-block-paragraph">From a web UI perspective, paths are created with the exact same payloads in Default and Advanced mode. For instance, I created one path from the web UI in Default mode (<code>DEFPATH</code>) and an equivalent one in Advanced mode (<code>ADVPATH</code>), with the same source and target, as well as every optional field left at its pre-filled value. Analyzing the <a href="https://www.dbi-services.com/blog/querying-goldengate-rest-api-log-efficiently/" target="_blank" rel="noreferrer noopener">restapi.log files</a>, here is the content of the payload:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
oracle@vmogg: jq -c &#039;select(.request.context.verb == &quot;POST&quot; and .request.context.uriTemplate == &quot;/services/{version}/sources/{distpath}&quot;)&#039; restapi.ndjson
</pre></div>


<p class="wp-block-paragraph">Captured&nbsp;<code>DEFPATH</code>&nbsp;(Default mode),&nbsp;<code>POST /services/v2/sources/DEFPATH</code>:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
{
  &quot;name&quot;: &quot;DEFPATH&quot;,
  &quot;status&quot;: &quot;stopped&quot;,
  &quot;source&quot;: {
    &quot;uri&quot;: &quot;trail://localhost:7811/services/v2/sources?trail=e1&quot;,
    &quot;details&quot;: {}
  },
  &quot;target&quot;: {
    &quot;isDynamicOggPort&quot;: true,
    &quot;uri&quot;: &quot;ogg://vmogg2:7812/services/v2/targets?trail=ea&quot;,
    &quot;details&quot;: {
      &quot;trail&quot;: { &quot;seqLength&quot;: 9, &quot;sizeMB&quot;: 2000 },
      &quot;compression&quot;: { &quot;enabled&quot;: false }
    }
  },
  &quot;options&quot;: {
    &quot;eofDelayCSecs&quot;: 10,
    &quot;checkpointFrequency&quot;: 10,
    &quot;critical&quot;: false,
    &quot;autoRestart&quot;: { &quot;retries&quot;: 10, &quot;delay&quot;: 2 },
    &quot;streaming&quot;: true
  },
  &quot;begin&quot;: { &quot;sequence&quot;: 0, &quot;offset&quot;: 0 }
}
</pre></div>


<p class="wp-block-paragraph">Captured&nbsp;<code>ADVPATH</code>&nbsp;(Advanced mode),&nbsp;<code>POST /services/v2/sources/ADVPATH</code>:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
{
  &quot;name&quot;: &quot;ADVPATH&quot;,
  &quot;status&quot;: &quot;stopped&quot;,
  &quot;source&quot;: {
    &quot;uri&quot;: &quot;trail://localhost:7811/services/v2/sources?trail=e1&quot;,
    &quot;details&quot;: {}
  },
  &quot;target&quot;: {
    &quot;isDynamicOggPort&quot;: true,
    &quot;uri&quot;: &quot;ogg://vmogg2:7812/services/v2/targets?trail=eb&quot;,
    &quot;details&quot;: {
      &quot;trail&quot;: { &quot;seqLength&quot;: 9, &quot;sizeMB&quot;: 2000 },
      &quot;compression&quot;: { &quot;enabled&quot;: false }
    }
  },
  &quot;options&quot;: {
    &quot;eofDelayCSecs&quot;: 10,
    &quot;checkpointFrequency&quot;: 10,
    &quot;critical&quot;: false,
    &quot;autoRestart&quot;: { &quot;retries&quot;: 10, &quot;delay&quot;: 2 },
    &quot;streaming&quot;: true
  },
  &quot;begin&quot;: { &quot;sequence&quot;: 0, &quot;offset&quot;: 0 }
}
</pre></div>


<p class="wp-block-paragraph">The two bodies differ&nbsp;<strong>only in&nbsp;<code>name</code>&nbsp;and the target trail letter</strong>. Every optional key that Default mode is supposed to “hide” (<code>sizeMB</code>,&nbsp;<code>seqLength</code>,&nbsp;<code>compression.enabled</code>,&nbsp;<code>eofDelayCSecs</code>,&nbsp;<code>checkpointFrequency</code>,&nbsp;<code>critical</code>,&nbsp;<code>autoRestart</code>,&nbsp;<code>streaming</code>) is sent explicitly by&nbsp;<em>both</em>&nbsp;modes, with the same value.</p>



<p class="wp-block-paragraph">If you work mostly from the web UI and create paths by hand, the new form will help you. And if you automate with the REST API, this enhancement does not affect you at all. Your existing calls keep working exactly as before, and you were already, in effect, in “advanced mode” because you send whatever properties you choose.</p>
<p>L’article <a href="https://www.dbi-services.com/blog/simplified-distribution-path-creation-in-goldengate-26-3/">Simplified Distribution Path Creation in GoldenGate 26.3</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/simplified-distribution-path-creation-in-goldengate-26-3/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>MongoDB DMK 2.5.0: Sharding support and new features</title>
		<link>https://www.dbi-services.com/blog/mongodb-dmk-2-5-0-sharding-support-and-new-features/</link>
					<comments>https://www.dbi-services.com/blog/mongodb-dmk-2-5-0-sharding-support-and-new-features/#respond</comments>
		
		<dc:creator><![CDATA[Julien Delattre]]></dc:creator>
		<pubDate>Fri, 26 Jun 2026 12:54:00 +0000</pubDate>
				<category><![CDATA[MongoDB]]></category>
		<category><![CDATA[2.5.0]]></category>
		<category><![CDATA[DMK]]></category>
		<category><![CDATA[Management]]></category>
		<category><![CDATA[Mongo]]></category>
		<category><![CDATA[mongodb]]></category>
		<category><![CDATA[New]]></category>
		<category><![CDATA[release]]></category>
		<category><![CDATA[Sharding]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=45326</guid>

					<description><![CDATA[<p>In this blog, I will present the new features introduced with the latest release (2.5.0) of the MongoDB DMK. The DMK is a set of standardized tools that aims at easing the work of DBAs by having dbi&#8217;s best practices embedded in common scripts across all the database servers of an organization. dbi services provides [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/mongodb-dmk-2-5-0-sharding-support-and-new-features/">MongoDB DMK 2.5.0: Sharding support and new features</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 this blog, I will present the new features introduced with the latest release (<strong>2.5.0</strong>) of the MongoDB DMK.</p>



<p class="wp-block-paragraph">The DMK is a set of standardized tools that aims at easing the work of DBAs by having dbi&#8217;s best practices embedded in common scripts across all the database servers of an organization.</p>



<p class="wp-block-paragraph">dbi services provides the&nbsp;<a href="https://www.dbi-services.com/fr/produits/dmk-management-kit/" target="_blank" rel="noreferrer noopener">DMK</a>&nbsp;(<em>Database Management Kit</em>) to its customers for multiple technologies: Oracle, Postgres, MongoDB, etc. This toolkit is provided&nbsp;<strong>free of charge</strong>&nbsp;to all clients who work with dbi services on a consulting project.</p>



<h2 id="h-new-features-of-the-mongodb-dmk-in-2-5-0" class="wp-block-heading">New features of the MongoDB DMK in 2.5.0</h2>



<h3 id="h-sharding-support" class="wp-block-heading">Sharding support</h3>



<p class="wp-block-paragraph">The biggest addition in DMK 2.5.0 is&nbsp;<strong>full sharding support</strong>. DMK can now create, start, stop, restart, and display the status of every component of a sharded MongoDB cluster: config server replica sets, shard replica sets, and&nbsp;<code>mongos</code>&nbsp;routers.</p>



<p class="wp-block-paragraph">Internally, <strong>instance management was refactored</strong> into a class hierarchy: a <code>MongoInstance</code> base class handles what is common to all MongoDB processes (URI construction, <code>mongosh</code> command execution, status gathering), and <code>MongodInstance</code> / <code>MongosInstance</code> extend it for their respective types. From a day-to-day usage perspective, this is transparent: you use the same <code>dmk_db_ctl.py</code> and <code>dmk_status.py</code> commands for all instance types.</p>



<p class="wp-block-paragraph">A few behaviours are specific to&nbsp;<code>mongos</code>: stopping a&nbsp;<code>mongos</code>&nbsp;router uses&nbsp;<code>SIGTERM</code>&nbsp;instead of the&nbsp;<code>--shutdown</code>&nbsp;command (which&nbsp;<code>mongos</code>&nbsp;does not support), and trying to back up a&nbsp;<code>mongos</code>&nbsp;instance now raises an explicit error, since&nbsp;<code>mongos</code>&nbsp;processes hold no data. In a sharded configuration, the underlying shards should be backed up instead.</p>



<p class="wp-block-paragraph"><strong>New configuration templates</strong> for each sharding component type are available in <code>$DMK_HOME/templates/dbcreate/</code>, in both forked (no systemd) and non-forked (systemd-managed) variants. A dedicated systemd unit file template (<code>mongos.service.template</code>) was also added for <code>mongos</code> routers.</p>



<p class="wp-block-paragraph">Three new generic JavaScript scripts in&nbsp;<code>$DMK_HOME/js/</code>&nbsp;handle the initialization steps:</p>



<ul class="wp-block-list">
<li><code>csrs_initiate.js</code> — initiate a config server replica set</li>



<li><code>rs_initiate.js</code> (updated) — initiate a shard or standalone replica set, now with optional arbiter support</li>



<li><code>sh_addshards.js</code> — register shards in the cluster via a <code>mongos</code> router</li>
</ul>



<p class="wp-block-paragraph">All three receive their parameters via the&nbsp;<code>mongosh</code>&nbsp;<code>--eval</code>&nbsp;flag, keeping them reusable across any cluster topology:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
# Initiate the config server replica set
mongosh 127.0.0.1:27017 \
  --eval &quot;var rsName=&#039;csrs&#039;; var rsHosts=&#x5B;&#039;127.0.0.1:27017&#039;,&#039;127.0.0.1:27018&#039;,&#039;127.0.0.1:27019&#039;];&quot; \
  $DMK_HOME/js/csrs_initiate.js

# Initiate shard 1 with an arbiter
mongosh 127.0.0.1:27020 \
  --eval &quot;var rsName=&#039;rs1&#039;; var rsHosts=&#x5B;&#039;127.0.0.1:27020&#039;,&#039;127.0.0.1:27021&#039;]; var arbiterHost=&#039;127.0.0.1:27022&#039;;&quot; \
  $DMK_HOME/js/rs_initiate.js

# Add all shards from a mongos router
mongosh 127.0.0.1:27030 \
  --eval &quot;var shards=&#x5B;&#039;rs1/127.0.0.1:27020,127.0.0.1:27021&#039;,&#039;rs2/127.0.0.1:27023,127.0.0.1:27024&#039;,&#039;rs3/127.0.0.1:27026,127.0.0.1:27027&#039;];&quot; \
  $DMK_HOME/js/sh_addshards.js
</pre></div>


<h3 id="h-new-nbsp-check-status-nbsp-option-in-nbsp-dmk-db-ctl-py" class="wp-block-heading">New&nbsp;<code>--check-status</code>&nbsp;option in&nbsp;<code>dmk_db_ctl.py</code></h3>



<p class="wp-block-paragraph">The&nbsp;<code>dmk_db_ctl.py</code>&nbsp;script now accepts a&nbsp;<code>--check-status</code>&nbsp;flag. When provided, it polls the instance after the start, stop, or restart command to confirm the instance has reached the expected state. This was the default behaviour until now, which led to unwanted errors when setting up DMK.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
dmk_db_ctl.py -i mdb01 -a start --check-status
dmk_db_ctl.py -i mdb01 -a stop --check-status
dmk_db_ctl.py -i mdb01 -a restart --check-status
</pre></div>


<p class="wp-block-paragraph">Without this flag, the script returns immediately after issuing the command. It should be noted that when using the&nbsp;<code>restart</code>&nbsp;option, the status will be checked after stopping the instance. Otherwise, if the instance is still running when the start was issued, the restart could silently succeed without actually restarting anything.</p>



<h3 id="h-changes-made-to-nbsp-dmk-status-py" class="wp-block-heading">Changes made to&nbsp;<code>dmk_status.py</code></h3>



<p class="wp-block-paragraph"><strong>Colored status output.</strong> <code>STARTED</code> is now displayed in green, <code>STOPPED</code> in red — making it easier to spot unhealthy instances at a glance. To disable colors (for log files, CI pipelines, or terminals that don’t support ANSI), set <code>COLORED_STATUS=no</code> in your local configuration file (<code>dmkl</code>) by uncommenting the following line:</p>



<pre class="wp-block-code"><code># var::COLORED_STATUS::=::nowarn::no::  # Disable colored status output in dmk_status.py (yes/no)</code></pre>



<p class="wp-block-paragraph"><strong>CSV output.</strong> The table view now supports CSV export via the <code>--csv</code> option, useful for piping output to other tools or exporting to a file:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
# Export status as semicolon-delimited CSV
&amp;gt; dmk_status.py -t -a --csv &quot;;&quot;
Instance;Status;Version;Port;Bind IPs
mdb01;STARTED;8.0.26;27417;127.0.0.1
mdb02;STARTED;8.0.26;27418;127.0.0.1
mdbcfg01;STARTED;8.0.26;27017;127.0.0.1
mdbmgs01;STARTED;8.0.26;27030;127.0.0.1
</pre></div>


<p class="wp-block-paragraph">The session view (<code>sess</code>) supports the same option.</p>



<p class="wp-block-paragraph"><strong>Process-only check.</strong>&nbsp;The new&nbsp;<code>-p</code>&nbsp;/&nbsp;<code>--process</code>&nbsp;option performs a quick process presence check without connecting to MongoDB. This is faster and does not require credentials, making it useful for lightweight health checks:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
dmk_status.py -t -a --process
</pre></div>


<p class="wp-block-paragraph"><strong>Improved version display.</strong>&nbsp;The&nbsp;<code>-mv</code>&nbsp;option now shows all installed MongoDB versions side by side in a single table instead of separate blocks, making it much easier to compare binary versions across multiple installations.</p>



<p class="wp-block-paragraph"><strong>Session display refactoring.</strong>&nbsp;Session data gathering was moved into the instance class, and the display logic (including filtering and formatting) was centralized in&nbsp;<code>dmk_status.py</code>. This also fixes the&nbsp;<code>--include-inactive</code>&nbsp;flag, which was not working correctly in the previous release.</p>



<h3 id="h-new-nbsp-update-mongo-conf-py-nbsp-script" class="wp-block-heading">New&nbsp;<code>update_mongo_conf.py</code>&nbsp;script</h3>



<p class="wp-block-paragraph">The new&nbsp;<code>update_mongo_conf.py</code>&nbsp;script modifies MongoDB configuration file parameters from the command line using dot-notation for nested keys, without manually editing YAML:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
# Enable TLS on an existing instance
update_mongo_conf.py mdb01 net.tls.mode requireTLS
update_mongo_conf.py mdb01 net.tls.certificateKeyFile /u01/app/mongodb/admin/mdb01/secret/server.pem
</pre></div>


<h3 id="h-new-nbsp-set-uri-py-nbsp-script" class="wp-block-heading">New&nbsp;<code>set_uri.py</code>&nbsp;script</h3>



<p class="wp-block-paragraph">The new&nbsp;<code>set_uri.py</code>&nbsp;script generates and persists a&nbsp;<code>MONGO_URI</code>&nbsp;in the local DMK configuration for a given instance. It supports both standalone and replica set connection strings:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
# Standalone
set_uri.py mdb01 sa 127.0.0.1:27017

# Replica set
set_uri.py mdbrs01 rs 127.0.0.1:27411,127.0.0.1:27412,127.0.0.1:27413 rs1
</pre></div>


<p class="wp-block-paragraph">The resulting URI is stored in the local configuration file and available as&nbsp;<code>$MONGO_URI</code>&nbsp;in the instance context.</p>



<h3 id="h-improvements-to-nbsp-dmk-dbcreate-py" class="wp-block-heading">Improvements to&nbsp;<code>dmk_dbcreate.py</code></h3>



<p class="wp-block-paragraph"><code>dmk_dbcreate.py</code>&nbsp;now reads the&nbsp;<code>[instance_name]</code>&nbsp;section from the local DMK configuration file when creating an instance, so instance-specific variables defined in your local config are picked up automatically. Empty values for&nbsp;<code>MONGO_BACKUP</code>,&nbsp;<code>MONGO_JOURNAL</code>, and&nbsp;<code>MONGO_LOG</code>&nbsp;are also now accepted — directories are only created for paths that are explicitly set.</p>



<p class="wp-block-paragraph">The&nbsp;<code>storageEngine</code>&nbsp;key was removed from all YAML configuration templates. WiredTiger is the only storage engine available in MongoDB Community Edition, making the field redundant.</p>



<p class="wp-block-paragraph">A new&nbsp;<code>mongod.service.template_fork</code>&nbsp;systemd unit (<code>Type=simple</code>, delegating start/stop to&nbsp;<code>dmk_db_ctl.py</code>) was also added, alongside the existing&nbsp;<code>mongod.service.template</code>&nbsp;that runs&nbsp;<code>mongod</code>&nbsp;in the foreground.&nbsp;<code>dmk_dbcreate.py</code>&nbsp;generates the&nbsp;<code>mongod</code>&nbsp;unit for&nbsp;<code>mongod</code>&nbsp;instances and the&nbsp;<code>mongos</code>&nbsp;unit for routers.</p>



<h3 id="h-installation-improvements" class="wp-block-heading">Installation improvements</h3>



<p class="wp-block-paragraph"><strong>Auto-creation of&nbsp;<code>.bash_profile</code>.</strong>&nbsp;If the&nbsp;<code>.bash_profile</code>&nbsp;of the&nbsp;<code>mongodb</code>&nbsp;user does not contain the DMK block, DMK now creates it automatically from the template on first sourcing. If the file already exists with a DMK block, only that block is updated in place (with a backup created first). This removes a manual step from first-time installation.</p>



<p class="wp-block-paragraph"><strong>DMK temp files.</strong>&nbsp;The&nbsp;<code>dmk_env.sh</code>&nbsp;file used to source instance environments is now written to&nbsp;<code>$DMK_HOME/tmp/</code>&nbsp;rather than&nbsp;<code>/tmp</code>, keeping temporary DMK files within the DMK directory tree.</p>



<h3 id="h-security-improvements" class="wp-block-heading">Security improvements</h3>



<p class="wp-block-paragraph">The default&nbsp;<code>bindIp</code>&nbsp;in all DMK configuration templates was changed from&nbsp;<code>0.0.0.0</code>&nbsp;to&nbsp;<code>127.0.0.1</code>. This is a safer default for freshly created instances that limits network exposure from the start.</p>



<p class="wp-block-paragraph">A new&nbsp;<code>MONGO_TLS_CERTIFICATE_KEY_FILE</code>&nbsp;environment variable allows specifying a custom client certificate for DMK connections. This is useful for instances secured with&nbsp;<code>serverAuth</code>-only TLS, where the default certificate path may not be the right client certificate to use.</p>



<p class="wp-block-paragraph">New TLS templates for replica sets (<code>mongo_conf_rs_tls.yaml</code>,&nbsp;<code>mongo_conf_rs_tls_fork.yaml</code>,&nbsp;<code>mongo_conf_rs_keyfile.yaml</code>) were also added.</p>



<h3 id="h-aliases-and-environment-variables-added-in-dmk-2-5-0" class="wp-block-heading">Aliases and environment variables added in DMK 2.5.0</h3>



<p class="wp-block-paragraph">New aliases in DMK 2.5.0:</p>



<ul class="wp-block-list">
<li><code>mglogrotate</code>: rotate the MongoDB log file (<code>db.adminCommand({ logRotate: 1 })</code>).</li>



<li><code>certrotate</code>: rotate the TLS certificate of an instance (<code>db.rotateCertificates()</code>).</li>
</ul>



<p class="wp-block-paragraph">New environment variables:</p>



<ul class="wp-block-list">
<li><code>COLORED_STATUS</code>: set to <code>no</code> to disable colored status output in <code>dmk_status.py</code>. Enabled by default.</li>



<li><code>MONGO_TLS_CERTIFICATE_KEY_FILE</code>: custom client TLS certificate path for DMK connections.</li>



<li><code>MONGO_URI</code>: the MongoDB connection URI, now easily managed with <code>set_uri.py</code>.</li>



<li><code>INSTANCE_NAMING_CONVENTION</code>: the regular expression used to validate instance names. This variable is now <strong>optional</strong> — if not set, no naming convention is enforced.</li>
</ul>



<h3 id="h-bug-fixes" class="wp-block-heading">Bug fixes</h3>



<p class="wp-block-paragraph">A few notable bugs were fixed in this release:</p>



<ul class="wp-block-list">
<li><strong>Quoted values</strong> in the MongoDB configuration file (viewed with <code>vic</code> / <code>dmkc</code>) could cause the DMK environment to fail loading due to unescaped double quotes. This is now handled correctly.</li>



<li><strong>Restart</strong> could silently succeed without actually restarting the instance if it was still running. The stop phase now always waits for the instance to be fully stopped first.</li>



<li><strong><code>--include-inactive</code></strong> flag in the session view was not working correctly and has been fixed.</li>
</ul>



<h2 id="h-upgrading-from-an-earlier-version-of-dmk" class="wp-block-heading">Upgrading from an earlier version of DMK</h2>



<p class="wp-block-paragraph">If you are upgrading from DMK 2.4.0, replace the DMK folder with the new one:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
cd /u01/app/mongodb/local
mv dmk .dmk_old
unzip /path/to/dmk_mongodb-2.5.0.zip
dmk
</pre></div>


<p class="wp-block-paragraph">If you are upgrading from DMK 2.3.x or earlier, read the&nbsp;<a href="https://www.dbi-services.com/blog/mongodb-dmk-2-4-0-new-features/" target="_blank" rel="noreferrer noopener">release notes of DMK 2.4.0</a>&nbsp;first.</p>
<p>L’article <a href="https://www.dbi-services.com/blog/mongodb-dmk-2-5-0-sharding-support-and-new-features/">MongoDB DMK 2.5.0: Sharding support and new features</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/mongodb-dmk-2-5-0-sharding-support-and-new-features/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>GoldenGate Trail Purge Task Fails with &#8220;OGG-12111: JSON element &#8216;/csn&#8217; does not match any schemas&#8221;</title>
		<link>https://www.dbi-services.com/blog/goldengate-trail-purge-fails/</link>
					<comments>https://www.dbi-services.com/blog/goldengate-trail-purge-fails/#respond</comments>
		
		<dc:creator><![CDATA[Julien Delattre]]></dc:creator>
		<pubDate>Wed, 24 Jun 2026 06:44:45 +0000</pubDate>
				<category><![CDATA[GoldenGate]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[26]]></category>
		<category><![CDATA[26ai]]></category>
		<category><![CDATA[Error]]></category>
		<category><![CDATA[fail]]></category>
		<category><![CDATA[ogg]]></category>
		<category><![CDATA[OGG-12111]]></category>
		<category><![CDATA[purge]]></category>
		<category><![CDATA[task]]></category>
		<category><![CDATA[trail]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=45209</guid>

					<description><![CDATA[<p>Since the beginning of the year, I had the opportunity to upgrade many GoldenGate setups to 26ai. On two of them, I was facing an issue regarding purge tasks that I could not solve. Since it took quite some time to finally find a solution, I figured it was worth documenting. The client had two [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/goldengate-trail-purge-fails/">GoldenGate Trail Purge Task Fails with &#8220;OGG-12111: JSON element &#8216;/csn&#8217; does not match any schemas&#8221;</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">Since the beginning of the year, I had the opportunity to upgrade many GoldenGate setups to 26ai. On two of them, I was facing an <strong>issue regarding purge tasks</strong> that I could not solve. Since it took quite some time to finally find a solution, I figured it was worth documenting.</p>



<p class="wp-block-paragraph">The client had two GoldenGate 26ai installations running on the same server.</p>



<ul class="wp-block-list">
<li>One extracting data from <strong>DB2</strong>, with GoldenGate for DB2/zOS.</li>



<li>One replicating into an <strong>Oracle</strong> 19c database, reading from the same trail files.</li>
</ul>



<p class="wp-block-paragraph">Both setups were using the initial release of GoldenGate 26ai.</p>



<p class="wp-block-paragraph">On both, I tried to set up trail purge tasks from the Administration Service web UI, and <strong>both GoldenGate trail purge failed with the same error</strong>.</p>



<h2 id="h-purge-task-creation-from-the-web-ui" class="wp-block-heading">Purge task creation from the web UI</h2>



<p class="wp-block-paragraph">To add a purge task, go to the&nbsp;<strong>Administration Service</strong>&nbsp;web UI, and on the left navigation panel, click on&nbsp;<strong><em>Tasks &gt; Purge Trail</em></strong>.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="588" height="258" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/06/trail_purge_1.png" alt="" class="wp-image-45210" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/06/trail_purge_1.png 588w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/06/trail_purge_1-300x132.png 300w" sizes="auto, (max-width: 588px) 100vw, 588px" /></figure>
</div>


<p class="wp-block-paragraph">From there, create a new task. You will be asked to provide a <strong>task name</strong>, one or multiple <strong>trail paths</strong>, <strong>retention rules</strong>, and whether to <strong>use checkpoints</strong> when purging trail files.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="1021" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/06/trail_purge_2-1024x1021.png" alt="" class="wp-image-45211" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/06/trail_purge_2-1024x1021.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/06/trail_purge_2-300x300.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/06/trail_purge_2-150x150.png 150w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/06/trail_purge_2-768x766.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/06/trail_purge_2.png 1472w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<p class="wp-block-paragraph">In my case, right after the creation, the purge task was failing with the <code>OGG-12111</code> error. This happened no matter how I configured the task. The task was correctly configured, but it would fail every time it was scheduled to run</p>



<h2 id="h-ogg-12111-nbsp-in-the-web-ui" class="wp-block-heading"><code>OGG-12111</code>&nbsp;in the web UI</h2>



<p class="wp-block-paragraph">The full error displayed was the following:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
JSON element &#039;/csn&#039; does not match any schemas
Code: OGG-12111
Cause: The JSON item does not validate against the provided JSON schema.
Action: Correct the JSON so that it conforms to the JSON schema.
</pre></div>


<p class="wp-block-paragraph">I first thought that it was a configuration issue on my side, but there is no such <code>csn</code> field when configuring the task. I quickly realized that if something was wrong, it was internal to GoldenGate. And unfortunately, all trail files were affected in this setup, so there was no working example to investigate further. On all other setups that I worked on, I never faced the <code>OGG-12111</code> error.</p>



<h2 id="h-analysis-of-adminsrvr-log" class="wp-block-heading">Analysis of <code>adminsrvr.log</code></h2>



<p class="wp-block-paragraph">Digging into the Administration Service log, I found the real error underneath:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
2026-04-20T14:18:41.377+0200 ERROR| ERROR   OGG-01072  Oracle GoldenGate Administration Service for Oracle:  NUMCNV_getUnsignedNumFromStr: Buffer overflow, needed: 21, allocated: 20. (Purge)
</pre></div>


<p class="wp-block-paragraph"><code>OGG-01072</code> is a buffer overflow in an internal GoldenGate method. It looked like a corrupted value gets embedded into the purge task JSON, and the JSON fails schema validation. And in the end, you get the <code>OGG-12111</code> error in the web UI.</p>



<p class="wp-block-paragraph"><code>OGG-12111</code>&nbsp;was just the symptom, while&nbsp;<code>OGG-01072</code>&nbsp;was the actual bug.</p>



<p class="wp-block-paragraph">Unfortunately, I couldn&#8217;t find any MOS bug filed for this. However, by trial and error, I discovered that the fix appears to have been <strong>introduced silently in a later patch</strong>, maybe through another bug resolution (that I could not identify).</p>



<h2 id="h-how-to-solve-nbsp-ogg-12111-nbsp-errors-in-goldengate-26ai" class="wp-block-heading">How to solve&nbsp;<code>OGG-12111</code>&nbsp;errors in GoldenGate 26ai ?</h2>



<p class="wp-block-paragraph">The only solution I found was patching GoldenGate to <strong><code>23.26.2.0.1</code></strong>. I didn&#8217;t test the intermediate patch levels between <code>23.26.1.0.0</code> and <code>23.26.2.0.1</code>, so I can&#8217;t say exactly which patch introduced the fix, but upgrading to <code>23.26.2.0.1</code> resolved the issue.</p>



<p class="wp-block-paragraph">After patching, I went back to the&nbsp;<strong><em>Purge Trail</em></strong>&nbsp;section of the web UI, and the existing purge tasks were already working. I did not even have to recreate them.</p>



<p class="wp-block-paragraph">So if you face this bug and your GoldenGate trail purge fails, don&#8217;t spend time reviewing the purge task parameters. Your tasks are most probably fine. The bug is inside the Administration Service&#8217;s numeric conversion method, and patching is the only way out.</p>
<p>L’article <a href="https://www.dbi-services.com/blog/goldengate-trail-purge-fails/">GoldenGate Trail Purge Task Fails with &#8220;OGG-12111: JSON element &#8216;/csn&#8217; does not match any schemas&#8221;</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-trail-purge-fails/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>LOB Replication With GoldenGate and Importance of Primary Keys</title>
		<link>https://www.dbi-services.com/blog/lob-replication-with-goldengate-and-importance-of-primary-keys/</link>
					<comments>https://www.dbi-services.com/blog/lob-replication-with-goldengate-and-importance-of-primary-keys/#respond</comments>
		
		<dc:creator><![CDATA[Julien Delattre]]></dc:creator>
		<pubDate>Tue, 16 Jun 2026 15:13:07 +0000</pubDate>
				<category><![CDATA[GoldenGate]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[26ai]]></category>
		<category><![CDATA[bad_column]]></category>
		<category><![CDATA[blob]]></category>
		<category><![CDATA[CLOB]]></category>
		<category><![CDATA[dba_goldengate_not_unique]]></category>
		<category><![CDATA[keycols]]></category>
		<category><![CDATA[LOB]]></category>
		<category><![CDATA[migration]]></category>
		<category><![CDATA[ogg]]></category>
		<category><![CDATA[primary key]]></category>
		<category><![CDATA[Replication]]></category>
		<category><![CDATA[support]]></category>
		<category><![CDATA[table]]></category>
		<category><![CDATA[unsupported]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=44906</guid>

					<description><![CDATA[<p>Every time I work on database migrations with GoldenGate, I have the same talks with application teams about missing primary keys. Especially when it comes to LOB replication with GoldenGate. In a previous blog, I wrote about how to interpret the DBA_GOLDENGATE_NOT_UNIQUE view, which lists tables with no primary key or non-null unique indexes. There [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/lob-replication-with-goldengate-and-importance-of-primary-keys/">LOB Replication With GoldenGate and Importance of Primary Keys</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">Every time I work on database migrations with GoldenGate, I have the same talks with application teams about missing primary keys. Especially when it comes to LOB replication with GoldenGate. In a <a href="https://www.dbi-services.com/blog/goldengate-row-identification-misconceptions-and-solutions/" target="_blank" rel="noreferrer noopener">previous blog</a>, I wrote about how to interpret the <code><a href="https://docs.oracle.com/en/database/oracle/oracle-database/26/refrn/DBA_GOLDENGATE_NOT_UNIQUE.html" target="_blank" rel="noreferrer noopener">DBA_GOLDENGATE_NOT_UNIQUE</a></code> view, which lists tables with <strong>no primary key or non-null unique indexes</strong>. There are two main groups of tables listed here:</p>



<ul class="wp-block-list">
<li>Tables where all columns can be used to identify uniqueness (<code>bad_column='N'</code>)</li>



<li>Tables where not all columns can be used (<code>bad_column='Y'</code>)</li>
</ul>



<p class="wp-block-paragraph">To show what happens when primary keys are missing in GoldenGate replication, let&#8217;s see a few examples. In all the examples, I will extract data from <code>APP_SOURCE</code> schema and replicate it into an <code>APP_TARGET</code> schema.</p>



<p class="wp-block-paragraph">The parameters of the replication do not really matter here, but to be precise, here is the extract parameter file:</p>



<pre class="wp-block-code"><code>EXTRACT EXT1
USERIDALIAS source_cdb DOMAIN OracleGoldenGate
EXTTRAIL pdb1/aa
SOURCECATALOG PDB1
DDL INCLUDE MAPPED
TABLE APP_SOURCE.*;</code></pre>



<p class="wp-block-paragraph">And here is the replicat parameter file:</p>



<pre class="wp-block-code"><code>REPLICAT REP2
USERIDALIAS target_pdb DOMAIN OracleGoldenGate
DDL INCLUDE MAPPED
MAP PDB1.APP_SOURCE.*, TARGET PDB2.APP_TARGET.*;</code></pre>



<h2 id="h-first-test-simple-table-with-primary-key" class="wp-block-heading">First test : simple table with primary key</h2>



<p class="wp-block-paragraph">First, let&#8217;s try the most common example, with a table <code>APP_SOURCE.TEST_PK</code> created <strong>with a primary key</strong>. You can skip this part if you know how GoldenGate works, but I just wanted to include this for comparison.</p>



<pre class="wp-block-code"><code>CREATE TABLE APP_SOURCE.TEST_PK
(
    id   NUMBER PRIMARY KEY,
    data VARCHAR2(100)
);</code></pre>



<p class="wp-block-paragraph">Let&#8217;s <strong>insert a few rows</strong> in this table and look at the content of the table in both the source and the target.</p>



<pre class="wp-block-code"><code>INSERT INTO APP_SOURCE.TEST_PK VALUES (1,'A');
INSERT INTO APP_SOURCE.TEST_PK VALUES (2,'B');
COMMIT;

-- Verify source/target
SELECT * FROM APP_SOURCE.TEST_PK ORDER BY id;
SELECT * FROM APP_TARGET.TEST_PK ORDER BY id;</code></pre>



<p class="wp-block-paragraph">You will see the same content in both tables.</p>



<pre class="wp-block-code"><code>SQL&gt; SELECT * FROM APP_SOURCE.TEST_PK ORDER BY id;

        ID DATA
---------- --------------------
         1 A
         2 B</code></pre>



<p class="wp-block-paragraph">Now, if you update the row with <code>id=1</code>, it will be updated in both tables as well.</p>



<pre class="wp-block-code"><code>UPDATE APP_SOURCE.TEST_PK SET data='A_UPDATED' WHERE id=1;
COMMIT;

-- Verify
SELECT * FROM APP_SOURCE.TEST_PK ORDER BY id;
SELECT * FROM APP_TARGET.TEST_PK ORDER BY id;</code></pre>



<p class="wp-block-paragraph">Checking the tables will give you the updated data.</p>



<pre class="wp-block-code"><code>SQL&gt; SELECT * FROM APP_TARGET.TEST_PK ORDER BY id;

        ID DATA
---------- --------------------
         1 A_UPDATED
         2 B</code></pre>



<p class="wp-block-paragraph">Until then, nothing really interesting, but let&#8217;s look at the <strong>report file of the extract</strong> on the source. You will see the following information:</p>



<pre class="wp-block-code"><code>2026-06-06 07:00:52&nbsp; INFO&nbsp;&nbsp;&nbsp; OGG-06509&nbsp; Using the following key columns for source table PDB1.APP_SOURCE.TEST_PK: ID.</code></pre>



<p class="wp-block-paragraph">Because the <strong>table has a primary key</strong>, GoldenGate knows that it should <strong>only use this column</strong> to identify unique rows.</p>



<h2 id="h-second-test-table-with-no-primary-key-and-no-lob-columns" class="wp-block-heading">Second test : table with no primary key and no LOB columns</h2>



<p class="wp-block-paragraph">In this second test, I will create a table without a primary key, but using only types that GoldenGate can use to identify uniqueness.</p>



<pre class="wp-block-code"><code>CREATE TABLE APP_SOURCE.TEST_NOPK
(
    id   NUMBER,
    data VARCHAR2(100)
);</code></pre>



<p class="wp-block-paragraph">We can already query the <code>DBA_GOLDENGATE_NOT_UNIQUE</code> view to find this new table listed with <code>bad_column='N'</code> :</p>



<pre class="wp-block-code"><code>SELECT *
FROM dba_goldengate_not_unique
WHERE owner='APP_SOURCE'
ORDER BY owner, table_name;

OWNER                          TABLE_NAME                     BAD_COLUMN
------------------------------ ------------------------------ ----------
APP_SOURCE                     TEST_NOPK                      N</code></pre>



<p class="wp-block-paragraph">Let&#8217;s do the same steps as before, inserting data and updating the content.</p>



<pre class="wp-block-code"><code>INSERT INTO APP_SOURCE.TEST_NOPK VALUES (1,'A');
INSERT INTO APP_SOURCE.TEST_NOPK VALUES (2,'B');
COMMIT;

SELECT * FROM APP_SOURCE.TEST_NOPK ORDER BY id;
SELECT * FROM APP_TARGET.TEST_NOPK ORDER BY id;

UPDATE APP_SOURCE.TEST_NOPK SET data='A_UPDATED' WHERE id=1;
COMMIT;</code></pre>



<p class="wp-block-paragraph">The content of the table is the same on source and target, as expected.</p>



<pre class="wp-block-code"><code>SQL&gt; SELECT * FROM APP_TARGET.TEST_NOPK ORDER BY id;

        ID DATA
---------- --------------------
         1 A_UPDATED
         2 B</code></pre>



<p class="wp-block-paragraph">And looking at the <strong>extract report file</strong>, we can see that <strong>all viable columns were used</strong>. In that case, it meant taking <code>ID</code> and <code>DATA</code>.</p>



<pre class="wp-block-code"><code>2026-06-06 07:08:13  INFO    OGG-06508  Wildcard MAP (TABLE) resolved (entry PDB1.APP_SOURCE.*): TABLE "PDB1"."APP_SOURCE"."TEST_NOPK".

2026-06-06 07:08:13  WARNING OGG-06439  No unique key is defined for table TEST_NOPK. All viable columns will be used to represent the key, but may not guarantee uniqueness. KEYCOLS may be used to define the key. If using KEYCOLS, make sure that you create an INDEX in the target database for those column(s) as well.

2026-06-06 07:08:13  INFO    OGG-06509  Using the following key columns for source table PDB1.APP_SOURCE.TEST_NOPK: ID, DATA.</code></pre>



<p class="wp-block-paragraph">As mentioned in the other blog about primary keys in GoldenGate, this will work, but you will of course have <strong>performance issues</strong> when replicating data.</p>



<h2 id="h-third-test-table-with-no-pk-and-a-clob-column" class="wp-block-heading">Third test : Table with no PK and a <code>CLOB</code> column</h2>



<p class="wp-block-paragraph">Now, let me show you the bad use case, where you don&#8217;t have a primary key and the <strong>table contains a non-viable column for uniqueness identification</strong>. In this example, I will use a <code>CLOB</code> column, but it could be another unbounded data type.</p>



<pre class="wp-block-code"><code>CREATE TABLE APP_SOURCE.TEST_CLOB
(
    id   NUMBER,
    code VARCHAR2(10),
    txt  CLOB
);</code></pre>



<p class="wp-block-paragraph">If we check the <code>DBA_GOLDENGATE_NOT_UNIQUE</code> view, we see the new table listed with <code>bad_column='Y'</code>.</p>



<pre class="wp-block-code"><code>SELECT *
FROM dba_goldengate_not_unique
WHERE owner='APP_SOURCE'
ORDER BY owner, table_name;

OWNER                          TABLE_NAME                     BAD_COLUMN
------------------------------ ------------------------------ ----------
APP_SOURCE                     TEST_CLOB                      Y
APP_SOURCE                     TEST_NOPK                      N</code></pre>



<p class="wp-block-paragraph">Let&#8217;s insert some data. But this time, I will add <strong>two more rows that are unique</strong>, but for which only the <strong><code>TXT</code> content differs</strong>.</p>



<pre class="wp-block-code"><code>INSERT INTO app_source.test_clob VALUES (1,'A',TO_CLOB('LOB_1'));
INSERT INTO app_source.test_clob VALUES (2,'B',TO_CLOB('LOB_2'));
INSERT INTO app_source.test_clob VALUES (100,'DUP',TO_CLOB('LOB_1'));
INSERT INTO app_source.test_clob VALUES (100,'DUP',TO_CLOB('LOB_2'));
COMMIT;</code></pre>



<p class="wp-block-paragraph">The data was correctly inserted, and the content is the same on the source and target.</p>



<pre class="wp-block-code"><code>SQL&gt; SELECT id,code,DBMS_LOB.SUBSTR(txt,40,1) txt FROM app_target.test_clob ORDER BY id;

        ID CODE       TXT
---------- ---------- ----------------------------------------
         1 A	      LOB_1
         2 B	      LOB_2
       100 DUP	      LOB_1
       100 DUP	      LOB_2</code></pre>



<p class="wp-block-paragraph">In the <strong>report file</strong>, we do not see any difference between this example and the one before. GoldenGate mentions using <strong>two columns for uniqueness identification</strong> : <code>ID</code> and <code>CODE</code>. <strong>GoldenGate never mentions that a third column existed and was not used</strong>. The warning displayed is the same as before.</p>



<pre class="wp-block-code"><code>2026-06-06 07:10:13  INFO    OGG-06508  Wildcard MAP (TABLE) resolved (entry PDB1.APP_SOURCE.*): TABLE "PDB1"."APP_SOURCE"."TEST_CLOB".

2026-06-06 07:10:13  WARNING OGG-06439  No unique key is defined for table TEST_CLOB. All viable columns will be used to represent the key, but may not guarantee uniqueness. KEYCOLS may be used to define the key. If using KEYCOLS, make sure that you create an INDEX in the target database for those column(s) as well.

2026-06-06 07:10:13  INFO    OGG-06509  Using the following key columns for source table PDB1.APP_SOURCE.TEST_CLOB: ID, CODE.</code></pre>



<p class="wp-block-paragraph">And now, the main problem I wanted to discuss regarding LOB replication with GoldenGate. If you <strong>try to delete one row by specifying all three columns</strong>, it will <strong>not always work</strong>.</p>



<pre class="wp-block-code"><code>DELETE FROM app_source.test_clob
WHERE id = 100
AND code = 'DUP'
AND DBMS_LOB.COMPARE(txt,TO_CLOB('LOB_1')) = 0;</code></pre>



<p class="wp-block-paragraph">Sometimes, the line with <code>LOB_1</code> will be deleted:</p>



<pre class="wp-block-code"><code>        ID CODE       TXT
---------- ---------- ----------------------------------------
         1 A	      LOB_1
         2 B	      LOB_2
       100 DUP	      LOB_2</code></pre>



<p class="wp-block-paragraph">But sometimes, the line with <code>LOB_2</code> will be deleted:</p>



<pre class="wp-block-code"><code>        ID CODE       TXT
---------- ---------- ----------------------------------------
         1 A	      LOB_1
         2 B	      LOB_2
       100 DUP	      LOB_1</code></pre>



<p class="wp-block-paragraph">More precisely, it will just <strong>delete the first line that was inserted</strong>. You then have two cases. If you insert <code>LOB_1</code> first, it will be deleted correctly:</p>



<pre class="wp-block-code"><code>DROP TABLE app_source.test_clob PURGE;

CREATE TABLE app_source.test_clob (id NUMBER, code VARCHAR2(10), txt CLOB);

INSERT INTO app_source.test_clob VALUES (100,'DUP',TO_CLOB('LOB_1'));
INSERT INTO app_source.test_clob VALUES (100,'DUP',TO_CLOB('LOB_2'));
COMMIT;

DELETE FROM app_source.test_clob
WHERE id = 100
AND code = 'DUP'
AND DBMS_LOB.COMPARE(txt,TO_CLOB('LOB_1')) = 0;
COMMIT;

SQL&gt; SELECT id,code,DBMS_LOB.SUBSTR(txt,40,1) txt
FROM app_target.test_clob
WHERE code='DUP';

        ID CODE       TXT
---------- ---------- ----------------------------------------
       100 DUP	      LOB_2</code></pre>



<p class="wp-block-paragraph">And if you insert <code>LOB_2</code> first, the incorrect line will be deleted:</p>



<pre class="wp-block-code"><code>DROP TABLE app_source.test_clob PURGE;

CREATE TABLE app_source.test_clob (id NUMBER, code VARCHAR2(10), txt CLOB);

INSERT INTO app_source.test_clob VALUES (100,'DUP',TO_CLOB('LOB_2'));
INSERT INTO app_source.test_clob VALUES (100,'DUP',TO_CLOB('LOB_1'));
COMMIT;

DELETE FROM app_source.test_clob
WHERE id = 100
AND code = 'DUP'
AND DBMS_LOB.COMPARE(txt,TO_CLOB('LOB_1')) = 0;
COMMIT;

SQL&gt; SELECT id,code,DBMS_LOB.SUBSTR(txt,40,1) txt
FROM app_target.test_clob
WHERE code='DUP';

        ID CODE       TXT
---------- ---------- ----------------------------------------
       100 DUP	      LOB_1</code></pre>



<p class="wp-block-paragraph">You now know why <strong>you should always pay attention</strong> to tables in the <code><a href="https://docs.oracle.com/en/database/oracle/oracle-database/26/refrn/DBA_GOLDENGATE_NOT_UNIQUE.html" target="_blank" rel="noreferrer noopener">DBA_GOLDENGATE_NOT_UNIQUE</a></code> view with <code>bad_column='Y'</code>. If you have such tables, there are several scenarios that I presented in the <a href="https://www.dbi-services.com/blog/goldengate-row-identification-misconceptions-and-solutions/" target="_blank" rel="noreferrer noopener">last blog on the topic</a>. But <strong>ignoring them is not one of them</strong>. This way, you will avoid issues regarding LOB replication with GoldenGate.</p>
<p>L’article <a href="https://www.dbi-services.com/blog/lob-replication-with-goldengate-and-importance-of-primary-keys/">LOB Replication With GoldenGate and Importance of Primary Keys</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/lob-replication-with-goldengate-and-importance-of-primary-keys/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>GoldenGate Row Identification: Misconceptions and Solutions</title>
		<link>https://www.dbi-services.com/blog/goldengate-row-identification-misconceptions-and-solutions/</link>
					<comments>https://www.dbi-services.com/blog/goldengate-row-identification-misconceptions-and-solutions/#respond</comments>
		
		<dc:creator><![CDATA[Julien Delattre]]></dc:creator>
		<pubDate>Fri, 12 Jun 2026 15:27:49 +0000</pubDate>
				<category><![CDATA[GoldenGate]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[26]]></category>
		<category><![CDATA[bad_column]]></category>
		<category><![CDATA[CLOB]]></category>
		<category><![CDATA[dba_goldengate_not_unique]]></category>
		<category><![CDATA[index]]></category>
		<category><![CDATA[LOB]]></category>
		<category><![CDATA[ogg]]></category>
		<category><![CDATA[pk]]></category>
		<category><![CDATA[primary key]]></category>
		<category><![CDATA[Replication]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=44899</guid>

					<description><![CDATA[<p>GoldenGate is a powerful replication tool, but it is so versatile that you should always check whether what you intend to do is supported or not. Oracle provides a few interesting scripts and views to check your environments before attempting a replication with GoldenGate, and I wanted to write about the DBA_GOLDENGATE_NOT_UNIQUE view. Before explaining [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/goldengate-row-identification-misconceptions-and-solutions/">GoldenGate Row Identification: Misconceptions and Solutions</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">GoldenGate is a <strong>powerful replication tool</strong>, but it is so versatile that <strong>you should always check</strong> whether what you intend to do is <strong>supported or not</strong>. Oracle provides a few interesting scripts and views to check your environments before attempting a replication with GoldenGate, and I wanted to write about the <code><a href="https://docs.oracle.com/en/database/oracle/oracle-database/26/refrn/DBA_GOLDENGATE_NOT_UNIQUE.html" target="_blank" rel="noreferrer noopener">DBA_GOLDENGATE_NOT_UNIQUE</a></code> view.</p>



<p class="wp-block-paragraph">Before explaining what this view contains and <strong>how to interpret it</strong>, you should remember that GoldenGate replicates data by replaying changes that occurred on the source database. One of the <strong>most important problems</strong> GoldenGate must solve is to <strong>identify the exact row</strong> that must be updated or deleted on the target database. This means that GoldenGate needs a way to <strong>uniquely identify</strong> every row in a table.</p>



<p class="wp-block-paragraph">The simplest solution is a <strong>primary key</strong>, but GoldenGate row identification can also be done through a <strong>non-null unique index</strong>. When neither exists, GoldenGate must <strong>fall back to less efficient mechanisms</strong>. This means <strong>using all available columns</strong> to identify a row.</p>



<p class="wp-block-paragraph">The <code>DBA_GOLDENGATE_NOT_UNIQUE</code> view contains tables that have <strong>no primary key</strong> and <strong>no non-null unique index</strong>. It is there to help you <strong>identify potential issues</strong> in your database schema and prepare in the best possible way a migration with GoldenGate or any replication work.</p>



<p class="wp-block-paragraph">Here is an example of the content of the view:</p>



<pre class="wp-block-code"><code>OWNER			       TABLE_NAME		      BAD_COLUMN
------------------------------ ------------------------------ ----------
APP_PDB1		       TEST_NOPK		      N
APP_PDB1		       TEST_CLOB		      Y</code></pre>



<p class="wp-block-paragraph">The view is very simple, yet very often misunderstood. The <code>owner</code> and <code>table_name</code> column names are self-explanatory, but let&#8217;s talk about <code>bad_column</code>. This column has two possible values: <code>Y</code> and <code>N</code>.</p>



<h2 id="h-first-case-bad-column-n" class="wp-block-heading">First case &#8211; <code>bad_column = 'N'</code></h2>



<p class="wp-block-paragraph" id="h-n-is-what-you-will-most-often-see-in-this-view-you-should-treat-these-as-warnings"><code>N</code> is what you will most often see in this view. You should treat these as <strong>warnings</strong>. If you intend to replicate a table from this list, you can choose to ignore the warning if you don&#8217;t care about <strong>replication performance</strong>.</p>



<p class="wp-block-paragraph" id="h-n-is-what-you-will-most-often-see-in-this-view-you-should-treat-these-as-warnings">Tables in this list will be <strong>replicated using all columns</strong> as a substitute key. GoldenGate can usually handle these tables without any functional issue. However, <code>UPDATE</code> and <code>DELETE</code> operations become more expensive because <strong>every column must be used</strong> to identify the target row.</p>



<p class="wp-block-paragraph">From my experience, you should still always <strong>discuss with the application owner</strong> or someone who knows the underlying database schema to try to <strong>avoid performance issues</strong>. A list of solutions is given at the end of the blog.</p>



<h2 id="h-second-case-bad-column-y" class="wp-block-heading">Second case &#8211; <code>bad_column = 'Y'</code></h2>



<p class="wp-block-paragraph">If there is one point to remember from this blog, it’s this: <strong>you should never replicate data from tables with <code>bad_column='Y'</code> without thorough investigation</strong>.</p>



<p class="wp-block-paragraph">Tables listed here contain one or more columns that GoldenGate cannot safely use as part of a substitute key, such as <code>LONG</code> or <code>CLOB</code>.</p>



<p class="wp-block-paragraph">Since GoldenGate cannot build a complete substitute key from all columns, row identification becomes problematic. Depending on the table structure and replication configuration, GoldenGate may be <strong>unable to correctly locate rows</strong> for <code>UPDATE</code> or <code>DELETE</code> operations.</p>



<p class="wp-block-paragraph">In practice, a table with <code>bad_column='Y'</code> should be considered a <strong>candidate for schema remediation</strong> before replication (see the list of options below).</p>



<h2 id="h-will-there-be-an-error-if-goldengate-cannot-identify-uniqueness" class="wp-block-heading">Will there be an error if GoldenGate cannot identify uniqueness ?</h2>



<p class="wp-block-paragraph">This is a very <strong>common misconception</strong> when talking about these primary key issues. <strong>GoldenGate does not verify</strong> that the columns used for row identification are truly unique. If duplicate rows exist, a replicat may update or delete an unintended row. In many cases no explicit GoldenGate error will be generated because, from GoldenGate’s perspective, a matching row was found. It could <strong>silently delete the wrong row</strong>, and you will never hear a word about it. In the logs, you won&#8217;t see the difference.</p>



<h2 id="h-what-can-be-done-to-solve-these-issues" class="wp-block-heading">What can be done to solve these issues ?</h2>



<p class="wp-block-paragraph">Essentially, there are four possible approaches:</p>



<ul class="wp-block-list">
<li>If you have the ability to <strong>create a primary key</strong> or a <strong>non-null unique index</strong> on the <strong>source database</strong>, go for it before the initial load of your target database. This is the <strong>safest approach</strong> because uniqueness is enforced by the database itself.</li>



<li>If you <strong>cannot alter the source</strong> schema but are <strong>100% sure</strong> that a <strong>subset of columns</strong> that already exists in the table <strong>can uniquely identify every row</strong>, you can use the <code>KEYCOLS</code> keyword in your parameter files.</li>



<li>Sometimes, the <strong>application</strong> design <strong>prevents duplicates</strong> from being generated. Again, you need to be sure about this. But sometimes, it means that you could <strong>rely on the application design</strong>.</li>



<li>When bad_column is <code>N</code>, you could decide to <strong>not do anything</strong>. For tables with a lot of activity, it could slow down your replication. During a migration, it could even completely block it in production. This should only be done in <strong>last resort</strong>.</li>
</ul>



<p class="wp-block-paragraph">A common misconception is that every table listed in <code>DBA_GOLDENGATE_NOT_UNIQUE</code> is unsupported by GoldenGate. This is not the case. At the other end of the spectrum, I&#8217;ve heard countless times that these warnings can be ignored. Do that, and you will have nightmares solving issues once you hit production. The view merely highlights tables for which GoldenGate cannot rely on a primary key or a non-null unique index for row identification. The real concern is the <code>bad_column</code> flag: <code>N</code> is a <strong>performance warning</strong>, while <code>Y</code> deserves <strong>immediate investigation</strong> before any replication project.</p>
<p>L’article <a href="https://www.dbi-services.com/blog/goldengate-row-identification-misconceptions-and-solutions/">GoldenGate Row Identification: Misconceptions and Solutions</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-row-identification-misconceptions-and-solutions/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>GoldenGate NGINX Reverse Proxy Behavior Changes</title>
		<link>https://www.dbi-services.com/blog/goldengate-nginx-reverse-proxy-behavior-changes/</link>
					<comments>https://www.dbi-services.com/blog/goldengate-nginx-reverse-proxy-behavior-changes/#respond</comments>
		
		<dc:creator><![CDATA[Julien Delattre]]></dc:creator>
		<pubDate>Tue, 09 Jun 2026 06:47:40 +0000</pubDate>
				<category><![CDATA[GoldenGate]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[26ai]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[Deployment]]></category>
		<category><![CDATA[Multiple]]></category>
		<category><![CDATA[Nginx]]></category>
		<category><![CDATA[ogg]]></category>
		<category><![CDATA[Proxy]]></category>
		<category><![CDATA[restapi]]></category>
		<category><![CDATA[reverse]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=44863</guid>

					<description><![CDATA[<p>I recently wrote about NGINX reverse proxy reconfiguration after creating or deleting a deployment in GoldenGate. It reminded me that there is an overlooked aspect of the reverse proxy configuration, which is important when trying to automate GoldenGate management with the REST API. In fact, when using a reverse proxy with a single deployment, some [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/goldengate-nginx-reverse-proxy-behavior-changes/">GoldenGate NGINX Reverse Proxy Behavior Changes</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 recently wrote about <a href="https://www.dbi-services.com/blog/reconfigure-nginx-after-adding-a-goldengate-deployment/" target="_blank" rel="noreferrer noopener">NGINX reverse proxy reconfiguration</a> after <strong>creating or deleting a deployment</strong> in GoldenGate. It reminded me that there is an <strong>overlooked aspect</strong> of the reverse proxy configuration, which is important when trying to <strong>automate GoldenGate management</strong> with the REST API.</p>



<p class="wp-block-paragraph">In fact, when using a <strong>reverse proxy with a single deployment</strong>, some <strong>endpoints are different</strong> from a <strong>multi-deployment</strong> configuration.</p>



<p class="wp-block-paragraph">Let&#8217;s take the <a href="https://docs.oracle.com/en/database/goldengate/core/26/oggra/op-services-version-extracts-get.html" target="_blank" rel="noreferrer noopener">extract listing</a> endpoint as example: <code>GET /services/v2/extracts</code>. With a <strong>basic GoldenGate configuration</strong> without NGINX reverse proxy, you could <strong>list the extracts</strong> with the following URL: <code>https://vmogg:7809/services/v2/extracts</code></p>



<p class="wp-block-paragraph">In a <strong>single-deployment</strong> setting using NGINX, the <code>/services/v2/extracts</code> endpoint is <strong>still valid</strong> and will list the extracts of your only deployment (API response given below).</p>



<pre class="wp-block-code"><code>{
    "$schema": "api:standardResponse",
    "links": &#091;
        {
            "rel": "canonical",
            "href": "https://vmogg_single_deployment/services/v2/extracts",
            "mediaType": "text/html"
        },
        {
            "rel": "self",
            "href": "https://vmogg_single_deployment/services/v2/extracts",
            "mediaType": "text/html"
        },
        {
            "rel": "describedby",
            "href": "https://vmogg_single_deployment/services/ogg_test_01/adminsrvr/v2/metadata-catalog/extracts",
            "mediaType": "application/schema+json"
        }
    ],
    "messages": &#091;],
    "response": {
        "$schema": "ogg:collection",
        "items": &#091;
            {
                "links": &#091;
                    {
                        "rel": "parent",
                        "href": "https://vmogg_single_deployment/services/v2/extracts",
                        "mediaType": "application/json"
                    },
                    {
                        "rel": "canonical",
                        "href": "https://vmogg_single_deployment/services/v2/extracts/EXT1",
                        "mediaType": "application/json"
                    }
                ],
                "$schema": "ogg:collectionItem",
                "name": "EXT1",
                "status": "running"
            }
        ]
    }
}</code></pre>



<p class="wp-block-paragraph"><br>In a <strong>multi-deployment</strong> configuration, the <strong>endpoint does not work</strong>:</p>



<pre class="wp-block-code"><code>{
	"links": &#091;],
	"messages": &#091;
		{
			"$schema": "ogg:message",
			"title": "The requested resource does not exist.",
			"code": "OGG-12031",
			"severity": "ERROR",
			"issued": "2026-05-28T18:25:48Z",
			"type": "https://www.rfc-editor.org/rfc/rfc9110.html#name-status-codes"
		}
	]
}</code></pre>



<p class="wp-block-paragraph">This behavior is <strong>expected</strong>, since you <strong>cannot query multiple deployments</strong> at once.</p>



<ul class="wp-block-list">
<li>With a <strong>single deployment</strong>, you can list extracts without specifying the deployment name.</li>



<li>With <strong>multiple deployments</strong>, there is <strong>no meaning</strong> in listing extracts without having to specify which deployment you are targeting.</li>
</ul>



<p class="wp-block-paragraph">In the NGINX reverse proxy configuration file, this is materialized by a change of behavior for all endpoints that are deployment-specific. To keep the extracts endpoint as example, here is what the configuration looks like in a <strong>single-deployment</strong> setup:</p>



<pre class="wp-block-code"><code>location ~ ^/services/ogg_test_01/(?&lt;version&gt;&#091;^/]+)/(?&lt;resource&gt;extracts.*)$ {
location ~ ^/services/(?&lt;version&gt;&#091;^/]+)/(?&lt;resource&gt;extracts.*)$ {</code></pre>



<p class="wp-block-paragraph">And here is what it looks like in a <strong>multi-deployment</strong> setup:</p>



<pre class="wp-block-code"><code>location ~ ^/services/ogg_test_01/(?&lt;version&gt;&#091;^/]+)/(?&lt;resource&gt;extracts.*)$ {
location ~ ^/services/ogg_test_02/(?&lt;version&gt;&#091;^/]+)/(?&lt;resource&gt;extracts.*)$ {</code></pre>



<p class="wp-block-paragraph">With a single deployment, we could access the extracts endpoint through the deployment or with the default endpoint. With multiple deployments, this second option is not available anymore, and you have to specify the deployment name every time.</p>



<p class="wp-block-paragraph">This is why a best practice is to <strong>always use deployment-specific endpoints</strong> whenever it is possible, to avoid NGINX behavior changes in GoldenGate when adding or deleting deployments.</p>



<h2 id="h-can-i-still-use-deployment-specific-endpoints-if-i-don-t-have-a-reverse-proxy" class="wp-block-heading">Can I still use deployment-specific endpoints if I don&#8217;t have a reverse proxy ?</h2>



<p class="wp-block-paragraph">In the same way that it does not make sense to have a single endpoint to list extracts if you have multiple deployments with a reverse proxy, it <strong>does not make sense to include the deployment</strong> name in the URL if you do not have a reverse proxy. If you try to access this:</p>



<pre class="wp-block-code"><code>http(s)://vmogg:port/services/deployment_name/adminsrvr/v2/extracts</code></pre>



<p class="wp-block-paragraph">You will receive an error stating that &#8220;<em>The requested resource does not exist</em>&#8220;. <strong>Without a reverse proxy</strong>, the <strong>port</strong> is what <strong>determines both the deployment and the service</strong> to which you connect.</p>
<p>L’article <a href="https://www.dbi-services.com/blog/goldengate-nginx-reverse-proxy-behavior-changes/">GoldenGate NGINX Reverse Proxy Behavior Changes</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-nginx-reverse-proxy-behavior-changes/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-08-17 12:18:38 by W3 Total Cache
-->