<?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>Fri, 04 Sep 2026 07:37:45 +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>MongoDB DMK 2.6.0 : pymongo integration and new features</title>
		<link>https://www.dbi-services.com/blog/mongodb-dmk-2-6-0-pymongo-integration-and-new-features/</link>
					<comments>https://www.dbi-services.com/blog/mongodb-dmk-2-6-0-pymongo-integration-and-new-features/#respond</comments>
		
		<dc:creator><![CDATA[Julien Delattre]]></dc:creator>
		<pubDate>Fri, 04 Sep 2026 05:34:49 +0000</pubDate>
				<category><![CDATA[MongoDB]]></category>
		<category><![CDATA[2.6.0]]></category>
		<category><![CDATA[DMK]]></category>
		<category><![CDATA[Management]]></category>
		<category><![CDATA[Mongo]]></category>
		<category><![CDATA[mongodb]]></category>
		<category><![CDATA[pymongo]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=46701</guid>

					<description><![CDATA[<p>In this blog, I will present the new features introduced with the latest release (2.6.0) of the MongoDB DMK. The DMK is a set of standardized tools that aims at easing the work of DBAs by having dbi’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-6-0-pymongo-integration-and-new-features/">MongoDB DMK 2.6.0 : pymongo integration 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 (<code>2.6.0</code>) 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’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 <a href="https://www.dbi-services.com/fr/produits/dmk-management-kit/" target="_blank" rel="noopener noreferrer">DMK</a> (<em>Database Management Kit</em>) to its customers for multiple technologies: Oracle, Postgres, MongoDB, etc. This toolkit is provided <strong>free of charge</strong> to all clients who work with dbi services on a consulting project.</p>



<h2 id="new-features-of-the-mongodb-dmk-in-260" class="wp-block-heading">New features of the MongoDB DMK in <code>2.6.0</code></h2>



<h3 id="pymongo-integration" class="wp-block-heading"><code>pymongo</code> integration</h3>



<p class="wp-block-paragraph">DMK now uses <code>pymongo</code> as its default MongoDB connection backend where available, instead of always shelling out to <code>mongosh</code>. Every internal operation that used to spawn a <code>mongosh</code> subprocess and parse its printed output (status checks, session listing, replica set state) now runs the equivalent <code>pymongo</code> call directly in the same process. That skips the cost of starting a shell interpreter and a Node.js runtime for every single query. It also gets typed BSON values (timestamps, <code>ObjectId</code>, <code>Decimal128</code>) back natively instead of round-tripping them through JSON text.</p>



<p class="wp-block-paragraph">A new <code>mongo_connection.py</code> module wraps either a <code>pymongo</code> client or a <code>mongosh</code> subprocess behind the same interface. It is automatically chosen based on whether <code>pymongo</code> is importable. Both backends return the same JSON-serializable shape, so the rest of DMK does not need to know which one is in use. <code>pymongo</code> is entirely optional: install it with <code>pip3 install pymongo</code> and DMK picks it up automatically the next time an alias or script runs. No restart and no configuration change are needed. Without it, DMK transparently falls back to the <code>mongosh</code> backend it has always used.</p>



<p class="wp-block-paragraph">Set <code>DMK_USE_PYMONGO=0</code> (or <code>false</code>/<code>no</code>) to force the <code>mongosh</code> backend even when <code>pymongo</code> is installed. This is useful to work around a <code>pymongo</code>-specific issue without uninstalling it. The <code>dmkpymongo</code> alias reports which backend is currently in use:</p>



<pre class="wp-block-code"><code>$ dmkpymongo
DMK is using the mongosh backend (pymongo is not installed).</code></pre>



<p class="wp-block-paragraph">Once <code>pymongo</code> is installed, the same alias instead reports <code>DMK is using the pymongo backend (pymongo &lt;version&gt; installed).</code></p>



<h3 id="startup-report-in-dmk_db_ctlpy" class="wp-block-heading">Startup report in <code>dmk_db_ctl.py</code></h3>



<p class="wp-block-paragraph"><code>dmk_db_ctl.py</code> gained a <code>--startup-report</code> option. After a <code>start</code> or <code>restart</code>, it scans the instance log for warnings/errors since the last startup and retrieves the server’s own <code>startupWarnings</code> buffer via <code>getLog</code>, then prints a combined report. If the start itself fails, the log is still scanned so the cause is visible.</p>



<pre class="wp-block-code"><code>dmk_db_ctl.py -i mdb01 -a start --startup-report
dmk_db_ctl.py -i mdb01 -a restart --startup-report --check-status</code></pre>



<p class="wp-block-paragraph">A successful restart reports both sources side by side, the log scan and the server’s own <code>getLog</code> buffer:</p>



<pre class="wp-block-code"><code>2026-09-02 15:22:05 | INFO | Restarting MongoDB instance mdb01 ...
2026-09-02 15:22:07 | INFO | MongoDB instance 'mdb01' is now 'STARTED'.
2026-09-02 15:22:08 | INFO | ------------------------------  Startup Report  ------------------------------
2026-09-02 15:22:08 | INFO | Log scan since last startup: 10 warning(s), 0 error(s)/fatal(s). Server startupWarnings buffer: 6 entrie(s).
2026-09-02 15:22:08 | INFO |   &#091;W] 2026-09-02T15:22:05.865+00:00 (initandlisten) Access control is not enabled for the database. Read and write access to data and configuration is unrestricted
2026-09-02 15:22:08 | INFO |   &#091;W] 2026-09-02T15:22:05.865+00:00 (initandlisten) We suggest setting swappiness to 0 or 1, as swapping can cause performance problems.
2026-09-02 15:22:08 | INFO |   &#091;W] 2026-09-02T15:22:06.006+00:00 (ftdc) Use of deprecated server parameter 'sslMode', please use 'tlsMode' instead.
2026-09-02 15:22:08 | INFO |   &#091;I] 2026-09-02T15:22:05.517+00:00 (initandlisten) Using the XFS filesystem is strongly recommended with the WiredTiger storage engine. See http://dochub.mongodb.org/core/prodnotes-filesystem (getLog)
2026-09-02 15:22:08 | INFO | ------------------------------------------------------------------------------</code></pre>



<p class="wp-block-paragraph">A failed start scans only the log, since the server was never reachable and there is no <code>getLog</code> buffer to add, then still re-raises so the command’s own exit code stays non-zero:</p>



<pre class="wp-block-code"><code>2026-09-02 15:21:45 | INFO | Restarting MongoDB instance mdb01 ...
2026-09-02 15:21:47 | ERROR | Instance failed to start. Scanning log for the cause ...
2026-09-02 15:21:47 | INFO | ------------------------------  Startup Report  ------------------------------
2026-09-02 15:21:47 | INFO | Log scan since last startup: 10 warning(s), 0 error(s)/fatal(s). Server startupWarnings buffer: 0 entrie(s).
2026-09-02 15:21:47 | INFO | ------------------------------------------------------------------------------</code></pre>



<p class="wp-block-paragraph">Without <code>--check-status</code>, <code>dmk_db_ctl.py</code> does not wait to confirm the server actually came up, so a start that silently fails to bind (a bad port in the configuration file, for example) still reports the previous startup’s log content as if it were current, with exit code 0. Pass <code>--check-status</code> alongside <code>--startup-report</code> whenever the report’s purpose is to catch a failed start, not just to review a successful one.</p>



<h3 id="default-mongoshrcjs" class="wp-block-heading">Default <code>~/.mongoshrc.js</code></h3>



<p class="wp-block-paragraph">DMK now bootstraps a <code>~/.mongoshrc.js</code> on first run (never overwriting an existing one), setting a prompt that shows <code>host:port</code>, database name, and replica set/<code>mongos</code> role, plus a set of read-only <code>show*()</code> helper functions for users, database/collection/index sizes, locks, active sessions, replica set status, and sharding status.</p>



<p class="wp-block-paragraph">On a standalone instance, the prompt reports <code>standalone</code>:</p>



<pre class="wp-block-code"><code>&#091;standalone] 127.0.0.1:27017/admin&gt;</code></pre>



<p class="wp-block-paragraph">On a replica set, it reports the replica set name and the member’s current role instead:</p>



<pre class="wp-block-code"><code>&#091;dbirs:PRIMARY] 127.0.0.1:28001/admin&gt;</code></pre>



<p class="wp-block-paragraph">Run <code>showAliases()</code> at any time to list every available <code>show*()</code> helper:</p>



<pre class="wp-block-code"><code>showUsers()             - users across all databases
showAllDBSizes()        - size of all databases, in MB
showAllCollections()    - all collections across all databases, including system ones
showCollections()       - all collections across all databases, excluding system ones
showIndexSizes()        - index sizes for collections in the current database
showUserRoles()         - user roles across all databases
showLocks()             - current lock statistics
showWaits()             - current lock queue / active clients
showActiveSessions()    - currently active sessions/operations
showMongoDBVersion()    - MongoDB server version
showMongoshVersion()    - mongosh version
showReplicaSetInfo()    - replica set status (rs.status())
showReplicaSetConfig()  - replica set configuration (rs.conf())
showShardStatus()       - list of shards in a sharded cluster
showChunkDistribution() - chunk count per shard, per sharded collection
showBalancerStatus()    - whether the sharding balancer is enabled</code></pre>



<h3 id="new-dmk_debug3-trace-tier" class="wp-block-heading">New <code>oplog</code> alias</h3>



<p class="wp-block-paragraph">A new <code>oplog</code> alias (<code>msp ${DMK_HOME}/js/oplog_info.js</code>) shows a replica set member’s oplog configured/used size and the time window (first entry to last entry) it currently covers, formatted as days/hours/minutes/seconds:</p>



<pre class="wp-block-code"><code>$ oplog
Oplog size:
-------------
  Configured size: 990.00 MB
  Used:            978.19 MB (98.81%)

Oplog window:
---------------
  First entry: Fri Aug 28 2026 15:44:01 GMT+0000 (Coordinated Universal Time)
  Last entry:  Wed Sep 02 2026 15:23:13 GMT+0000 (Coordinated Universal Time)
  Covers:      4d 23h 39m 12s (430752s)</code></pre>



<h3 id="sess-alias-improvements" class="wp-block-heading"><code>sess</code> alias improvements</h3>



<p class="wp-block-paragraph">The session view (<code>sess</code> / <code>dmk_status.py --sessions</code>) now hides internal/background operations (replication threads, <code>Checkpointer</code>, <code>TTLMonitor</code>, and similar) by default, since they have no client connection behind them and are noise for “who’s connected” questions. Pass <code>--include-internal</code> (or <code>--show-all</code>) to bring them back. Session rows also now show <code>planSummary</code>.</p>



<h3 id="configuration-file-parsing-fixes" class="wp-block-heading">Configuration file parsing fixes</h3>



<p class="wp-block-paragraph">Quote parsing in the DMK configuration file received further fixes. The YAML parser gained list support, and a bug where it could silently re-parent sibling keys into the wrong nested block was fixed. <code>update_mongo_conf.py</code> now edits a configuration file’s lines directly instead of rewriting the whole file, so comments, lists, and header formatting are no longer destroyed. A password containing an unquoted <code>#</code> in <code>cred.yaml</code> is no longer silently truncated as an inline comment.</p>



<h3 id="systemd-sudo-grant-check" class="wp-block-heading"><code>systemd</code> sudo grant check</h3>



<p class="wp-block-paragraph"><code>dmk_db_ctl.py</code> now checks that the current user actually has the sudo grants to run <code>systemctl start|stop</code> on the instance’s service before attempting it, failing fast with a clear message instead of surfacing <code>sudo</code>’s own cryptic stderr.</p>



<h3 id="dmk_dbcreatepy-improvements" class="wp-block-heading"><code>dmk_dbcreate.py</code> improvements</h3>



<p class="wp-block-paragraph">Directory/config path variables (<code>admin_path</code>, <code>log_path</code>, <code>data_path</code>) are now read from the installer template rather than re-derived from environment variables that could differ from it, which could set up an instance’s directories in the wrong place. <code>dmk_dbcreate.py</code> also now checks the configured port for conflicts before creating an instance: it verifies the port is a valid integer, is not already assigned to another instance in <code>mongodb.lst</code>, and is not already accepted by a listening process, failing fast with a clear error instead of creating an instance that silently squats on a port already in use.</p>



<h3 id="new-dmk_debug3-trace-tier" class="wp-block-heading">New <code>DMK_DEBUG=3</code> trace tier</h3>



<p class="wp-block-paragraph">Level 2 debug output previously mixed operational debug (instance, connection, status) with high-volume configuration-file parsing/computation output, making it hard to isolate the signal that actually matters when troubleshooting. That parsing/computation noise now only appears at a new <code>DMK_DEBUG=3</code> (<code>TRACE</code>) tier; levels 0-2 keep their existing meaning unchanged.</p>



<h3 id="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>Session runtime</strong> was truncated to the low 32 bits on the <code>mongosh</code> backend, so operations running over roughly 71 minutes showed a wrong, wrapped time. Fixed.</li>



<li><strong>Status table sorting</strong> on numeric columns was lexicographic, so port <code>9000</code> sorted after port <code>27017</code>. Fixed.</li>



<li>A process-existence check could raise an error if an instance stopped between reading its process list and reading its PID file. Fixed.</li>
</ul>



<h2 id="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.5.0, replace the DMK folder with the new one:</p>



<pre class="wp-block-code"><code>cd /u01/app/mongodb/local
mv dmk .dmk_old
unzip /path/to/dmk_mongodb-2.6.0.zip
dmk</code></pre>



<p class="wp-block-paragraph">If you are upgrading from DMK 2.4.0 or earlier, read the <a href="https://www.dbi-services.com/blog/mongodb-dmk-2-5-0-sharding-support-and-new-features/" target="_blank" rel="noopener noreferrer">release notes of DMK 2.5.0</a> first.</p>
<p>L’article <a href="https://www.dbi-services.com/blog/mongodb-dmk-2-6-0-pymongo-integration-and-new-features/">MongoDB DMK 2.6.0 : pymongo integration 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-6-0-pymongo-integration-and-new-features/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Rename a GoldenGate Extract Without Missing Transactions</title>
		<link>https://www.dbi-services.com/blog/rename-a-goldengate-extract-without-missing-transactions/</link>
					<comments>https://www.dbi-services.com/blog/rename-a-goldengate-extract-without-missing-transactions/#respond</comments>
		
		<dc:creator><![CDATA[Julien Delattre]]></dc:creator>
		<pubDate>Mon, 31 Aug 2026 06:19:00 +0000</pubDate>
				<category><![CDATA[GoldenGate]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[administration]]></category>
		<category><![CDATA[extract]]></category>
		<category><![CDATA[migration]]></category>
		<category><![CDATA[ogg]]></category>
		<category><![CDATA[Rename]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=46579</guid>

					<description><![CDATA[<p>Throughout my consulting missions, I have often been asked to rename GoldenGate extracts. While this is not a difficult task, it should still be done correctly to avoid missing transactions. In this blog, I will explain how to rename a GoldenGate extract from the adminclient. If you often rename extracts, or want to remove the [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/rename-a-goldengate-extract-without-missing-transactions/">Rename a GoldenGate Extract Without Missing Transactions</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">Throughout my consulting missions, I have often been asked to <strong>rename GoldenGate extracts</strong>. While this is not a difficult task, it should still be done correctly to avoid missing transactions. In this blog, I will explain how to rename a GoldenGate extract from the <code>adminclient</code>. If you often rename extracts, or want to remove the risk of a typo on a SCN by automating the process, I will also write a blog on renaming an extract with the REST API later.</p>



<p class="wp-block-paragraph">Please note that these operations are useful not just for renaming an extract. You can also use the same steps to move an extract to another deployment, or to another host.</p>



<h2 id="cant-i-just-directly-rename-the-extract-and-restart-it-" class="wp-block-heading">Can’t I just directly rename the extract and restart it ?</h2>



<p class="wp-block-paragraph">Unfortunately, it is <strong>not possible to just rename the extract and restart it</strong>. Extracts are registered in the database and are associated with a specific SCN. If you stop an extract and try to start it with a new name, you will get an error because the extract is not registered with the new name inside the source database. Moreover, if you try to create a new extract with the new name, you will miss transactions if you do not follow the correct steps described in this blog.</p>



<h2 id="steps-to-rename-a-goldengate-extract" class="wp-block-heading">Steps to rename a GoldenGate extract</h2>



<p class="wp-block-paragraph">The main steps to rename a GoldenGate extract are the following:</p>



<ul class="wp-block-list">
<li>Build the <strong>LogMiner data dictionary</strong> (if you don’t already build it regularly).</li>



<li>Check for <strong>long running transactions</strong> in the source database.</li>



<li><strong>Stop the extract</strong> that you want to rename.</li>



<li>Get the SCN of the <strong>oldest unprocessed transaction</strong>.</li>



<li>Find the <strong>dictionary build</strong> to register the new extract.</li>



<li><strong>Create the new extract</strong>, registered and started at the correct SCNs.</li>



<li>Copy the parameter file and <strong>start the new extract</strong>.</li>
</ul>



<h2 id="build-the-logminer-data-dictionary" class="wp-block-heading">Build the LogMiner data dictionary</h2>



<p class="wp-block-paragraph">To register the new extract, you need a LogMiner data dictionary build that exists <strong>at or before the start SCN</strong>. If your dictionary build SCN is after the start SCN, this will not work. If you don’t already build the dictionary regularly, build one now with <code>DBMS_CAPTURE_ADM.BUILD</code> :</p>



<pre class="wp-block-code"><code>SET SERVEROUTPUT ON
DECLARE
    scn NUMBER;
BEGIN
    DBMS_CAPTURE_ADM.BUILD(first_scn =&gt; scn);
    DBMS_OUTPUT.PUT_LINE('Dictionary build starting SCN: ' || scn);
END;
/

Dictionary build starting SCN: 17218169

PL/SQL procedure successfully completed.</code></pre>



<h2 id="check-for-long-running-transactions-in-the-source-database" class="wp-block-heading">Check for long running transactions in the source database</h2>



<p class="wp-block-paragraph">The recovery checkpoint only moves forward when a transaction <strong>commits</strong>. This means that <strong>an open long running transaction will freeze the start SCN</strong>. It is worth checking for long running transactions here : the start SCN (the oldest unprocessed transaction) must stay <strong>after</strong> the dictionary build SCN, since that build is what you register the new extract with. The further back a long running transaction freezes the start SCN, the more likely it drops before your build, and the more redo the new extract has to re-mine before it catches up. I dedicated a full blog on <a href="https://www.dbi-services.com/blog/checking-long-running-transactions-in-goldengate/" target="_blank" rel="noopener noreferrer">checking long running transactions in GoldenGate</a> both from the <code>adminclient</code> and the REST API, please have a look at it.</p>



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

Sending showtrans tabular request to Extract group EXT1 ...

No transactions found.</code></pre>



<p class="wp-block-paragraph">Here, the idea is to wait until there are no transactions started before the dictionary build SCN.</p>



<h2 id="stop-the-extract-that-you-want-to-rename" class="wp-block-heading">Stop the extract that you want to rename</h2>



<p class="wp-block-paragraph">Once the dictionary is built and there are no long running transactions, you can stop the extract.</p>



<pre class="wp-block-code"><code>OGG (https://vmogg ogg_test_01) 2&gt; stop extract ext1</code></pre>



<h2 id="get-the-scn-of-the-oldest-unprocessed-transaction" class="wp-block-heading">Get the SCN of the oldest unprocessed transaction</h2>



<p class="wp-block-paragraph">The SCN you are looking for is the one of the <strong>oldest unprocessed transaction</strong>, which corresponds to the <strong>recovery checkpoint</strong> of the extract. In the rest of the blog, I will refer to it as the <strong>start SCN</strong>, because this is the SCN from which the new extract will be started. In this example, the <strong>start SCN</strong> is <code>17219083</code>.</p>



<pre class="wp-block-code"><code>OGG (https://vmogg ogg_test_01) 3&gt; info extract ext1 showch
...
  Recovery Checkpoint (position of oldest unprocessed transaction in the data source):
    Timestamp: 2026-08-12 18:35:47.000000
    SCN: 0.17219083 (17219083)
...</code></pre>



<h2 id="find-the-dictionary-build-to-register-the-new-extract" class="wp-block-heading">Find the dictionary build to register the new extract</h2>



<p class="wp-block-paragraph">If you waited for long running transactions to commit, as mentioned before, the dictionary build that you have will be before the start SCN. However, if you build the dictionary on a regular basis and did not check the long running transactions, you need to retrieve the <strong>most recent build that is still older than the start SCN</strong>:</p>



<pre class="wp-block-code"><code>SELECT first_change#
FROM v$archived_log
WHERE dictionary_begin = 'YES'
AND standby_dest = 'NO'
AND name IS NOT NULL
AND status = 'A'
AND first_change# &lt; 17219083 -- the start SCN retrieved above
ORDER BY first_change# DESC
FETCH FIRST 1 ROWS ONLY;

FIRST_CHANGE#
-------------
   17218169</code></pre>



<p class="wp-block-paragraph">The <code>first_change# &lt; start_scn</code> filter is the important part. Without it, you might pick the most recent dictionary build overall, which is not guaranteed to have happened before the start SCN. In the rest of the blog, I will refer to <code>17218169</code> as the <strong>dictionary build SCN</strong>.</p>



<p class="wp-block-paragraph">If the query returns no rows at all, no build predates the start SCN yet. In that case, you must build the dictionary again, as shown above. Then, you must restart the extract and wait for the oldest unprocessed transaction (recovery checkpoint) to go beyond this SCN.</p>



<h2 id="create-the-new-extract-at-the-correct-scns" class="wp-block-heading">Create the new extract at the correct SCNs</h2>



<p class="wp-block-paragraph">We now have the two SCNs we need :</p>



<ul class="wp-block-list">
<li>The <strong>dictionary build SCN</strong> (<code>17218169</code> in the example), used to <strong>register</strong> the extract.</li>



<li>The <strong>start SCN</strong> (<code>17219083</code> in the example), the oldest unprocessed transaction, used to <strong>add</strong> the extract.</li>
</ul>



<p class="wp-block-paragraph">From the <code>adminclient</code>, log into the database, then create and register the new extract :</p>



<pre class="wp-block-code"><code>OGG (https://vmogg ogg_test_01) 4&gt; dblogin useridalias source_cdb
Successfully logged into database CDB$ROOT.

# Here, we are using the start SCN
OGG (https://vmogg ogg_test_01) 5&gt; add extract ext2, integrated tranlog, scn 17219083
Integrated Extract added.

# Here, we are using the dictionary build SCN
OGG (https://vmogg ogg_test_01) 6&gt; register extract ext2 database scn 17218169 container (pdb1)
Extract group EXT2 successfully registered with database at SCN 17218169.</code></pre>



<h2 id="copy-the-parameter-file-and-start-the-new-extract" class="wp-block-heading">Copy the parameter file and start the new extract</h2>



<p class="wp-block-paragraph">Finally, copy the content of the parameter file from the old extract to the new one, only changing the extract name. Here, you need to make one choice:</p>



<ul class="wp-block-list">
<li>Keep the same trail file name, <code>aa</code> in this case. You will have to delete the original <code>EXT1</code> extract, since two extracts cannot write to the same trail file. <code>EXT2</code> will start from the next trail sequence.</li>



<li>Change to another trail file name. In that case, you would have to reconfigure all replicats or distribution paths consuming the trail file.</li>
</ul>



<pre class="wp-block-code"><code>OGG (https://vmogg ogg_test_01) 7&gt; view params ext1
EXTRACT EXT1
USERIDALIAS source_cdb DOMAIN OracleGoldenGate
EXTTRAIL aa
SOURCECATALOG PDB1
TABLE SALES.ORDERS;

OGG (https://vmogg ogg_test_01) 8&gt; edit params ext2
EXTRACT EXT2
USERIDALIAS source_cdb DOMAIN OracleGoldenGate
EXTTRAIL aa
SOURCECATALOG PDB1
TABLE SALES.ORDERS;</code></pre>



<p class="wp-block-paragraph">In this case, <strong>after deleting <code>EXT1</code></strong> to free the trail, assign the trail to <code>EXT2</code>, then <strong>start the new extract</strong>. It will pick up exactly where the old one left off.</p>



<pre class="wp-block-code"><code>OGG (https://vmogg ogg_test_01) 9&gt; add exttrail aa, extract ext2
EXTTRAIL added.

OGG (https://vmogg ogg_test_01) 10&gt; start extract ext2</code></pre>
<p>L’article <a href="https://www.dbi-services.com/blog/rename-a-goldengate-extract-without-missing-transactions/">Rename a GoldenGate Extract Without Missing Transactions</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/rename-a-goldengate-extract-without-missing-transactions/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>GoldenGate DB2 z/OS Upgrade Checklist</title>
		<link>https://www.dbi-services.com/blog/goldengate-db2-z-os-upgrade-checklist/</link>
					<comments>https://www.dbi-services.com/blog/goldengate-db2-z-os-upgrade-checklist/#respond</comments>
		
		<dc:creator><![CDATA[Julien Delattre]]></dc:creator>
		<pubDate>Thu, 27 Aug 2026 06:17:00 +0000</pubDate>
				<category><![CDATA[GoldenGate]]></category>
		<category><![CDATA[19]]></category>
		<category><![CDATA[19c]]></category>
		<category><![CDATA[21]]></category>
		<category><![CDATA[21c]]></category>
		<category><![CDATA[26]]></category>
		<category><![CDATA[26ai]]></category>
		<category><![CDATA[checklist]]></category>
		<category><![CDATA[clidriver]]></category>
		<category><![CDATA[DB2]]></category>
		<category><![CDATA[IBM]]></category>
		<category><![CDATA[Licensing]]></category>
		<category><![CDATA[migration]]></category>
		<category><![CDATA[ogg]]></category>
		<category><![CDATA[OGG-30057]]></category>
		<category><![CDATA[OGG-30121]]></category>
		<category><![CDATA[sql1598n]]></category>
		<category><![CDATA[upgrade]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=46580</guid>

					<description><![CDATA[<p>Upgrading GoldenGate when the source is DB2 for z/OS is not quite the same exercise as upgrading a GoldenGate installation for Oracle. Most of what I described in my generic blogs about planning a GoldenGate upgrade and migrating from Classic to Microservices Architecture is still valid. However, there is an extra layer to deal with. [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/goldengate-db2-z-os-upgrade-checklist/">GoldenGate DB2 z/OS Upgrade Checklist</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">Upgrading GoldenGate when the source is <strong>DB2 for z/OS</strong> is not quite the same exercise as upgrading a GoldenGate installation for Oracle. Most of what I described in my generic blogs about <a href="https://www.dbi-services.com/blog/planning-goldengate-migration-before-premier-support-expires/" target="_blank" rel="noopener noreferrer">planning a GoldenGate upgrade</a> and <a href="https://www.dbi-services.com/blog/upgrade-goldengate-from-classic-to-microservices-architecture-before-its-too-late/" target="_blank" rel="noopener noreferrer">migrating from Classic to Microservices Architecture</a> is still valid. However, there is an extra layer to deal with. It has to do with the <strong>IBM Data Server Driver for ODBC and CLI</strong>, and everything DB2-side depending on it. This blog is a consolidated checklist of everything you should check before, during, and after a GoldenGate for DB2 z/OS upgrade, based on issues I faced.</p>



<h2 id="why-db2-zos-upgrades-are-different" class="wp-block-heading">Why DB2 z/OS upgrades are different</h2>



<p class="wp-block-paragraph">With Oracle, a GoldenGate upgrade does not really involve the databases themselves. You just have to install the new home, and migrate or reconfigure extracts and replicats. Provided that you do not have a complex custom layer on top of it (automation, pipelines, etc.), this is everything you have to do. With DB2 z/OS, GoldenGate talks to the DB2 database through the <strong>CLI driver</strong>. This driver has its own version, its own licensing, and its own DB2-side procedures that need to be updated. If you only upgrade GoldenGate and the CLI driver but forget the DB2 z/OS side, you will hit errors when trying to extract data from DB2. On top of this, a stored procedure is installed in the DB2 database, for GoldenGate to work.</p>



<h2 id="the-sql1598n-licensing-issue" class="wp-block-heading">The <code>SQL1598N</code> licensing issue</h2>



<p class="wp-block-paragraph">The first error you might encounter when upgrading the CLI driver as part of a GoldenGate upgrade is related to the licensing file. I detailed this in a <a href="https://www.dbi-services.com/blog/db2-sql1598n-licensing-error-when-upgrading-goldengate/" target="_blank" rel="noopener noreferrer">previous blog</a>, but the short version is: the IBM Data Server Driver for ODBC and CLI does not ship with a license file to connect to DB2 for z/OS. A separate file, <code>db2consv_zs.lic</code>, has to be placed manually into the <code>clidriver/license/</code> directory. T<strong>his file is tied to the exact driver version</strong> ! Reusing the license from your old driver (<code>11.1</code>) in the new driver’s directory (<code>12.1</code>) will not work, and connections will fail with:</p>



<pre class="wp-block-code"><code>SQLState : 42968
NativeError : -1598
DiagMsg: &#091;IBM]&#091;CLI Driver] SQL1598N An attempt to connect to the database
server failed because of a licensing problem. SQLSTATE=42968</code></pre>



<p class="wp-block-paragraph">Remember to get the new license file and test it way before the cutover. Whoever manages IBM software on your side, or IBM support directly, needs to provide a <strong>new</strong> <code>db2consv_zs.lic</code> matching the target driver version. Since getting a license file from IBM support is rarely instantaneous, plan some time to get this done.</p>



<h2 id="the-db2-side-stored-procedure-step" class="wp-block-heading">The DB2-side stored procedure step</h2>



<p class="wp-block-paragraph">This is the part which is easy to miss because it doesn’t happen on the GoldenGate host at all. However, it is documented by Oracle. A GoldenGate extract for DB2 z/OS relies on an <strong>initialization and utility stored procedure</strong> which is installed directly in DB2 itself. This stored procedure ships with each GoldenGate release and is versioned against it. When you upgrade GoldenGate, the stored procedure sitting in the DB2 subsystem does not upgrade itself. It stays at whatever version was installed during the last GoldenGate install, until it is explicitly reinstalled.</p>



<p class="wp-block-paragraph">When setting up a new GoldenGate home for DB2, a <code>zOSutils.zip</code> file is included under <code>$OGG_HOME/lib</code>. This is what you must use. The new stored procedure will replace the old one in the catalog.</p>



<p class="wp-block-paragraph">Just like the CLI driver issues described above, this should be <strong>managed by DB2 engineers</strong>. Installing or replacing a stored procedure at the DB2 level requires the appropriate privileges, which a Database/GoldenGate/Linux administrator typically does not have. Talk with your <strong>DB2 for z/OS DBA or systems engineer</strong> as part of the upgrade plan, and treat the stored procedure reinstall as a mandatory step of the GoldenGate upgrade itself.</p>



<h3 id="ogg-30121-or-ogg-30057-with-db2-procedure-upgrade" class="wp-block-heading"><code>OGG-30121</code> or <code>OGG-30057</code> with DB2 procedure upgrade</h3>



<p class="wp-block-paragraph">If GoldenGate itself gets upgraded but the stored procedure in the DB2 subsystem is left at its old version, the extract will detect the mismatch at startup and abend with <code>OGG-30121</code>:</p>



<pre class="wp-block-code"><code>OGG-30121  ERROR  The initialization and utility stored procedure major version is 210610 and is not compatible with this Extract. (The minor version is 00).</code></pre>



<p class="wp-block-paragraph">Getting an <code>OGG-30121</code> error during a GoldenGate upgrade means that the DB2-side stored procedure reinstall was missed. There is no need to start debugging the GoldenGate configuration.</p>



<p class="wp-block-paragraph">Also, please note that this stored procedure change needs to happen during the GoldenGate upgrade, not before. What I mean by this is that you cannot ask for the stored procedure to be updated a week before the GoldenGate upgrade. You will need to <strong>allocate time for updating the stored procedure</strong> in your upgrade scenario.</p>



<p class="wp-block-paragraph">The reverse situation also exists. If you update the procedure but not GoldenGate, you will have an <code>OGG-30057</code> error when attempting to restart the extracts.</p>



<pre class="wp-block-code"><code>OGG-30057  ERROR  The log reading user-defined function major version is 231010 and is not supported. (The minor version is 00)</code></pre>



<h2 id="other-things-to-check-during-the-upgrade" class="wp-block-heading">Other things to check during the upgrade</h2>



<p class="wp-block-paragraph">Here are a few other points regarding issues I faced when upgrading GoldenGate for DB2 setups in the past:</p>



<ul class="wp-block-list">
<li>The response file contain an <code>IBMCLIDRIVER</code> variable. It must point to the actual root of the CLI driver installation, not a parent directory. A wrong path produces an <a href="https://www.dbi-services.com/blog/deployment-creation-ins-85037-error-with-goldengate-26ai-for-db2-z-os/" target="_blank" rel="noopener noreferrer">INS-85037 deployment error</a> when using <code>oggca.sh</code>.</li>



<li>Confirm your GoldenGate version is still under <strong>Premier Support</strong> or <strong>Extended Support</strong> before you upgrade. Indeed, 19c and 21c Premier Support came to an end in May 2026, as covered in my <a href="https://www.dbi-services.com/blog/planning-goldengate-migration-before-premier-support-expires/" target="_blank" rel="noopener noreferrer">migration planning blog</a>.</li>
</ul>



<h2 id="using-the-migration-utility-with-db2-zos-sources" class="wp-block-heading">Using the Migration Utility with DB2 z/OS sources</h2>



<p class="wp-block-paragraph">If part of your upgrade also involves moving from <strong>Classic Architecture</strong> to Microservices, the general procedure and its limitations are the same, regardless of source database, and covered in <a href="https://www.dbi-services.com/blog/upgrade-goldengate-from-classic-to-microservices-architecture-before-its-too-late/" target="_blank" rel="noopener noreferrer">Upgrade GoldenGate from Classic to Microservices Architecture</a>. You can use the <strong>migration utility</strong> delivered by Oracle (patch <code>37274898</code> / <code>KB100447</code> in MOS). You will still have to pay attention to the points described above.</p>



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



<p class="wp-block-paragraph">Before upgrading GoldenGate for DB2 z/OS:</p>



<ul class="wp-block-list">
<li>Confirm your support status before deciding on a target version. You should upgrade to 26ai.</li>



<li>Identify the current and target CLI driver version and request the matching <code>db2consv_zs.lic</code> from IBM (or your internal license owner) ahead of time, if needed.</li>



<li>Open a change request with your DB2 for z/OS DBA/systems engineer to <strong>reinstall the GoldenGate stored procedure</strong> in every affected DB2 database. This must be done during the upgrade, after stopping and before restarting the new extracts.</li>



<li>After cutover, if an extract abends with the <code>OGG-30121</code> or <code>OGG-30057</code> error, check the stored procedure at the DB2 level.</li>
</ul>



<p class="wp-block-paragraph">With this, I hope you will succeed in your GoldenGate for DB2 z/OS migrations and upgrades.</p>
<p>L’article <a href="https://www.dbi-services.com/blog/goldengate-db2-z-os-upgrade-checklist/">GoldenGate DB2 z/OS Upgrade Checklist</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-db2-z-os-upgrade-checklist/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>NGINX Secured Distribution Path with GoldenGate REST API</title>
		<link>https://www.dbi-services.com/blog/nginx-secured-distribution-path-with-goldengate-rest-api/</link>
					<comments>https://www.dbi-services.com/blog/nginx-secured-distribution-path-with-goldengate-rest-api/#respond</comments>
		
		<dc:creator><![CDATA[Julien Delattre]]></dc:creator>
		<pubDate>Mon, 24 Aug 2026 06:05:32 +0000</pubDate>
				<category><![CDATA[GoldenGate]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[26]]></category>
		<category><![CDATA[26ai]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[Automation]]></category>
		<category><![CDATA[distribution-path]]></category>
		<category><![CDATA[Nginx]]></category>
		<category><![CDATA[ogg]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[restapi]]></category>
		<category><![CDATA[Security]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=46561</guid>

					<description><![CDATA[<p>In a previous blog, I presented how to set up a distribution path between two GoldenGate deployments both secured with NGINX. The method I used there was purely through the Web UI. But GoldenGate also exposes a full REST API, and everything you can do in the UI can be done through the API as [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/nginx-secured-distribution-path-with-goldengate-rest-api/">NGINX Secured Distribution Path with GoldenGate REST API</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">In a <a href="https://www.dbi-services.com/blog/create-distribution-paths-in-nginx-secured-goldengate-26ai/" target="_blank" rel="noopener noreferrer">previous blog</a>, I presented how to set up a distribution path between two GoldenGate deployments both secured with NGINX. The method I used there was purely through the Web UI. But GoldenGate also exposes a full REST API, and everything you can do in the UI can be done through the API as well, which is useful for automation, scripting, or when the UI is not reachable.</p>



<p class="wp-block-paragraph">This blog covers the exact same setup, using the REST API instead. I will show two ways of doing it :</p>



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



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



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



<p class="wp-block-paragraph">The prerequisites are the same as in the previous blog :</p>



<ul class="wp-block-list">
<li>Two GoldenGate Microservices deployments, <code>ogg_test_01</code> (source) on <code>oggvm1</code> and <code>ogg_test_02</code> (target) on <code>oggvm2</code>. I will use the latest 26ai version.</li>



<li>Both OGG setups secured with NGINX acting as a reverse proxy, so everything goes through port <code>443</code>.</li>



<li>A running extract on the source, writing to a trail (<code>aa</code> in my case).</li>
</ul>



<p class="wp-block-paragraph">Just like in the Web UI, there are three steps to get a working distribution path :</p>



<ul class="wp-block-list">
<li><a href="#create-the-path-connection"><strong>Create a path connection</strong></a> on the source, to authenticate against the target.</li>



<li><a href="#register-the-targets-ca-certificate" data-type="internal" data-id="#register-the-targets-ca-certificate"><strong>Register the target’s CA certificate</strong></a> on the source Service Manager.</li>



<li><a href="#create-and-start-the-distribution-path"><strong>Create and start the distribution path</strong></a>.</li>
</ul>



<p class="wp-block-paragraph">A quick note on URLs before we start. Behind an NGINX reverse proxy, each service has its own path prefix :</p>



<ul class="wp-block-list">
<li>Administration Service : <code>/services/&lt;deployment&gt;/adminsrvr/v2/...</code></li>



<li>Distribution Service : <code>/services/&lt;deployment&gt;/distsrvr/v2/...</code></li>



<li>Service Manager : <code>/services/ServiceManager/v2/...</code></li>
</ul>



<p class="wp-block-paragraph">The <code>oggrestapi.py</code> client builds these for you as soon as you pass <code>reverse_proxy=True</code> and the deployment name, so let’s connect once and reuse the client. If you don’t provide the <code>password</code> argument, you will be prompted for it.</p>



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

ogg_source = OGGRestAPI(
    url="https://oggvm1",
    username="ogg",
    deployment="ogg_test_01",
    reverse_proxy=True,
)</code></pre>



<h2 id="create-the-path-connection" class="wp-block-heading">Create the path connection</h2>



<p class="wp-block-paragraph">As explained in <a href="https://www.dbi-services.com/blog/creating-path-connections-with-goldengate-rest-api/" target="_blank" rel="noopener noreferrer">Creating Path Connections with GoldenGate REST API</a>, a <strong>path connection is simply an alias in the <code>Network</code> domain</strong>. It stores the credentials of a user that exists on the target deployment, and its alias is only known on the source side.</p>



<p class="wp-block-paragraph">With the client, just call the <code>create_alias</code> method :</p>



<pre class="wp-block-code"><code>ogg_source.create_alias(
    alias="ogg_target",
    domain="Network",
    data={
        "userid": "ogg_user_on_target",
        "password": "***",
    },
)</code></pre>



<p class="wp-block-paragraph">As mentioned in the introduction, here is the same call with <code>requests</code>, calling the Administration Service of <code>oggvm1</code> through NGINX :</p>



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

auth = ("ogg", "ogg_password")

response = requests.post(
    "https://oggvm1/services/ogg_test_01/adminsrvr/v2/credentials/Network/ogg_target",
    auth=auth,
    json={
        "userid": "ogg_user_on_target",
        "password": "***",
    },
)</code></pre>



<p class="wp-block-paragraph">After refreshing the source Web UI, the new path connection is visible under the <em><strong>Path Connections</strong></em> tab :</p>



<figure class="wp-block-image"><img decoding="async" src="https://preview.juliendelattre.pages.dev/images/blog/goldengate-path-connections-rest-api.png" alt="GoldenGate Admin Service Path Connections tab showing the ogg_target alias with user ID ogg_user_on_target and type Password" /></figure>



<p class="wp-block-paragraph">But of course, you can also view the new path connection by calling the REST API:</p>



<pre class="wp-block-code"><code># Since path connections are aliases of the Network domain, we use the get_alias method to retrieve them
&gt;&gt;&gt; ogg_source.get_alias('Network', 'ogg_target')
{'$schema': 'ogg:credentials', 'userid': 'ogg_user_on_target', 'type': 'PASSWORD'}</code></pre>



<h2 id="register-the-targets-ca-certificate" class="wp-block-heading">Register the target’s CA certificate</h2>



<p class="wp-block-paragraph">Because the <strong>deployments are secured with NGINX</strong>, the source has to trust the certificate authority that signed the target’s certificate. This is done <strong>on the source Service Manager</strong>, by registering the target’s <strong>root CA certificate</strong>.</p>



<p class="wp-block-paragraph">With the client, use <code>create_deployment_certificate</code> against the source deployment. The certificate type to use is <code>truststore</code>, and the certificate content goes under <code>trustpointBundle.trustpointPem</code>:</p>



<pre class="wp-block-code"><code>target_ca = open("rootCA_ogg_test_02.pem").read()

ogg_source.create_deployment_certificate(
    deployment="ogg_test_01",
    type="truststore",
    certificate="rootCA_ogg_test_02",
    data={
        "trustpointBundle": {
            "trustpointPem": target_ca,
        }
    },
)</code></pre>



<p class="wp-block-paragraph">The same call with <code>requests</code>, this time on the Service Manager prefix :</p>



<pre class="wp-block-code"><code>target_ca = open("rootCA_ogg_test_02.pem").read()

response = requests.post(
    "https://oggvm1/services/ServiceManager/v2/deployments/ogg_test_01/certificates/truststore/rootCA_ogg_test_02",
    auth=auth,
    json={
        "trustpointBundle": {
            "trustpointPem": target_ca,
        }
    },
)</code></pre>



<p class="wp-block-paragraph">Registering under the specific deployment (<code>ogg_test_01</code>) is the equivalent of the <strong>Local</strong> option in the Web UI. To get the <strong>Shared</strong> behavior instead, register the same certificate under the <code>ServiceManager</code> deployment name, so it becomes available to every deployment on that node.</p>



<p class="wp-block-paragraph">If the certificate file contains a <strong>chain</strong> of certificates, you must register each certificate individually, since GoldenGate does not accept them in one go. I described that issue in detail in a <a href="https://www.dbi-services.com/blog/ogg-30007-how-to-register-certificates-in-goldengate/" target="_blank" rel="noopener noreferrer">blog about the <code>OGG-30007</code> error</a>.</p>



<h2 id="create-and-start-the-distribution-path" class="wp-block-heading">Create and start the distribution path</h2>



<p class="wp-block-paragraph">We can now create the distribution path itself. It has a <strong>source endpoint</strong> (the local trail) and a <strong>target endpoint</strong> (the target’s Receiver Service, reached over <code>wss</code> through NGINX). Because the target is NGINX-secured, the target URI :</p>



<ul class="wp-block-list">
<li>uses the <code>wss</code> protocol on port <code>443</code>,</li>



<li>points at the <strong>Receiver Service</strong> path prefix, <code>recvsrvr</code>, not <code>distsrvr</code> (that prefix is only for the Distribution Service on the source side),</li>



<li>does <strong>not</strong> carry the path connection alias itself. The alias goes in a separate <code>authenticationMethod</code> key.</li>
</ul>



<p class="wp-block-paragraph">With the client :</p>



<pre class="wp-block-code"><code>ogg_source.create_distribution_path(
    distpath="path12",
    name="path12",
    source={
        "uri": "trail://localhost/services/v2/sources?trail=PDB1/aa",
    },
    target={
        "uri": "wss://oggvm2/services/ogg_test_02/recvsrvr/v2/targets?trail=PDB1/bb",
        "authenticationMethod": {
            "domain": "Network",
            "alias": "ogg_target",
        },
    },
    begin="now",
    status="running",
)</code></pre>



<p class="wp-block-paragraph">And the equivalent <code>requests</code> call, <strong>on the Distribution Service prefix</strong> (<code>/services/ogg_test_01/distsrvr/</code>):</p>



<pre class="wp-block-code"><code>response = requests.post(
    "https://oggvm1/services/ogg_test_01/distsrvr/v2/sources/path12",
    auth=auth,
    json={
        "name": "path12",
        "source": {
            "uri": "trail://localhost/services/v2/sources?trail=PDB1/aa",
        },
        "target": {
            "uri": "wss://oggvm2/services/ogg_test_02/recvsrvr/v2/targets?trail=PDB1/bb",
            "authenticationMethod": {
                "domain": "Network",
                "alias": "ogg_target",
            },
        },
        "begin": "now",
        "status": "running",
    },
)</code></pre>



<p class="wp-block-paragraph">The trail value in both URIs also has to match the path the extract actually registers, <code>EXTTRAIL PDB1/aa</code> on the source becomes <code>trail=PDB1/aa</code> in the source URI, and the same logic applies to the target’s <code>bb</code> trail. A bare <code>trail=aa</code> without the PDB path segment matches neither what the extract writes nor what the target’s own directory layout expects.</p>



<p class="wp-block-paragraph">Once the path is created with <code>status: "running"</code>, the trail files start flowing. You can confirm it on the target :</p>



<pre class="wp-block-code"><code>oracle@oggvm2:~/ ll $OGG_DEPLOYMENT_HOME/var/lib/data/PDB1
total 0
-rw-r-----. 1 oracle oinstall 0 Mar 22 07:34 bb000000000</code></pre>



<h2 id="the-remote-peer-submitted-a-certificate-that-failed-validation" class="wp-block-heading">The remote peer submitted a certificate that failed validation</h2>



<p class="wp-block-paragraph">If your distribution path doesn’t start and generates a “<em>certificate that failed validation</em>” error, it means that you incorrectly registered your certificates. Make sure that the <strong>target</strong> deployment’s CA certificate is registered on the <strong>source</strong> Service Manager, and not the other way around.</p>



<p class="wp-block-paragraph">And that’s it. With three REST calls, through <code>oggrestapi.py</code> or using the <code>requests</code> module, you get the exact same NGINX-secured distribution path as the Web UI method, but in a form you can script and repeat.</p>
<p>L’article <a href="https://www.dbi-services.com/blog/nginx-secured-distribution-path-with-goldengate-rest-api/">NGINX Secured Distribution Path with GoldenGate REST API</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/nginx-secured-distribution-path-with-goldengate-rest-api/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>GoldenGate 26ai out-of-place patching with Python</title>
		<link>https://www.dbi-services.com/blog/goldengate-26ai-out-of-place-patching-with-python/</link>
					<comments>https://www.dbi-services.com/blog/goldengate-26ai-out-of-place-patching-with-python/#respond</comments>
		
		<dc:creator><![CDATA[Julien Delattre]]></dc:creator>
		<pubDate>Thu, 20 Aug 2026 06:54:00 +0000</pubDate>
				<category><![CDATA[GoldenGate]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[23ai]]></category>
		<category><![CDATA[26ai]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[Automation]]></category>
		<category><![CDATA[ogg]]></category>
		<category><![CDATA[out of place]]></category>
		<category><![CDATA[patch]]></category>
		<category><![CDATA[patching]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[rest]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=44875</guid>

					<description><![CDATA[<p>I already covered out-of-place patching from the web UI, but patching tasks should be automated, and clicking through the same screens for every deployment can get repetitive. Let’s do the exact same out-of-place patch of a GoldenGate Microservices Architecture deployment, this time entirely with the REST API. Every step below shows two ways to make [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/goldengate-26ai-out-of-place-patching-with-python/">GoldenGate 26ai out-of-place patching with Python</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 already covered <a href="https://www.dbi-services.com/blog/goldengate-26ai-out-of-place-patching-with-the-web-ui/" target="_blank" rel="noopener noreferrer">out-of-place patching from the web UI</a>, but patching tasks should be automated, and clicking through the same screens for every deployment can get repetitive. Let’s do the exact same <strong>out-of-place patch of a GoldenGate Microservices Architecture deployment</strong>, this time entirely with the <strong>REST API</strong>.</p>



<p class="wp-block-paragraph">Every step below shows two ways to make the same call:</p>



<ul class="wp-block-list">
<li>A <strong>standard <code>requests</code> call</strong>, the default Python module to handle REST APIs.</li>



<li>The equivalent call using <strong><code>oggrestapi.py</code></strong>, the <code>OGGRestAPI</code> <a href="https://github.com/juliendlttr/ogg/blob/main/26/oggrestapi.py" target="_blank" rel="noopener noreferrer">Python client</a> I presented in <a href="https://www.dbi-services.com/blog/production-ready-goldengate-rest-client-in-python/" target="_blank" rel="noopener noreferrer">another blog</a>, which handles everything for you.</li>
</ul>



<h2 id="installing-the-latest-version-of-goldengate" class="wp-block-heading">Installing the latest version of GoldenGate</h2>



<p class="wp-block-paragraph">This part does not change: the REST API cannot install software on the server, so you still need to <strong>unzip the patched installation</strong> to a new <code>OGG_HOME</code> and run <code>runInstaller</code> in silent mode, as described in the web UI blog.</p>



<h2 id="patching-the-service-manager-with-the-rest-api" class="wp-block-heading">Patching the Service Manager with the REST API</h2>



<p class="wp-block-paragraph">As with the web UI, the Service Manager has to be patched first. Assume the following setup:</p>



<ul class="wp-block-list">
<li><code>sm_url</code>: <code>https://vmogg:7809</code></li>



<li><code>new_ogg_home</code>: <code>/u01/app/ogg/product/23.26.2.0.1</code></li>



<li><code>username</code> / <code>password</code>: an administrator on the Service Manager</li>
</ul>



<p class="wp-block-paragraph"><strong>Updating <code>OGG_HOME</code></strong> is a <code>PATCH</code> call on the <code>ServiceManager</code> deployment:</p>



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

sm_url = "https://vmogg:7809"
auth = ("oggadmin", "password")

requests.patch(
    f"{sm_url}/services/v2/deployments/ServiceManager",
    json={"oggHome": "/u01/app/ogg/product/23.26.2.0.1"},
    auth=auth,
)</code></pre>



<p class="wp-block-paragraph">With <code>oggrestapi.py</code>:</p>



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

client = OGGRestAPI(url="https://vmogg:7809", username="oggadmin", password="password")
client.update_deployment(deployment="ServiceManager", ogg_home="/u01/app/ogg/product/23.26.2.0.1")</code></pre>



<p class="wp-block-paragraph">Already, you can see that the REST API client simplifies the patching a lot.</p>



<p class="wp-block-paragraph"><strong>Restarting the Service Manager</strong> is the same endpoint, this time setting <code>status</code>:</p>



<pre class="wp-block-code"><code>requests.patch(
    f"{sm_url}/services/v2/deployments/ServiceManager",
    json={"status": "restart"},
    auth=auth,
)</code></pre>



<pre class="wp-block-code"><code>client.restart_deployment(deployment="ServiceManager")</code></pre>



<p class="wp-block-paragraph"><code>restart_deployment</code> is a dedicated method in <code>oggrestapi.py</code>, following the same pattern already used for <code>restart_service</code>, <code>restart_extract</code> and <code>restart_replicat</code>. It makes it easier to use the API, instead of building the <code>{"status": "restart"}</code> payload yourself. It also takes an optional <code>only_if_running</code> argument, so a deployment that was already stopped before the patch is left alone rather than being started by the restart call.</p>



<p class="wp-block-paragraph">As with the web UI, all your deployment processes are still running on the old <code>OGG_HOME</code> at this point. The <code>AIService</code>, introduced in 26ai, does not pick up the new home automatically either. You should then <strong>list the services</strong> attached to the Service Manager and <strong>restart the ones that are not <code>ServiceManager</code> itself</strong>:</p>



<pre class="wp-block-code"><code>services = requests.get(
    f"{sm_url}/services/v2/deployments/ServiceManager/services",
    auth=auth,
).json()&#091;"response"]&#091;"items"]

for service in services:
    if service&#091;"name"] != "ServiceManager":
        requests.patch(
            f"{sm_url}/services/v2/deployments/ServiceManager/services/{service&#091;'name']}",
            json={"status": "restart"},
            auth=auth,
        )</code></pre>



<pre class="wp-block-code"><code>for service in client.list_services("ServiceManager"):
    if service.get("name") != "ServiceManager":
        client.restart_service(deployment="ServiceManager", service=service.get("name"))</code></pre>



<h2 id="patching-each-deployment-with-the-rest-api" class="wp-block-heading">Patching each deployment with the REST API</h2>



<p class="wp-block-paragraph">Once the Service Manager runs on the new home, repeat the same <strong>update, then restart</strong> sequence for each deployment (<code>oggHome</code>, then <code>status: restart</code>):</p>



<pre class="wp-block-code"><code>deployment = "ogg_test_01"

requests.patch(
    f"{sm_url}/services/v2/deployments/{deployment}",
    json={"oggHome": "/u01/app/ogg/product/23.26.2.0.1"},
    auth=auth,
)

requests.patch(
    f"{sm_url}/services/v2/deployments/{deployment}",
    json={"status": "restart"},
    auth=auth,
)</code></pre>



<pre class="wp-block-code"><code>client.update_deployment(deployment="ogg_test_01", ogg_home="/u01/app/ogg/product/23.26.2.0.1")
client.restart_deployment(deployment="ogg_test_01")</code></pre>



<p class="wp-block-paragraph">Once the deployment is back up, restart its extracts and replicats. Since these processes are not accessible through the Service Manager port, you need to change the URL. If you use a reverse proxy setup, or <code>auto_discovery=True</code> (see below), this is also easier with the Python client.</p>



<pre class="wp-block-code"><code>admin_url = "https://vmogg:7810"

extracts = requests.get(f"{admin_url}/services/v2/extracts", auth=auth).json()&#091;"response"]&#091;"items"]
for extract in extracts:
    requests.patch(f"{admin_url}/services/v2/extracts/{extract&#091;'name']}", json={"status": "stopped"}, auth=auth)
    requests.patch(f"{admin_url}/services/v2/extracts/{extract&#091;'name']}", json={"status": "running"}, auth=auth)

replicats = requests.get(f"{admin_url}/services/v2/replicats", auth=auth).json()&#091;"response"]&#091;"items"]
for replicat in replicats:
    requests.patch(f"{admin_url}/services/v2/replicats/{replicat&#091;'name']}", json={"status": "stopped"}, auth=auth)
    requests.patch(f"{admin_url}/services/v2/replicats/{replicat&#091;'name']}", json={"status": "running"}, auth=auth)</code></pre>



<p class="wp-block-paragraph">With <code>oggrestapi.py</code>, <code>restart_all_extracts</code> and <code>restart_all_replicats</code> do the same thing on an <code>OGGRestAPI</code> client already pointed at the deployment (either connected directly to its Administration Service, or through an NGINX reverse proxy with <code>deployment=</code> set):</p>



<pre class="wp-block-code"><code>admin_client = OGGRestAPI(url="https://vmogg:7810", username="oggadmin", password="password")
admin_client.restart_all_extracts(only_if_running=True)
admin_client.restart_all_replicats(only_if_running=True)</code></pre>



<h2 id="automating-the-whole-patching-in-one-call" class="wp-block-heading">Automating the whole patching in one call</h2>



<p class="wp-block-paragraph">The steps listed above (update home, restart deployment, restart processes for every deployment) is exactly what <code>patch_deployment</code> (a single deployment) and <code>patch_deployments</code> (all of them) already do in <code>oggrestapi.py</code>, internally calling <code>restart_deployment</code> for the restart step. They also handle the <code>ServiceManager</code> special case (patch and restart the deployment and its services, but never restart extracts and replicats on it) and the <code>wait_until_deployment_status</code> polling in between:</p>



<pre class="wp-block-code"><code>client = OGGRestAPI(url="https://vmogg:7809", username="oggadmin", password="password", reverse_proxy=True)
client.patch_deployments(new_home="/u01/app/ogg/product/23.26.2.0.1", ask_credentials=False)</code></pre>



<p class="wp-block-paragraph">Both methods take <code>restart_after_patch</code> and <code>restart_processes_after_patch</code> (both default to <code>True</code>) if you need to skip either step, for example to patch every home first and restart everything in a separate maintenance window:</p>



<pre class="wp-block-code"><code>client.patch_deployments(
    new_home="/u01/app/ogg/product/23.26.2.0.1",
    restart_after_patch=False,
    restart_processes_after_patch=False,
    ask_credentials=False,
)</code></pre>



<p class="wp-block-paragraph"><code>restart_processes_after_patch=True</code> needs per-deployment routing: restarting extracts and replicats on <code>ogg_test_01</code> is a different call than on <code>ogg_test_02</code>, and a plain connection to the Service Manager’s own port has no way to reach either one. <code>oggrestapi.py</code> gives you two ways to get that routing from a single client:</p>



<ul class="wp-block-list">
<li><code>reverse_proxy=True</code>, shown above, if you already run NGINX in front of your deployments.</li>



<li><code>auto_discovery=True</code>, with no reverse proxy at all. The client looks up each deployment’s real Administration/Distribution/Performance Metrics Service port through the Service Manager itself (the same <code>GET .../deployments/{deployment}/services/{service}</code> call), the first time each one is actually needed, and reuses that lookup for the rest of the run:</li>
</ul>



<pre class="wp-block-code"><code>client = OGGRestAPI(url="https://vmogg:7809", username="oggadmin", password="password", auto_discovery=True)
client.patch_deployments(new_home="/u01/app/ogg/product/23.26.2.0.1", ask_credentials=False)</code></pre>



<p class="wp-block-paragraph">Without either flag, patch with <code>restart_processes_after_patch=False</code> and restart each deployment’s processes yourself through a separate client pointed at that deployment’s own admin URL.</p>



<h2 id="some-services-are-still-running-on-the-old-ogg_home" class="wp-block-heading">Some services are still running on the old <code>OGG_HOME</code></h2>



<p class="wp-block-paragraph">Same as with the web UI: a <code>restart</code> call on a deployment returns as soon as the Administration Service (<code>adminsrvr</code>) is back up. The Receiver Service (<code>recvsrvr</code>) or the Distribution Service (<code>distsrvr</code>) can take a bit longer to restart. If, after polling for a few minutes, a service is still reporting the old home, restart it individually with the same <code>PATCH .../services/{service}</code> call shown above for the <code>AIService</code>, or with the <code>restart_service</code> method.</p>



<h2 id="other-things-to-consider" class="wp-block-heading">Other things to consider</h2>



<p class="wp-block-paragraph">If you change the name of your home at every release, remember to update <code>OGG_HOME</code> in every script and environment that references it, for example:</p>



<ul class="wp-block-list">
<li>DMK environment files.</li>



<li><code>systemd</code> service files, which might hardcode the <code>OGG_HOME</code> variable.</li>
</ul>
<p>L’article <a href="https://www.dbi-services.com/blog/goldengate-26ai-out-of-place-patching-with-python/">GoldenGate 26ai out-of-place patching with Python</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.dbi-services.com/blog/goldengate-26ai-out-of-place-patching-with-python/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<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>



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

ogg_client = OGGRestAPI(
    url="https://vmogg:7809",
    username="ogg",
)

active_transactions = ogg_client.get_active_transactions('OracleGoldenGate.source_cdb')

&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">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>



<pre class="wp-block-code"><code>db2cli execsql -db &lt;database_alias&gt; -user &lt;username&gt; -passwd &lt;password&gt; \
  -inputsql /home/oracle/input.sql</code></pre>



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



<pre class="wp-block-code"><code>select 1 from sysibm.sysdummy1;</code></pre>



<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>



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



<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>



<pre class="wp-block-code"><code>FetchAll: Columns: 1
1
1
FetchAll: 1 rows fetched.</code></pre>



<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>



<pre class="wp-block-code"><code>/opt/ibm/db2_odbc_cli_11_1/clidriver/license/db2consv_zs.lic</code></pre>



<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 <code>7.0.11</code></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 <code>7.0.11</code> 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 <code>7.0.11</code>+ 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>
	</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-09-06 20:21:06 by W3 Total Cache
-->