<?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>dbi Blog</title>
	<atom:link href="https://www.dbi-services.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.dbi-services.com/blog/</link>
	<description></description>
	<lastBuildDate>Tue, 03 Nov 2026 17:24:25 +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>dbi Blog</title>
	<link>https://www.dbi-services.com/blog/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Oracle Base Database Cloud@Customer</title>
		<link>https://www.dbi-services.com/blog/oracle-base-database-cloudcustomer/</link>
					<comments>https://www.dbi-services.com/blog/oracle-base-database-cloudcustomer/#respond</comments>
		
		<dc:creator><![CDATA[Jérôme Dubar]]></dc:creator>
		<pubDate>Tue, 03 Nov 2026 17:24:23 +0000</pubDate>
				<category><![CDATA[ExaCC]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Base Database CC]]></category>
		<category><![CDATA[base database cloud@customer]]></category>
		<category><![CDATA[low cost Exadata]]></category>
		<category><![CDATA[low cost Exadata cloud@customer]]></category>
		<category><![CDATA[ODA CC]]></category>
		<category><![CDATA[oda cloud at customer]]></category>
		<category><![CDATA[oda cloud@customer]]></category>
		<category><![CDATA[oracle database appliance]]></category>
		<category><![CDATA[X11-HA]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=48320</guid>

					<description><![CDATA[<p>Base Database Cloud@Customer: is it an ODA Cloud@Customer?</p>
<p>L’article <a href="https://www.dbi-services.com/blog/oracle-base-database-cloudcustomer/">Oracle Base Database Cloud@Customer</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 id="h-introduction" class="wp-block-heading">Introduction</h2>



<p class="wp-block-paragraph">Do you prefer on-premises or public clouds for your database infrastructure? Or is your company in transit between both? Who really knows what&#8217;s the best solution? Is it a mix? With security and sovereignty being hot topics today, decisions are even more difficult to take.</p>



<p class="wp-block-paragraph">For its database, Oracle has multiple offers. On-premises for sure (mostly Oracle Database Appliance and Exadata), public cloud for sure (Oracle Cloud Infrastructure or Oracle Database Service in the other main cloud providers). There is also an intermediate solution since several years now: Exadata Cloud@Customer. This is basically an Exadata delivered in your datacenter and paid as a subscription, with hardware managed by Oracle.</p>



<p class="wp-block-paragraph">The problem of this solution is that Exadata platform is too expensive for most of us. Something less ambitious was required for answering most of Oracle database needs. This is why a new offering has been recently presented by Oracle: Oracle Base Database Cloud@Customer. Here are my initial thoughts about this new offering.</p>



<h2 id="h-key-points-of-this-new-offer" class="wp-block-heading">Key points of this new offer</h2>



<p class="wp-block-paragraph">Key points are quite similar to Exadata Cloud@Customer, with some differences:</p>



<ul class="wp-block-list">
<li>Oracle provides the pieces of hardware: you don&#8217;t buy them</li>



<li>Oracle manages hardware and the underlying software (firmware, BIOS, hypervisor OS)</li>



<li>OCI console (web based) is used to provision your servers (VM clusters) and your databases</li>



<li>It can run Enterprise Edition (EE) databases like Exadata Cloud@Customer, but also Standard Edition 2 (SE2) databases</li>



<li>You pay a fixed monthly price for hardware plus average CPU usage</li>



<li>Unlike Exadata Cloud@Customer, you may also create application VMs with CPUs not used for databases</li>



<li>CPU cost for application VMs is lower than CPU cost for databases</li>



<li>You can Bring Your Own Oracle Database Licenses (BYOL) or pay them by usage (billed with the subscription)</li>



<li>You can configure High-Availability with Real Application Cluster</li>



<li>You can automate the lifecycle of your environment using APIs (ansible, DevOps, &#8230;)</li>



<li>Root access to the database VMs is allowed, meaning that you can setup additional components</li>



<li>You can configure a Disaster Recovery with a Data Guard configuration starting from 2x Oracle Base Database Cloud@Customer</li>
</ul>



<h2 id="h-technical-specs" class="wp-block-heading">Technical specs</h2>



<p class="wp-block-paragraph">Now, let&#8217;s have a deeper look at the technical specifications.</p>



<p class="wp-block-paragraph">This solution is composed of 3 components:</p>



<ul class="wp-block-list">
<li>2 identical servers with each 2x 32-core AMD Epyc processors and 768GB RAM (2x 2U)</li>



<li>1 storage shelf (SAS) with 6, 12, 18 or 24 SSD disks of 7.68TB (1x 4U)</li>
</ul>



<p class="wp-block-paragraph">The servers runs on Oracle Linux and KVM.</p>



<p class="wp-block-paragraph">On top of this system, you will provision VMs within these limits:</p>



<ul class="wp-block-list">
<li>120 usable cores (60 usable cores on each node)</li>



<li>1320GB of RAM (660GB on each node)</li>



<li>11.6, 23.4, 35.3 or 47.2TB of usable storage depending on your configuration</li>
</ul>



<p class="wp-block-paragraph">A 2-core VM will be initially configured by Oracle for OCI remote access on each server. This VM is called the Control Plane Proxy Service (CPS). A physical 2-port Ethernet interface on each node is associated to this VM for physical isolation.</p>



<h2 id="h-embedded-licenses-model" class="wp-block-heading">Embedded licenses model</h2>



<p class="wp-block-paragraph">You can keep your existing licenses for running your database workload on this platform (BYOL), or you can choose to go for embedded licenses.</p>



<p class="wp-block-paragraph">If you choose embedded licenses, you will have 4 possibilities when you create an Oracle database VM:</p>



<ul class="wp-block-list">
<li>Standard Edition: basically the same features as SE2 + Transparent Database Encryption</li>



<li>Enterprise Edition: classic EE features + Real Application Testing + Diagnostic and Tuning Pack</li>



<li>Enterprise Edition High Performance : same as previous one + Partitioning + Advanced Compression + Database Vault + Multitenant</li>



<li>Enterprise Edition Extreme Performance : same as previous one + Active Data Guard + RAC + In Memory</li>
</ul>



<p class="wp-block-paragraph">High Performance and Extreme Performance don&#8217;t really bring more performance, but they pack more options. Note than you cannot add a single option. For example, if you need more than 3 PDBs on your container database, you must go for Enterprise Edition High Performance for the Multitenant option.</p>



<p class="wp-block-paragraph">With the embedded licenses, you can optimize the cost of your licenses:</p>



<ul class="wp-block-list">
<li>Mix various editions on your Base Database Cloud@Customer, according to your needs</li>



<li>License cost nothing when the VM is down</li>



<li>You can increase the number of CPUs for some VMs during specific timeframes in the year</li>
</ul>



<p class="wp-block-paragraph">Would it be a better choice to keep your existing licenses? I would answer with another question: if you don&#8217;t own the servers, why would you keep your license ownership?</p>



<h2 id="h-is-it-an-oda-cloud-customer" class="wp-block-heading">Is it an ODA Cloud@Customer?</h2>



<p class="wp-block-paragraph">Oracle Database Appliance (ODA) is a cheaper solution compared to Exadata. But until now, it didn&#8217;t exist as a Cloud@Customer solution. Is Base Database Cloud@Customer a kind of ODA Cloud@Customer?</p>



<p class="wp-block-paragraph">Yes, and no.</p>



<p class="wp-block-paragraph">Yes because technically, this solution is based on an ODA X11-HA with slightly more RAM (768GB on each node) with a single storage shelf (SSD-only &#8211; high performance version). This shelf is populated with 6, 12, 18 or 24 SSDs according to your needs. It will mostly cover the same features as the HA ODA, creating DB Systems with 19c and/or 26ai databases, running SE2 or EE databases, creating application VMs&#8230;</p>



<p class="wp-block-paragraph">No because Oracle didn&#8217;t choose ODA Cloud@Customer naming for obvious reasons. First, odacli commands don&#8217;t exist for managing your environment. Since 2016, odacli is the central CLI used for managing mostly bare-metal ODAs. Second reason is that you won&#8217;t be able to configure bare metal databases on this new solution: you can&#8217;t connect to the OS of the nodes. These nodes are under Oracle responsibility. Last reason for not calling it an ODA: it&#8217;s a service based on classic servers. ODA is also based on classic Oracle servers, with no dedicated technologies for databases.</p>



<h2 id="h-what-is-the-benefit-compared-to-oda" class="wp-block-heading">What is the benefit compared to ODA?</h2>



<p class="wp-block-paragraph">ODA became expensive, especially this year. Base price is 37&#8217;655$ for the small one, according to the latest price list from June. RAM and disk price hikes made some of our customers not able to afford an ODA infrastructure anymore. Renewing a database infrastructure without buying servers may help.</p>



<p class="wp-block-paragraph">Another trend is less complexity. Some experienced Oracle DBAs are gently approaching retirement, some others have much more database technologies to handle and they cannot be Oracle experts anymore. Less complexity regarding Oracle database is welcomed, and managing database lifecycle through OCI console is rather easy.</p>



<p class="wp-block-paragraph">If buying servers doesn&#8217;t make any sense for your company, and if you don&#8217;t have enough skills to deploy, patch and manage an ODA, this new solution should be considered.</p>



<h2 id="h-how-it-compares-to-exadata-cloud-customer" class="wp-block-heading">How it compares to Exadata Cloud@Customer?</h2>



<p class="wp-block-paragraph">What makes Exadata so different than any other solution is the smart storage. Instead of having direct-attached disks or a SAN with its own intelligence, Exadata has several dedicated servers with disks, flash cards and database intelligence. These servers are called the storage cells. These cells will process some SQL statements and do the filtering before sending the blocks to the compute nodes. This is what&#8217;s called cell offloading. An old legend tells that you don&#8217;t need indexes for a database running on Exadata&#8230; For sure, with some optimizations you can probably expect the highest performance on the market.</p>



<p class="wp-block-paragraph">Base Exadata is much more complex than ODA as it includes 2 computes nodes, 3 storage cells and 2 RoCE fabrics (basically 40Gbps switches for high-speed connection between the compute nodes and the cells). And you can scale up for more compute nodes (maximum of 8) and more storage cells (maximum of 12): you cannot do that on an ODA.</p>



<p class="wp-block-paragraph">You can replace Exadata with Exadata Cloud@Customer and ODA with Base Database Cloud@Customer in these previous sentences.</p>



<p class="wp-block-paragraph">Some features won&#8217;t be available on Base Database Cloud@Customer like Autonomous database.</p>



<p class="wp-block-paragraph">On the other hand, Exadata Cloud@Customer cannot run SE2 databases and application VMs.</p>



<p class="wp-block-paragraph">A colleague of mine told me that unlike Exadata Cloud@Customer, Base Database Cloud@Customer won&#8217;t come with a complete rack: setup will be done in an existing rack.</p>



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



<p class="wp-block-paragraph">Pricing is publicly available here: <a href="https://www.oracle.com/database/base-database-service/pricing/">https://www.oracle.com/database/base-database-service/pricing/</a></p>



<p class="wp-block-paragraph">Like an Exadata Cloud@Customer, you won&#8217;t buy this machine. But you will pay $8,000 once for the initial setup.</p>



<p class="wp-block-paragraph">This system has a base configuration with 6 disks, and you can buy (lease) up to 3 storage expansions of 6 disks. Each storage expansion costs $1,900.00 each month.</p>



<p class="wp-block-paragraph">Here is a summary of monthly hardware cost:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td>Configuration  </td><td><span style="font-family: -webkit-standard;white-space: normal">Price per month</span></td></tr><tr><td>6-disk configuration</td><td>$8,121.00</td></tr><tr><td>12-disk configuration</td><td>$10,021.00</td></tr><tr><td>18-disk configuration</td><td>$11,921.00</td></tr><tr><td>24-disk configuration</td><td>$13,821.00</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">You&#8217;ll need to add usage cost, based on ECPU per hour. On this platform, ECPU equals to 1/4 of a core. You can Bring Your Own License, or pay the license by usage:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td>License type</td><td>Metric</td><td>Price per hour</td></tr><tr><td>BYOL</td><td>ECPU</td><td>$0.0484</td></tr><tr><td>Emb. SE</td><td>ECPU</td><td>$0.0538</td></tr><tr><td>Emb. EE</td><td>ECPU</td><td>$0.1075</td></tr><tr><td>Emb. EE High Perf</td><td>ECPU</td><td>$0.2218</td></tr><tr><td>Emb. EE Extreme Perf</td><td>ECPU</td><td>$0.336</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Example: if you need a Base Database Cloud@Customer with 12 disks and an average of 32 ECPUs with embedded EE licenses, the overall cost for one year is:<br>10,021 * 12 + 32 * 0.1075 * 24 * 365 = $150&#8217;386 without the initial setup cost.</p>



<p class="wp-block-paragraph">Note that you should consider 2 machines because you probably need a Disaster Recovery setup. I would recommend 2 identical machines.</p>



<h2 id="h-advantages-and-limits-of-this-solution" class="wp-block-heading">Advantages and limits of this solution</h2>



<p class="wp-block-paragraph">These are the advantages I see:</p>



<ul class="wp-block-list">
<li>you don&#8217;t buy the servers, they belong to Oracle and you just pay for using them: this is better for a lot of companies</li>



<li>you will benefit from TDE, Transparent Database Encryption: TDE is normally an option on top of Enterprise Edition only</li>



<li>you won&#8217;t manage the servers yourself: you will only manage the VMs and the databases more easily</li>



<li>opting for embedded licenses brings flexibility: increase the CPU when you need to, stop your test and development databases when they are not in use&#8230;</li>
</ul>



<p class="wp-block-paragraph">On the other hand, these are the limits I see:</p>



<ul class="wp-block-list">
<li>the cost is still too expensive for those running a small number of databases on small ODAs like X11-S and X11-L</li>



<li>the limit of 32 ECPUs for Standard Edition VM (8 cores): this limit does not exist on ODA X11 series</li>



<li>the storage, 44TB being not that big</li>



<li>database version: don&#8217;t expect to deploy database versions older than 1-year old</li>



<li>choosing embedded licenses means stopping paying Oracle support for your perpetual licenses: you&#8217;ll need to buy them again later if you want to go back to on-premises or IaaS solutions</li>
</ul>



<h2 id="h-is-this-the-best-solution-for-your-needs" class="wp-block-heading">Is this the best solution for your needs?</h2>



<p class="wp-block-paragraph">For now, this solution is new and no one at dbi services gets his hands on it. It could come in the coming weeks or months.</p>



<p class="wp-block-paragraph">To find out if this solution could fit your needs, you must have a deep knowledge of your current infrastructure and an overview on your future needs. I strongly advise starting with a complete infrastructure review. Correct sizing for whatever solution you may consider has to be done with accuracy. Especially for Cloud or Hybrid Cloud solutions that requires surgical precision!</p>



<p class="wp-block-paragraph">If you cannot do this kind of work yourself, this is something we&#8217;re used to do at dbi services since many years.</p>



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



<p class="wp-block-paragraph">This new offering brings new possibilities for those who prefer the subscription model (OPEX) without going to the public cloud. But it has some limits. Main limit is that it&#8217;s not affordable enough for companies used to lower cost solutions like ODA X11-S and ODA X11-L. But this is definitely an in-between: you want a modern platform without the cost of Exadata Cloud@Customer? That might be Base Database Cloud@Customer. My thought is that performance could be quite similar to Exadata Cloud@Customer for most databases.</p>
<p>L’article <a href="https://www.dbi-services.com/blog/oracle-base-database-cloudcustomer/">Oracle Base Database Cloud@Customer</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/oracle-base-database-cloudcustomer/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>The real OPEX cost of the wrong open source choice</title>
		<link>https://www.dbi-services.com/blog/the-real-opex-cost-of-the-wrong-open-source-choice/</link>
					<comments>https://www.dbi-services.com/blog/the-real-opex-cost-of-the-wrong-open-source-choice/#respond</comments>
		
		<dc:creator><![CDATA[Hervé Schweitzer]]></dc:creator>
		<pubDate>Tue, 03 Nov 2026 15:26:08 +0000</pubDate>
				<category><![CDATA[Non classifié(e)]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=48309</guid>

					<description><![CDATA[<p>Free to download, expensive to run Open source is not free! The licence is, but the hours your team spends making it work are not. At dbi services we love open source. We run PostgreSQL, Kafka and Kubernetes for many customers and we contribute where we can. But over the last years I see the [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/the-real-opex-cost-of-the-wrong-open-source-choice/">The real OPEX cost of the wrong open source choice</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 id="h-free-to-download-expensive-to-run" class="wp-block-heading">Free to download, expensive to run</h2>



<p class="wp-block-paragraph">Open source is not free! The licence is, but the hours your team spends making it work are not.</p>



<p class="wp-block-paragraph">At dbi services we love open source. We run PostgreSQL, Kafka and Kubernetes for many customers and we contribute where we can. But over the last years I see the same story again and again: a company picks an open source tool because there is no licence to pay, and then spends months building, tuning and debugging something that was never designed for their use case.</p>



<p class="wp-block-paragraph">On the budget slide it looks great. No CAPEX. But nobody puts the OPEX on that slide, and that is where the real bill is!</p>



<h2 id="h-a-typical-case-debezium-between-two-database-engines" class="wp-block-heading">A typical case: Debezium between two database engines</h2>



<p class="wp-block-paragraph">The requirement sounds simple. Replicate data from Oracle to PostgreSQL, or from SQL Server to something else, with low latency.</p>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="735" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/11/Screenshot-2026-11-03-at-16.21.34-1024x735.png" alt="" class="wp-image-48317" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/11/Screenshot-2026-11-03-at-16.21.34-1024x735.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/11/Screenshot-2026-11-03-at-16.21.34-300x215.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/11/Screenshot-2026-11-03-at-16.21.34-767x551.png 767w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/11/Screenshot-2026-11-03-at-16.21.34.png 1404w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Someone finds Debezium. It is a great project for change data capture into Kafka. So the team starts, and quickly the architecture looks like this:</p>



<ul class="wp-block-list">
<li>1. Debezium with a source connector reading the redo logs or the transaction log</li>



<li>2. A Kafka cluster, plus Kafka Connect</li>



<li>3. A schema registry, because the data types have to survive the trip</li>



<li>4. A sink connector, often with custom code, to write into the target engine</li>



<li>Monitoring for all of the above</li>
</ul>



<p class="wp-block-paragraph">For a use case that is &#8220;copy these tables from A to B&#8221;, that is five new components to install, secure, patch and understand. And then the real fun starts: data type mapping between engines, DDL changes on the source, LOB columns, initial loads of big tables, connector restarts that replay or lose events. Every one of these is solvable. Every one of these costs days.</p>



<h2 id="h-where-the-money-really-goes" class="wp-block-heading">Where the money really goes</h2>



<p class="wp-block-paragraph">The cost is not in one big invoice. It is spread over many small things that nobody adds up.</p>



<ul class="wp-block-list">
<li><strong>Build time.</strong> Weeks or months of senior engineers wiring components together instead of delivering business value.</li>



<li><strong>Troubleshooting.</strong> When replication lags at 2am, who knows Kafka Connect internals well enough to fix it? Usually one person.</li>



<li><strong>Knowledge silo.</strong> That one person becomes the system. When they go on holiday or leave the company, you have a production pipeline nobody understands.</li>



<li><strong>Upgrades.</strong> Five components means five release cycles, five sets of breaking changes, five compatibility matrices to check.</li>



<li><strong>Support.</strong> Community forums are great, but they do not have an SLA. Commercial support for the stack exists, and then it is not free anymore either.</li>



<li><strong>Hidden cost.</strong> Every hour spent on plumbing is an hour not spent on the project the replication was supposed to enable..</li>
</ul>



<h2 id="h-let-s-do-the-maths-over-three-years" class="wp-block-heading">Let&#8217;s do the maths over three years</h2>



<p class="wp-block-paragraph">Over three years, the &#8220;free&#8221; option can easily cost more than the tool with a licence. Here is a simple example, with an internal cost of CHF 1&#8217;000 per engineer day. The numbers are illustrative, but they are close to what we see in real projects.</p>



<figure class="wp-block-table"><table><thead><tr><th>Cost item</th><th>Open source stack (CHF)</th><th>Commercial replication tool (CHF)</th></tr></thead><tbody><tr><td>Licence, 3 years</td><td>0</td><td>75&#8217;000</td></tr><tr><td>Build and initial setup</td><td>40&#8217;000</td><td>5&#8217;000</td></tr><tr><td>Troubleshooting, 2 days/month vs 3 days/year</td><td>72&#8217;000</td><td>9&#8217;000</td></tr><tr><td>Upgrades and compatibility, 10 vs 2 days/year</td><td>30&#8217;000</td><td>6&#8217;000</td></tr><tr><td><strong>Total over 3 years</strong></td><td><strong>142&#8217;000</strong></td><td><strong>95&#8217;000</strong></td></tr></tbody></table></figure>



<p class="wp-block-paragraph">And this table does not even include the risk of the key person leaving!</p>



<h2 id="h-this-is-not-an-anti-open-source-post" class="wp-block-heading">This is not an anti open source post</h2>



<p class="wp-block-paragraph">The problem is not open source. The problem is choosing a tool for the wrong reason.</p>



<p class="wp-block-paragraph">Debezium is the right choice when you already run Kafka, you have people who know it, and you need events flowing to many consumers. It is also the right choice when the goal is not just syncing two databases, but turning raw data changes into meaningful business events (order placed, inventory updated, customer status changed, invoice issued) that multiple downstream systems can react to independently. In that context it is excellent. It is the wrong choice when the only need is to keep two databases in sync and nobody in the team has ever operated Kafka.</p>



<p class="wp-block-paragraph">The same applies to many other tools. The question is never &#8220;open source or not&#8221;. The question is &#8220;what will this cost us to run, every day, for the next three years?&#8221;</p>
<p>L’article <a href="https://www.dbi-services.com/blog/the-real-opex-cost-of-the-wrong-open-source-choice/">The real OPEX cost of the wrong open source choice</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/the-real-opex-cost-of-the-wrong-open-source-choice/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>GoldenGate captures TRUNCATE on a global temporary table and the replicat abends</title>
		<link>https://www.dbi-services.com/blog/goldengate-captures-truncate-on-a-global-temporary-table-and-the-replicat-abends/</link>
					<comments>https://www.dbi-services.com/blog/goldengate-captures-truncate-on-a-global-temporary-table-and-the-replicat-abends/#respond</comments>
		
		<dc:creator><![CDATA[Julien Delattre]]></dc:creator>
		<pubDate>Mon, 02 Nov 2026 07:38:00 +0000</pubDate>
				<category><![CDATA[GoldenGate]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[26]]></category>
		<category><![CDATA[ddl]]></category>
		<category><![CDATA[extract]]></category>
		<category><![CDATA[ogg]]></category>
		<category><![CDATA[replicat]]></category>
		<category><![CDATA[Troubleshooting]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=48139</guid>

					<description><![CDATA[<p>In an extract report, I noticed that the CREATE and DROP of a global temporary table were excluded (OGG-10473), while the TRUNCATE of the same table was included (OGG-00487). If the extract writes the TRUNCATE to the trail but not the CREATE, the replicat will try to apply it on a target where the table [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/goldengate-captures-truncate-on-a-global-temporary-table-and-the-replicat-abends/">GoldenGate captures TRUNCATE on a global temporary table and the replicat abends</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 an extract report, I noticed that the <code class="nowrap">CREATE</code> and <code class="nowrap">DROP</code> of a global temporary table were excluded (<code class="nowrap"><a class="ogg-code-link" href="https://juliendelattre.com/tools/goldengate-error-code-explorer/OGG-10473/" target="_blank" rel="noopener noreferrer">OGG-10473</a></code>), while the <code class="nowrap">TRUNCATE</code> of the same table was included (<code class="nowrap"><a class="ogg-code-link" href="https://juliendelattre.com/tools/goldengate-error-code-explorer/OGG-00487/" target="_blank" rel="noopener noreferrer">OGG-00487</a></code>). If the extract writes the <code class="nowrap">TRUNCATE</code> to the trail but not the <code class="nowrap">CREATE</code>, the replicat will try to apply it on a target where the table does not exist. <strong>The replicat abends with <code class="nowrap">ORA-00942</code></strong>. Oracle support confirmed that <strong>this is the designed behavior for temporary tables</strong>, so the <code class="nowrap">TRUNCATE</code> has to be excluded or its error discarded in the replicat parameters. This post shows the failure, the affected DDL statements and ways to keep the replicat running.</p>



<h2 id="why-global-temporary-table-ddl-is-excluded" class="wp-block-heading">Why global temporary table DDL is excluded</h2>



<p class="wp-block-paragraph">The data of a global temporary table is private to each session and is not replicated. The extract therefore skips the DDL that creates and drops it, and the table does not exist on the target. However, <code class="nowrap">TRUNCATE</code> operations are captured by GoldenGate.</p>



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



<ul class="wp-block-list">
<li>GoldenGate <code class="nowrap">23.26.4.0.0</code> Microservices Architecture, deployment <code class="nowrap">ogg_test_01</code>.</li>



<li>Source: <code class="nowrap">CDB01</code>/<code class="nowrap">PDB1</code>, Oracle 19c. Target: <code class="nowrap">CDB02</code>/<code class="nowrap">PDB2</code>, Oracle 19c.</li>



<li>A <code class="nowrap">GTTTEST</code> schema exists in both PDBs.</li>



<li>Integrated extract <code class="nowrap">EGTT</code> connects to <code class="nowrap">PDB1</code> directly (PDB-level capture), with <code>DDL INCLUDE ALL</code>.</li>



<li>Integrated replicat <code class="nowrap">RGTT</code> applies to <code class="nowrap">PDB2</code>, with <code>DDL INCLUDE ALL</code>.</li>
</ul>



<p class="wp-block-paragraph">The parameter file of the extract:</p>



<pre class="wp-block-code"><code>EXTRACT EGTT
EXTTRAIL gt
USERIDALIAS source_pdb1 DOMAIN OracleGoldenGate
DDL INCLUDE ALL
DDLOPTIONS REPORT
TABLE GTTTEST.*;</code></pre>



<p class="wp-block-paragraph">The parameter file of the replicat:</p>



<pre class="wp-block-code"><code>REPLICAT RGTT
USERIDALIAS oggadmin_pdb2 DOMAIN OracleGoldenGate
DDL INCLUDE ALL
DDLOPTIONS REPORT
MAP GTTTEST.*, TARGET GTTTEST.*;</code></pre>



<p class="wp-block-paragraph">The extract is registered with <code>REGISTER EXTRACT EGTT DATABASE</code>, and the replicat uses the checkpoint table <code class="nowrap">OGGADMIN.CHECKPOINT</code>.</p>



<h2 id="workload-on-the-source" class="wp-block-heading">Workload on the source</h2>



<p class="wp-block-paragraph">The three statements run as <code class="nowrap">GTTTEST</code> on <code class="nowrap">PDB1</code>:</p>



<pre class="wp-block-code"><code>SQL&gt; CREATE GLOBAL TEMPORARY TABLE temp_test (c number) ON COMMIT PRESERVE ROWS;

Table created.

SQL&gt; TRUNCATE TABLE temp_test;

Table truncated.

SQL&gt; DROP TABLE temp_test PURGE;

Table dropped.</code></pre>



<h2 id="what-the-extract-does" class="wp-block-heading">What the extract does</h2>



<p class="wp-block-paragraph">The extract report shows the three DDL statements:</p>



<ul class="wp-block-list">
<li><code class="nowrap">CREATE</code> and <code class="nowrap">DROP</code> are excluded.</li>



<li><code class="nowrap">TRUNCATE</code> is included.</li>
</ul>



<pre class="wp-block-code"><code>2026-10-24 07:26:05  INFO    OGG-01487  DDL found, operation &#091;CREATE GLOBAL TEMPORARY TABLE temp_test (c number) ON COMMIT PRESERVE ROWS (size 74)], ... ].
2026-10-24 07:26:05  INFO    OGG-10473  DDL on global temporary table excluded, optype &#091;CREATE], objtype &#091;TABLE], objowner "GTTTEST", objname "TEMP_TEST".
2026-10-24 07:26:05  INFO    OGG-01487  DDL found, operation &#091;TRUNCATE TABLE temp_test (size 24)], ... ].
2026-10-24 07:26:05  INFO    OGG-00487  DDL operation included &#091;INCLUDE ALL], optype &#091;TRUNCATE], objtype &#091;TABLE], objowner "GTTTEST", objname "TEMP_TEST".
2026-10-24 07:26:05  INFO    OGG-01487  DDL found, operation &#091;DROP TABLE temp_test PURGE (size 26)], ... ].
2026-10-24 07:26:05  INFO    OGG-10473  DDL on global temporary table excluded, optype &#091;DROP], objtype &#091;TABLE], objowner "GTTTEST", objname "TEMP_TEST".</code></pre>



<p class="wp-block-paragraph">Only the <code class="nowrap">TRUNCATE</code> reaches the trail.</p>



<h2 id="what-the-replicat-does" class="wp-block-heading">What the replicat does</h2>



<p class="wp-block-paragraph">The replicat maps the <code class="nowrap">TRUNCATE</code> to <code class="nowrap">GTTTEST.TEMP_TEST</code> and executes it on <code class="nowrap">PDB2</code>. The table does not exist there, and the replicat abends:</p>



<pre class="wp-block-code"><code>2026-10-24 07:26:08  INFO    OGG-00482  DDL found, operation &#091;TRUNCATE TABLE temp_test (size 24)].
2026-10-24 07:26:08  INFO    OGG-00489  DDL is of mapped scope, after mapping new operation &#091;TRUNCATE TABLE "GTTTEST"."TEMP_TEST" (size 36)].
2026-10-24 07:26:08  INFO    OGG-00487  DDL operation included &#091;INCLUDE ALL], optype &#091;TRUNCATE], objtype &#091;TABLE], objowner "GTTTEST", objname "TEMP_TEST".
2026-10-24 07:26:08  INFO    OGG-00484  Executing DDL operation.
2026-10-24 07:26:08  ERROR   OGG-00519  Fatal error executing DDL replication: error &#091;Error code &#091;942], ORA-00942: table or view does not exist
2026-10-24 07:26:08  ERROR   OGG-30538  Fatal error executing DDL statement &#091;TRUNCATE TABLE "GTTTEST"."TEMP_TEST"].
2026-10-24 07:26:08  ERROR   OGG-00664  Error 942 on OCI call &#091;ORA] - ORA-00942: table or view does not exist
2026-10-24 07:26:13  ERROR   OGG-01668  PROCESS ABENDING.</code></pre>



<p class="wp-block-paragraph">The status in the <code class="nowrap">adminclient</code>:</p>



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

Program     Status      Group       Type                   Lag at Chkpt       Time Since Chkpt
EXTRACT     RUNNING     EGTT        INTEGRATED                  00:00:03           00:00:04
REPLICAT    ABENDED     RGTT        INTEGRATED                  00:00:04           00:00:13</code></pre>



<h2 id="ddloptions-for-global-temporary-tables" class="wp-block-heading"><code class="nowrap">DDLOPTIONS</code> for global temporary tables</h2>



<p class="wp-block-paragraph">The <a href="https://docs.oracle.com/en/database/goldengate/core/26/reference/ddloptions.html" target="_blank" rel="noopener noreferrer"><code class="nowrap">DDLOPTIONS</code> documentation</a> describes two options for global temporary tables. By default, GTT DDL is not visible to the extract, which does not match the <code class="nowrap">TRUNCATE</code> captured above.</p>



<ul class="wp-block-list">
<li><code class="nowrap">CAPTUREGLOBALTEMPTABLE</code> (extract): makes GTT DDL visible to the extract. It is filtered like any other DDL and, if it passes, written to the trail.</li>



<li><code class="nowrap">NOAPPLYGLOBALTEMPTABLE</code> (replicat): prevents the replicat from applying GTT DDL. Without it, the replicat applies all GTT DDL from the trail.</li>
</ul>



<p class="wp-block-paragraph">Every case uses the same workload. It has the three GTT statements, then a regular table with one row going through <code class="nowrap">CREATE</code>, <code class="nowrap">TRUNCATE</code> and <code class="nowrap">DROP</code>. Each case starts from a new extract, replicat and trail.</p>



<h3 id="noapplyglobaltemptable-on-the-replicat" class="wp-block-heading"><code class="nowrap">NOAPPLYGLOBALTEMPTABLE</code> on the replicat</h3>



<p class="wp-block-paragraph">The parameter file of the replicat:</p>



<pre class="wp-block-code"><code>REPLICAT RGTT
USERIDALIAS oggadmin_pdb2 DOMAIN OracleGoldenGate
DDL INCLUDE ALL
DDLOPTIONS REPORT, NOAPPLYGLOBALTEMPTABLE
MAP GTTTEST.*, TARGET GTTTEST.*;</code></pre>



<p class="wp-block-paragraph"><strong>The replicat still abends on the <code class="nowrap">TRUNCATE</code></strong>, with the same errors as without the option:</p>



<pre class="wp-block-code"><code>INFO    OGG-00482  DDL found, operation &#091;TRUNCATE TABLE temp_test (size 24)].
ERROR   OGG-00519  Fatal error executing DDL replication: error &#091;Error code &#091;942], ORA-00942: table or view does not exist
ERROR   OGG-01668  PROCESS ABENDING.</code></pre>



<p class="wp-block-paragraph">If the GTT already exists on the target, the replicat does not abend, because the <code class="nowrap">TRUNCATE</code> is applied to that table.</p>



<h3 id="captureglobaltemptable-on-the-extract" class="wp-block-heading"><code class="nowrap">CAPTUREGLOBALTEMPTABLE</code> on the extract</h3>



<p class="wp-block-paragraph">With <code>DDLOPTIONS REPORT, CAPTUREGLOBALTEMPTABLE</code> in the extract, the <code class="nowrap">CREATE</code> and <code class="nowrap">DROP</code> are no longer excluded:</p>



<pre class="wp-block-code"><code>OGG-00487  DDL operation included &#091;INCLUDE ALL], optype &#091;CREATE], objtype &#091;TABLE], objowner "GTTTEST", objname "TEMP_TEST".
OGG-00487  DDL operation included &#091;INCLUDE ALL], optype &#091;TRUNCATE], objtype &#091;TABLE], objowner "GTTTEST", objname "TEMP_TEST".
OGG-00487  DDL operation included &#091;INCLUDE ALL], optype &#091;DROP], objtype &#091;TABLE], objowner "GTTTEST", objname "TEMP_TEST".</code></pre>



<p class="wp-block-paragraph">The replicat creates the table on the target, truncates it and drops it. <strong>It keeps running:</strong></p>



<pre class="wp-block-code"><code>INFO    OGG-00482  DDL found, operation &#091;CREATE GLOBAL TEMPORARY TABLE temp_test (c number) ON COMMIT PRESERVE ROWS (size 74)].
INFO    OGG-00489  DDL is of mapped scope, after mapping new operation &#091;CREATE GLOBAL TEMPORARY TABLE "GTTTEST"."TEMP_TEST" (c number) ON COMMIT PRESERVE ROWS (size 86)].
INFO    OGG-00482  DDL found, operation &#091;TRUNCATE TABLE temp_test (size 24)].
INFO    OGG-00482  DDL found, operation &#091;DROP TABLE temp_test PURGE (size 26)].</code></pre>



<h3 id="both-options-together" class="wp-block-heading">Both options together</h3>



<p class="wp-block-paragraph">With <code class="nowrap">CAPTUREGLOBALTEMPTABLE</code> on the extract and <code class="nowrap">NOAPPLYGLOBALTEMPTABLE</code> on the replicat, the replicat excludes the <code class="nowrap">CREATE</code> and <strong>still executes the <code class="nowrap">TRUNCATE</code></strong>:</p>



<pre class="wp-block-code"><code>INFO    OGG-00482  DDL found, operation &#091;CREATE GLOBAL TEMPORARY TABLE temp_test (c number) ON COMMIT PRESERVE ROWS (size 74)].
INFO    OGG-10473  DDL on global temporary table excluded, optype &#091;CREATE], objtype &#091;TABLE], objowner "GTTTEST", objname "TEMP_TEST".
INFO    OGG-00482  DDL found, operation &#091;TRUNCATE TABLE temp_test (size 24)].
ERROR   OGG-00519  Fatal error executing DDL replication: error &#091;Error code &#091;942], ORA-00942: table or view does not exist
ERROR   OGG-01668  PROCESS ABENDING.</code></pre>



<p class="wp-block-paragraph">The replicat abends on the <code class="nowrap">TRUNCATE</code> before it reaches the <code class="nowrap">DROP</code>. To check the <code class="nowrap">DROP</code>, the same two options run with a workload that has no <code class="nowrap">TRUNCATE</code> on the global temporary table. <strong>The replicat excludes both the <code class="nowrap">CREATE</code> and the <code class="nowrap">DROP</code></strong> and keeps running:</p>



<pre class="wp-block-code"><code>INFO    OGG-00482  DDL found, operation &#091;CREATE GLOBAL TEMPORARY TABLE temp_test (c number) ON COMMIT PRESERVE ROWS (size 74)].
INFO    OGG-10473  DDL on global temporary table excluded, optype &#091;CREATE], objtype &#091;TABLE], objowner "GTTTEST", objname "TEMP_TEST".
INFO    OGG-00482  DDL found, operation &#091;DROP TABLE temp_test PURGE (size 26)].
INFO    OGG-10473  DDL on global temporary table excluded, optype &#091;DROP], objtype &#091;TABLE], objowner "GTTTEST", objname "TEMP_TEST".</code></pre>



<p class="wp-block-paragraph">So <code class="nowrap">NOAPPLYGLOBALTEMPTABLE</code> skips the <code class="nowrap">CREATE</code> and <code class="nowrap">DROP</code> of a global temporary table, but not its <code class="nowrap">TRUNCATE</code>.</p>



<h2 id="which-ddl-statements-are-affected" class="wp-block-heading">Which DDL statements are affected</h2>



<p class="wp-block-paragraph">The <code class="nowrap">TRUNCATE</code> is not the only statement that behaves differently from <code class="nowrap">CREATE</code> and <code class="nowrap">DROP</code>. This workload runs on the source with the default extract (no <code class="nowrap">CAPTUREGLOBALTEMPTABLE</code>):</p>



<pre class="wp-block-code"><code>CREATE GLOBAL TEMPORARY TABLE temp_test (c number) ON COMMIT PRESERVE ROWS;
ALTER TABLE temp_test ADD (d number);
COMMENT ON TABLE temp_test IS 'gtt';
CREATE INDEX temp_test_i ON temp_test(c);
TRUNCATE TABLE temp_test;
ALTER TABLE temp_test RENAME TO temp_test2;
DROP TABLE temp_test2 PURGE;</code></pre>



<p class="wp-block-paragraph">The extract excludes five of the seven statements and <strong>includes <code class="nowrap">COMMENT</code> and <code class="nowrap">TRUNCATE</code></strong>:</p>



<pre class="wp-block-code"><code>INFO    OGG-10473  DDL on global temporary table excluded, optype &#091;CREATE], objtype &#091;TABLE], objowner "GTTTEST", objname "TEMP_TEST".
INFO    OGG-10473  DDL on global temporary table excluded, optype &#091;ALTER], objtype &#091;TABLE], objowner "GTTTEST", objname "TEMP_TEST".
INFO    OGG-00487  DDL operation included &#091;INCLUDE ALL], optype &#091;COMMENT], objtype &#091;TABLE], objowner "GTTTEST", objname "TEMP_TEST".
INFO    OGG-10473  DDL on global temporary table excluded, optype &#091;CREATE], objtype &#091;INDEX], objowner "GTTTEST", objname "TEMP_TEST".
INFO    OGG-00487  DDL operation included &#091;INCLUDE ALL], optype &#091;TRUNCATE], objtype &#091;TABLE], objowner "GTTTEST", objname "TEMP_TEST".
INFO    OGG-10473  DDL on global temporary table excluded, optype &#091;ALTER], objtype &#091;TABLE], objowner "GTTTEST", objname "TEMP_TEST2".
INFO    OGG-10473  DDL on global temporary table excluded, optype &#091;DROP], objtype &#091;TABLE], objowner "GTTTEST", objname "TEMP_TEST2".</code></pre>



<p class="wp-block-paragraph">With <code class="nowrap">CAPTUREGLOBALTEMPTABLE</code> on the extract and <code class="nowrap">NOAPPLYGLOBALTEMPTABLE</code> on the replicat, the extract captures every statement and the replicat makes the same decision. It excludes <code class="nowrap">CREATE</code> and <code class="nowrap">ALTER</code> (<code class="nowrap">OGG-10473</code>), then applies the <code class="nowrap">COMMENT</code> and <strong>abends</strong>:</p>



<pre class="wp-block-code"><code>INFO    OGG-00482  DDL found, operation &#091;ALTER TABLE temp_test ADD (d number) (size 36)].
INFO    OGG-10473  DDL on global temporary table excluded, optype &#091;ALTER], objtype &#091;TABLE], objowner "GTTTEST", objname "TEMP_TEST".
INFO    OGG-00482  DDL found, operation &#091;COMMENT ON TABLE temp_test IS 'gtt' (size 35)].
INFO    OGG-00487  DDL operation included &#091;INCLUDE ALL], optype &#091;COMMENT], objtype &#091;TABLE], objowner "GTTTEST", objname "TEMP_TEST".
ERROR   OGG-00519  Fatal error executing DDL replication: error &#091;Error code &#091;942], ORA-00942: table or view does not exist
ERROR   OGG-30538  Fatal error executing DDL statement &#091;COMMENT ON TABLE "GTTTEST"."TEMP_TEST" IS 'gtt'].
ERROR   OGG-01668  PROCESS ABENDING.</code></pre>



<p class="wp-block-paragraph">Each statement runs separately to see what the replicat does with it:</p>



<figure class="wp-block-table"><table><thead><tr><th>Statement on the global temporary table</th><th>Replicat</th></tr></thead><tbody><tr><td><code>CREATE TABLE</code>, <code>DROP TABLE</code></td><td>Excluded (<code class="nowrap">OGG-10473</code>)</td></tr><tr><td><code>ALTER TABLE .<wbr>.<wbr>.<wbr> ADD</code>, <code>ALTER TABLE .<wbr>.<wbr>.<wbr> RENAME TO</code></td><td>Excluded (<code class="nowrap">OGG-10473</code>)</td></tr><tr><td><code>CREATE INDEX</code>, <code class="nowrap">GRANT</code></td><td>Excluded (<code class="nowrap">OGG-10473</code>)</td></tr><tr><td><code>TRUNCATE TABLE</code></td><td><strong>Applied, abends with <code class="nowrap">ORA-00942</code></strong></td></tr><tr><td><code>COMMENT ON TABLE</code>, <code>COMMENT ON COLUMN</code></td><td><strong>Applied, abends with <code class="nowrap">ORA-00942</code></strong></td></tr></tbody></table></figure>



<h2 id="scope-and-truncate-options-do-not-change-it" class="wp-block-heading">Scope and truncate options do not change it</h2>



<p class="wp-block-paragraph">A difference in DDL scope could explain why <code class="nowrap">CREATE</code> is excluded and <code class="nowrap">TRUNCATE</code> is not. However, with <code>DDL INCLUDE MAPPED</code> on the replicat, the <code class="nowrap">TRUNCATE</code> is still included and the replicat abends:</p>



<pre class="wp-block-code"><code>INFO    OGG-00482  DDL found, operation &#091;TRUNCATE TABLE temp_test (size 24)].
INFO    OGG-00487  DDL operation included &#091;INCLUDE MAPPED], optype &#091;TRUNCATE], objtype &#091;TABLE], objowner "GTTTEST", objname "TEMP_TEST".
ERROR   OGG-00519  Fatal error executing DDL replication: error &#091;Error code &#091;942], ORA-00942: table or view does not exist
ERROR   OGG-30538  Fatal error executing DDL statement &#091;TRUNCATE TABLE "GTTTEST"."TEMP_TEST"].
ERROR   OGG-01668  PROCESS ABENDING.</code></pre>



<p class="wp-block-paragraph">The same happens with <code class="nowrap">GETTRUNCATES</code> and with <code class="nowrap">IGNORETRUNCATES</code> in the replicat, and with a global temporary table created with <code>ON COMMIT DELETE ROWS</code>. Those parameters control the truncate operation of the data, not the <code class="nowrap">TRUNCATE</code> DDL statement.</p>



<h2 id="answer-from-oracle-support" class="wp-block-heading">Answer from Oracle Support</h2>



<p class="wp-block-paragraph">I opened a service request with Oracle. The Product Team answered that <code>TRUNCATE TABLE</code> is a DDL operation and has to be excluded with an <code class="nowrap">EXCLUDE</code> clause of the <code class="nowrap">DDL</code> parameter. DDL cannot be filtered by temporary versus permanent tables, so the exclusion is done by table name. If that is too much work, the alternative is <code>DDLERROR 942 DISCARD</code>. I then pointed out that <code class="nowrap">CREATE</code> and <code class="nowrap">DROP</code> are DDL operations too and are excluded. The answer was that <strong>this is how it is designed for temporary tables</strong>.</p>



<h2 id="keeping-the-replicat-running" class="wp-block-heading">Keeping the replicat running</h2>



<h3 id="exclude-the-truncate-by-table-name" class="wp-block-heading">Exclude the <code class="nowrap">TRUNCATE</code> by table name</h3>



<p class="wp-block-paragraph">The <code class="nowrap">DDL</code> parameter of the replicat excludes the <code class="nowrap">TRUNCATE</code> of the table:</p>



<pre class="wp-block-code"><code>REPLICAT RGTT
USERIDALIAS oggadmin_pdb2 DOMAIN OracleGoldenGate
DDL INCLUDE ALL, EXCLUDE OBJNAME GTTTEST.TEMP_TEST OPTYPE TRUNCATE
DDLOPTIONS REPORT, NOAPPLYGLOBALTEMPTABLE
MAP GTTTEST.*, TARGET GTTTEST.*;</code></pre>



<p class="wp-block-paragraph">The replicat finds the <code class="nowrap">TRUNCATE</code> and skips it with an informational message, <code class="nowrap"><a class="ogg-code-link" href="https://juliendelattre.com/tools/goldengate-error-code-explorer/OGG-00488/" target="_blank" rel="noopener noreferrer">OGG-00488</a></code>. <strong>It keeps running</strong>:</p>



<pre class="wp-block-code"><code>INFO    OGG-00482  DDL found, operation &#091;CREATE GLOBAL TEMPORARY TABLE temp_test (c number) ON COMMIT PRESERVE ROWS (size 74)].
INFO    OGG-10473  DDL on global temporary table excluded, optype &#091;CREATE], objtype &#091;TABLE], objowner "GTTTEST", objname "TEMP_TEST".
INFO    OGG-00482  DDL found, operation &#091;TRUNCATE TABLE temp_test (size 24)].
INFO    OGG-00489  DDL is of mapped scope, after mapping new operation &#091;TRUNCATE TABLE "GTTTEST"."TEMP_TEST" (size 36)].
INFO    OGG-00488  DDL operation excluded &#091;EXCLUDE OBJNAME GTTTEST.TEMP_TEST OPTYPE TRUNCATE], optype &#091;TRUNCATE], objtype &#091;TABLE], objowner "GTTTEST", objname "TEMP_TEST".
INFO    OGG-00482  DDL found, operation &#091;DROP TABLE temp_test PURGE (size 26)].
INFO    OGG-10473  DDL on global temporary table excluded, optype &#091;DROP], objtype &#091;TABLE], objowner "GTTTEST", objname "TEMP_TEST".</code></pre>



<p class="wp-block-paragraph">The exclusion works per table name, so it has to list every global temporary table. <code>COMMENT ON TABLE</code> and <code>COMMENT ON COLUMN</code> abend the same way, so the exclusion must cover them too.</p>



<h3 id="discard-the-ora-00942-error" class="wp-block-heading">Discard the <code class="nowrap">ORA-00942</code> error</h3>



<p class="wp-block-paragraph"><code>DDLERROR 942 DISCARD</code> needs no table list. The replicat applies the <code class="nowrap">TRUNCATE</code>, receives <code class="nowrap">ORA-00942</code> from the target and discards the error:</p>



<pre class="wp-block-code"><code>REPLICAT RGTT
USERIDALIAS oggadmin_pdb2 DOMAIN OracleGoldenGate
DISCARDFILE RGTT.dsc, APPEND
DDL INCLUDE ALL
DDLOPTIONS REPORT
DDLERROR 942 DISCARD
MAP GTTTEST.*, TARGET GTTTEST.*;</code></pre>



<p class="wp-block-paragraph">The report shows <code class="nowrap"><a class="ogg-code-link" href="https://juliendelattre.com/tools/goldengate-error-code-explorer/OGG-00494/" target="_blank" rel="noopener noreferrer">OGG-00494</a></code> instead of the abend:</p>



<pre class="wp-block-code"><code>INFO    OGG-00482  DDL found, operation &#091;TRUNCATE TABLE temp_test (size 24)].
INFO    OGG-00487  DDL operation included &#091;INCLUDE ALL], optype &#091;TRUNCATE], objtype &#091;TABLE], objowner "GTTTEST", objname "TEMP_TEST".
INFO    OGG-00494  DDL error discarded: error code &#091;942], filter &#091;include all (default)], error text &#091;Current time: 2026-10-24 07:55:57
 Error text &#091;Error code &#091;942], ORA-00942: table or view does not exist</code></pre>



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

Program     Status      Group       Type                   Lag at Chkpt       Time Since Chkpt
EXTRACT     RUNNING     EGTT        INTEGRATED                  00:00:03           00:00:07
REPLICAT    RUNNING     RGTT        INTEGRATED                  00:00:00           00:00:06</code></pre>



<p class="wp-block-paragraph">The discard file <code class="nowrap">RGTT.dsc</code> has the statement:</p>



<pre class="wp-block-code"><code>Current time: 2026-10-24 07:55:57
 Error text &#091;Error code &#091;942], ORA-00942: table or view does not exist
Help: https://docs.oracle.com/error-help/db/ora-00942/
], operation &#091;TRUNCATE TABLE "GTTTEST"."TEMP_TEST" (size 36)]
Operation failed at seqno 0 rba 1,333.</code></pre>



<p class="wp-block-paragraph">The parameter applies to every DDL statement that fails with <code class="nowrap">ORA-00942</code>, not only to temporary tables. A statement that fails because a regular table is missing on the target is discarded too, so check the discard file regularly.</p>



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



<ul class="wp-block-list">
<li>With <code>DDL INCLUDE ALL</code>, the extract excludes <code class="nowrap">CREATE</code>, <code class="nowrap">ALTER</code>, <code>CREATE INDEX</code> and <code class="nowrap">DROP</code> of a global temporary table (<code class="nowrap">OGG-10473</code>) but includes <code class="nowrap">TRUNCATE</code> and <code class="nowrap">COMMENT</code> (<code class="nowrap">OGG-00487</code>).</li>



<li>The <code class="nowrap">TRUNCATE</code> is written to the trail and applied by the replicat on a target that has no such table.</li>



<li>The replicat abends with <code class="nowrap">ORA-00942</code> (<code class="nowrap"><a class="ogg-code-link" href="https://juliendelattre.com/tools/goldengate-error-code-explorer/OGG-00519/" target="_blank" rel="noopener noreferrer">OGG-00519</a></code>, <code class="nowrap"><a class="ogg-code-link" href="https://juliendelattre.com/tools/goldengate-error-code-explorer/OGG-30538/" target="_blank" rel="noopener noreferrer">OGG-30538</a></code>, <code class="nowrap"><a class="ogg-code-link" href="https://juliendelattre.com/tools/goldengate-error-code-explorer/OGG-01668/" target="_blank" rel="noopener noreferrer">OGG-01668</a></code>).</li>



<li><code>DDL INCLUDE MAPPED</code>, <code class="nowrap">GETTRUNCATES</code> and <code class="nowrap">IGNORETRUNCATES</code> do not change the abend.</li>



<li><code class="nowrap">NOAPPLYGLOBALTEMPTABLE</code> on the replicat does not prevent it, because the <code class="nowrap">TRUNCATE</code> is still executed.</li>



<li><code class="nowrap">CAPTUREGLOBALTEMPTABLE</code> on the extract makes the whole <code class="nowrap">CREATE</code>, <code class="nowrap">TRUNCATE</code> and <code class="nowrap">DROP</code> sequence replicate without error.</li>



<li>Oracle support confirmed that this is the designed behavior for temporary tables.</li>



<li><code>DDL EXCLUDE OBJNAME &lt;table&gt; OPTYPE TRUNCATE</code> on the replicat skips the <code class="nowrap">TRUNCATE</code> for the listed tables.</li>



<li><code>DDLERROR 942 DISCARD</code> on the replicat keeps it running for all tables and writes the failed statement to the discard file.</li>
</ul>
<p>L’article <a href="https://www.dbi-services.com/blog/goldengate-captures-truncate-on-a-global-temporary-table-and-the-replicat-abends/">GoldenGate captures TRUNCATE on a global temporary table and the replicat abends</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-captures-truncate-on-a-global-temporary-table-and-the-replicat-abends/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>AI meets OEM, use native OEM MCP server</title>
		<link>https://www.dbi-services.com/blog/ai-meets-oem-use-native-oem-mcp-server/</link>
					<comments>https://www.dbi-services.com/blog/ai-meets-oem-use-native-oem-mcp-server/#respond</comments>
		
		<dc:creator><![CDATA[Marc Wagner]]></dc:creator>
		<pubDate>Sat, 31 Oct 2026 01:47:08 +0000</pubDate>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Enterprise Manager 24ai]]></category>
		<category><![CDATA[MCP Server]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=48245</guid>

					<description><![CDATA[<p>I have recently been configuring and testing Oracle AI Database Assistant integrated with Oracle Enterprise Manager 24ai Release 1 Update 10, to interact with the Oracle Management Repository (OMR) using natural language prompts. It is time now to test the MCP server integrated with OEM 24ai Release 1 Update 12. In this blog, I will [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/ai-meets-oem-use-native-oem-mcp-server/">AI meets OEM, use native OEM MCP server</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">I have recently been configuring and testing Oracle AI Database Assistant integrated with Oracle Enterprise Manager 24ai Release 1 Update 10, to interact with the Oracle Management Repository (OMR) using natural language prompts.</p>



<p class="wp-block-paragraph">It is time now to test the MCP server integrated with OEM 24ai Release 1 Update 12. In this blog, I will show you how I configured a client to connect and interact with OEM MCP server in order to get information from the OMR, and perform first short tests.</p>



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



<h3>Requirements</h3>



<p class="wp-block-paragraph">I need to be at least in OEM 24ai Release 1 Update 12.</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1,2,6,8,25,26,27,28,29,30]">
[oracle@oem24ai ~]$ $OMS_HOME/bin/emctl getversion oms
Oracle Enterprise Manager 24ai Release 1
Copyright (c) 1996, 2024 Oracle Corporation.  All rights reserved.
       Oracle Enterprise Manager OMS 24ai Release 1

[oracle@oem24ai ~]$ export ORACLE_HOME=$OMS_HOME

[oracle@oem24ai ~]$ $ORACLE_HOME/OPatch/opatch lspatches
39984317;EM Stack Patch Bundle 24.1.0.0.0(ID:260906.1632) (Patch 39984254)
39979941;OPSS Bundle Patch 12.2.1.4.260904
39930279;ADF BUNDLE PATCH 12.2.1.4.260825
39919567;WLS PATCH SET UPDATE 12.2.1.4.260823
39901894;WebCenter Core Bundle Patch 12.2.1.4.260818
39896168;OWSM BUNDLE PATCH 12.2.1.4.260818
39861406;PERL 5.42.2 patch for EM 24.1.0.0.0
39798204;RDA release 26.3-2026915 for OFM 12.2.1.4 SPB
39611663;OHS (NATIVE) DB19C BUNDLE PATCH 12.2.1.4.260624
39574504;FMW Thirdparty Bundle Patch 12.2.1.4.260617
39567777;OSS 19C BUNDLE PATCH 12.2.1.4.260616
39487427;JDBC19.31 BUNDLE PATCH 12.2.1.4.260603
39425385;DB CLIENT 19.31 FOR FMW BUNDLE PATCH 12.2.1.4.260721 (39425385)
38832179;One-off
38098858;One-off
1221432;Coherence Cumulative Patch 12.2.1.4.32
39808046;Oracle Enterprise Manager for Cloud Framework 24ai Release 1 Plug-in Update 13 (24.1.1.13) for Oracle Management Service
39808030;Oracle Enterprise Manager for Systems Infrastructure 24ai Release 1 Plug-in Update 13 (24.1.1.13) for Oracle Management Service
39808017;Oracle Enterprise Manager for Exadata 24ai Release 1 Plug-in Update 13 (24.1.1.13) for Oracle Management Service
39807976;Oracle Enterprise Manager for Oracle Database 24ai Release 1 Plug-in Update 13 (24.1.1.13) for Oracle Management Service
39807963;Oracle Enterprise Manager for Fusion Middleware 24ai Release 1 Plug-in Update 13 (24.1.1.13) for Oracle Management Service
39807951;Oracle Enterprise Manager 24ai Release 1 Platform Update 13 (24.1.0.13) for Oracle Management Service
36789759;FMW PLATFORM BUNDLE PATCH 12.2.1.4.240812
34065178;One-off
30152128;One-off
34809489;One-off
35965629;ADR FOR WEBLOGIC SERVER 12.2.1.4.0 CPU JAN 2024

OPatch succeeded.
[oracle@oem24ai ~]$
</pre>
<br>



<p class="wp-block-paragraph">This is ok as I patched my OEM before performing further tests, and I&#8217;m now running Update 13.</p>



<h3>Connectivity tests without any client</h3>



<h4>TCP connectivity</h4>



<p class="wp-block-paragraph">The address to reach the MCP server from my lab is the following:</p>



<pre class="wp-block-code"><code>https:&#047;&#047;oem24ai.jew.lab:7803/em/api/mcp</code></pre>



<p class="wp-block-paragraph">Before going further in configuring any client, I made a local connection test to the MCP server from my Mac using curl command. Option v for verbose and k to disable TLS certificate verification.</p>



<p class="wp-block-paragraph">The command confirmed the connection is ok (DNS resolution, TCP connectivity). HTTP Error 401 (Unauthorized) is ok as we did not provide any user and password, so OEM rejected the unauthorized request.</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1,34]">maw@dbi-servicess-MacBook-Pro-2 ~ % curl -vk \
&gt; https://oem24ai.jew.lab:7803/em/api/mcp
* Host oem24ai.jew.lab:7803 was resolved.
* IPv6: (none)
* IPv4: 10.0.10.250
*   Trying 10.0.10.250:7803...
* Connected to oem24ai.jew.lab (10.0.10.250) port 7803
* ALPN: curl offers h2,http/1.1
* (304) (OUT), TLS handshake, Client hello (1):
* (304) (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
* TLSv1.2 (IN), TLS handshake, Server finished (14):
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
* TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.2 (OUT), TLS handshake, Finished (20):
* TLSv1.2 (IN), TLS change cipher, Change cipher spec (1):
* TLSv1.2 (IN), TLS handshake, Finished (20):
* SSL connection using TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384 / [blank] / UNDEF
* ALPN: server did not agree on a protocol. Uses default.
* Server certificate:
*  subject: CN=oem24ai.iaas.jewlab.oraclevcn.com
*  start date: Oct 13 13:55:47 2026 GMT
*  expire date: Oct 11 13:55:47 2036 GMT
*  issuer: O=EnterpriseManager on oem24ai.iaas.jewlab.oraclevcn.com; OU=EnterpriseManager on oem24ai.iaas.jewlab.oraclevcn.com; L=EnterpriseManager on oem24ai.iaas.jewlab.oraclevcn.com; ST=CA; C=US; CN=oem24ai.iaas.jewlab.oraclevcn.com
*  SSL certificate verify result: self signed certificate in certificate chain (19), continuing anyway.
* using HTTP/1.x
&gt; GET /em/api/mcp HTTP/1.1
&gt; Host: oem24ai.jew.lab:7803
&gt; User-Agent: curl/8.7.1
&gt; Accept: */*
&gt;
* Request completely sent off
&lt; HTTP/1.1 401 Unauthorized
&lt; Date: Mon, 26 Oct 2026 13:07:26 GMT
&lt; Date: Mon, 26 Oct 2026 13:07:26 GMT
&lt; X-ORACLE-DMS-ECID: d5e13a8c-fc9e-4654-8dd2-ecd46f90471c-000004af
&lt; X-ORACLE-DMS-RID: 0
&lt; X-ORCL-EM-APIGW-ERR: 0
&lt; X-ORCL-EM-APIGW-GUID: e525b50c-f555-1c15-b8ca-a13fe481ea20
&lt; X-ORCL-EMOA: true
&lt; X-Content-Type-Options: nosniff
&lt; X-XSS-Protection: 1; mode=block
&lt; X-Frame-Options: SAMEORIGIN
&lt; Content-Length: 0
&lt;
* Connection #0 to host oem24ai.jew.lab left intact
maw@dbi-servicess-MacBook-Pro-2 ~ %
</pre>
<br>



<h4>MCP connection</h4>



<p class="wp-block-paragraph">Let&#8217;s test MCP connection with user and password using curl command. We will use following options:</p>



<ul class="wp-block-list">
<li>-s for silent execution</li>



<li>-S to show errors</li>



<li>-k to skip TLS certificate verification</li>



<li>-u to provide user/password</li>



<li>-H to provide the header</li>



<li>-X to give the HTTP method</li>



<li>-d to display the data to be sent in the HTTP request body in json format</li>
</ul>



<p class="wp-block-paragraph">The MCP method specified in the JSON request body is initialize. We use this method to establish an initial connection with the MCP server and negotiate protocol capabilities.</p>



<p class="wp-block-paragraph">First securely read the password into a shell variable.</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1]">[oracle@oem24ai ~]$ read -rs -p "OEM password: " OEM_PASS
OEM password: [oracle@oem24ai ~]$
</pre>
<br>



<p class="wp-block-paragraph">Then run the curl command to test the MCP connection.</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17]">[oracle@oem24ai ~]$ curl -sS -k -u "sysman:${OEM_PASS}" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -X POST "https://oem24ai.jew.lab:7803/em/api/mcp" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "initialize",
    "params": {
      "protocolVersion": "2025-06-18",
      "capabilities": {},
      "clientInfo": {
        "name": "oem-mcp-test",
        "version": "1.0"
      }
    }
  }'
{"id":1,"jsonrpc":"2.0","result":{"protocolVersion":"2025-06-18","serverInfo":{"version":"1.0.0","name":"em-mcp-server","title":"Enterprise Manager MCP Server"},"capabilities":{"prompts":{"listChanged":false},"resources":{"listChanged":false,"subscribe":false},"tools":{"listChanged":false}},"instructions":"This is an MCP server to interface with Enterprise Manager (EM) Unless otherwise specified, assume that databases and database targets refers to the following target types: oracle_database, oracle_pdb, rac_database, oracle_cloud_atp, oracle_cloud_adw."}}[oracle@oem24ai ~]$
</pre>
<br>



<p class="wp-block-paragraph">As we can see in the result, the connection to the MCP server was successful.</p>



<h3>Query MCP tool lists</h3>



<p class="wp-block-paragraph">Let&#8217;s retrieve the lists of available tools exposed by the MCP server. This time, we will use the MCP method tools/list.</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1,2,3,4,5,6,7,8,9,10,11]">[oracle@oem24ai ~]$ curl -sS -k -u "sysman:$OEM_PASS" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -H "MCP-Protocol-Version: 2025-06-18" \
  -X POST "https://oem24ai.jew.lab:7803/em/api/mcp" \
  -d '{
    "jsonrpc": "2.0",
    "id": 2,
    "method": "tools/list",
    "params": {}
  }'
{"id":2,"jsonrpc":"2.0","result":{"tools":[{"name":"ExecuteSql","title":"Execute SQL","description":"Execute SQL through the Free Query API. By default the query runs against the Enterprise Manager repository; include targetConnection to run against a target database. Use bind parameters instead of direct text substitution when applicable. The response contains query results, response time, and available result metadata.","inputSchema":{"properties":{"isSqlMonitorEnabled":{"description":"optional flag to enable SQL monitoring. Defaults to false","type":"boolean"},"excludeNullValues":{"description":"optional flag to omit null-valued properties from repository query results. Defaults to false","type":"boolean"},"resourcePlan":{"description":"optional resource plan action information for query tracking. Target database queries require action because it cannot be inferred from a query name","type":"object","properties":{"action":{"type":"string","description":"optional repository query action and required target database query action"}}},"query":{"description":"the sql query to execute","type":"string"},"bindType":{"description":"optional bind parameter mode. Defaults to INDEX. Use NAME when parameters are bound by alias","type":"string","enum":["INDEX","NAME"]},"transforms":{"description":"optional response transforms currently used for localized target type columns","type":"array","items":{"type":"object","properties":{"type":{"type":"string","description":"transform type"},"columnName":{"type":"string","description":"source column name"},"localizedColumnName":{"type":"string","description":"localized output column name"}}}},"limit":{"description":"optional positive integer row limit. Va
...
</pre>
<br>



<p class="wp-block-paragraph">As we can see in the result we see the list of all available tools exposed by the MCP server, the first one been ExecuteSql.</p>



<p class="wp-block-paragraph">This confirm our connection and use of the MCP server is ok.</p>



<h3>Configure the MCP client</h3>



<p class="wp-block-paragraph">As MCP client I will use my Visual Studio Code installed on my Mac. To use it with the MCP server, I will install and use the Codex extension from OpenAI. I will sign in with my ChatGPT account.</p>



<p class="wp-block-paragraph">OpenAI Codex is an AI-powered coding agent developed by OpenAI. It helps developers write, understand, debug, test, and modify code, often working directly with an existing software project.</p>



<h4>Configure Codex extension</h4>



<p class="wp-block-paragraph">I will configure Codex with sysman password converted into a Base64-encoded string. For this I will use the base64 linux command:</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1]">
maw@dbi-servicess-MacBook-Pro-2 ~ % printf '%s' 'sysman:XXXXXXX' | base64 | tr -d '\n'
c3lzbXXXXXXXXXXXXXXyMDI2%                                                                                                                                            maw@dbi-servicess-MacBook-Pro-2 ~ %
</pre>
<br>



<p class="wp-block-paragraph">And I will configure Codex extension, see next 2 pictures. I provided OEM-MCP-native as MCP server name.</p>



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



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



<p class="wp-block-paragraph">This configuration will be stored in the config.toml file from the .codex directory.</p>



<p class="wp-block-paragraph">The connection was not working. Asking for the list of tools exposed by the MCP server was just provided an output that no tool was existing. I could find the following in the codex output terminal:</p>



<pre class="wp-block-code"><code>026-10-26 15:03:53.265 &#091;warning] Failed to discover app tools authStatus=bearerToken error="MCP startup failed: handshaking with MCP server failed: Send message error Transport &#091;codex_rmcp_client::tool_list_changes::ToolListChanges&lt;codex_rmcp_client::event_notification_transport::EventNotificationTransport&lt;rmcp::transport::worker::WorkerTransport&lt;rmcp::transport::streamable_http_client::StreamableHttpClientWorker&lt;codex_rmcp_client::http_client_adapter::StreamableHttpClientAdapter&gt;&gt;&gt;&gt;] error: Client error: HTTP request failed: http/request failed: error sending request for url (https://oem24ai.jew.lab:7803/em/api/mcp), when send initialize request: Send message error Transport &#091;codex_rmcp_client::tool_list_changes::ToolListChanges&lt;codex_rmcp_client::event_notification_transport::EventNotificationTransport&lt;rmcp::transport::worker::WorkerTransport&lt;rmcp::transport::streamable_http_client::StreamableHttpClientWorker&lt;codex_rmcp_client::http_client_adapter::StreamableHttpClientAdapter&gt;&gt;&gt;&gt;] error: Client error: HTTP request failed: http/request failed: error sending request for url (https://oem24ai.jew.lab:7803/em/api/mcp), when send initialize request" hostId=local pluginId=null server=OEM-MCP-native</code></pre>



<p class="wp-block-paragraph">I made some further check with curl command omitting -k option:</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1,14,15]">
maw@dbi-servicess-MacBook-Pro-2 .codex % curl -v \
  https://oem24ai.jew.lab:7803/em/api/mcp
* Host oem24ai.jew.lab:7803 was resolved.
* IPv6: (none)
* IPv4: 10.0.10.250
*   Trying 10.0.10.250:7803...
* Connected to oem24ai.jew.lab (10.0.10.250) port 7803
* ALPN: curl offers h2,http/1.1
* (304) (OUT), TLS handshake, Client hello (1):
*  CAfile: /etc/ssl/cert.pem
*  CApath: none
* (304) (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (OUT), TLS alert, unknown CA (560):
* SSL certificate problem: self signed certificate in certificate chain
* Closing connection
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (OUT), TLS alert, unknown CA (560):
curl: (60) SSL certificate problem: self signed certificate in certificate chain
More details here: https://curl.se/docs/sslcerts.html

curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.
maw@dbi-servicess-MacBook-Pro-2 .codex %
</pre>
<br>



<p class="wp-block-paragraph">And I could confirm that the problem comes from missing TLS certificate.</p>



<p class="wp-block-paragraph">I ran following command to see what certificate was sent by the MCP server and understand why certificate verification failed.</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1,2,3,4,5]">
[oracle@oem24ai ~]$ openssl s_client \
  -connect oem24ai.jew.lab:7803 \
  -servername oem24ai.jew.lab \
  -showcerts &amp;1 |
grep -E 'subject=|issuer=|verify error|Verify return code'
verify error:num=19:self-signed certificate in certificate chain
subject=CN=oem24ai.iaas.jewlab.oraclevcn.com
issuer=O=EnterpriseManager on oem24ai.iaas.jewlab.oraclevcn.com, OU=EnterpriseManager on oem24ai.iaas.jewlab.oraclevcn.com, L=EnterpriseManager on oem24ai.iaas.jewlab.oraclevcn.com, ST=CA, C=US, CN=oem24ai.iaas.jewlab.oraclevcn.com
    Verify return code: 19 (self-signed certificate in certificate chain)
</pre>
<br>



<p class="wp-block-paragraph">The return code: 19 confirm that the certificate could not be considered as trusted.</p>



<p class="wp-block-paragraph">The second command will display the DNS name available in the certificate, here we do not have any:</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1,2,3,4]">
[oracle@oem24ai ~]$ openssl s_client \
  -connect oem24ai.jew.lab:7803 \
  -servername oem24ai.jew.lab 2&gt;/dev/null |
openssl x509 -noout -ext subjectAltName
No extensions in certificate
</pre>
<br>



<p class="wp-block-paragraph">Also we can see that the domain name registered in the MCP Server certificate is not the same that the one we use to connect: . jew.lab versus jewlab.oraclevcn.com. We will have to provide both names in the new certificate we will create.</p>



<h4>Configure a new trusted certificate and implement it into OEM</h4>



<p class="wp-block-paragraph">To help with this following oracle documentation is useful:</p>



<p class="wp-block-paragraph"><a href="https://docs.oracle.com/en/enterprise-manager/cloud-control/enterprise-manager-cloud-control/24.1/emadm/emctl-security-commands.html">https://docs.oracle.com/en/enterprise-manager/cloud-control/enterprise-manager-cloud-control/24.1/emadm/emctl-security-commands.html</a></p>



<p class="wp-block-paragraph"><a href="https://docs.oracle.com/en/enterprise-manager/cloud-control/enterprise-manager-cloud-control/24.1/emsec/configuring-secure-communication.html">https://docs.oracle.com/en/enterprise-manager/cloud-control/enterprise-manager-cloud-control/24.1/emsec/configuring-secure-communication.html</a></p>



<p class="wp-block-paragraph">See parts: “Configuring Third Party Certificates”, then “Configuring a Third Party Certificate for HTTPS Console Users”.</p>



<h5>Generate the private Certificate Authority (CA)</h5>



<p class="wp-block-paragraph">Let&#8217;s create the private key to be used to sign certificates (CA private key):</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1,4,10]">
maw@dbi-servicess-MacBook-Pro-2 oem-pki % pwd
/Users/maw/Documents/Dokument/pem_ssh_key/OEM-Lab/oem-pki

maw@dbi-servicess-MacBook-Pro-2 oem-pki % openssl genrsa -out oem-root-ca.key 4096
Generating RSA private key, 4096 bit long modulus
.......++++
.............................................................................................................................................................................++++
e is 65537 (0x10001)

maw@dbi-servicess-MacBook-Pro-2 oem-pki % ls -ltrh
total 8
-rw-r--r--@ 1 maw  DBI-SERVICES\Domain Users   3.2K Oct 29 11:01 oem-root-ca.key
maw@dbi-servicess-MacBook-Pro-2 oem-pki %
</pre>
<br>



<p class="wp-block-paragraph">I generated the CA certificate:</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1,4,8,16]">
maw@dbi-servicess-MacBook-Pro-2 oem-pki % pwd
/Users/maw/Documents/Dokument/pem_ssh_key/OEM-Lab/oem-pki

maw@dbi-servicess-MacBook-Pro-2 oem-pki % ls -ltrh
total 8
-rw-r--r--@ 1 maw  DBI-SERVICES\Domain Users   3.2K Oct 29 11:01 oem-root-ca.key

maw@dbi-servicess-MacBook-Pro-2 oem-pki % openssl req -new -x509 -sha256 \
  -days 3650 \
  -key oem-root-ca.key \
  -out oem-root-ca.crt \
  -subj "/CN=OEM Lab Root CA" \
  -addext "basicConstraints=critical,CA:TRUE" \
  -addext "keyUsage=critical,keyCertSign,cRLSign"

maw@dbi-servicess-MacBook-Pro-2 oem-pki % ls -ltrh
total 16
-rw-r--r--@ 1 maw  DBI-SERVICES\Domain Users   3.2K Oct 29 11:01 oem-root-ca.key
-rw-r--r--@ 1 maw  DBI-SERVICES\Domain Users   1.7K Oct 29 11:08 oem-root-ca.crt
maw@dbi-servicess-MacBook-Pro-2 oem-pki %
</pre>
<br>



<p class="wp-block-paragraph">I checked the certificate:</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1,2]">
maw@dbi-servicess-MacBook-Pro-2 oem-pki % openssl x509 -in oem-root-ca.crt \
  -noout -subject -issuer -dates
subject= /CN=OEM Lab Root CA
issuer= /CN=OEM Lab Root CA
notBefore=Oct 29 10:08:18 2026 GMT
notAfter=Oct 26 10:08:18 2036 GMT
</pre>
<br>



<p class="wp-block-paragraph">I checked the basic constraints extension:</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1,2]">
maw@dbi-servicess-MacBook-Pro-2 oem-pki % openssl x509 -in oem-root-ca.crt -noout -text | \
  grep -A 3 "Basic Constraints"
            X509v3 Basic Constraints: critical
                CA:TRUE
            X509v3 Key Usage: critical
                Certificate Sign, CRL Sign
maw@dbi-servicess-MacBook-Pro-2 oem-pki %
</pre>
<br>



<p class="wp-block-paragraph">All good, the certificate is marked as a Certificate Authority.</p>



<p class="wp-block-paragraph">I verified the Root CA is self-signed:</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1]">
maw@dbi-servicess-MacBook-Pro-2 oem-pki % openssl verify -CAfile oem-root-ca.crt oem-root-ca.crt
oem-root-ca.crt: OK
maw@dbi-servicess-MacBook-Pro-2 oem-pki %
</pre>
<br>



<h5>Generate the OMS server certificate with both DNS names</h5>



<p class="wp-block-paragraph">I generated the OMS private key and CSR:</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1,4,9,10,11,12,13,20]">maw@dbi-servicess-MacBook-Pro-2 oem-pki % pwd
/Users/maw/Documents/Dokument/pem_ssh_key/OEM-Lab/oem-pki

maw@dbi-servicess-MacBook-Pro-2 oem-pki % ls -ltrh
total 16
-rw-r--r--@ 1 maw  DBI-SERVICES\Domain Users   3.2K Oct 29 11:01 oem-root-ca.key
-rw-r--r--@ 1 maw  DBI-SERVICES\Domain Users   1.7K Oct 29 11:08 oem-root-ca.crt

maw@dbi-servicess-MacBook-Pro-2 oem-pki % openssl req -new -newkey rsa:3072 -nodes \
  -keyout oem24ai.key \
  -out oem24ai.csr \
  -subj "/CN=oem24ai.iaas.jewlab.oraclevcn.com" \
  -addext "subjectAltName=DNS:oem24ai.iaas.jewlab.oraclevcn.com,DNS:oem24ai.jew.lab"
Generating a 3072 bit RSA private key
.....................++++
........................++++
writing new private key to 'oem24ai.key'
-----

maw@dbi-servicess-MacBook-Pro-2 oem-pki % ls -ltrh
total 32
-rw-r--r--@ 1 maw  DBI-SERVICES\Domain Users   3.2K Oct 29 11:01 oem-root-ca.key
-rw-r--r--@ 1 maw  DBI-SERVICES\Domain Users   1.7K Oct 29 11:08 oem-root-ca.crt
-rw-r--r--@ 1 maw  DBI-SERVICES\Domain Users   2.4K Oct 29 11:16 oem24ai.key
-rw-r--r--@ 1 maw  DBI-SERVICES\Domain Users   1.3K Oct 29 11:16 oem24ai.csr
maw@dbi-servicess-MacBook-Pro-2 oem-pki %
</pre>
<br>



<p class="wp-block-paragraph">We have now oem24ai.key which is OMS server private key, oem24ai.csr which is certificate signing request.</p>



<p class="wp-block-paragraph">I created the certificate extensions (we need to ensure the signed certificate contains the correct SAN entries):</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1,2,3,4,5,6,7,8,10]">
maw@dbi-servicess-MacBook-Pro-2 oem-pki % cat &gt; oem24ai.ext &lt;&lt;&#039;EOF&#039;
basicConstraints=critical,CA:FALSE
keyUsage=critical,digitalSignature,keyEncipherment
extendedKeyUsage=serverAuth
subjectAltName=DNS:oem24ai.iaas.jewlab.oraclevcn.com,DNS:oem24ai.jew.lab
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer
EOF

maw@dbi-servicess-MacBook-Pro-2 oem-pki % ls -ltrh
total 40
-rw-r--r--@ 1 maw  DBI-SERVICES\Domain Users   3.2K Oct 29 11:01 oem-root-ca.key
-rw-r--r--@ 1 maw  DBI-SERVICES\Domain Users   1.7K Oct 29 11:08 oem-root-ca.crt
-rw-r--r--@ 1 maw  DBI-SERVICES\Domain Users   2.4K Oct 29 11:16 oem24ai.key
-rw-r--r--@ 1 maw  DBI-SERVICES\Domain Users   1.3K Oct 29 11:16 oem24ai.csr
-rw-r--r--@ 1 maw  DBI-SERVICES\Domain Users   249B Oct 29 11:18 oem24ai.ext
maw@dbi-servicess-MacBook-Pro-2 oem-pki %
</pre>
<br>



<p class="wp-block-paragraph">I signed the certificate with my private CA:</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1,2,3,4,5,6,7,8,9,14]">
maw@dbi-servicess-MacBook-Pro-2 oem-pki % openssl x509 -req \
  -in oem24ai.csr \
  -CA oem-root-ca.crt \
  -CAkey oem-root-ca.key \
  -CAcreateserial \
  -out oem24ai.crt \
  -days 825 \
  -sha256 \
  -extfile oem24ai.ext
Signature ok
subject=/CN=oem24ai.iaas.jewlab.oraclevcn.com
Getting CA Private Key

maw@dbi-servicess-MacBook-Pro-2 oem-pki % ls -ltrh
total 56
-rw-r--r--@ 1 maw  DBI-SERVICES\Domain Users   3.2K Oct 29 11:01 oem-root-ca.key
-rw-r--r--@ 1 maw  DBI-SERVICES\Domain Users   1.7K Oct 29 11:08 oem-root-ca.crt
-rw-r--r--@ 1 maw  DBI-SERVICES\Domain Users   2.4K Oct 29 11:16 oem24ai.key
-rw-r--r--@ 1 maw  DBI-SERVICES\Domain Users   1.3K Oct 29 11:16 oem24ai.csr
-rw-r--r--@ 1 maw  DBI-SERVICES\Domain Users   249B Oct 29 11:18 oem24ai.ext
-rw-r--r--@ 1 maw  DBI-SERVICES\Domain Users    17B Oct 29 11:19 oem-root-ca.srl
-rw-r--r--@ 1 maw  DBI-SERVICES\Domain Users   1.8K Oct 29 11:19 oem24ai.crt
maw@dbi-servicess-MacBook-Pro-2 oem-pki %
</pre>
<br>



<p class="wp-block-paragraph">oem24ai.crt is now created and signed by my private CA.</p>



<p class="wp-block-paragraph">oem-root-ca.key must never be copied and must stay locally on my Mac.</p>



<p class="wp-block-paragraph">I checked the certificate subject, issuer, validity and SAN:</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1]">
maw@dbi-servicess-MacBook-Pro-2 oem-pki % openssl x509 -in oem24ai.crt -noout -subject -issuer -dates
subject= /CN=oem24ai.iaas.jewlab.oraclevcn.com
issuer= /CN=OEM Lab Root CA
notBefore=Oct 29 10:19:27 2026 GMT
notAfter=Jan 31 10:19:27 2029 GMT
maw@dbi-servicess-MacBook-Pro-2 oem-pki % openssl x509 -in oem24ai.crt -noout -text | \
grep -A 1 "Subject Alternative Name"
            X509v3 Subject Alternative Name:
                DNS:oem24ai.iaas.jewlab.oraclevcn.com, DNS:oem24ai.jew.lab
maw@dbi-servicess-MacBook-Pro-2 oem-pki %
</pre>
<br>



<p class="wp-block-paragraph">I can see that both my DNS names are now existing.</p>



<p class="wp-block-paragraph">I verified the certificate chain:</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1]">
maw@dbi-servicess-MacBook-Pro-2 oem-pki % openssl verify -CAfile oem-root-ca.crt oem24ai.crt
oem24ai.crt: OK
maw@dbi-servicess-MacBook-Pro-2 oem-pki %
</pre>
<br>



<p class="wp-block-paragraph">I also verified if the certificate is suitable for HTTPS:</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1,2]">
maw@dbi-servicess-MacBook-Pro-2 oem-pki % openssl x509 -in oem24ai.crt -noout -text | \
grep -A 2 -E "Basic Constraints:|Key Usage:"
            X509v3 Basic Constraints: critical
                CA:FALSE
            X509v3 Key Usage: critical
                Digital Signature, Key Encipherment
            X509v3 Extended Key Usage:
                TLS Web Server Authentication
            X509v3 Subject Alternative Name:
maw@dbi-servicess-MacBook-Pro-2 oem-pki %
</pre>
<br>



<h5>Create the Oracle Wallet for OEM 24ai</h5>



<p class="wp-block-paragraph">I have created all needed certificates for my OEM HTTPS console access. Following are available.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td class="has-text-align-left" data-align="left"><strong>File</strong></td><td>P<strong>urpose</strong></td></tr><tr><td class="has-text-align-left" data-align="left">oem-root-ca.crt</td><td>Private CA certificate</td></tr><tr><td class="has-text-align-left" data-align="left">oem24ai.crt</td><td>Signed OMS server certificate</td></tr><tr><td class="has-text-align-left" data-align="left">oem24ai.key</td><td>OMS server private key</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">I transferred the needed certificate files to the OMS server:</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1]">
maw@dbi-servicess-MacBook-Pro-2 oem-pki % scp -i /Users/maw/Documents/Dokument/pem_ssh_key/OEM-lab/OEM-lab.key oem-root-ca.crt oem24ai.crt oem24ai.key oracle@oem24ai.jew.lab:/home/oracle/
oem-root-ca.crt                                                                                                                                                                                                                                                           100% 1744   121.2KB/s   00:00
oem24ai.crt                                                                                                                                                                                                                                                               100% 1822   127.0KB/s   00:00
oem24ai.key                                                                                                                                                                                                                                                               100% 2488   156.6KB/s   00:00
maw@dbi-servicess-MacBook-Pro-2 oem-pki %
</pre>
<br>



<p class="wp-block-paragraph">I created the needed directory for certificate and moved the files:</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1,4,6,8,10,17]">
oracle@oem24ai:/u01/app/oracle/oms24ai/ [rdbms19320] pwd
/u01/app/oracle/oms24ai

oracle@oem24ai:/u01/app/oracle/oms24ai/ [rdbms19320] mkdir -p oem-ssl/wallet

oracle@oem24ai:/u01/app/oracle/oms24ai/ [rdbms19320] chmod -R 700 oem-ssl

oracle@oem24ai:/u01/app/oracle/oms24ai/ [rdbms19320] mv ~/oem-root-ca.crt ~/oem24ai.crt ~/oem24ai.key oem-ssl/

oracle@oem24ai:/u01/app/oracle/oms24ai/ [rdbms19320] ls -ltrh oem-ssl
total 12K
-rw-r--r--. 1 oracle oinstall 1.8K Oct 29 10:33 oem-root-ca.crt
-rw-r--r--. 1 oracle oinstall 1.8K Oct 29 10:33 oem24ai.crt
-rw-r--r--. 1 oracle oinstall 2.5K Oct 29 10:33 oem24ai.key
drwx------. 2 oracle oinstall    6 Oct 29 10:39 wallet

oracle@oem24ai:/u01/app/oracle/oms24ai/ [rdbms19320] chmod 600 oem-ssl/oem24ai.key
oracle@oem24ai:/u01/app/oracle/oms24ai/ [rdbms19320]
</pre>
<br>



<p class="wp-block-paragraph">I created the Oracle Wallet:</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1,3,4,5]">
oracle@oem24ai:/u01/app/oracle/oms24ai/ [rdbms19320] export WALLET_DIR=/u01/app/oracle/oms24ai/oem-ssl/wallet

oracle@oem24ai:/u01/app/oracle/oms24ai/ [rdbms19320] $OMS_HOME/bin/orapki wallet create \
  -wallet "$WALLET_DIR" \
  -auto_login
Oracle PKI Tool Release 19.0.0.0.0 - Production
Version 19.32.0.0.0
Copyright (c) 2004, 2026, Oracle and/or its affiliates. All rights reserved.

Enter password:
Enter password again:
Operation is successfully completed.
oracle@oem24ai:/u01/app/oracle/oms24ai/ [rdbms19320]
</pre>
<br>



<p class="wp-block-paragraph">I checked the created wallet files:</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1]">
oracle@oem24ai:/u01/app/oracle/oms24ai/ [rdbms19320] ls -ltrh "$WALLET_DIR"
total 8.0K
-rw-------. 1 oracle oinstall   0 Oct 29 10:46 ewallet.p12.lck
-rw-------. 1 oracle oinstall 235 Oct 29 10:46 ewallet.p12
-rw-------. 1 oracle oinstall   0 Oct 29 10:46 cwallet.sso.lck
-rw-------. 1 oracle oinstall 280 Oct 29 10:46 cwallet.sso
oracle@oem24ai:/u01/app/oracle/oms24ai/ [rdbms19320]
</pre>
<br>



<p class="wp-block-paragraph">I checked the private key format, should be private key:</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1]">
oracle@oem24ai:/u01/app/oracle/oms24ai/ [rdbms19320] head -n 1 /u01/app/oracle/oms24ai/oem-ssl/oem24ai.key
-----BEGIN PRIVATE KEY-----
oracle@oem24ai:/u01/app/oracle/oms24ai/ [rdbms19320]
</pre>
<br>



<p class="wp-block-paragraph">The private key format should be compatible with storing it into Oracle Wallet.</p>



<p class="wp-block-paragraph">We can check that certificate and private keys match:</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1,2,5,6]">
oracle@oem24ai:/u01/app/oracle/oms24ai/ [rdbms19320] openssl x509 -in /u01/app/oracle/oms24ai/oem-ssl/oem24ai.crt \
  -pubkey -noout | openssl dgst -sha256
SHA2-256(stdin)= 5a80b1977405XXXXf5b0cc39ab1ea

oracle@oem24ai:/u01/app/oracle/oms24ai/ [rdbms19320] openssl pkey -in /u01/app/oracle/oms24ai/oem-ssl/oem24ai.key \
  -pubout | openssl dgst -sha256
SHA2-256(stdin)= 5a80b1977405XXXXf5b0cc39ab1ea
oracle@oem24ai:/u01/app/oracle/oms24ai/ [rdbms19320]
</pre>
<br>



<p class="wp-block-paragraph">Both SHA-256 digests match.</p>



<p class="wp-block-paragraph">Now I will import the signed OMS certificate and private key into the wallet. I will first setup variable for the directories and check wallet files:</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1,4,6,9]">
oracle@oem24ai:/u01/app/oracle/oms24ai/ [rdbms19320] echo $WALLET_DIR
/u01/app/oracle/oms24ai/oem-ssl/wallet

oracle@oem24ai:/u01/app/oracle/oms24ai/ [rdbms19320] export CERT_DIR=/u01/app/oracle/oms24ai/oem-ssl

oracle@oem24ai:/u01/app/oracle/oms24ai/ [rdbms19320] echo $CERT_DIR
/u01/app/oracle/oms24ai/oem-ssl

oracle@oem24ai:/u01/app/oracle/oms24ai/ [rdbms19320] ls -l "$WALLET_DIR"/ewallet.p12 "$WALLET_DIR"/cwallet.sso
-rw-------. 1 oracle oinstall 280 Oct 29 10:46 /u01/app/oracle/oms24ai/oem-ssl/wallet/cwallet.sso
-rw-------. 1 oracle oinstall 235 Oct 29 10:46 /u01/app/oracle/oms24ai/oem-ssl/wallet/ewallet.p12
oracle@oem24ai:/u01/app/oracle/oms24ai/ [rdbms19320]
</pre>
<br>



<p class="wp-block-paragraph">I will secure wallet password into a variable:</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1]">
oracle@oem24ai:/u01/app/oracle/oms24ai/ [rdbms19320] read -rs -p "Wallet password: " WALLET_PWD
Wallet password: oracle@oem24ai:/u01/app/oracle/oms24ai/ [rdbms19320]
</pre>
<br>



<p class="wp-block-paragraph">And import the key into the wallet:</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1,2,3,4,5,6,7]">
oracle@oem24ai:/u01/app/oracle/oms24ai/ [rdbms19320] $OMS_HOME/bin/orapki wallet import_private_key \
  -wallet "$WALLET_DIR" \
  -pwd "$WALLET_PWD" \
  -alias oem24ai \
  -pvtkeyfile "$CERT_DIR/oem24ai.key" \
  -cert "$CERT_DIR/oem24ai.crt" \
  -cacert "$CERT_DIR/oem-root-ca.crt"
Oracle PKI Tool Release 19.0.0.0.0 - Production
Version 19.32.0.0.0
Copyright (c) 2004, 2026, Oracle and/or its affiliates. All rights reserved.

Enter private key password:
PKI-07014: Unable to import private key. Header not present in private key
</pre>
<br>



<p class="wp-block-paragraph">It seems the format of the key is not compatible. openSSL created a PKCS#8 PEM format key, let&#8217;s convert it to RSA PEM format:</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1,3,8]">
oracle@oem24ai:/u01/app/oracle/oms24ai/ [rdbms19320] cp $CERT_DIR/oem24ai.key $CERT_DIR/oem24ai.key.bak.20261029_1202

oracle@oem24ai:/u01/app/oracle/oms24ai/ [rdbms19320] ssh-keygen -p -m PEM -f $CERT_DIR/oem24ai.key
Enter new passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved with the new passphrase.

oracle@oem24ai:/u01/app/oracle/oms24ai/ [rdbms19320] head -n 1 "/u01/app/oracle/oms24ai/oem-ssl/oem24ai.key"
-----BEGIN RSA PRIVATE KEY-----
oracle@oem24ai:/u01/app/oracle/oms24ai/ [rdbms19320]
</pre>
<br>



<p class="wp-block-paragraph">Now I have a RSA key format.</p>



<p class="wp-block-paragraph">Let&#8217;s retry the import of the key into the wallet:</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1,2,3,4,5,6,7]">
oracle@oem24ai:/u01/app/oracle/oms24ai/ [rdbms19320] $OMS_HOME/bin/orapki wallet import_private_key \
  -wallet "$WALLET_DIR" \
  -pwd "$WALLET_PWD" \
  -alias oem24ai \
  -pvtkeyfile "$CERT_DIR/oem24ai.key" \
  -cert "$CERT_DIR/oem24ai.crt" \
  -cacert "$CERT_DIR/oem-root-ca.crt"
Oracle PKI Tool Release 19.0.0.0.0 - Production
Version 19.32.0.0.0
Copyright (c) 2004, 2026, Oracle and/or its affiliates. All rights reserved.

Enter private key password:
PKI-07014: Unable to import private key. Header not present in private key
oracle@oem24ai:/u01/app/oracle/oms24ai/ [rdbms19320]
</pre>
<br>



<p class="wp-block-paragraph">Still not ok. Let&#8217;s try converting it into a new p12 format key.</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1,2,3,4,5,6,10]">
oracle@oem24ai:/u01/app/oracle/oms24ai/ [rdbms19320] openssl pkcs12 -export \
  -inkey "$CERT_DIR/oem24ai.key" \
  -in "$CERT_DIR/oem24ai.crt" \
  -certfile "$CERT_DIR/oem-root-ca.crt" \
  -name oem24ai \
  -out "$CERT_DIR/oem24ai.p12"
Enter Export Password:
Verifying - Enter Export Password:

oracle@oem24ai:/u01/app/oracle/oms24ai/ [rdbms19320] ls -ltrh $CERT_DIR
total 24K
-rw-r--r--. 1 oracle oinstall 1.8K Oct 29 10:33 oem-root-ca.crt
-rw-r--r--. 1 oracle oinstall 1.8K Oct 29 10:33 oem24ai.crt
drwx------. 2 oracle oinstall   90 Oct 29 10:46 wallet
-rw-------. 1 oracle oinstall 2.5K Oct 29 11:02 oem24ai.key.bak.20261029_1202
-rw-------. 1 oracle oinstall 2.5K Oct 29 11:02 oem24ai.key
-rw-------. 1 oracle oinstall 4.9K Oct 29 11:12 oem24ai.p12
oracle@oem24ai:/u01/app/oracle/oms24ai/ [rdbms19320]
</pre>
<br>



<p class="wp-block-paragraph">I secured the new p12 key password and try the import again.</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1,4,5,6,7,8]">
oracle@oem24ai:/u01/app/oracle/oms24ai/ [rdbms19320] read -rs -p "PKCS12 password: " PKCS12_PWD
PKCS12 password: oracle@oem24ai:/u01/app/oracle/oms24ai/ [rdbms19320]

oracle@oem24ai:/u01/app/oracle/oms24ai/ [rdbms19320] $OMS_HOME/bin/orapki wallet import_pkcs12 \
  -wallet "$WALLET_DIR" \
  -pwd "$WALLET_PWD" \
  -pkcs12file "$CERT_DIR/oem24ai.p12" \
  -pkcs12pwd "$PKCS12_PWD"
Oracle PKI Tool Release 19.0.0.0.0 - Production
Version 19.32.0.0.0
Copyright (c) 2004, 2026, Oracle and/or its affiliates. All rights reserved.

orapki command import_pkcs12 executed successfully.
oracle@oem24ai:/u01/app/oracle/oms24ai/ [rdbms19320]
</pre>
<br>



<p class="wp-block-paragraph">The import was successful now!</p>



<p class="wp-block-paragraph">I checked the wallet content:</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1,2,3]">
oracle@oem24ai:/u01/app/oracle/oms24ai/ [rdbms19320] $OMS_HOME/bin/orapki wallet display \
  -wallet "$WALLET_DIR" \
  -complete
Oracle PKI Tool Release 19.0.0.0.0 - Production
Version 19.32.0.0.0
Copyright (c) 2004, 2026, Oracle and/or its affiliates. All rights reserved.

Requested Certificates:
User Certificates:
Subject:        CN=oem24ai.iaas.jewlab.oraclevcn.com
Issuer:         CN=OEM Lab Root CA
Serial Number:  00:B3:5D:86:6A:43:33:F1:1F
Key Length      3072
MD5 digest:     EC:14:E4:12:22:16:34:FC:28:1D:59:B8:F9:EA:F0:B2
SHA digest:     31:EE:0B:44:44:2C:05:A7:CC:B8:3B:70:C6:F9:E8:83:0E:55:F2:7D

Trusted Certificates:
Subject:        CN=OEM Lab Root CA
Issuer:         CN=OEM Lab Root CA
Serial Number:  00:D7:B3:06:4D:B3:41:CF:9F
Key Length      4096
MD5 digest:     C5:16:F1:A9:AA:AE:9A:FD:1A:A6:6E:72:9C:0B:0A:95
SHA digest:     AA:E4:F4:49:EF:6C:17:4D:9E:30:42:E9:34:A6:80:5D:AB:F3:7D:02

oracle@oem24ai:/u01/app/oracle/oms24ai/ [rdbms19320]
</pre>
<br>



<h5>Configure OEM 24ai to use the new wallet for HTTPS on port 7803</h5>



<p class="wp-block-paragraph">I first checked that the Wallet is autologin and checked wallet content (should have the OEM server certificate):</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1,5,6,7]">
oracle@oem24ai:/u01/app/oracle/oms24ai/ [rdbms19320] ls -l "$WALLET_DIR"/ewallet.p12 "$WALLET_DIR"/cwallet.sso
-rw-------. 1 oracle oinstall 4931 Oct 29 11:14 /u01/app/oracle/oms24ai/oem-ssl/wallet/cwallet.sso
-rw-------. 1 oracle oinstall 4886 Oct 29 11:14 /u01/app/oracle/oms24ai/oem-ssl/wallet/ewallet.p12

oracle@oem24ai:/u01/app/oracle/oms24ai/ [rdbms19320] $OMS_HOME/bin/orapki wallet display \
  -wallet "$WALLET_DIR" \
  -summary
Oracle PKI Tool Release 19.0.0.0.0 - Production
Version 19.32.0.0.0
Copyright (c) 2004, 2026, Oracle and/or its affiliates. All rights reserved.

Requested Certificates:
User Certificates:
Subject:        CN=oem24ai.iaas.jewlab.oraclevcn.com
Trusted Certificates:
Subject:        CN=OEM Lab Root CA
oracle@oem24ai:/u01/app/oracle/oms24ai/ [rdbms19320]
</pre>
<br>



<p class="wp-block-paragraph">I backuped the current OMS configuration:</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1,3,7,9,13,18]">oracle@oem24ai:/u01/app/oracle/oms24ai/ [rdbms19320] mkdir oem-ssl/backup-20261029

oracle@oem24ai:/u01/app/oracle/oms24ai/ [rdbms19320] ls -ld oem-ssl/backup-20261029/

drwxr-xr-x. 2 oracle oinstall 6 Oct 29 12:46 oem-ssl/backup-20261029/

oracle@oem24ai:/u01/app/oracle/oms24ai/ [rdbms19320] cp -a /u01/app/oracle/oms24ai/gc_inst/em/EMGC_OMS1 ./oem-ssl/backup-20261029/

oracle@oem24ai:/u01/app/oracle/oms24ai/ [rdbms19320] ls -ltrh ./oem-ssl/backup-20261029/
total 0
drwxr-x---. 3 oracle oinstall 43 Oct 29 08:17 EMGC_OMS1

oracle@oem24ai:/u01/app/oracle/oms24ai/ [rdbms19320] ls -ltrh ./oem-ssl/backup-20261029/EMGC_OMS1/
total 4.0K
drwxr-x---. 10 oracle oinstall  110 Oct 21 05:33 sysman
-rw-r-----.  1 oracle oinstall 2.7K Oct 29 08:17 emgc.properties

oracle@oem24ai:/u01/app/oracle/oms24ai/ [rdbms19320] ls -ltrh ./oem-ssl/backup-20261029/EMGC_OMS1/sysman/
total 12K
drwxr--r--.  2 oracle oinstall    6 Oct 14 13:52 state
drwxr--r--.  3 oracle oinstall   19 Oct 14 13:57 emcli
drwxr-x---.  2 oracle oinstall   89 Oct 14 14:07 ocm
drwxr-----.  2 oracle oinstall   43 Oct 14 14:09 backup
drwxr--r--.  2 oracle oinstall    6 Oct 15 09:56 tmp
drwxr-x---.  9 oracle oinstall 4.0K Oct 21 11:55 agentpush
drwxr--r--.  5 oracle oinstall 4.0K Oct 29 08:16 log
drwxr-x---. 11 oracle oinstall 4.0K Oct 29 08:17 config
oracle@oem24ai:/u01/app/oracle/oms24ai/ [rdbms19320]
</pre>
<br>



<p class="wp-block-paragraph">I added the wallet to the console (This targets the HTTPS Console certificate):</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1]">
oracle@oem24ai:/u01/app/oracle/oms24ai/ [rdbms19320] $OMS_HOME/bin/emctl secure console -wallet /u01/app/oracle/oms24ai/oem-ssl/wallet
Oracle Enterprise Manager 24ai Release 1
Copyright (c) 1996, 2024 Oracle Corporation.  All rights reserved.
Securing Console... Started.
Enter Enterprise Manager Root (SYSMAN) Password :
Securing Console... Successful
Run SSL Reload Command
oracle@oem24ai:/u01/app/oracle/oms24ai/ [rdbms19320]
</pre>
<br>



<p class="wp-block-paragraph">I ran the command to reload the certificate without having to restart the OMS:</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1]">
oracle@oem24ai:/u01/app/oracle/oms24ai/ [rdbms19320] $OMS_HOME/bin/emctl secure ssl_reload
Oracle Enterprise Manager 24ai Release 1
Copyright (c) 1996, 2024 Oracle Corporation.  All rights reserved.
SSL Reload... Started.
SSL Reload completed successfully.
oracle@oem24ai:/u01/app/oracle/oms24ai/ [rdbms19320]
</pre>
<br>



<p class="wp-block-paragraph">I verified the certificate actually presented by port&nbsp;<code>7803</code>:</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1,2,3,4]">
oracle@oem24ai:/u01/app/oracle/oms24ai/ [rdbms19320] echo | openssl s_client \
  -connect oem24ai.iaas.jewlab.oraclevcn.com:7803 \
  -servername oem24ai.iaas.jewlab.oraclevcn.com \
  2&gt;/dev/null | openssl x509 -noout -subject -issuer -dates
subject=CN=oem24ai.iaas.jewlab.oraclevcn.com
issuer=CN=OEM Lab Root CA
notBefore=Oct 29 10:19:27 2026 GMT
notAfter=Jan 31 10:19:27 2029 GMT
oracle@oem24ai:/u01/app/oracle/oms24ai/ [rdbms19320]
</pre>
<br>



<p class="wp-block-paragraph">OEM is presenting the new certificate on port&nbsp;<code>7803</code></p>



<h5>Trust the OEM Root CA on my local Mac</h5>



<p class="wp-block-paragraph">The OEM 24ai server now presents the new certificate on port&nbsp;<code>7803</code>. Next, I need my Mac to trust the CA that signed it, so Codex can establish a TLS connection to the OEM MCP endpoint.</p>



<p class="wp-block-paragraph">I checked the certificate again:</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1,4,14]">
maw@dbi-servicess-MacBook-Pro-2 oem-pki % pwd
/Users/maw/Documents/Dokument/pem_ssh_key/OEM-Lab/oem-pki

maw@dbi-servicess-MacBook-Pro-2 oem-pki % ls -ltrh
total 56
-rw-r--r--@ 1 maw  DBI-SERVICES\Domain Users   3.2K Oct 29 11:01 oem-root-ca.key
-rw-r--r--@ 1 maw  DBI-SERVICES\Domain Users   1.7K Oct 29 11:08 oem-root-ca.crt
-rw-r--r--@ 1 maw  DBI-SERVICES\Domain Users   2.4K Oct 29 11:16 oem24ai.key
-rw-r--r--@ 1 maw  DBI-SERVICES\Domain Users   1.3K Oct 29 11:16 oem24ai.csr
-rw-r--r--@ 1 maw  DBI-SERVICES\Domain Users   249B Oct 29 11:18 oem24ai.ext
-rw-r--r--@ 1 maw  DBI-SERVICES\Domain Users    17B Oct 29 11:19 oem-root-ca.srl
-rw-r--r--@ 1 maw  DBI-SERVICES\Domain Users   1.8K Oct 29 11:19 oem24ai.crt

maw@dbi-servicess-MacBook-Pro-2 oem-pki % openssl x509 -in oem-root-ca.crt -noout -subject -issuer -dates
subject= /CN=OEM Lab Root CA
issuer= /CN=OEM Lab Root CA
notBefore=Oct 29 10:08:18 2026 GMT
notAfter=Oct 26 10:08:18 2036 GMT
maw@dbi-servicess-MacBook-Pro-2 oem-pki %
</pre>
<br>



<p class="wp-block-paragraph">And finally I added the Root CA to macOS trusted certificates:</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1,2,3,4,5]">
maw@dbi-servicess-MacBook-Pro-2 oem-pki % sudo security add-trusted-cert \
  -d \
  -r trustRoot \
  -k /Library/Keychains/System.keychain \
  /Users/maw/Documents/Dokument/pem_ssh_key/OEM-Lab/oem-pki/oem-root-ca.crt
Password:
maw@dbi-servicess-MacBook-Pro-2 oem-pki %
</pre>
<br>



<p class="wp-block-paragraph">Successful. This installed the CA into the system keychain and marks it as trusted.</p>



<h5>Test connection with curl command</h5>



<p class="wp-block-paragraph">Let&#8217;s test the connection with curl command activating TLS verification, so omitting -k option.</p>



<p class="wp-block-paragraph">I explicitly tested providing the CA file:</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1,2,3,33,41]">maw@dbi-servicess-MacBook-Pro-2 oem-pki % curl -v \
&gt; -cacert /Users/maw/Documents/Dokument/pem_ssh_key/OEM-Lab/oem-pki/oem-root-ca.crt \
&gt; https://oem24ai.jew.lab:7803/em/api/mcp
* URL rejected: No host part in the URL
* Closing connection
curl: (3) URL rejected: No host part in the URL
* Host oem24ai.jew.lab:7803 was resolved.
* IPv6: (none)
* IPv4: 10.0.10.250
*   Trying 10.0.10.250:7803...
* Connected to oem24ai.jew.lab (10.0.10.250) port 7803
* ALPN: curl offers h2,http/1.1
* (304) (OUT), TLS handshake, Client hello (1):
*  CAfile: /etc/ssl/cert.pem
*  CApath: none
* (304) (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
* TLSv1.2 (IN), TLS handshake, Server finished (14):
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
* TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.2 (OUT), TLS handshake, Finished (20):
* TLSv1.2 (IN), TLS change cipher, Change cipher spec (1):
* TLSv1.2 (IN), TLS handshake, Finished (20):
* SSL connection using TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384 / [blank] / UNDEF
* ALPN: server did not agree on a protocol. Uses default.
* Server certificate:
*  subject: CN=oem24ai.iaas.jewlab.oraclevcn.com
*  start date: Oct 29 10:19:27 2026 GMT
*  expire date: Jan 31 10:19:27 2029 GMT
*  subjectAltName: host "oem24ai.jew.lab" matched cert's "oem24ai.jew.lab"
*  issuer: CN=OEM Lab Root CA
*  SSL certificate verify ok.
* using HTTP/1.x
&gt; GET /em/api/mcp HTTP/1.1
&gt; Host: oem24ai.jew.lab:7803
&gt; User-Agent: curl/8.7.1
&gt; Accept: */*
&gt;
* Request completely sent off
&lt; HTTP/1.1 401 Unauthorized
&lt; Date: Thu, 29 Oct 2026 13:01:26 GMT
&lt; Date: Thu, 29 Oct 2026 13:01:26 GMT
&lt; X-ORACLE-DMS-ECID: d5217381-6141-4190-9a60-0a7f609ee162-00000beb
&lt; X-ORACLE-DMS-RID: 0
&lt; X-ORCL-EM-APIGW-ERR: 0
&lt; X-ORCL-EM-APIGW-GUID: 9a1bdced-2748-8952-d070-7f568cfcb7fe
&lt; X-ORCL-EMOA: true
&lt; X-Content-Type-Options: nosniff
&lt; X-XSS-Protection: 1; mode=block
&lt; X-Frame-Options: SAMEORIGIN
&lt; Content-Length: 0
&lt;
* Connection #0 to host oem24ai.jew.lab left intact
maw@dbi-servicess-MacBook-Pro-2 oem-pki %
</pre>
<br>



<p class="wp-block-paragraph">Working now. All ok. HTTP 401 Unauthorized is expected because we&#8217;re testing without credentials.</p>



<p class="wp-block-paragraph">I also tested with default certificate trust configuration:</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1,28,36]">
maw@dbi-servicess-MacBook-Pro-2 oem-pki % curl -v https://oem24ai.jew.lab:7803/em/api/mcp
* Host oem24ai.jew.lab:7803 was resolved.
* IPv6: (none)
* IPv4: 10.0.10.250
*   Trying 10.0.10.250:7803...
* Connected to oem24ai.jew.lab (10.0.10.250) port 7803
* ALPN: curl offers h2,http/1.1
* (304) (OUT), TLS handshake, Client hello (1):
*  CAfile: /etc/ssl/cert.pem
*  CApath: none
* (304) (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
* TLSv1.2 (IN), TLS handshake, Server finished (14):
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
* TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.2 (OUT), TLS handshake, Finished (20):
* TLSv1.2 (IN), TLS change cipher, Change cipher spec (1):
* TLSv1.2 (IN), TLS handshake, Finished (20):
* SSL connection using TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384 / [blank] / UNDEF
* ALPN: server did not agree on a protocol. Uses default.
* Server certificate:
*  subject: CN=oem24ai.iaas.jewlab.oraclevcn.com
*  start date: Oct 29 10:19:27 2026 GMT
*  expire date: Jan 31 10:19:27 2029 GMT
*  subjectAltName: host "oem24ai.jew.lab" matched cert's "oem24ai.jew.lab"
*  issuer: CN=OEM Lab Root CA
*  SSL certificate verify ok.
* using HTTP/1.x
&gt; GET /em/api/mcp HTTP/1.1
&gt; Host: oem24ai.jew.lab:7803
&gt; User-Agent: curl/8.7.1
&gt; Accept: */*
&gt;
* Request completely sent off
&lt; HTTP/1.1 401 Unauthorized
&lt; Date: Thu, 29 Oct 2026 13:03:09 GMT
&lt; Date: Thu, 29 Oct 2026 13:03:09 GMT
&lt; X-ORACLE-DMS-ECID: d5217381-6141-4190-9a60-0a7f609ee162-00000bf3
&lt; X-ORACLE-DMS-RID: 0
&lt; X-ORCL-EM-APIGW-ERR: 0
&lt; X-ORCL-EM-APIGW-GUID: 23898c58-68b4-bb57-a5fb-1baf10253a9e
&lt; X-ORCL-EMOA: true
&lt; X-Content-Type-Options: nosniff
&lt; X-XSS-Protection: 1; mode=block
&lt; X-Frame-Options: SAMEORIGIN
&lt; Content-Length: 0
&lt;
* Connection #0 to host oem24ai.jew.lab left intact
maw@dbi-servicess-MacBook-Pro-2 oem-pki %
</pre>
<br>



<p class="wp-block-paragraph">My Mac now trusts the new OEM certificate.</p>



<h5>Run a discovery test with Codex</h5>



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



<p class="wp-block-paragraph">And now I could successfully list the tools exposed by the MCP server using codex, as you can see in previous picture.</p>



<p class="wp-block-paragraph">The MCP connection is working and exposes 113 tools.</p>



<h3>Make some tests with Visual Studio Code and Codex as MCP client</h3>



<p class="wp-block-paragraph">Let&#8217;s test and request to list the targets that are up.</p>



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



<p class="wp-block-paragraph">I can request which MCP server Codex is using and he will give me the tool that was used to retrieve the information.</p>



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



<p class="wp-block-paragraph">I queried to list the databases targets that are up:</p>



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



<p class="wp-block-paragraph">And I finally queried to show the databases by tablespace allocated space. Here we can see that Codex will use the ExecuteSql tool and run SQL queries on OMR:</p>



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



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



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



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



<p class="wp-block-paragraph">In this blog I showed how to configure client connection to MCP server built directly in OEM and how to use and query it. We can see that this solution is more powerful and flexible than using Oracle AI Database Assistant.</p>



<p class="wp-block-paragraph">Here additional interesting websites:</p>



<p class="wp-block-paragraph"><a href="https://docs.oracle.com/en/enterprise-manager/cloud-control/enterprise-manager-cloud-control/24.1/emadm/enterprise-manager-model-context-protocol-server.html">https://docs.oracle.com/en/enterprise-manager/cloud-control/enterprise-manager-cloud-control/24.1/emadm/enterprise-manager-model-context-protocol-server.html</a></p>



<p class="wp-block-paragraph"><a href="https://blogs.oracle.com/observability/oracle-enterprise-manager-mcp-server-bringing-enterprise-manager-data-to-ai-agents">https://blogs.oracle.com/observability/oracle-enterprise-manager-mcp-server-bringing-enterprise-manager-data-to-ai-agents</a></p>



<p class="wp-block-paragraph"></p>
<p>L’article <a href="https://www.dbi-services.com/blog/ai-meets-oem-use-native-oem-mcp-server/">AI meets OEM, use native OEM MCP server</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.dbi-services.com/blog/ai-meets-oem-use-native-oem-mcp-server/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Oracle AI Database Assistant showing &#8220;No metrics data were found&#8221;</title>
		<link>https://www.dbi-services.com/blog/oracle-ai-database-assistant-showing-no-metrics-data-were-found/</link>
					<comments>https://www.dbi-services.com/blog/oracle-ai-database-assistant-showing-no-metrics-data-were-found/#respond</comments>
		
		<dc:creator><![CDATA[Marc Wagner]]></dc:creator>
		<pubDate>Fri, 30 Oct 2026 13:07:29 +0000</pubDate>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[AI database assistant]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=48227</guid>

					<description><![CDATA[<p>I have already blogged on how to setup Oracle AI Database Assistant available since Enterprise Manager 24ai Release 1 Update 10, and also blogged doing some tests. For some prompts I was getting the error &#8220;No metrics data were found&#8221;. In this blog, I would like to explain how I resolved the problem. Problem description [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/oracle-ai-database-assistant-showing-no-metrics-data-were-found/">Oracle AI Database Assistant showing &#8220;No metrics data were found&#8221;</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">I have already blogged on how to setup Oracle AI Database Assistant available since Enterprise Manager 24ai Release 1 Update 10, and also blogged doing some tests.</p>



<p class="wp-block-paragraph">For some prompts I was getting the error &#8220;No metrics data were found&#8221;. In this blog, I would like to explain how I resolved the problem.</p>



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



<h3>Problem description</h3>



<p class="wp-block-paragraph">Running for example the prompt: &#8220;Show Oracle databases by tablespace allocated space in MB&#8221; I was getting the message &#8220;No metrics data were found. Check that metric collection is enabled&#8221;.</p>



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



<h3>Explanation</h3>



<p class="wp-block-paragraph">This prompt will need &#8220;Tablespace Allocation&#8221; and &#8220;Tablespace Allocated Space (MB)&#8221; metrics.</p>



<p class="wp-block-paragraph">Let&#8217;s check for one of the target DB configured in OEM and see if the metric is enabled.</p>



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



<p class="wp-block-paragraph">The metrics is enabled and refresh rate is &#8220;every 24 hours&#8221;.</p>



<p class="wp-block-paragraph">Let&#8217;s see if there is some data already stored in OMR.</p>



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



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



<p class="wp-block-paragraph">As we can see there is no data for this metrics even if the metric is enabled.</p>



<p class="wp-block-paragraph">This comes from the fact that it is our lab and the nodes are not always up and running.</p>



<h3>Resolution</h3>



<p class="wp-block-paragraph">Let&#8217;s connect to the DB System node hosting the database (OEM Agent) and check available targets:</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1,12]">
[oracle@oradb19c ~]$ /opt/oracle/agentem24ai/agent_24.1.0.0.0/bin/emctl config agent listtargets
Oracle Enterprise Manager 24ai Release 1
Copyright (c) 1996, 2024 Oracle Corporation.  All rights reserved.
[oradb19c.dbaas.jewlab.oraclevcn.com, host]
[oradb19c.dbaas.jewlab.oraclevcn.com:3872, oracle_emd]
[agent24c1_3_oradb19c.dbaas.jewlab.oraclevcn.com_8659, oracle_home]
[CDB19C_SITE1.dbaas.jewlab.oraclevcn.com, oracle_database]
[ASMNET1LSNR_ASM_oradb19c.dbaas.jewlab.oraclevcn.com, oracle_listener]
[LISTENER_oradb19c.dbaas.jewlab.oraclevcn.com, oracle_listener]
[CDB19C_SITE1.dbaas.jewlab.oraclevcn.com_CDBROOT, oracle_pdb]
[CDB19C_SITE1.dbaas.jewlab.oraclevcn.com_PDB19C, oracle_pdb]
[OraDB19000_home1_2_oradb19c.dbaas.jewlab.oraclevcn.com_6741, oracle_home]
[OraGI19Home1_1_oradb19c.dbaas.jewlab.oraclevcn.com_9873, oracle_home]
</pre>
<br>



<p class="wp-block-paragraph">So we have the target name to be used: [CDB19C_SITE1.dbaas.jewlab.oraclevcn.com_PDB19C, oracle_pdb]</p>



<p class="wp-block-paragraph">Let&#8217;s trigger the tablespace allocation metric collection on the Agent for this target:</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1]">
[oracle@oradb19c ~]$ /opt/oracle/agentem24ai/agent_24.1.0.0.0/bin/emctl control agent runCollection "CDB19C_SITE1.dbaas.jewlab.oraclevcn.com_PDB19C:oracle_pdb" "tbspAllocation"
Oracle Enterprise Manager 24ai Release 1
Copyright (c) 1996, 2024 Oracle Corporation.  All rights reserved.
---------------------------------------------------------------
EMD runCollection completed successfully

[oracle@oradb19c ~]$
</pre>
<br>



<p class="wp-block-paragraph">We now need to upload the pending collected data to OMS:</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1]">
[oracle@oradb19c ~]$ /opt/oracle/agentem24ai/agent_24.1.0.0.0/bin/emctl upload agent
Oracle Enterprise Manager 24ai Release 1
Copyright (c) 1996, 2024 Oracle Corporation.  All rights reserved.
---------------------------------------------------------------
EMD upload completed successfully
[oracle@oradb19c ~]$
</pre>
<br>



<p class="wp-block-paragraph">Now check if we have some data metrics for tablespace allocation for this target:</p>



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



<p class="wp-block-paragraph">Yes we have!</p>



<p class="wp-block-paragraph">Let&#8217;s change the metric settings to have it run on hourly bases:</p>



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



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



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



<p class="wp-block-paragraph">I did the same for the other DB System nodes. Let&#8217;s check with the AI prompt to see if we have now some result.</p>



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



<p class="wp-block-paragraph">And it&#8217;s now working!</p>



<p class="wp-block-paragraph">So in case of such error, &#8220;No metrics data were found. Check that metric collection is enabled&#8221;, need to find the corresponding metrics and check if the metric is enabled and data are existing. What is most difficult is to find a documentation providing the corresponding metrics according to the prompt family. If I find anything further, I will update this blog.</p>
<p>L’article <a href="https://www.dbi-services.com/blog/oracle-ai-database-assistant-showing-no-metrics-data-were-found/">Oracle AI Database Assistant showing &#8220;No metrics data were found&#8221;</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.dbi-services.com/blog/oracle-ai-database-assistant-showing-no-metrics-data-were-found/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Manual local controller firmware update during ODA Patching</title>
		<link>https://www.dbi-services.com/blog/manual-local-controller-firmware-update-during-oda-patching/</link>
					<comments>https://www.dbi-services.com/blog/manual-local-controller-firmware-update-during-oda-patching/#respond</comments>
		
		<dc:creator><![CDATA[Marc Wagner]]></dc:creator>
		<pubDate>Fri, 30 Oct 2026 09:28:27 +0000</pubDate>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[oda]]></category>
		<category><![CDATA[patching]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=48216</guid>

					<description><![CDATA[<p>I was recently patching several Oracle Database Appliance (ODA) X11-2-HA at customer from 19.26 to 19.30 and then finally to 19.32. During one patching hop I faced an issue where /root became full. One of the consequences was that I had to manually patch local controller firmware. Through this blog I would like to share [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/manual-local-controller-firmware-update-during-oda-patching/">Manual local controller firmware update during ODA Patching</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 was recently patching several Oracle Database Appliance (ODA) X11-2-HA at customer from 19.26 to 19.30 and then finally to 19.32.</p>



<p class="wp-block-paragraph">During one patching hop I faced an issue where /root became full. One of the consequences was that I had to manually patch local controller firmware. Through this blog I would like to share with you my experience about this problem and the solution I applied.</p>



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



<h3>Problem description</h3>



<p class="wp-block-paragraph">I was at the step to run the update-servercomponents patching:</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1]">
[root@node0 ~]# /opt/oracle/dcs/bin/odacli update-servercomponents -v 19.30.0.0.0
{
  "jobId" : "03c81877-9d76-426d-b6c8-a7da09ffca66",
  "status" : "Created",
  "message" : "A server update job has been initiated. If a reboot is required, it will be performed as part of the update process. The final status will be provided once the update operation has been completed on all nodes.",
  "reports" : [ ],
  "createTimestamp" : "September 24, 2026 10:11:14 CEST",
  "resourceList" : [ ],
  "description" : "Server Patching to 19.30.0.0.0",
  "updatedTime" : "September 24, 2026 10:11:14 CEST",
  "jobType" : null,
  "cpsMetadata" : null,
  "ecJobId" : null
}
</pre>
<br>



<p class="wp-block-paragraph">The job patching activity was on-going correctly:</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1]">
[root@node0 ~]# odacli describe-job -i 03c81877-9d76-426d-b6c8-a7da09ffca66

Job details
----------------------------------------------------------------
                     ID:  03c81877-9d76-426d-b6c8-a7da09ffca66
            Description:  Server Patching to 19.30.0.0.0
                 Status:  Running
                Created:  September 24, 2026 10:11:14 CEST
                Message:

Task Name                                Node Name                 Start Time                               End Time                                 Status
---------------------------------------- ------------------------- ---------------------------------------- ---------------------------------------- ----------------
Validate ILOM server reachable           node0                 September 24, 2026 10:11:24 CEST         September 24, 2026 10:11:24 CEST         Success
Validate ILOM server reachable           node1                 September 24, 2026 10:11:24 CEST         September 24, 2026 10:11:24 CEST         Success
Validating GI user metadata              node0                 September 24, 2026 10:11:24 CEST         September 24, 2026 10:11:24 CEST         Success
Validating GI user metadata              node1                 September 24, 2026 10:11:24 CEST         September 24, 2026 10:11:24 CEST         Success
Modify BM udev rules                     node0                 September 24, 2026 10:11:25 CEST         September 24, 2026 10:11:36 CEST         Success
Modify BM udev rules                     node1                 September 24, 2026 10:11:25 CEST         September 24, 2026 10:11:36 CEST         Success
Stop oakd                                node1                 September 24, 2026 10:11:40 CEST         September 24, 2026 10:11:43 CEST         Success
Creating local repository                node0                 September 24, 2026 10:11:43 CEST         September 24, 2026 10:11:45 CEST         Success
OSPatchBaseRepo
Creating local repository                node1                 September 24, 2026 10:11:43 CEST         September 24, 2026 10:11:45 CEST         Success
OSPatchBaseRepo
Updating versionlock plugin              node0                 September 24, 2026 10:11:45 CEST         September 24, 2026 10:11:48 CEST         Success
Updating versionlock plugin              node1                 September 24, 2026 10:11:45 CEST         September 24, 2026 10:11:48 CEST         Success
Applying OS Patches                      node0                 September 24, 2026 10:11:48 CEST                                                  Running
Applying OS Patches                      node1                 September 24, 2026 10:11:48 CEST                                                  Running

[root@node0 ~]#
</pre>
<br>



<p class="wp-block-paragraph">I&#8217;m used to let a tail -f running on the DCS alert log agent, just to watch all things are on-going:</p>



<pre class="wp-block-code"><code>tail -f /opt/oracle/dcs/log/dcs-agent.log</code></pre>



<p class="wp-block-paragraph">And I could see, the following error:</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [17]">
2026-09-24 10:34:50,775 ERROR [DcsJobScheduler-Worker] [] c.o.d.c.e.ExceptionFactory: Failed to write to file: /tmp/dcsfiles/asm/asm_2026-09-24_10-34-50.0766_303.sql
DcsException{errorHttpCode=InternalError, msg=failed to write to file /tmp/dcsfiles/asm/asm_2026-09-24_10-34-50.0766_303.sql: No space left on device, msgId=12022, causedBy=java.io.IOException: No space left on device}
     at com.oracle.dcs.commons.exception.DcsException$Builder.build(DcsException.java:143)
     at com.oracle.dcs.commons.exception.ExceptionFactory.failWriteFile(ExceptionFactory.java:477)
     at com.oracle.dcs.commons.exception.ExceptionFactory.lambda$failWriteFileSupplier$18(ExceptionFactory.java:493)
     at com.oracle.dcs.commons.exception.ExceptionFactory.throwFailWriteFile(ExceptionFactory.java:832)
     at com.oracle.dcs.commons.utils.CommonsUtils.writeToSqlFile(CommonsUtils.java:2006)
     at com.oracle.dcs.agent.utils.db.SqlPlusHelper.runASMStatements(SqlPlusHelper.java:996)
     at com.oracle.dcs.agent.schedule.jobs.RebalanceMonitoringHelper.getRebalanceInfo(RebalanceMonitoringHelper.java:169)
     at com.oracle.dcs.agent.schedule.jobs.RebalanceMonitoringHelper.monitorRebalance(RebalanceMonitoringHelper.java:293)
     at com.oracle.dcs.agent.schedule.jobs.RebalanceMonitorJob.executeJob(RebalanceMonitorJob.java:100)
     at com.oracle.dcs.agent.schedule.jobs.RebalanceMonitorJob.run(RebalanceMonitorJob.java:62)
     at com.oracle.dcs.agent.schedule.DcsJobScheduler$DcsExecutionTask.run(DcsJobScheduler.java:572)
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
     at java.lang.Thread.run(Thread.java:750)
Caused by: java.io.IOException: No space left on device
     at java.io.FileOutputStream.writeBytes(Native Method)
     at java.io.FileOutputStream.write(FileOutputStream.java:326)
     at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:221)
     at sun.nio.cs.StreamEncoder.implClose(StreamEncoder.java:316)
     at sun.nio.cs.StreamEncoder.close(StreamEncoder.java:149)
     at java.io.OutputStreamWriter.close(OutputStreamWriter.java:233)
     at com.oracle.dcs.commons.utils.CommonsUtils.writeToSqlFile(CommonsUtils.java:2004)
     ... 9 more
2026-09-24 10:34:50,776 DEBUG [DcsJobScheduler-Worker] [] c.o.d.a.s.DcsJobScheduler: afterExecute() : Begin
</pre>
<br>



<h3>Resolution</h3>



<p class="wp-block-paragraph">I immediately checked Root File System:</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1]">
[root@node0 tmp]# df -h /tmp
Filesystem                          Size  Used Avail Use% Mounted on
/dev/mapper/VolGroupSys-LogVolRoot   30G   30G     0 100% /
</pre>
<br>



<p class="wp-block-paragraph">And root file system was full! No space left of device!</p>



<p class="wp-block-paragraph">How is it possible, knowing one of my pre-patching steps is to check /, /u01, /opt, and /boot file systems occupancies, to ensure that for /, /u01 and /opt I have at least 20 GB available space, running:</p>



<pre class="wp-block-code"><code>df -h / /u01 /opt /boot /opt/oracle/oak/pkgrepos/orapkgs/clones</code></pre>



<p class="wp-block-paragraph">Checking what could have taken all this space, I could see that a folder named oraapp was taking 23GB space in local root file system:</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1,16]">[root@node0 /]# du -sh *
0    bin
257M boot
3.7M core.oclumon.bin.89762
20M  dev
35M  etc
4.0M home
0    lib
0    lib64
16K  lost+found
4.0K media
92G  mnt
0    null
25G  opt
4.0K oracle-ahf-2511100.zip
23G  oraapp
0    proc
575M root
4.1G run
0    sbin
4.0K srv
0    sys
341M tmp
32G  u01
20K  u02
12K  u03
20K  u04
56K  u99
2.3G usr
1.5G var
[root@node0 /]#
</pre>
<br>



<p class="wp-block-paragraph">This folder with the name of the application was certainly not generated by the ODA patching. Contacting the customer we could realise that he has been writing some hourly synchronization script to sync application data between primary and standby, which is more than ok. And the data were copied on an ACFS File System that was created for this purpose. Which is totally ok. The problem is that the synchronization job was still running during the patching, and the patching will close all ASM resources. Bingo, the synchronization job created then of course locally a directory in root file system. With customer agreement I immediately deleted that directory.</p>



<p class="wp-block-paragraph">Lesson learned, we updated the patching MOP to have the new synchronization job stopped before patching.</p>



<p class="wp-block-paragraph">At the end the patching could anyhow run successfully.</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1,7]">
[root@node0 ~]# odacli describe-job -i 03c81877-9d76-426d-b6c8-a7da09ffca66

Job details
----------------------------------------------------------------
                     ID:  03c81877-9d76-426d-b6c8-a7da09ffca66
            Description:  Server Patching to 19.30.0.0.0
                 Status:  Success
                Created:  September 24, 2026 10:11:14 CEST
                Message:

Task Name                                Node Name                 Start Time                               End Time                                 Status
---------------------------------------- ------------------------- ---------------------------------------- ---------------------------------------- ----------------
Validate ILOM server reachable           node0                 September 24, 2026 10:11:24 CEST         September 24, 2026 10:11:24 CEST         Success
Validate ILOM server reachable           node1                 September 24, 2026 10:11:24 CEST         September 24, 2026 10:11:24 CEST         Success
Validating GI user metadata              node0                 September 24, 2026 10:11:24 CEST         September 24, 2026 10:11:24 CEST         Success
Validating GI user metadata              node1                 September 24, 2026 10:11:24 CEST         September 24, 2026 10:11:24 CEST         Success
Modify BM udev rules                     node0                 September 24, 2026 10:11:25 CEST         September 24, 2026 10:11:36 CEST         Success
Modify BM udev rules                     node1                 September 24, 2026 10:11:25 CEST         September 24, 2026 10:11:36 CEST         Success
Stop oakd                                node1                 September 24, 2026 10:11:40 CEST         September 24, 2026 10:11:43 CEST         Success
Creating local repository                node0                 September 24, 2026 10:11:43 CEST         September 24, 2026 10:11:45 CEST         Success
OSPatchBaseRepo
Creating local repository                node1                 September 24, 2026 10:11:43 CEST         September 24, 2026 10:11:45 CEST         Success
OSPatchBaseRepo
Updating versionlock plugin              node0                 September 24, 2026 10:11:45 CEST         September 24, 2026 10:11:48 CEST         Success
Updating versionlock plugin              node1                 September 24, 2026 10:11:45 CEST         September 24, 2026 10:11:48 CEST         Success
Applying OS Patches                      node0                 September 24, 2026 10:11:48 CEST         September 24, 2026 10:19:41 CEST         Success
Applying OS Patches                      node1                 September 24, 2026 10:11:48 CEST         September 24, 2026 10:19:24 CEST         Success
Creating local repository HMPPatchRepo   node0                 September 24, 2026 10:19:41 CEST         September 24, 2026 10:19:42 CEST         Success
Creating local repository HMPPatchRepo   node1                 September 24, 2026 10:19:41 CEST         September 24, 2026 10:19:42 CEST         Success
Applying HMP Patches                     node0                 September 24, 2026 10:19:42 CEST         September 24, 2026 10:19:45 CEST         Success
Applying HMP Patches                     node1                 September 24, 2026 10:19:42 CEST         September 24, 2026 10:19:44 CEST         Success
Setting SELinux mode                     node0                 September 24, 2026 10:19:45 CEST         September 24, 2026 10:19:45 CEST         Success
Setting SELinux mode                     node1                 September 24, 2026 10:19:45 CEST         September 24, 2026 10:19:45 CEST         Success
Starting the clusterware                 node1                 September 24, 2026 10:21:16 CEST         September 24, 2026 10:22:34 CEST         Success
Deconfigure AFD                          node1                 September 24, 2026 10:24:12 CEST         September 24, 2026 10:25:52 CEST         Success
Oda-hw-mgmt upgrade                      node0                 September 24, 2026 10:25:53 CEST         September 24, 2026 10:27:50 CEST         Success
Patch location validation                node0                 September 24, 2026 10:25:53 CEST         September 24, 2026 10:25:53 CEST         Success
Patch location validation                node1                 September 24, 2026 10:25:53 CEST         September 24, 2026 10:25:53 CEST         Success
Oda-hw-mgmt upgrade                      node1                 September 24, 2026 10:27:50 CEST         September 24, 2026 10:29:47 CEST         Success
Post Deconfigure AFD                     node1                 September 24, 2026 10:31:22 CEST         September 24, 2026 10:32:43 CEST         Success
OSS Patching                             node0                 September 24, 2026 10:32:43 CEST         September 24, 2026 10:32:44 CEST         Success
OSS Patching                             node1                 September 24, 2026 10:32:43 CEST         September 24, 2026 10:32:44 CEST         Success
Installing SQLcl software                node1                 September 24, 2026 10:32:44 CEST         September 24, 2026 10:32:47 CEST         Success
Applying Firmware local Disk Patches     node0                 September 24, 2026 10:32:47 CEST         September 24, 2026 10:32:51 CEST         Success
Applying Firmware local Disk Patches     node1                 September 24, 2026 10:32:51 CEST         September 24, 2026 10:32:55 CEST         Success
Applying Firmware local Controller Patch node0                 September 24, 2026 10:32:58 CEST         September 24, 2026 10:33:01 CEST         Success
Applying Firmware local Controller Patch node1                 September 24, 2026 10:33:01 CEST         September 24, 2026 10:40:45 CEST         Success
Checking Ilom patch Version              node0                 September 24, 2026 10:40:46 CEST         September 24, 2026 10:40:46 CEST         Success
Checking Ilom patch Version              node1                 September 24, 2026 10:40:46 CEST         September 24, 2026 10:40:46 CEST         Success
Patch location validation                node0                 September 24, 2026 10:40:46 CEST         September 24, 2026 10:40:46 CEST         Success
Patch location validation                node1                 September 24, 2026 10:40:46 CEST         September 24, 2026 10:40:46 CEST         Success
Save password in Wallet                  node1                 September 24, 2026 10:40:47 CEST         September 24, 2026 10:40:49 CEST         Success
Disabling IPMI v2                        node0                 September 24, 2026 10:40:49 CEST         September 24, 2026 10:40:50 CEST         Success
Disabling IPMI v2                        node1                 September 24, 2026 10:40:50 CEST         September 24, 2026 10:40:51 CEST         Success
Apply Ilom patch                         node0                 September 24, 2026 10:40:51 CEST         September 24, 2026 10:52:26 CEST         Success
Apply Ilom patch                         node1                 September 24, 2026 10:52:26 CEST         September 24, 2026 11:03:45 CEST         Success
Copying Flash Bios to Temp location      node0                 September 24, 2026 11:03:45 CEST         September 24, 2026 11:03:45 CEST         Success
Copying Flash Bios to Temp location      node1                 September 24, 2026 11:03:45 CEST         September 24, 2026 11:03:45 CEST         Success
Start oakd                               node1                 September 24, 2026 11:04:04 CEST         September 24, 2026 11:04:20 CEST         Success
Add SYSNAME in Env                       node1                 September 24, 2026 11:04:21 CEST         September 24, 2026 11:04:21 CEST         Success
Cleanup JRE Home                         node0                 September 24, 2026 11:04:21 CEST         September 24, 2026 11:04:21 CEST         Success
Cleanup JRE Home                         node1                 September 24, 2026 11:04:21 CEST         September 24, 2026 11:04:21 CEST         Success
Starting the clusterware                 node1                 September 24, 2026 11:05:51 CEST         September 24, 2026 11:07:08 CEST         Success
Update lvm.conf file                     node0                 September 24, 2026 11:07:09 CEST         September 24, 2026 11:07:09 CEST         Success
Update lvm.conf file                     node1                 September 24, 2026 11:07:09 CEST         September 24, 2026 11:07:09 CEST         Success
Generating and saving BOM                node0                 September 24, 2026 11:07:10 CEST         September 24, 2026 11:07:39 CEST         Success
Generating and saving BOM                node1                 September 24, 2026 11:07:10 CEST         September 24, 2026 11:07:37 CEST         Success
Update System full patch version         node0                 September 24, 2026 11:07:10 CEST         September 24, 2026 11:07:10 CEST         Success
Update System full patch version         node1                 September 24, 2026 11:07:10 CEST         September 24, 2026 11:07:10 CEST         Success
Update System rebootless patch version   node0                 September 24, 2026 11:07:10 CEST         September 24, 2026 11:07:10 CEST         Success
Update System rebootless patch version   node1                 September 24, 2026 11:07:10 CEST         September 24, 2026 11:07:10 CEST         Success
PreRebootNode Actions                    node0                 September 24, 2026 11:07:39 CEST         September 24, 2026 11:08:53 CEST         Success
PreRebootNode Actions                    node1                 September 24, 2026 11:08:53 CEST         September 24, 2026 11:10:03 CEST         Success
Reboot Node                              node1                 September 24, 2026 11:10:04 CEST         September 24, 2026 11:29:09 CEST         Success
Validate DCS Agent is up                 node1                 September 24, 2026 11:29:08 CEST         September 24, 2026 11:29:08 CEST         Success
Reboot Node                              node0                 September 24, 2026 11:29:10 CEST         September 24, 2026 11:48:15 CEST         Success
Validate DCS Agent is up                 node0                 September 24, 2026 11:48:15 CEST         September 24, 2026 11:48:15 CEST         Success

[root@node0 ~]#
</pre>
<br>



<p class="wp-block-paragraph">Checking the system, there was no really impact, expect some difference in old kernel in /boot between the two nodes (the synchronization script only run on node0), which was having no impact and would be resolved with next hop patching, and local controller firmware not been updated. The patching process had no space to copy the firmware patches locally on the appropriate directory.</p>



<p class="wp-block-paragraph">The other patching steps, grid and storage went successfully at well. At the end the components versions were as following:</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1,40]">
[root@node0 ~]# odacli describe-component
System Version
--------------
19.30.0.0.0

System Node Name
----------------
node0

Local System Version
--------------------
19.30.0.0.0

Component                                Installed Version    Available Version
---------------------------------------- -------------------- --------------------
OAK                                      19.30.0.0.0          up-to-date

GI                                       19.30.0.0.260120     up-to-date

DB {
     OraDB19000_home3                    19.26.0.0.250121     19.30.0.0.260120
     [cdbx9]
}

DCSCONTROLLER                            19.30.0.0.0          up-to-date

DCSCLI                                   19.30.0.0.0          up-to-date

DCSAGENT                                 19.30.0.0.0          up-to-date

DCSADMIN                                 19.30.0.0.0          up-to-date

OS                                       8.10                 up-to-date

ILOM                                     5.1.5.29.r167569     up-to-date

BIOS                                     62150200             up-to-date

LOCAL CONTROLLER FIRMWARE {
     [c3, c4]                            16.35.4030           16.35.8002
}

SHARED CONTROLLER FIRMWARE {
     [c1, c2]                            16.00.08.00          up-to-date
}

FIRMWAREEXPANDER {
     [c1x0, c2x0]                        0310                 up-to-date
}

LOCAL DISK FIRMWARE {
     [c0d0, c0d1]                        D3MU001              up-to-date
}

SHARED DISK FIRMWARE {
     [c1d0, c1d1, c1d2, c1d3, c1d4,      RXG0                 up-to-date
     c1d5, c1d6, c1d7, c1d8, c1d9,
     c1d10, c1d11, c1d12, c1d13,
     c1d14, c1d15, c1d16, c1d17,
     c1d18, c1d19, c1d20, c1d21,
     c1d22, c1d23, c2d0, c2d1, c2d2,
     c2d3, c2d4, c2d5, c2d6, c2d7,
     c2d8, c2d9, c2d10, c2d11, c2d12,
     c2d13, c2d14, c2d15, c2d16,
     c2d17, c2d18, c2d19, c2d20,
     c2d21, c2d22, c2d23]
}

HMP                                      2.4.10.1.600         up-to-date

System Node Name
----------------
node1

Local System Version
--------------------
19.30.0.0.0

Component                                Installed Version    Available Version
---------------------------------------- -------------------- --------------------
OAK                                      19.30.0.0.0          up-to-date

GI                                       19.30.0.0.260120     up-to-date

DB {
     OraDB19000_home3                    19.26.0.0.250121     19.30.0.0.260120
     [cdbx9]
}

DCSCONTROLLER                            19.30.0.0.0          up-to-date

DCSCLI                                   19.30.0.0.0          up-to-date

DCSAGENT                                 19.30.0.0.0          up-to-date

DCSADMIN                                 19.30.0.0.0          up-to-date

OS                                       8.10                 up-to-date

ILOM                                     5.1.5.29.r167569     up-to-date

BIOS                                     62150200             up-to-date

LOCAL CONTROLLER FIRMWARE {
     [c3, c4]                            16.35.8002           up-to-date
}

SHARED CONTROLLER FIRMWARE {
     [c1, c2]                            16.00.08.00          up-to-date
}

FIRMWAREEXPANDER {
     [c1x0, c2x0]                        0310                 up-to-date
}

LOCAL DISK FIRMWARE {
     [c0d0, c0d1]                        D3MU001              up-to-date
}

SHARED DISK FIRMWARE {
     [c1d0, c1d1, c1d2, c1d3, c1d4,      RXG0                 up-to-date
     c1d5, c1d6, c1d7, c1d8, c1d9,
     c1d10, c1d11, c1d12, c1d13,
     c1d14, c1d15, c1d16, c1d17,
     c1d18, c1d19, c1d20, c1d21,
     c1d22, c1d23, c2d0, c2d1, c2d2,
     c2d3, c2d4, c2d5, c2d6, c2d7,
     c2d8, c2d9, c2d10, c2d11, c2d12,
     c2d13, c2d14, c2d15, c2d16,
     c2d17, c2d18, c2d19, c2d20,
     c2d21, c2d22, c2d23]
}

HMP                                      2.4.10.1.600         up-to-date

[root@node0 ~]#
</pre>
<br>



<p class="wp-block-paragraph">As we can see the local controller firmware is not up to date on node 0 when updated on node1.</p>



<h3>Manual patching of local controller firmware</h3>



<p class="wp-block-paragraph">Let&#8217;s patch manually the local controller firmware on node0.</p>



<p class="wp-block-paragraph">Local controller firmware needs to be patched on node0 only:</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1,3,7]">
[root@node0 ~]# odacli describe-component | grep 'LOCAL CONTROLLER FIRMWARE' -A2
LOCAL CONTROLLER FIRMWARE {
     [c3, c4]                            16.35.4030           16.35.8002
}
--
LOCAL CONTROLLER FIRMWARE {
     [c3, c4]                            16.35.8002           up-to-date
}
[root@node0 ~]#
</pre>
<br>



<p class="wp-block-paragraph">Listing the controller, we can see that we need to patch c3 and c4 Mellanox controllers from 16.35.4030 to 16.35.8002 version for the fiber channel network cards:</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1,16,17]">
[root@node0 ~]# fwupdate list controller

WARNING: Due to strict MMIO memory settings in the running kernel some network controllers may not be accessible.
         See Hardware Management Pack documentation regarding iomem kernel settings required for
         firmware update of these devices.


==================================================
CONTROLLER
==================================================
ID    Type   Manufacturer   Model     Product Name               FW Version       BIOS Version   EFI Version    FCODE Version  Package Version  NVDATA Version    XML Support
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
c0    HDC    Intel          0x2826    0x4873                     -                -              -              -              -                -                 N/A
c1    SAS    LSI Logic      0x0097    ORCL-EXT-SAS3              16.00.08.00      08.37.00.00    18.00.00.00    01.00.68.00    -                14.01.00.13       N/A
c2    SAS    LSI Logic      0x0097    ORCL-EXT-SAS3              16.00.08.00      08.37.00.00    18.00.00.00    01.00.68.00    -                14.01.00.13       N/A
c3    NET    Mellanox       0x1017    Oracle 25GbE Dual-Port SFP 16.35.4030       -              14.29.15       -              -                -                 N/A
c4    NET    Mellanox       0x1017    Oracle 25GbE Dual-Port SFP 16.35.4030       -              14.29.15       -              -                -                 N/A
[root@node0 ~]#
</pre>
<br>



<p class="wp-block-paragraph">Let&#8217;s go in the appropriate mellanox firmware controller directory from the repository and check that version 8002 file is available:</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1,3]">
[root@node0 ~]# cd /opt/oracle/oak/pkgrepos/firmwarecontroller/mellanox/0x1017/16.35.8002/

[root@node0 16.35.8002]# ll
total 16392
-rw-r--r--. 1 root root      290 Feb 11  2026 componentmetadata.xml
-rw-r--r--. 1 root root 16777216 Feb 11  2026 fw-ConnectX5-rel-16_35_8002-8201339_Ax_Bx-UEFI-14.29.15.signed.bin
-rw-r--r--. 1 root root     2463 Feb 11  2026 metadata.xml
[root@node0 16.35.8002]#
</pre>
<br>



<p class="wp-block-paragraph">Let&#8217;s update c3 controller:</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1]">
[root@node0 16.35.8002]# fwupdate update controller -n c3 -x metadata.xml

The following actions will be taken:
==========================================================
ID        Priority Action      Status      Old Firmware Ver.   Proposed Ver.       New Firmware Ver.   System Reboot
---------------------------------------------------------------------------------------------------------------------------
c3        1        Check FW    Success     16.35.4030          16.35.8002          N/A                 N/A
Do you wish to process the above actions? [y/n]? y
Update of c3 to 16.35.8002.
Updating c3: Success

Verifying all priority 1 updates

Execution Summary
==========================================================
ID        Priority Action      Status      Old Firmware Ver.   Proposed Ver.       New Firmware Ver.   System Reboot
---------------------------------------------------------------------------------------------------------------------------
c3        1        Validate    Success     16.35.4030          16.35.8002          16.35.8002          N/A
[root@node0 16.35.8002]#
</pre>
<br>



<p class="wp-block-paragraph">And c4 controller:</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1]">
[root@node0 16.35.8002]# fwupdate update controller -n c4 -x metadata.xml

The following actions will be taken:
==========================================================
ID        Priority Action      Status      Old Firmware Ver.   Proposed Ver.       New Firmware Ver.   System Reboot
---------------------------------------------------------------------------------------------------------------------------
c4        1        Check FW    Success     16.35.4030          16.35.8002          N/A                 N/A
Do you wish to process the above actions? [y/n]? y
Update of c4 to 16.35.8002.
Updating c4: Success

Verifying all priority 1 updates

Execution Summary
==========================================================
ID        Priority Action      Status      Old Firmware Ver.   Proposed Ver.       New Firmware Ver.   System Reboot
---------------------------------------------------------------------------------------------------------------------------
c4        1        Validate    Success     16.35.4030          16.35.8002          16.35.8002          N/A
</pre>
<br>



<p class="wp-block-paragraph">Let&#8217;s check and confirm that all is ok, listing the controllers:</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1,16,17]">
[root@node0 16.35.8002]# fwupdate list controller

WARNING: Due to strict MMIO memory settings in the running kernel some network controllers may not be accessible.
         See Hardware Management Pack documentation regarding iomem kernel settings required for
         firmware update of these devices.


==================================================
CONTROLLER
==================================================
ID    Type   Manufacturer   Model     Product Name               FW Version       BIOS Version   EFI Version    FCODE Version  Package Version  NVDATA Version    XML Support
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
c0    HDC    Intel          0x2826    0x4873                     -                -              -              -              -                -                 N/A
c1    SAS    LSI Logic      0x0097    ORCL-EXT-SAS3              16.00.08.00      08.37.00.00    18.00.00.00    01.00.68.00    -                14.01.00.13       N/A
c2    SAS    LSI Logic      0x0097    ORCL-EXT-SAS3              16.00.08.00      08.37.00.00    18.00.00.00    01.00.68.00    -                14.01.00.13       N/A
c3    NET    Mellanox       0x1017    Oracle 25GbE Dual-Port SFP 16.35.8002       -              14.29.15       -              -                -                 N/A
c4    NET    Mellanox       0x1017    Oracle 25GbE Dual-Port SFP 16.35.8002       -              14.29.15       -              -                -                 N/A
[root@node0 16.35.8002]#
</pre>
<br>



<p class="wp-block-paragraph">We can check and see that now all both nodes local controller firmware are up to date:</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1]">
[root@node0 16.35.8002]# odacli describe-component | grep 'LOCAL CONTROLLER FIRMWARE' -A2
LOCAL CONTROLLER FIRMWARE {
     [c3, c4]                            16.35.8002           up-to-date
}
--
LOCAL CONTROLLER FIRMWARE {
     [c3, c4]                            16.35.8002           up-to-date
}
[root@node0 16.35.8002]#
</pre>
<br>



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



<p class="wp-block-paragraph">And finally all our ODA components are up to date.</p>



<pre class="brush: sql; gutter: true; first-line: 1; highlight: [1]">
[root@node0 16.35.8002]# odacli describe-component
System Version
--------------
19.30.0.0.0

System Node Name
----------------
node0

Local System Version
--------------------
19.30.0.0.0

Component                                Installed Version    Available Version
---------------------------------------- -------------------- --------------------
OAK                                      19.30.0.0.0          up-to-date

GI                                       19.30.0.0.260120     up-to-date

DB {
     OraDB19000_home3                    19.26.0.0.250121     19.30.0.0.260120
     [cdbx9]
}

DCSCONTROLLER                            19.30.0.0.0          up-to-date

DCSCLI                                   19.30.0.0.0          up-to-date

DCSAGENT                                 19.30.0.0.0          up-to-date

DCSADMIN                                 19.30.0.0.0          up-to-date

OS                                       8.10                 up-to-date

ILOM                                     5.1.5.29.r167569     up-to-date

BIOS                                     62150200             up-to-date

LOCAL CONTROLLER FIRMWARE {
     [c3, c4]                            16.35.8002           up-to-date
}

SHARED CONTROLLER FIRMWARE {
     [c1, c2]                            16.00.08.00          up-to-date
}

FIRMWAREEXPANDER {
     [c1x0, c2x0]                        0310                 up-to-date
}

LOCAL DISK FIRMWARE {
     [c0d0, c0d1]                        D3MU001              up-to-date
}

SHARED DISK FIRMWARE {
     [c1d0, c1d1, c1d2, c1d3, c1d4,      RXG0                 up-to-date
     c1d5, c1d6, c1d7, c1d8, c1d9,
     c1d10, c1d11, c1d12, c1d13,
     c1d14, c1d15, c1d16, c1d17,
     c1d18, c1d19, c1d20, c1d21,
     c1d22, c1d23, c2d0, c2d1, c2d2,
     c2d3, c2d4, c2d5, c2d6, c2d7,
     c2d8, c2d9, c2d10, c2d11, c2d12,
     c2d13, c2d14, c2d15, c2d16,
     c2d17, c2d18, c2d19, c2d20,
     c2d21, c2d22, c2d23]
}

HMP                                      2.4.10.1.600         up-to-date

System Node Name
----------------
node1

Local System Version
--------------------
19.30.0.0.0

Component                                Installed Version    Available Version
---------------------------------------- -------------------- --------------------
OAK                                      19.30.0.0.0          up-to-date

GI                                       19.30.0.0.260120     up-to-date

DB {
     OraDB19000_home3                    19.26.0.0.250121     19.30.0.0.260120
     [cdbx9]
}

DCSCONTROLLER                            19.30.0.0.0          up-to-date

DCSCLI                                   19.30.0.0.0          up-to-date

DCSAGENT                                 19.30.0.0.0          up-to-date

DCSADMIN                                 19.30.0.0.0          up-to-date

OS                                       8.10                 up-to-date

ILOM                                     5.1.5.29.r167569     up-to-date

BIOS                                     62150200             up-to-date

LOCAL CONTROLLER FIRMWARE {
     [c3, c4]                            16.35.8002           up-to-date
}

SHARED CONTROLLER FIRMWARE {
     [c1, c2]                            16.00.08.00          up-to-date
}

FIRMWAREEXPANDER {
     [c1x0, c2x0]                        0310                 up-to-date
}

LOCAL DISK FIRMWARE {
     [c0d0, c0d1]                        D3MU001              up-to-date
}

SHARED DISK FIRMWARE {
     [c1d0, c1d1, c1d2, c1d3, c1d4,      RXG0                 up-to-date
     c1d5, c1d6, c1d7, c1d8, c1d9,
     c1d10, c1d11, c1d12, c1d13,
     c1d14, c1d15, c1d16, c1d17,
     c1d18, c1d19, c1d20, c1d21,
     c1d22, c1d23, c2d0, c2d1, c2d2,
     c2d3, c2d4, c2d5, c2d6, c2d7,
     c2d8, c2d9, c2d10, c2d11, c2d12,
     c2d13, c2d14, c2d15, c2d16,
     c2d17, c2d18, c2d19, c2d20,
     c2d21, c2d22, c2d23]
}

HMP                                      2.4.10.1.600         up-to-date

[root@node0 16.35.8002]#
</pre>
<br>



<p class="wp-block-paragraph">We could see how easy it is to manually patch local controller firmware on the ODA, which helps to mitigate patching issues impacted by customized script. This is why, knowing we are speaking about appliance, it is always good to avoid the most we can any customization, and if doing some to well document it.</p>
<p>L’article <a href="https://www.dbi-services.com/blog/manual-local-controller-firmware-update-during-oda-patching/">Manual local controller firmware update during ODA Patching</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/manual-local-controller-firmware-update-during-oda-patching/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Name resolution of Oracle</title>
		<link>https://www.dbi-services.com/blog/name-resolution-of-oracle/</link>
					<comments>https://www.dbi-services.com/blog/name-resolution-of-oracle/#respond</comments>
		
		<dc:creator><![CDATA[Martin Bracher]]></dc:creator>
		<pubDate>Wed, 28 Oct 2026 15:14:22 +0000</pubDate>
				<category><![CDATA[Database management]]></category>
		<category><![CDATA[Oracle]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=48198</guid>

					<description><![CDATA[<p>This blog post is a follow-up of TNS_ADMIN – which *.ora files Oracle will use. There, the main focus was to find out if a running database instance will use a TNS_ADMIN environment or the binary defaults. In this blog post we will analyze much more the internal mechanisms to find the *.ora files, which [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/name-resolution-of-oracle/">Name resolution of Oracle</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">This blog post is a follow-up of <a href="https://www.dbi-services.com/blog/tns_admin-which-ora-files-oracle-will-use/" data-type="post" data-id="41089">TNS_ADMIN – which *.ora files Oracle will use</a>. There, the main focus was to find out if a running database instance will use a TNS_ADMIN environment or the binary defaults.</p>



<p class="wp-block-paragraph">In this blog post we will analyze much more the internal mechanisms to find the *.ora files, which offered a few surprises. You will see many tracing output. If you are only interested in the summary, scroll down to the end <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<h2 id="h-local-and-remote-connections" class="wp-block-heading">Local and remote connections</h2>



<p class="wp-block-paragraph">To connect to an Oracle database, you can do that locally </p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
sqlplus appuser/password
sqlplus appuser    #asks for password
sqlplus / as sysdba
</pre></div>


<p class="wp-block-paragraph">In this case, it connects locally to the current environment of ORACLE_HOME and ORACLE_SID. No listener is involved for that.</p>



<p class="wp-block-paragraph">For a remote connection, you have to connect to a listener (defined by hostname and port), and specifying the desired SID or SERVICE_NAME for which the listener should start a process for you. The easiest form is EZCONNECT: host:port/service, but usually you will use an alias that will be resolved to the destination. These aliases are defined in the tnsnames.ora file or an ldap server specified in ldap.ora. For how to setup an ldap server, see my blog post <a href="https://www.dbi-services.com/blog/setup-an-ldap-server-for-oracle-naming-on-enterprise-linux-9/" data-type="post" data-id="46966">Setup an LDAP server for Oracle naming on Enterprise Linux 9</a></p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; title: ; notranslate">
MYAPP.DBI-SERVICES.COM =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = host01)(PORT = 1521))
    (CONNECT_DATA =
      (SERVICE_NAME = PDBMYAPP.dbi-services.com)
    )
  )
</pre></div>


<p class="wp-block-paragraph">To connect to that database remotely, you can use</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
sqlplus appuser/password@//host01:1521/pdbmyapp.dbi-services.com
sqlplus appuser/password@myapp.dbi-services.com
sqlplus appuser/password@myapp  #if names.default_domain=dbi-services.com
</pre></div>


<h2 id="h-location-of-the-oracle-network-configuration-ora-files" class="wp-block-heading">Location of the Oracle network configuration (*.ora files)</h2>



<h3 id="h-without-tns-admin" class="wp-block-heading">Without TNS_ADMIN</h3>



<p class="wp-block-paragraph">And where is sqlplus or tnsping looking for the configuration files? As an old, experienced administrator, I would expect it in the directory of the <code>$TNS_ADMIN</code> variable, or if unset, in <code>$ORACLE_HOME/network/admin</code>. Or if you are using the nice feature of the Read-Only ORACLE_HOME (ROOH) where configuration and logs are relocated to ORACLE_BASE (<code>roohctl -enable</code>), it will be in <code>$ORACLE_BASE/homes/&lt;home_name&gt;/network/admin</code>. I will call the directory as <code><strong>$DEFAULT_TNS</strong></code> and it points, depending if ROOH or non-ROOH, to the corresponding network/admin directory. </p>



<p class="wp-block-paragraph">Hint: My home for the tests is such a ROOH home. If you have a non-ROOH home, simply set DEFAULT_TNS to $ORACLE_HOME/network admin.</p>



<h4 id="h-tracing-with-strace" class="wp-block-heading">Tracing with strace</h4>



<p class="wp-block-paragraph">But is my expectation of name resolution really correct? On Linux, we can see with the <code>strace</code> binary what the tool will look for:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
strace sqlplus -S -L a/b@xyz 2&gt;&amp;1 |grep -E &#039;\.ora&#039;
</pre></div>


<p class="wp-block-paragraph">I will use an alias that does not exist (@xyz). strace prints the output on STDERR, so I will redirect it to STDOUT (2&gt;&amp;1) and filter the whole output for &#8220;.ora&#8221;. I use the ORACLE_HOME=/u00/app/oracle/product/19.32.0 where no Oracle newtork configuration is present:</p>



<pre class="wp-block-code"><code>lstat("/u00/app/oracle/product/19.32.0/env.ora", {st_mode=S_IFREG|0644, st_size=852, ...}) = 0
openat(AT_FDCWD, "/u00/app/oracle/product/19.32.0/env.ora", O_RDONLY) = 3
access("/u00/app/oracle/homes/OraDB19Home2/network/admin/sqlnet.ora", F_OK) = -1 ENOENT (No such file or directory)
access("/home/oracle/.sqlnet.ora", F_OK) = -1 ENOENT (No such file or directory)
access("/u00/app/oracle/homes/OraDB19Home2/network/admin/sqlnet.ora", F_OK) = -1 ENOENT (No such file or directory)
access("/etc/intchg.ora", F_OK)         = -1 ENOENT (No such file or directory)
access("/u00/app/oracle/homes/OraDB19Home2/network/admin/intchg.ora", F_OK) = -1 ENOENT (No such file or directory)
access("/etc/tnsnav.ora", F_OK)         = -1 ENOENT (No such file or directory)
access("/u00/app/oracle/homes/OraDB19Home2/network/admin/tnsnav.ora", F_OK) = -1 ENOENT (No such file or directory)
access("/home/oracle/.tnsnames.ora", F_OK) = -1 ENOENT (No such file or directory)
access("/etc/tnsnames.ora", F_OK)       = -1 ENOENT (No such file or directory)
access("/u00/app/oracle/homes/OraDB19Home2/network/admin/tnsnames.ora", F_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/u00/app/oracle/product/19.32.0/ldap/admin/fips.ora", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/u00/app/oracle/product/19.32.0/ldap/admin/fips.ora", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/u00/app/oracle/product/19.32.0/ldap/admin/ldap.ora", 0x7fff8d79e530) = -1 ENOENT (No such file or directory)
stat("/u00/app/oracle/product/19.32.0/network/admin/ldap.ora", 0x7fff8d79e530) = -1 ENOENT (No such file or directory)
stat("/u00/app/oracle/homes/OraDB19Home2/network/admin/ldap.ora", 0x7fff8d79e620) = -1 ENOENT (No such file or directory)</code></pre>



<ul class="wp-block-list">
<li><code>$ORACLE_HOME/env.ora</code> : First surprise, a file that was not known to me. In this file you can set environment variables. Here you can set a TNS_ADMIN variable as a fallback if it is not yet set in the environment.</li>



<li><code>/u00/app/oracle/homes/OraDB19Home2/network/admin/sqlnet.ora</code>: The next one is the <code>$DEFAULT_TNS</code> location which is expected for me</li>



<li><code>/home/oracle/.sqlnet.ora</code> : Did you know that it looks for a &#8220;.sqlnet.ora&#8221; (mind the dot!) in your home-directory?</li>



<li><code>intchg.ora / tnsnav.ora</code> : seems to be related to network &#8220;communities&#8221; and routing, not naming resolution.</li>



<li><code>/home/oracle/.tnsnames.ora</code> : It also looks for a .tnsnames.ora (mind the dot!) in the user&#8217;s home.</li>



<li><code>/etc/tnsnames.ora</code> : I have never seen that before &#8230;</li>



<li><code>/u00/app/oracle/homes/OraDB19Home2/network/admin/tnsnames.ora</code> : expected <code>$DEFAULT_TNS</code> location</li>



<li><code>fips.ora</code> : Related to cryptography (US government Federal Information Processing Standards)</li>



<li><code>/u00/app/oracle/product/19.32.0/ldap/admin/ldap.ora</code> : It is a home configured for ROOH. Why it looks here? Probably a bug&#8230;</li>



<li><code>/u00/app/oracle/homes/OraDB19Home2/network/admin/ldap.ora</code> : That is what I expected.</li>
</ul>



<p class="wp-block-paragraph">Summary: 1st, it looks for an sqlnet.ora (to determine name resolution order and default domain); Then, it looks for a tnsnames.ora, then for an ldap server</p>



<p class="wp-block-paragraph">Next, I will create a <code>/home/oracle/.sqlnet.ora</code> and trace what happens:</p>



<pre class="wp-block-code"><code>$ strace sqlplus -S -L a/b@xyz 2&gt;&amp;1 |grep -E '\.ora'
access("/u00/app/oracle/homes/OraDB19Home2/network/admin/sqlnet.ora", F_OK) = -1 ENOENT (No such file or directory)
access("/home/oracle/.sqlnet.ora", F_OK) = 0
openat(AT_FDCWD, "/home/oracle/.sqlnet.ora", O_RDONLY) = 6
access("/u00/app/oracle/homes/OraDB19Home2/network/admin/sqlnet.ora", F_OK) = -1 ENOENT (No such file or directory)</code></pre>



<p class="wp-block-paragraph">It opens my .sqlnet.ora, but it also tries to open the sqlnet.ora of the <code>$DEFAULT_TNS</code>. I assume it will use it as fallback for parameters not present in $HOME/.sqlnet.ora; let&#8217;s try: </p>



<h4 id="h-create-a-test-configuration" class="wp-block-heading">Create a test configuration</h4>



<p class="wp-block-paragraph">I create a configuration with </p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; title: ; notranslate">
# /u00/app/oracle/homes/OraDB19Home2/network/admin/sqlnet.ora
names.default_domain = dbi-services.com
SQLNET.EXPIRE_TIME = 10
</pre></div>

<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; title: ; notranslate">
# /home/oracle/.sqlnet.ora
names.default_domain = dbi.internal
SQLNET.EXPIRE_TIME = 10
</pre></div>

<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; title: ; notranslate">
#  /u00/app/oracle/homes/OraDB19Home2/network/admin/
DBI.dbi-services.com = ...
</pre></div>

<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; title: ; notranslate">
# /home/oracle/.tnsnames.ora
EXT.dbi-services.com = ...
INT.dbi.internal = ...
</pre></div>


<p class="wp-block-paragraph">Then, I try to connect:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
sqlplus a/b@EXT  # ORA-12154: TNS:could not resolve the connect identifier specified
sqlplus a/b@INT   # it can resolve it and connects (default_domain of $HOME/.sqlnet.ora)
</pre></div>


<p class="wp-block-paragraph">The domain of <code>$HOME/.sqlnet.ora</code> is used. If I remove the default domain from the <code>$HOME/.sqlnet.ora</code>:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
sqlplus a/b@EXT  # it can resolve it and connects (using default_domain of $DEFAULT_TNS/sqlnet.ora)
sqlplus a/b@INT   # ORA-12154: TNS:could not resolve the connect identifier specified
</pre></div>


<p class="wp-block-paragraph">That means, values in <code>$HOME/.sqlnet.ora</code> will override values of the default <code>$DEFAULT_TNS/sqlnet.ora</code>. The same applies to $HOME/.tnsnames.ora, it overrides entries in the default tnsnames.ora</p>



<p class="wp-block-paragraph">And what about the <code>/etc/tnsnames.ora</code>? Create it:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; title: ; notranslate">
# /etc/tnsnames.ora
ETC.dbi-services.com = ...
</pre></div>

<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
sqlplus a/b@ETC.dbi-services.com
sqlplus a/b@INT.dbi.internal 
sqlplus a/b@EXT.dbi-services.com   # ORA-12154: TNS:could not resolve the connect identifier specified
sqlplus a/b@ETC
</pre></div>


<p class="wp-block-paragraph">If it is present, the default tnsnames.ora in the <code>$DEFAULT_TNS</code> is ignored (it will not find the EXT.dbi-services.com), but the <code>$HOME/.tnsnames.ora</code> has precedence (it can resolve INT.dbi.internal). And we can also see that the default-domain for &#8220;@ETC&#8221; is taken from the <code>$DEFAULT_TNS/sqlnet.ora</code> (in <code>$HOME/.sqlnet.ora</code> it is not defined).</p>



<h3 id="h-with-tns-admin" class="wp-block-heading">With TNS_ADMIN</h3>



<p class="wp-block-paragraph"><code>TNS_ADMIN</code> is the variable to explicitly specify the location of the *.ora configuration files. If it is not set in your shell, Oracle looks for it in <code>$ORACLE_HOME/env.ora</code>;<br>It is usually used to centralize the configuration for all ORACLE_HOME&#8217;s in one directory. We recommend <code>${ORACLE_BASE}/network/admin</code>. </p>



<p class="wp-block-paragraph">First, I will use an empty TNS_ADMIN directory with no *.ora files</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
mkdir /tmp/empty
export TNS_ADMIN=/tmp/empty
strace sqlplus -S -L a/b@abc 2&gt;&amp;1 |grep -E &quot;\.ora&quot;|grep -vE &#039;tnsnav|intchg|fips&#039;
</pre></div>


<pre class="wp-block-code"><code>lstat("/u00/app/oracle/product/19.32.0/env.ora", {st_mode=S_IFREG|0644, st_size=852, ...}) = 0
openat(AT_FDCWD, "/u00/app/oracle/product/19.32.0/env.ora", O_RDONLY) = 3
access("/tmp/empty/sqlnet.ora", F_OK)   = -1 ENOENT (No such file or directory)
access("/u00/app/oracle/homes/OraDB19Home2/network/admin/sqlnet.ora", F_OK) = 0
openat(AT_FDCWD, "/u00/app/oracle/homes/OraDB19Home2/network/admin/sqlnet.ora", O_RDONLY) = 6
access("/home/oracle/.sqlnet.ora", F_OK) = 0
openat(AT_FDCWD, "/home/oracle/.sqlnet.ora", O_RDONLY) = 6
access("/tmp/empty/sqlnet.ora", F_OK)   = -1 ENOENT (No such file or directory)
access("/u00/app/oracle/homes/OraDB19Home2/network/admin/sqlnet.ora", F_OK) = 0
openat(AT_FDCWD, "/u00/app/oracle/homes/OraDB19Home2/network/admin/sqlnet.ora", O_RDONLY) = 8
access("/home/oracle/.tnsnames.ora", F_OK) = 0
access("/tmp/empty/tnsnames.ora", F_OK) = -1 ENOENT (No such file or directory)
access("/etc/tnsnames.ora", F_OK)       = 0
stat("/home/oracle/.tnsnames.ora", {st_mode=S_IFREG|0644, st_size=716, ...}) = 0
openat(AT_FDCWD, "/home/oracle/.tnsnames.ora", O_RDONLY) = 9
stat("/etc/tnsnames.ora", {st_mode=S_IFREG|0644, st_size=579, ...}) = 0
openat(AT_FDCWD, "/etc/tnsnames.ora", O_RDONLY) = 9
stat("/u00/app/oracle/product/19.32.0/ldap/admin/ldap.ora", 0x7ffde1f5b730) = -1 ENOENT (No such file or directory)
stat("/tmp/empty/ldap.ora", 0x7ffde1f5b730) = -1 ENOENT (No such file or directory)
stat("/u00/app/oracle/product/19.32.0/network/admin/ldap.ora", 0x7ffde1f5b730) = -1 ENOENT (No such file or directory)
stat("/u00/app/oracle/homes/OraDB19Home2/network/admin/ldap.ora", 0x7ffde1f5b820) = -1 ENOENT (No such file or directory)
stat("/home/oracle/.tnsnames.ora", {st_mode=S_IFREG|0644, st_size=716, ...}) = 0
stat("/etc/tnsnames.ora", {st_mode=S_IFREG|0644, st_size=579, ...}) = 0
...</code></pre>



<p class="wp-block-paragraph">If TNS_ADMIN is set, but the directory is empty, it will fallback to the order as above. <br>Now I will set it to a directory with an sqlnet.ora file and no tnsnames.ora, and I delete the /etc/tnsnames.ora:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
mkdir /tmp/admin; cp $ORACLE_BASE/network/admin/sqlnet.ora /tmp/admin/
export TNS_ADMIN=/tmp/admin
strace sqlplus -S -L a/b@abc 2&gt;&amp;1 |grep -E &#039;tnsnames|sqlnet&#039;
</pre></div>


<pre class="wp-block-code"><code>access("/tmp/admin/sqlnet.ora", F_OK)   = 0
openat(AT_FDCWD, "/tmp/admin/sqlnet.ora", O_RDONLY) = 6
access("/home/oracle/.sqlnet.ora", F_OK) = 0
openat(AT_FDCWD, "/home/oracle/.sqlnet.ora", O_RDONLY) = 6
access("/tmp/admin/sqlnet.ora", F_OK)   = 0
openat(AT_FDCWD, "/tmp/admin/sqlnet.ora", O_RDONLY) = 8
access("/home/oracle/.tnsnames.ora", F_OK) = 0
access("/tmp/admin/tnsnames.ora", F_OK) = -1 ENOENT (No such file or directory)
access("/etc/tnsnames.ora", F_OK)       = -1 ENOENT (No such file or directory)
access("/u00/app/oracle/homes/OraDB19Home2/network/admin/tnsnames.ora", F_OK) = 0
stat("/home/oracle/.tnsnames.ora", {st_mode=S_IFREG|0644, st_size=716, ...}) = 0
openat(AT_FDCWD, "/home/oracle/.tnsnames.ora", O_RDONLY) = 12
stat("/u00/app/oracle/homes/OraDB19Home2/network/admin/tnsnames.ora", {st_mode=S_IFREG|0644, st_size=432, ...}) = 0
openat(AT_FDCWD, "/u00/app/oracle/homes/OraDB19Home2/network/admin/tnsnames.ora", O_RDONLY) = 12
stat("/home/oracle/.tnsnames.ora", {st_mode=S_IFREG|0644, st_size=716, ...}) = 0
stat("/u00/app/oracle/homes/OraDB19Home2/network/admin/tnsnames.ora", {st_mode=S_IFREG|0644, st_size=432, ...}) = 0
...</code></pre>



<p class="wp-block-paragraph">It takes the <code>$TNS_ADMIN/sqlnet.ora</code> and ignores the <code>$DEFAULT_TNS/sqlnet.ora</code>. It will not find the <code>$TNS_ADMIN/tnsnames.ora</code> (does not exist) and not the <code>/etc/tnsnames.ora</code> (I removed it before), so it uses the default in <code>$DEFAULT_TNS</code>. </p>



<p class="wp-block-paragraph">For the next try I will add the tnsnames.ora to the TNS_ADMIN.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
cp $ORACLE_BASE/network/admin/tnsnames.ora /tmp/admin
export TNS_ADMIN=/tmp/admin
strace sqlplus -S -L a/b@abc 2&gt;&amp;1 |grep -E &#039;tnsnames|sqlnet&#039;
</pre></div>


<pre class="wp-block-code"><code>access("/tmp/admin/sqlnet.ora", F_OK)   = 0
openat(AT_FDCWD, "/tmp/admin/sqlnet.ora", O_RDONLY) = 6
access("/home/oracle/.sqlnet.ora", F_OK) = 0
openat(AT_FDCWD, "/home/oracle/.sqlnet.ora", O_RDONLY) = 6
access("/tmp/admin/sqlnet.ora", F_OK)   = 0
openat(AT_FDCWD, "/tmp/admin/sqlnet.ora", O_RDONLY) = 8
access("/home/oracle/.tnsnames.ora", F_OK) = 0
access("/tmp/admin/tnsnames.ora", F_OK) = 0
stat("/home/oracle/.tnsnames.ora", {st_mode=S_IFREG|0644, st_size=716, ...}) = 0
openat(AT_FDCWD, "/home/oracle/.tnsnames.ora", O_RDONLY) = 12
stat("/tmp/admin/tnsnames.ora", {st_mode=S_IFREG|0644, st_size=11319, ...}) = 0
openat(AT_FDCWD, "/tmp/admin/tnsnames.ora", O_RDONLY) = 12
read(12, "# tnsnames.ora Network Configura"..., 4096) = 4096
stat("/home/oracle/.tnsnames.ora", {st_mode=S_IFREG|0644, st_size=716, ...}) = 0
stat("/tmp/admin/tnsnames.ora", {st_mode=S_IFREG|0644, st_size=11319, ...}) = 0
...</code></pre>



<p class="wp-block-paragraph">As expected, it finds the <code>$TNS_ADMIN/tnsnames.ora</code> and it no longer looks for it in the <code>$DEFAULT_TNS/tnsnames.ora</code>. And this was not quite clear to me: it will no longer look for the <code>/etc/tnsnames.ora</code> file. It is only used if TNS_ADMIN is NOT set! </p>



<h3 id="h-ldap-ora" class="wp-block-heading">ldap.ora</h3>



<p class="wp-block-paragraph">And what about the LDAP connections (defined in ldap.ora)? Currently there is no ldap.ora present. Without TNS_ADMIN:</p>



<pre class="wp-block-code"><code>stat("/u00/app/oracle/product/19.32.0/ldap/admin/ldap.ora", 0x7ffdb464fd30) = -1 ENOENT (No such file or directory)<br>stat("/u00/app/oracle/product/19.32.0/network/admin/ldap.ora", 0x7ffdb464fd30) = -1 ENOENT (No such file or directory)<br>stat("/u00/app/oracle/homes/OraDB19Home2/network/admin/ldap.ora", 0x7ffdb464fe20) = -1 ENOENT (No such file or directory)</code></pre>



<p class="wp-block-paragraph">&#8220;Works as designed&#8221; or a bug: it first looks in $ORACLE_HOME, instead of the ROOH admin direcory. </p>



<p class="wp-block-paragraph">And with TNS_ADMIN set, but without ldap.ora</p>



<pre class="wp-block-code"><code>stat("/u00/app/oracle/product/19.32.0/ldap/admin/ldap.ora", 0x7ffcb23acdb0) = -1 ENOENT (No such file or directory)
stat("/tmp/admin/ldap.ora", 0x7ffcb23acdb0) = -1 ENOENT (No such file or directory)
stat("/u00/app/oracle/product/19.32.0/network/admin/ldap.ora", 0x7ffcb23acdb0) = -1 ENOENT (No such file or directory)
stat("/u00/app/oracle/homes/OraDB19Home2/network/admin/ldap.ora", 0x7ffcb23acea0) = -1 ENOENT (No such file or directory)</code></pre>



<p class="wp-block-paragraph">Now I set in TNS_ADMIN the names.directory_path=(LDAP) and add the ldap.ora file</p>



<pre class="wp-block-code"><code>stat("/u00/app/oracle/product/19.32.0/ldap/admin/ldap.ora", 0x7ffdb55680b0) = -1 ENOENT (No such file or directory)
stat("/tmp/admin/ldap.ora", {st_mode=S_IFREG|0644, st_size=500, ...}) = 0
stat("/tmp/admin/ldap.ora", {st_mode=S_IFREG|0644, st_size=500, ...}) = 0
openat(AT_FDCWD, "/tmp/admin/ldap.ora", O_RDONLY) = 12
...</code></pre>



<p class="wp-block-paragraph">And it works! But what if I create an ldap.ora in the ORACLE_HOME? I create it with an invalid ldap host.</p>



<pre class="wp-block-code"><code>stat("/u00/app/oracle/product/19.32.0/ldap/admin/ldap.ora", {st_mode=S_IFREG|0644, st_size=501, ...}) = 0
stat("/u00/app/oracle/product/19.32.0/ldap/admin/ldap.ora", {st_mode=S_IFREG|0644, st_size=501, ...}) = 0
openat(AT_FDCWD, "/u00/app/oracle/product/19.32.0/ldap/admin/ldap.ora", O_RDONLY) = 12</code></pre>



<p class="wp-block-paragraph">We can see that it only uses the <code>$ORACLE_HOME/ldap/admin/ldap.ora</code>, and not the <code>$TNS_ADMIN/ldap.ora</code>! For me, that is a bug. For all other *.ora files the TNS_ADMIN variable is respected, but not for ldap.ora!</p>



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



<p class="wp-block-paragraph">To resolve an sql*net alias, which configuration files <code>sqlplus</code> will use?</p>



<p class="wp-block-paragraph">My stone-age knowledge that the *.ora files in $TNS_ADMIN are used, and if TNS_ADMIN is not set, then it uses the files in the <code>$DEFAULT_TNS</code>. That&#8217;s mostly correct (or at least not completely wrong), but there are some differences.  My most important findings:</p>



<p class="wp-block-paragraph">If a file in TNS_ADMIN does not exist, it looks in other locations. If a file .sqlnet.ora or .tnsnames.ora (with leading dot) in $HOME exists, the normal *.ora files will be used, but entries in the dot files has precedence. And if there is a file /etc/tnsnames.ora and TNS_ADMIN is <strong>not</strong> set, it will use it. And it ignores a $TNS_ADMIN/ldap.ora if there is one in $ORACLE_HOME/ldap/admin/.</p>



<h3 id="h-sqlnet-ora-network-defaults" class="wp-block-heading">sqlnet.ora (Network defaults)</h3>



<p class="wp-block-paragraph">The relevant parameters for name resolution are <code>NAMES.DEFAULT_DOMAIN </code>and <code>NAMES.DIRECTORY_PATH</code>. <br>It uses the sqlnet.ora in:</p>



<ul class="wp-block-list">
<li><code>$HOME/.sqlnet.ora</code> : (mind the dot!): if it exists, the following files will be used, but values in this file has precedence.</li>



<li><code>$TNS_ADMIN/sqlnet.ora</code> : It uses this file and stops. If it does not exist or TNS_ADMIN is not defined, then continue with the next point:</li>



<li><code>$default_tns/sqlnet.ora</code> </li>
</ul>



<h3 id="h-tnsnames-ora" class="wp-block-heading">tnsnames.ora</h3>



<ul class="wp-block-list">
<li><code>$HOME/.tnsnames.ora</code> : (mind the dot!): if it exists, the following files will be used, but aliases in this file has precedence.</li>



<li><code>/etc/tnsnames.ora</code> : if TNS_ADMIN is <strong>NOT</strong> set! It uses this file and stops</li>



<li><code>$TNS_ADMIN/tnsnames.ora</code> : if TNS_ADMIN is set and tnsnames.ora is present, it uses it and stops; if the file is not present, it continues with the next point.</li>



<li><code>$default_tns/tnsnames.ora</code> </li>
</ul>



<h3 id="h-ldap-ora-0" class="wp-block-heading">ldap.ora</h3>



<ul class="wp-block-list">
<li><code>$ORACLE_HOME/ldap/admin/ldap.ora</code> : if it exists, It uses this file and stops (TNS_ADMIN is ignored!)</li>



<li><code>$TNS_ADMIN/ldap.ora</code> : if TNS_ADMIN is set and ldap.ora is present, it uses it and stops; if the file is not present, it continues with the next point.</li>



<li><code>$default_tns/ldap.ora</code> </li>
</ul>



<p class="wp-block-paragraph">These are the findings with an sqlplus of version 19.32.0; For other releases/versions it is probably the same, but you can simply verify it yourself with the strace utility. </p>



<p class="wp-block-paragraph">For Oracle 26ai (23.26) it is a litte bit easier to see what tnsnames.ora is used</p>



<pre class="wp-block-code"><code>SQL*Plus: Release 23.26.1.0.0 - Production on Wed Oct 28 14:10:19 2026
Version 23.26.1.0.0

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

ERROR:
ORA-12154: Cannot connect to database. Cannot find alias db1970 in
/home/oracle/.tnsnames.ora,
/u00/app/oracle/product/23/23.26/network/admin/tnsnames.ora.
Help: https://docs.oracle.com/error-help/db/ora-12154/


SP2-0751: Unable to connect to Oracle.  Exiting SQL*Plus
Help: https://docs.oracle.com/error-help/db/sp2-0751/</code></pre>



<p class="wp-block-paragraph">or with an ldap configuration, you will see that it tried it, but not which ldap.ora was used (so strace may be still needed).</p>



<pre class="wp-block-code"><code>ORA-12154: Cannot connect to database. Cannot find alias db1970 in
/home/oracle/.tnsnames.ora, /tmp/admin/tnsnames.ora and LDAP.</code></pre>



<p class="wp-block-paragraph"></p>
<p>L’article <a href="https://www.dbi-services.com/blog/name-resolution-of-oracle/">Name resolution of Oracle</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/name-resolution-of-oracle/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>tnsping with Oracle instant-client?</title>
		<link>https://www.dbi-services.com/blog/tnsping-with-oracle-instant-client/</link>
					<comments>https://www.dbi-services.com/blog/tnsping-with-oracle-instant-client/#respond</comments>
		
		<dc:creator><![CDATA[Martin Bracher]]></dc:creator>
		<pubDate>Wed, 28 Oct 2026 04:59:48 +0000</pubDate>
				<category><![CDATA[Database management]]></category>
		<category><![CDATA[Oracle]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=48182</guid>

					<description><![CDATA[<p>The instant client For an application server that connects to Oracle, you probably would not like to install gigabytes of a full Oracle client software? For that, Oracle offers the so-called &#8220;Instant Client&#8221; you can download for free at oracle.com. It is available for different platforms and in different package formats (rpm, zip, &#8230;) There [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/tnsping-with-oracle-instant-client/">tnsping with Oracle instant-client?</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 id="h-the-instant-client" class="wp-block-heading">The instant client</h2>



<p class="wp-block-paragraph">For an application server that connects to Oracle, you probably would not like to install gigabytes of a full Oracle client software? For that, Oracle offers the so-called &#8220;Instant Client&#8221; you can download for free at <a href="https://www.oracle.com/database/technologies/instant-client/downloads.html">oracle.com</a>. It is available for different platforms and in different package formats (rpm, zip, &#8230;)</p>



<p class="wp-block-paragraph">There are different components you can download. Always required is the &#8220;basic&#8221; or &#8220;basic lite&#8221; package with the core libraries. Additionally you can install sqlplus, tools (sqlldr, datapump), sdk and the odbc component.</p>



<h2 id="h-analyzing-connection-problems" class="wp-block-heading">Analyzing connection problems</h2>



<h3 id="h-analyzing-with-the-normal-client" class="wp-block-heading">Analyzing with the &#8220;normal&#8221; client</h3>



<p class="wp-block-paragraph">If you have issues with the naming resolution, you will probably start with the <code>tnsping</code> utility:</p>



<pre class="wp-block-code"><code>$  tnsping DB01

TNS Ping Utility for Linux: Version 19.0.0.0.0 - Production on 27-OCT-2026 17:25:09

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

Used parameter files:
/u00/app/oracle/network/admin/sqlnet.ora

TNS-03505: Failed to resolve name</code></pre>



<p class="wp-block-paragraph">It will show you which TNS_ADMIN (the location of the sqlnet.ora and the other *.ora files) is used. It will look in <code>$TNS_ADMIN</code> and if it is not set, in <code>$ORACLE_HOME/network/admin</code>.  </p>



<p class="wp-block-paragraph">And why &#8220;Failed to resolve name&#8221;? Have a look at the names.directory_path parameter in the sqlnet.ora file, e.g.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; title: ; notranslate">
NAMES.DIRECTORY_PATH=(LDAP, TNSNAMES)
# default is (tnsnames, ezconnect, ldap)
</pre></div>


<p class="wp-block-paragraph">In this case the alias &#8220;DB01&#8221; is unknown in LDAP and the tnsnames.ora. For LDAP, check that the ldap.ora is correctly defined and the ldap server running and reachable, otherwise it will be skipped and only the tnsnames.ora is evaluated. See also my <a href="https://www.dbi-services.com/blog/oracle-ldap-timeouts/" data-type="post" data-id="46960">Oracle LDAP Timeouts</a> blog.</p>



<p class="wp-block-paragraph">If the alias exists, but the connection fails, you will get the resolved connect-string you can analyze.</p>



<pre class="wp-block-code"><code>Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = server01)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = TEST.dbi-services.com)))
TNS-12545: Connect failed because target host or object does not exist</code></pre>



<h3 id="h-analyzing-with-the-instant-client" class="wp-block-heading">Analyzing with the Instant Client</h3>



<p class="wp-block-paragraph">If you are using the instant client, unfortunately there is no tnsping available. How we can debug the connection? The only instantclient binary we have is sqlplus.</p>



<p class="wp-block-paragraph">First, check if the variable TNS_ADMIN is set. Then, the configuration in this directory is used.</p>



<p class="wp-block-paragraph">If not, where does it look for?</p>



<p class="wp-block-paragraph">If you extract the instant client from the .zip file, binaries and libraries are all in the same directory (.rpm is different). To run sqlplus, the libraries of the instantclient have to be in <code>$LD_LIBRARY_PATH</code>, otherwise we get </p>



<pre class="wp-block-code"><code>sqlplus: error while loading shared libraries: libsqlplus.so: cannot open shared object file: No such file or directory</code></pre>



<p class="wp-block-paragraph">To see where sqlplus will look for the network configuration (*.ora) we can use the <code>strace</code> utility of Linux.</p>



<pre class="wp-block-code"><code>$ strace sqlplus x/y@DB01  2&gt;&amp;1 |grep sqlnet.ora
access("/u00/app/oracle/product/instantclient/instantclient_21_7/network/admin/sqlnet.ora", F_OK) = -1 ENOENT (No such file or directory)</code></pre>



<p class="wp-block-paragraph">Is this the path from the binary, or the path from LD_LIBTRARY_PATH? To find it out, I will write the path for the libraries relative.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
export PATH=$PATH:/u00/app/oracle/product/instantclient/instantclient_21_7
cd /u00/app/oracle/product/instantclient/instantclient_21_7
LD_LIBRARY_PATH=../instantclient_21_7 strace sqlplus x/y@DB01  2&gt;&amp;1 |grep sqlnet.ora
</pre></div>


<pre class="wp-block-code"><code>access("../instantclient_21_7/network/admin/sqlnet.ora", F_OK) = -1 ENOENT (No such file or directory)
access("../instantclient_21_7/network/admin/sqlnet.ora", F_OK) = -1 ENOENT (No such file or directory)
access("/home/oracle/.sqlnet.ora", F_OK) = -1 ENOENT (No such file or directory)</code></pre>



<p class="wp-block-paragraph">As you can see, it looks for the configuration below the library location in network/admin. And that is different from an sqlplus in a &#8220;normal&#8221; ORACLE_HOME, where it looks for $ORACLE_HOME/network/admin!</p>



<p class="wp-block-paragraph">Now you can check the *.ora files in this directory and analyze why the name can&#8217;t be resolved.</p>



<p class="wp-block-paragraph">If the name is resolved, but the connect fails, you have to get the resolved connect string. Note the order of names.directory_path!</p>



<p class="wp-block-paragraph">If LDAP is one of the naming methods, it is a little bit more complicated. You can use the ldapsearch binary. Depending on the version from openldap or oracle, the syntax is slightly different:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
# openldap 
/usr/bin/ldapsearch -o ldif-wrap=no -h localhost -p 389 -D &#039;&#039; \
  -b &quot;cn=DB1970,cn=OracleContext,dc=dbi-services,dc=com&quot; \
  -s sub &quot;objectclass=orclNetService&quot;

# oracle
 ldapsearch  -x -LLL -h localhost -p 389 \
  -b &quot;cn=DB1970,cn=OracleContext,dc=dbi-services,dc=com&quot; \
  -s sub &quot;objectclass=orclNetService&quot;
</pre></div>


<pre class="wp-block-code"><code>cn=DB1970,cn=OracleContext,dc=dbi-services,dc=com
objectClass=top
objectClass=orclNetService
cn=DB1970
orclNetDescString=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=server01)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=DB1970A.dbi-services.com)))</code></pre>



<p class="wp-block-paragraph">the value of orclNetDescString is the connect string sqlplus uses.</p>



<p class="wp-block-paragraph">In case of the tnsnames.ora, it is easy: search in the file for an alias &#8220;DB01&#8221;.</p>



<p class="wp-block-paragraph">Update: Good news! If you use a 26ai instant client, it shows you the tnsnames.ora files it used <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<pre class="wp-block-code"><code>ERROR:
ORA-12154: Cannot connect to database. Cannot find alias z in
/home/oracle/.tnsnames.ora, /u00/app/oracle/network/admin/tnsnames.ora and
LDAP.
Help: https://docs.oracle.com/error-help/db/ora-12154/</code></pre>



<h3 id="h-instant-client-on-windows" class="wp-block-heading">Instant Client on Windows?</h3>



<p class="wp-block-paragraph">Same but differnt <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> It also evaluates the TNS_ADMIN variable and the network\admin directory below the instant client directory with the *.dll; But additionally, it also evaluates the *.ora files in the current directory.</p>



<p class="wp-block-paragraph"></p>
<p>L’article <a href="https://www.dbi-services.com/blog/tnsping-with-oracle-instant-client/">tnsping with Oracle instant-client?</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/tnsping-with-oracle-instant-client/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Oracle Fusion Middleware 12c to 14c: 6 Critical Lessons</title>
		<link>https://www.dbi-services.com/blog/oracle-fusion-middleware-12c-to-14c-6-critical-lessons/</link>
					<comments>https://www.dbi-services.com/blog/oracle-fusion-middleware-12c-to-14c-6-critical-lessons/#respond</comments>
		
		<dc:creator><![CDATA[David Diab]]></dc:creator>
		<pubDate>Tue, 27 Oct 2026 15:26:53 +0000</pubDate>
				<category><![CDATA[Application integration & Middleware]]></category>
		<category><![CDATA[JBoss EAP]]></category>
		<category><![CDATA[Oracle Fusion Middleware]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=47959</guid>

					<description><![CDATA[<p>Upgrading Oracle Fusion Middleware from 12c to 14c is not simply about installing new binaries and running the Upgrade Assistant. After working on several Oracle Fusion Middleware upgrades, involving WebLogic Server, ADF, Oracle Forms, Oracle Reports, Oracle HTTP Server, and Identity Management components, I have noticed that the most challenging issues rarely come from the [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/oracle-fusion-middleware-12c-to-14c-6-critical-lessons/">Oracle Fusion Middleware 12c to 14c: 6 Critical Lessons</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 Oracle Fusion Middleware from 12c to 14c is not simply about installing new binaries and running the Upgrade Assistant.</p>



<p class="wp-block-paragraph">After working on several Oracle Fusion Middleware upgrades, involving WebLogic Server, ADF, Oracle Forms, Oracle Reports, Oracle HTTP Server, and Identity Management components, I have noticed that the most challenging issues rarely come from the installation itself.</p>



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



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="576" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/Futuristic-12c-to-14c-Migration-1024x576.png" alt="" class="wp-image-47960" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/Futuristic-12c-to-14c-Migration-1024x576.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/Futuristic-12c-to-14c-Migration-300x169.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/Futuristic-12c-to-14c-Migration-768x432.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/Futuristic-12c-to-14c-Migration-1536x864.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/10/Futuristic-12c-to-14c-Migration.png 1672w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">They usually come from existing configurations, dependencies, database schemas, or assumptions inherited from the previous environment.</p>



<p class="wp-block-paragraph">Oracle provides comprehensive upgrade documentation, but every environment has its own history and technical constraints.</p>



<p class="wp-block-paragraph">Here are six areas I now pay particular attention to when preparing and executing an Oracle Fusion Middleware 12c to 14c upgrade.</p>



<h2 id="h-1-compatibility-is-more-than-an-operating-system-check" class="wp-block-heading">1. Compatibility is more than an Operating System check</h2>



<p class="wp-block-paragraph">Before starting an upgrade, the first challenge is understanding the full compatibility matrix.</p>



<p class="wp-block-paragraph">Oracle FMW 14.1.2 introduces a new technology baseline, including Java 17, which can expose dependencies that worked perfectly under 12c.</p>



<p class="wp-block-paragraph">Operating system certification is only one part of the equation.</p>



<p class="wp-block-paragraph">The complete assessment should cover:</p>



<ul class="wp-block-list">
<li>Operating system and database versions</li>



<li>JDK certification and compatibility</li>



<li>Middleware component versions and interoperability</li>



<li>Third-party libraries and custom Java applications</li>



<li>JDBC drivers, authentication providers, and external integrations</li>
</ul>



<p class="wp-block-paragraph">A particularly important point is to inspect custom Java code for dependencies on internal WebLogic APIs or libraries whose behavior may have changed.</p>



<p class="wp-block-paragraph"><strong>My recommendation:</strong> Do not limit your compatibility assessment to Oracle&#8217;s certification matrix. Include the applications and integrations that depend on the middleware.</p>



<p class="wp-block-paragraph">A supported platform does not automatically mean a compatible application.</p>



<h2 id="h-2-database-schemas-small-configuration-differences-major-consequences" class="wp-block-heading">2. Database schemas: Small configuration differences, major consequences</h2>



<p class="wp-block-paragraph">One of the most important lessons concerns the relationship between WebLogic domains and their RCU schemas.</p>



<p class="wp-block-paragraph">For example, Oracle FMW 14c introduces an important distinction between the following database users:</p>



<ul class="wp-block-list">
<li><code>&lt;PREFIX&gt;_WLS</code></li>



<li><code>&lt;PREFIX&gt;_WLS_RUNTIME</code></li>
</ul>



<p class="wp-block-paragraph">In environments where <code>WLSSchemaDataSource</code> still uses the runtime schema, the configuration must be reviewed before upgrading.</p>



<p class="wp-block-paragraph">The Upgrade Assistant expects the appropriate WLS schema owner. A mismatch can prevent the schema upgrade from completing successfully.</p>



<p class="wp-block-paragraph">Oracle explicitly <a href="https://docs.oracle.com/en/middleware/fusion-middleware/14.1.2/fupim/upgrade-requirements.html" target="_blank" rel="noreferrer noopener">documents this requirement</a>, but it is easy to overlook when working with multiple domains and different RCU prefixes.</p>



<p class="wp-block-paragraph">Beyond this specific example, I systematically verify schema ownership, registry versions, database connectivity, account status, and the consistency between configured data sources and database metadata.</p>



<p class="wp-block-paragraph"><strong>My recommendation:</strong> Treat database schema validation as an independent upgrade workstream, not merely a preliminary check performed by the Upgrade Assistant.</p>



<h2 id="h-3-readiness-checks-are-essential-but-they-are-not-a-guarantee" class="wp-block-heading">3. Readiness checks are essential, but they are not a guarantee</h2>



<p class="wp-block-paragraph">Oracle&#8217;s Upgrade Assistant provides readiness checks to identify potential upgrade problems.</p>



<p class="wp-block-paragraph">They are extremely valuable and should be executed before the actual migration.</p>



<p class="wp-block-paragraph">However, a successful readiness check does not guarantee that the upgrade will succeed.</p>



<p class="wp-block-paragraph">Some issues only appear during schema modification, domain reconfiguration, server startup, or application initialization.</p>



<p class="wp-block-paragraph">For this reason, I distinguish between three levels of validation:</p>



<ul class="wp-block-list">
<li><strong>Pre-upgrade readiness:</strong> Are the schemas and configurations eligible for upgrade?</li>



<li><strong>Technical upgrade validation:</strong> Have the schemas and domains been successfully upgraded?</li>



<li><strong>Functional validation:</strong> Do applications, integrations, security services, and business processes actually work?</li>
</ul>



<p class="wp-block-paragraph"><strong>My recommendation:</strong> Never interpret a successful readiness check, or even a successful domain reconfiguration, as proof that the environment is operational. The real validation begins when the applications start communicating with their dependencies.</p>



<h2 id="h-4-domain-reconfiguration-deserves-its-own-risk-assessment" class="wp-block-heading">4. Domain reconfiguration deserves its own risk assessment</h2>



<p class="wp-block-paragraph">Domain reconfiguration is one of the most sensitive phases of an Oracle FMW upgrade.</p>



<p class="wp-block-paragraph">The Reconfiguration Wizard modifies existing domain configurations to align them with the target middleware version. These changes can affect security settings, JDBC resources, deployment configurations, and product-specific components. The challenge becomes greater in environments containing multiple domains, custom configurations, or legacy integrations.</p>



<p class="wp-block-paragraph">One important consideration is that domain reconfiguration cannot simply be reversed. Oracle explicitly recommends restoring the original domain from a backup if reconfiguration fails.</p>



<p class="wp-block-paragraph"><strong>My recommendation:</strong> Take complete, verified backups of the Domain Homes and document custom configurations before starting reconfiguration. More importantly, treat schema upgrade and domain reconfiguration as coordinated operations, with clearly defined recovery points. Rollback must be designed before the upgrade begins, not after something goes wrong.</p>



<h2 id="h-5-patch-strategy-matters-as-much-as-the-target-version" class="wp-block-heading">5. Patch strategy matters as much as the target version</h2>



<p class="wp-block-paragraph">Installing Oracle FMW 14c does not necessarily mean the environment is ready to be upgraded. Depending on the products involved, additional Bundle Patches, Stack Patch Bundles, or product-specific fixes may be required or recommended.</p>



<p class="wp-block-paragraph">This is particularly important in environments combining components such as:</p>



<ul class="wp-block-list">
<li>WebLogic Server and ADF</li>



<li>Oracle Access Management</li>



<li>Oracle Internet Directory</li>



<li>Oracle HTTP Server</li>



<li>Oracle Reports</li>
</ul>



<p class="wp-block-paragraph">The objective is not simply to install the latest available patch. It is to establish a <strong>consistent, certified, and supportable patch baseline</strong> across all Oracle Homes. An incomplete or inconsistent patch strategy can introduce unnecessary complexity into an already sensitive migration.</p>



<p class="wp-block-paragraph"><strong>My recommendation:</strong> Define and validate the target patch inventory before executing the upgrade. Keep installation, patching, schema upgrade, and domain reconfiguration as distinct, controlled phases.</p>



<h2 id="h-6-the-most-important-upgrade-test-is-not-whether-weblogic-starts" class="wp-block-heading">6. The most important upgrade test is not whether WebLogic starts</h2>



<p class="wp-block-paragraph">A running AdminServer is encouraging, but it proves very little about the overall application platform. The same applies to Managed Servers reporting a <code>RUNNING</code> state.</p>



<p class="wp-block-paragraph">A complete post-upgrade validation must consider the entire application chain:</p>



<ul class="wp-block-list">
<li>JDBC connectivity and database transactions</li>



<li>Authentication, authorization, and identity integrations</li>



<li>Application deployments and critical business transactions</li>



<li>HTTP routing, SSL/TLS, and reverse proxy integration</li>



<li>Scheduled processes, reporting services, and external dependencies</li>
</ul>



<p class="wp-block-paragraph">This is particularly relevant in environments where ADF applications, Oracle Reports, and Identity Management components depend on one another. It is entirely possible to have a technically healthy WebLogic domain while critical application functionality remains unavailable.</p>



<p class="wp-block-paragraph"><strong>My recommendation:</strong> Define application-level acceptance criteria with the customer before scheduling the upgrade. The upgrade is complete when the expected business services have been validated, not when the last Managed Server reaches the <code>RUNNING</code> state.</p>



<h2 id="h-final-thoughts" class="wp-block-heading">Final Thoughts</h2>



<p class="wp-block-paragraph">After several Oracle Fusion Middleware upgrade projects, one conclusion has become clear to me: <strong>the actual upgrade commands are rarely the most difficult part of the job.</strong></p>



<p class="wp-block-paragraph">The real complexity lies in understanding the existing architecture, identifying hidden dependencies, anticipating compatibility issues, and controlling the sequence of changes.</p>



<p class="wp-block-paragraph">Oracle&#8217;s documentation provides the technical foundation. Experience helps identify where additional verification is necessary.</p>



<p class="wp-block-paragraph">A successful migration from 12c to 14c is not measured only by the absence of errors during the upgrade. It is measured by the ability to deliver a stable, supportable, and fully functional platform with a controlled operational impact.</p>



<p class="wp-block-paragraph"><a href="https://www.dbi-services.com/blog/tag/oracle-fusion-middleware/" target="_blank" rel="noreferrer noopener">Related blogs</a></p>



<p class="wp-block-paragraph"></p>
<p>L’article <a href="https://www.dbi-services.com/blog/oracle-fusion-middleware-12c-to-14c-6-critical-lessons/">Oracle Fusion Middleware 12c to 14c: 6 Critical Lessons</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/oracle-fusion-middleware-12c-to-14c-6-critical-lessons/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>ECM Migration: The moment you inherit everyone&#8217;s mess</title>
		<link>https://www.dbi-services.com/blog/ecm-migration-the-moment-you-inherit-everyones-mess/</link>
					<comments>https://www.dbi-services.com/blog/ecm-migration-the-moment-you-inherit-everyones-mess/#respond</comments>
		
		<dc:creator><![CDATA[Guillaume Meunier]]></dc:creator>
		<pubDate>Tue, 27 Oct 2026 14:38:35 +0000</pubDate>
				<category><![CDATA[Enterprise content management]]></category>
		<category><![CDATA[digitalization]]></category>
		<category><![CDATA[ECM]]></category>
		<category><![CDATA[Enterprise Content Management]]></category>
		<category><![CDATA[M-Files]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=48158</guid>

					<description><![CDATA[<p>In my last blog post, I wrote about the importance of ownership of information. Today, I would like to consider what it means when we decide to start a migration project. We have 2 million documents in our current ECM. We need to migrate them to the new platform. It sounds simple. At least, it [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/ecm-migration-the-moment-you-inherit-everyones-mess/">ECM Migration: The moment you inherit everyone&#8217;s mess</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 href="https://www.dbi-services.com/blog/data-ownership-stewardship-ecm/" target="_blank" rel="noreferrer noopener">my last blog post</a>, I wrote about the importance of ownership of information.</p>



<p class="wp-block-paragraph">Today, I would like to consider what it means when we decide to start a migration project.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">We have 2 million documents in our current ECM. We need to migrate them to the new platform.</p>
</blockquote>



<p class="wp-block-paragraph">It sounds simple.</p>



<p class="wp-block-paragraph">At least, it does when you put it in a project plan:</p>



<ul class="wp-block-list">
<li>Extract the documents</li>



<li>Transform the metadata</li>



<li>Load everything into the new system</li>



<li>Validate the result</li>



<li>Go live</li>
</ul>



<p class="wp-block-paragraph">Then you start looking at the contents of those 2 million documents and the questions begin:</p>



<ul class="wp-block-list">
<li>Which documents are still relevant?</li>



<li>Which ones are duplicates?</li>



<li>Which ones are obsolete?</li>



<li>Which ones are legally required to be retained?</li>



<li>Which ones are just old drafts?</li>



<li>Who owns them?</li>



<li>Are the permissions still correct?</li>



<li>Is the metadata meaningful?</li>



<li>Does anyone even know why some of these documents exist?</li>
</ul>



<p class="wp-block-paragraph">Suddenly, migration doesn&#8217;t look like a technical project anymore.</p>



<p class="wp-block-paragraph">It looks more like an archaeological excavation!</p>



<p class="wp-block-paragraph">And that is the uncomfortable reality about ECM migrations:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Migration is the moment when you inherit everyone&#8217;s mess.</p>
</blockquote>



<h2 id="h-migration-doesn-t-create-the-mess" class="wp-block-heading">Migration doesn&#8217;t create the mess</h2>



<p class="wp-block-paragraph">One of the biggest misconceptions about ECM migration is that the migration project is responsible for creating the information problems.</p>



<p class="wp-block-paragraph">This is usually not the case. These problems have been accumulating for years:</p>



<ul class="wp-block-list">
<li>A document was created for a project.</li>



<li>Someone copied it to another folder.</li>



<li>Another person downloaded it and changed the file name.</li>



<li>A new version was uploaded elsewhere.</li>



<li>The project ended.</li>



<li>The people involved moved to other departments.</li>



<li>The folder structure changed.</li>



<li>The retention rules changed.</li>



<li>The application that created the document was replaced.</li>



<li>Nobody went back to clean up what was left behind.</li>



<li>Multiply this by thousands of users and years of activity, and the result is what I call &#8216;information debt&#8217;.</li>
</ul>



<p class="wp-block-paragraph">This debt isn&#8217;t visible on a daily basis; people simply work around it. Day after day, searching for information takes longer and longer.<br>They create this mess through the way they work: keeping several copies of documents, asking colleagues where things are, creating additional folders and saving documents &#8216;just in case&#8217;.</p>



<p class="wp-block-paragraph">Until one day, someone says: &#8220;We&#8217;re migrating to a new ECM.&#8221;</p>



<p class="wp-block-paragraph">Suddenly, all that accumulated debt becomes part of the migration scope. This is why migration projects often reveal problems that have existed for years. Migration does not create the mess. It simply makes the mess impossible to ignore.</p>



<h2 id="h-the-just-migrate-everything-strategy" class="wp-block-heading">The &#8220;just migrate everything&#8221; strategy</h2>



<p class="wp-block-paragraph">When faced with a large repository, it is understandable to have a certain reaction.</p>



<p class="wp-block-paragraph">&#8220;We should migrate everything. We don&#8217;t want to lose anything.&#8221;</p>



<p class="wp-block-paragraph">This approach sounds safe and responsible.</p>



<p class="wp-block-paragraph">And sometimes it is also the easiest political option, because nobody has to make difficult decisions, explain why 15-year-old documents were deleted, or decide whether old project folders still have value.<br><br>You just move everything, But the problem is that you haven&#8217;t solved the information problem.<br><br>You&#8217;ve just moved it!</p>



<p class="wp-block-paragraph">It&#8217;s like moving house: your old basement is full of boxes.</p>



<p class="wp-block-paragraph">Rather than opening the boxes and deciding what you need, you simply load them onto the truck and store them in the new basement.</p>



<p class="wp-block-paragraph">Technically, the move was successful. But you haven&#8217;t tidied up at all.<br>Ultimately, you continue to have years of old stuff that your family doesn&#8217;t need, but now it&#8217;s in a new building.</p>



<p class="wp-block-paragraph">That&#8217;s exactly what happens with many ECM migrations.</p>



<p class="wp-block-paragraph">Old repository → migration → new repository.</p>



<p class="wp-block-paragraph">A few months later: &#8220;Why is the new ECM already so difficult to navigate?&#8221;</p>



<p class="wp-block-paragraph">Because you migrated the old information environment instead of redesigning it.</p>



<h2 id="h-the-three-questions" class="wp-block-heading">The three questions</h2>



<p class="wp-block-paragraph">Before deciding how to migrate content, I think every organization should ask three simple questions:</p>



<ul class="wp-block-list">
<li>Should we migrate it?</li>



<li>Should we keep it somewhere else?</li>



<li>Or should we delete it?</li>
</ul>



<p class="wp-block-paragraph">Although these questions may sound obvious, they are surprisingly difficult in practice.</p>



<h3 id="h-migrate-it" class="wp-block-heading">Migrate it</h3>



<p class="wp-block-paragraph">Clearly, some information is still valuable.</p>



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



<ul class="wp-block-list">
<li>active contracts;</li>



<li>current customer documentation;</li>



<li>ongoing projects;</li>



<li>current procedures;</li>



<li>active employee records;</li>



<li>current policies;</li>



<li>documents actively used by business processes;</li>



<li>information required for day-to-day operations.</li>
</ul>



<p class="wp-block-paragraph">This content is suited to the new information environment. Ideally, it should not simply be copied as it is.</p>



<p class="wp-block-paragraph">The migration provides an opportunity to improve the classification, metadata, relationships and lifecycle of the content.</p>



<p class="wp-block-paragraph">The objective is not just to put this document into the new system, but to ensure that this information is useful within it.</p>



<p class="wp-block-paragraph">These are very different objectives.</p>



<h3 id="h-archive-it" class="wp-block-heading">Archive it</h3>



<p class="wp-block-paragraph">The second category is more subtle.</p>



<p class="wp-block-paragraph">While some information still needs to exist, it doesn&#8217;t need to remain part of the active working environment.</p>



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



<ul class="wp-block-list">
<li>closed projects</li>



<li>expired contracts</li>



<li>historical financial records</li>



<li>old customer files</li>



<li>completed cases.</li>



<li>previous versions that must be retained</li>



<li>records subject to regulatory retention</li>
</ul>



<p class="wp-block-paragraph">These documents may have little operational value today.<br><br>However, this does not necessarily mean that they can be deleted.<br><br>Organizations often confuse two very different concepts here. Keeping something is not the same as actively using it.<br><br>Retention requirements may mean that information must remain available for several years.<br><br>However, this does not automatically mean that it belongs alongside the documents that people use every day.<br><br>Archiving can therefore be an important part of a migration strategy.<br><br>The aim is not to ignore historical information. Rather, the goal is to prevent historical information from overwhelming current information.</p>



<h3 id="h-delete-it" class="wp-block-heading">Delete it</h3>



<p class="wp-block-paragraph">Then comes the most uncomfortable option. <strong>Delete it.</strong></p>



<p class="wp-block-paragraph">Some information simply isn&#8217;t worth migrating.</p>



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



<li>temporary exports</li>



<li>old drafts</li>



<li>test documents</li>



<li>abandoned documents</li>



<li>obsolete versions</li>



<li>documents created for a one-off purpose that no longer exists</li>



<li>files with no business value or retention requirement</li>



<li>documents that nobody can explain</li>
</ul>



<p class="wp-block-paragraph">This is where migration projects can become political.</p>



<p class="wp-block-paragraph">Someone will inevitably say: &#8220;We might need it someday.&#8221;</p>



<p class="wp-block-paragraph">Maybe! However, &#8220;we might need it someday&#8221; is not an information management strategy.</p>



<p class="wp-block-paragraph">If every document is considered potentially useful forever, nothing can ever be deleted.</p>



<p class="wp-block-paragraph">If nothing can ever be deleted, your information environment will eventually resemble a historical archive rather than a working system.</p>



<h2 id="h-the-fourth-category-nobody-knows" class="wp-block-heading">The fourth category: nobody knows</h2>



<p class="wp-block-paragraph">However, in (almost) every migration project, there will always be a category that doesn&#8217;t fit neatly into &#8216;migrate&#8217;, &#8216;archive&#8217; or &#8216;delete&#8217;.</p>



<p class="wp-block-paragraph"><strong>Nobody knows.</strong></p>



<p class="wp-block-paragraph">You find a document, it looks important.</p>



<p class="wp-block-paragraph">But nobody knows:</p>



<ul class="wp-block-list">
<li>Who owns it?</li>



<li>Whether it is still valid?</li>



<li>Why it exists?</li>



<li>Whether it is a record?</li>



<li>Whether there is a newer version?</li>



<li>Whether it can be deleted?</li>
</ul>



<p class="wp-block-paragraph">So, what do organizations usually do?</p>



<p class="wp-block-paragraph">They migrate it, because migration feels safer than making a decision.</p>



<p class="wp-block-paragraph">This creates what I call the &#8220;just in case&#8221; migration.</p>



<p class="wp-block-paragraph">&#8220;Just in case&#8221; is one of the most expensive phrases in information management.</p>



<p class="wp-block-paragraph">Unknown content should not automatically be migrated.</p>



<p class="wp-block-paragraph">The right answer is often to investigate before migrating.</p>



<h2 id="h-the-hidden-problem" class="wp-block-heading">The hidden problem</h2>



<p class="wp-block-paragraph">As I have already mentioned, documents are only one aspect of the migration process.</p>



<p class="wp-block-paragraph">The other part is the information surrounding those documents: metadata.</p>



<p class="wp-block-paragraph">Legacy ECM systems often contain years of accumulated classifications, fields, document types, folders and custom properties.</p>



<p class="wp-block-paragraph">Some of these are useful and some aren&#8217;t. Sometimes they were created for a specific department, others were created because the old system required them.</p>



<p class="wp-block-paragraph">Some have values such as:</p>



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



<li>Miscellaneous</li>



<li>Unknown</li>



<li>N/A</li>



<li>Old</li>



<li>New</li>



<li>Final</li>



<li>Final_final</li>
</ul>



<p class="wp-block-paragraph">Then, as with documents, there are fields that nobody remembers either.</p>



<p class="wp-block-paragraph">Yet during migration, there is often pressure to map everything.</p>



<ul class="wp-block-list">
<li>Old field → new field.</li>



<li>Old document type → new document type.</li>



<li>Old folder → new folder.</li>



<li>Old classification → new classification.</li>
</ul>



<p class="wp-block-paragraph">This looks like the secure way to proceed. However, this can result in something worse than a bad legacy system.</p>



<p class="wp-block-paragraph">A new system that incorporates a legacy model that has been successfully migrated.</p>



<p class="wp-block-paragraph">Ultimately, no solution or improvement has been offered, the new ECM has the same issues as the previous one.</p>



<h2 id="h-do-not-migrate-the-structure-migrate-the-meaning" class="wp-block-heading">Do not migrate the structure, migrate the meaning</h2>



<p class="wp-block-paragraph">This is one of the most important lessons I have learned from working with various ECM environments.</p>



<p class="wp-block-paragraph">A migration does not necessarily have to reproduce the inherited structure.</p>



<p class="wp-block-paragraph">The important thing is to preserve the information.</p>



<p class="wp-block-paragraph">Imagine a legacy repository containing: Customers / Switzerland / Active / Contracts / 2026</p>



<p class="wp-block-paragraph">This folder tells you something, but it also tells you very little.</p>



<p class="wp-block-paragraph">In a metadata-driven environment, the same document could be described using properties such as:</p>



<ul class="wp-block-list">
<li>Document class = Contract</li>



<li>Customer = Customer X</li>



<li>Country = Switzerland</li>



<li>Status: Active</li>



<li>Contract year: 2026</li>
</ul>



<p class="wp-block-paragraph">The document is not dependent on a particular folder structure.</p>



<p class="wp-block-paragraph">It has context.</p>



<p class="wp-block-paragraph">This context can be used for:</p>



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



<li>Views</li>



<li>Security.</li>



<li>workflows.</li>



<li>Reporting.</li>



<li>Automation</li>



<li>AI</li>
</ul>



<p class="wp-block-paragraph">This is one of the reasons I prefer working with a metadata-driven ECM solution such as <a href="https://m-files.com" target="_blank" rel="noreferrer noopener">M-Files</a>.</p>



<p class="wp-block-paragraph">However, there is an important warning here: M-Files won&#8217;t magically clean up your information.</p>



<p class="wp-block-paragraph">Migrating bad information with bad metadata simply creates a better system for finding bad information.</p>



<p class="wp-block-paragraph">The technology can support a better information model, but it cannot make decisions for you.</p>



<h2 id="h-migration-is-not-a-copy-operation" class="wp-block-heading">Migration is not a copy operation</h2>



<p class="wp-block-paragraph">I think it is important to distinguish between technical and information migration.</p>



<p class="wp-block-paragraph">Technical migration asks: &#8220;Can we move the documents successfully?&#8221;</p>



<p class="wp-block-paragraph">An information migration asks: &#8220;Are we moving the right information, with the right context, into the right structure?&#8221;</p>



<p class="wp-block-paragraph">These are completely different questions.</p>



<p class="wp-block-paragraph">It is possible to have a technically perfect migration and still have a terrible outcome.</p>



<h2 id="h-don-t-forget-the-relationships" class="wp-block-heading">Don&#8217;t forget the relationships</h2>



<p class="wp-block-paragraph">Another aspect that is often overlooked during migration is relationships.</p>



<p class="wp-block-paragraph">Documents rarely exist in isolation, for example:</p>



<ul class="wp-block-list">
<li>A project document belongs to a project.</li>



<li>An invoice belongs to a supplier, and potentially to a contract.</li>



<li>An employee document belongs to an employee.</li>
</ul>



<p class="wp-block-paragraph">When migrating, we often focus on the document itself.</p>



<p class="wp-block-paragraph">However, the more important question may be: &#8220;Did the context arrive with it?&#8221;</p>



<p class="wp-block-paragraph">If not, you have migrated the document but lost part of its meaning.</p>



<p class="wp-block-paragraph">This is particularly important when transitioning from folder-centric repositories to object and metadata-driven approaches.</p>



<p class="wp-block-paragraph">The goal isn&#8217;t simply to preserve files, it&#8217;s to preserve information and context.</p>



<h2 id="h-an-opportunity-to-reduce-information-debt" class="wp-block-heading">An opportunity to reduce information debt</h2>



<p class="wp-block-paragraph">This is probably the most important link to my previous article on <a href="https://www.dbi-services.com/blog/information-debt-the-technical-debt-nobody-talks-about/" target="_blank" rel="noreferrer noopener">information debt</a>.</p>



<p class="wp-block-paragraph">Information debt builds up when organizations repeatedly postpone decisions about their information.</p>



<p class="wp-block-paragraph">Migration offers a rare opportunity to ask the right questions:</p>



<ul class="wp-block-list">
<li>What do we have?</li>



<li>What do we need?</li>



<li>Who owns it?</li>



<li>How long should we keep it?</li>



<li>What does it mean?</li>



<li>How should it be classified?</li>



<li>Who should have access?</li>



<li>What can we get rid of?</li>
</ul>



<p class="wp-block-paragraph">These questions make migration painful.</p>



<p class="wp-block-paragraph">But they also make migration valuable.</p>



<p class="wp-block-paragraph">If you only use migration to move information, you miss the opportunity.</p>



<p class="wp-block-paragraph">Instead, you can use it to reduce your information debt.</p>



<h2 id="h-do-not-migrate-your-history" class="wp-block-heading">Do not migrate your history</h2>



<p class="wp-block-paragraph">Every ECM migration eventually raises an uncomfortable question:</p>



<p class="wp-block-paragraph">Does this information still deserve to exist?</p>



<p class="wp-block-paragraph">The goal shouldn&#8217;t be to recreate yesterday&#8217;s information environment using tomorrow&#8217;s technology. Rather, it should be to move the information that the organization still needs, retain what must be kept and remove what no longer has a reason to exist.</p>



<p class="wp-block-paragraph">After all, technology can move millions of documents remarkably quickly. The real migration project is deciding which of those documents deserve to survive.</p>



<p class="wp-block-paragraph">A successful migration isn&#8217;t about moving everything.</p>



<p class="wp-block-paragraph">It&#8217;s about starting tomorrow with less information debt than you have today.</p>



<p class="wp-block-paragraph">So, please stop asking: &#8220;How are we going to migrate everything?&#8221;</p>



<p class="wp-block-paragraph">Ask a very different question: &#8220;What is actually worth taking with us?&#8221;</p>



<p class="wp-block-paragraph">That&#8217;s where a successful ECM migration begins.</p>



<p class="wp-block-paragraph"></p>
<p>L’article <a href="https://www.dbi-services.com/blog/ecm-migration-the-moment-you-inherit-everyones-mess/">ECM Migration: The moment you inherit everyone&#8217;s mess</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/ecm-migration-the-moment-you-inherit-everyones-mess/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-11-04 12:39:53 by W3 Total Cache
-->