<?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>Archives des Migration - dbi Blog</title>
	<atom:link href="https://www.dbi-services.com/blog/tag/migration/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.dbi-services.com/blog/tag/migration/</link>
	<description></description>
	<lastBuildDate>Tue, 08 Sep 2026 14:06:06 +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>Archives des Migration - dbi Blog</title>
	<link>https://www.dbi-services.com/blog/tag/migration/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Oracle AutoUpgrade? Easy way to upgrade your Oracle Database! Part I</title>
		<link>https://www.dbi-services.com/blog/oracle-autoupgrade-easy-way-to-upgrade-your-oracle-database-part-i/</link>
					<comments>https://www.dbi-services.com/blog/oracle-autoupgrade-easy-way-to-upgrade-your-oracle-database-part-i/#respond</comments>
		
		<dc:creator><![CDATA[Xavier Franck Godard]]></dc:creator>
		<pubDate>Thu, 17 Jul 2025 10:21:33 +0000</pubDate>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[autoupgrade]]></category>
		<category><![CDATA[Migration]]></category>
		<category><![CDATA[Upgrade]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=39481</guid>

					<description><![CDATA[<p>Introduction The AutoUpgrade utility is designed to automate the upgrade process, both before starting upgrades, during upgrade deployments, and during postupgrade checks and configuration migration The Oracle AutoUpgrade Tool is part of Oracle Home since the version 12.1.0.2.It&#8217;s a java-based program which can be download on MySupport Oracle : ID 2485457.1It&#8217;s recommanded to use the [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/oracle-autoupgrade-easy-way-to-upgrade-your-oracle-database-part-i/">Oracle AutoUpgrade? Easy way to upgrade your Oracle Database! Part I</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading" id="h-introduction">Introduction</h2>



<p class="wp-block-paragraph">The AutoUpgrade utility is designed to automate the upgrade process, both before starting upgrades, during upgrade deployments, and during postupgrade checks and configuration migration</p>



<p class="wp-block-paragraph">The Oracle AutoUpgrade Tool is part of Oracle Home since the version 12.1.0.2.<br>It&#8217;s a java-based program which can be download on MySupport Oracle : ID 2485457.1<br>It&#8217;s recommanded to use the lastest version (as usual, like for opatch by example).</p>



<p class="wp-block-paragraph">The most important point is that Oracle desupport DBUA (Database Upgrade Assistant) and other manual upgrade to Oracle 23ai. AutoUpgrade is the only supported method.</p>



<p class="wp-block-paragraph">This tab show the supported sources database version and the supported target database version for AutoUpgrade</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Source Database Version</th><th></th></tr></thead><tbody><tr><td>11.2.0.4</td><td>12.2.0.1 (12.2 + DBJAN2019RU and newer)</td></tr><tr><td>12.1.0.2</td><td>18c (18.5 and newer)</td></tr><tr><td>12.2.0.1</td><td>19c (19.3 and newer)</td></tr><tr><td>18c</td><td>21c (21.3 and newer)</td></tr><tr><td>19c</td><td>23ai (23.4 and newer)</td></tr><tr><td></td><td>Any future release</td></tr></tbody></table></figure>



<h2 class="wp-block-heading" id="h-the-autoupgrade-workflow">The AutoUpgrade workflow</h2>



<p class="wp-block-paragraph">Using AutoUpgrade is running four simple steps :</p>



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



<li>Analyze</li>



<li>Fixups</li>



<li>Deploy</li>
</ul>



<h3 class="wp-block-heading" id="h-prepare">Prepare</h3>



<p class="wp-block-paragraph">The first step is about downloading all binairies that we need to patching or upgrade our databases. And to create a configuration file used by AutoUpgrade for known what to do and where do it.</p>



<ul class="wp-block-list">
<li>Download lastest version of AutoUpgrade -&gt; My Oracle Support ID 2485457.1</li>



<li>Download lastet version of opatch -&gt; My Oracle Support ID 224346.1</li>



<li>Download DBRU + OJVM+ DPBP+ Most Important One-off Patches -&gt; My Oracle Support ID 2118136.2 + ID 555.1</li>
</ul>



<p class="wp-block-paragraph">The configuration file used by AutoUpgrade must contain some informations like : </p>



<ul class="wp-block-list">
<li>Source Oracle Home</li>



<li>Target Oracle Home</li>



<li>Patches repository</li>



<li>Source Database SID</li>



<li>and other advanced option</li>
</ul>



<p class="wp-block-paragraph">We will see that later in this blog, no worries!</p>



<h3 class="wp-block-heading" id="h-analyze">Analyze</h3>



<p class="wp-block-paragraph">It&#8217;s the classic precheck used during all patch, upgrade process lead by Oracle.</p>



<h3 class="wp-block-heading" id="h-fixups">Fixups</h3>



<p class="wp-block-paragraph">Automatic or manual Fixups, if necessary.</p>



<h3 class="wp-block-heading" id="h-deploy">Deploy</h3>



<p class="wp-block-paragraph">It&#8217;s the main step where AutoUpgrade run the upgrade process on your source database.<br>In case of failure, AutoUpgrade is able to restart where it fails on… After have fixed the errors by yourself!</p>



<h2 class="wp-block-heading" id="h-a-simple-example">A simple example</h2>



<p class="wp-block-paragraph">For this labs, we have :</p>



<ul class="wp-block-list">
<li>Oracle Linux Server 8</li>



<li>Oracle Database Home 19.24 installed in <span style="text-decoration: underline">/u01/app/oracle/product/19.24/dbhome_1</span></li>



<li>Oracle standalone database : DB19</li>
</ul>



<p class="wp-block-paragraph">We want to patch this database to the 19.28 version, according to the Best Pratices (for this check Mike Dietrich blogs : <a href="https://mikedietrichde.com/">https://mikedietrichde.com/</a> ).</p>



<h3 class="wp-block-heading" id="h-preparation">Preparation</h3>



<p class="wp-block-paragraph">We download the following patches :</p>



<ul class="wp-block-list">
<li>Patch 37960098 : DBRU 19.28</li>



<li>Patch 38170982 : Data Pump Bundle Patches (My Oracle Support ID 2819284.1)</li>



<li>Patch 37847857 : OJVM 19.28</li>



<li>Patch 34672698 : [VOS] DB50: ORA-800: soft external error, arguments: [set priority failed], [vktm] , dism(16)</li>



<li>Patch 34774667 : [AQ] ORA-7445 in Purge Queue Table / High CPU usage in SVCB Service</li>



<li>Patch 29213893 : [QRY OPTIMIZER] DBMS_STATS Failing With Error Ora-1422 When Gathering Stats for User$ Table</li>
</ul>



<p class="wp-block-paragraph">We save them in the repository <span style="text-decoration: underline">/home/oracle/autoupgrade/patches</span> (for example).</p>



<p class="wp-block-paragraph">We download in the same manner the lastest version of Opatch following the Oracle MySupport ID 224346.1 :</p>



<details class="wp-block-details is-layout-flow wp-block-details-is-layout-flow"><summary>How to install OPatch utility ?</summary>
<p class="wp-block-paragraph"></p>



<ol class="wp-block-list">
<li>Download the latest Opatch utility<br>Search for Patch 6880880 in MOS or from the URL<br>https://updates.oracle.com/download/6880880.html</li>



<li>Take a backup of older version of OPatch utility under $ORACLE_HOME and unzip the downloaded file</li>
</ol>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
cd $ORACLE_HOME
mv OPatch OPatch.bkp
unzip &lt;download directory&gt;/p6880880_&lt;version&gt;_&lt;platform&gt;.zip
cd OPatch
./opatch version
</pre></div></details>



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



<p class="wp-block-paragraph">The most recent version of AutoUpgrade, 25.3 is a fully supported version and can be downloaded via this link: version <a href="https://support.oracle.com/epmos/main/downloadattachmentprocessor?parent=DOCUMENT&amp;sourceId=2485457.1&amp;attachid=2485457.1:AUTOUPGRADE253250509&amp;clickstream=yes">20250509</a> or directly from <a href="https://www.oracle.com/database/upgrades/">oracle.com</a>.<br>Oracle strongly recommends that you always use the latest version of AutoUpgrade. AutoUpgrade is backward compatible and can upgrade older releases of Oracle Database as well.<br>The latest ORDS 25.1 can be found from here which supports AutoUpgrade REST API.</p>



<p class="wp-block-paragraph">The last step of the preparation is to create the configuration file used by AutoUpgrade for our patching.<br>An simple config file look like (/home/oracle/patch_DB19.cfg) :</p>



<div class="wp-block-group is-vertical is-layout-flex wp-container-core-group-is-layout-4fc3f8e1 wp-block-group-is-layout-flex">
<div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<pre class="wp-block-code"><code>global.global_log_dir=/home/oracle/autoupgrade-patching/log
patch1.sid=DB19
patch1.log_dir=/home/oracle/autoupgrade-patching/DB19/log
patch1.source_home=/u01/app/oracle/product/19.24/dbhome_1
patch1.target_home=/u01/app/oracle/product/19.28/dbhome_1
patch1.restoration=YES
patch1.drop_grp_after_patching=YES
patch1.folder=/home/oracle/autoupgrade/patches
patch1.patch=RU,OJVM,OPATCH,DPBP,34672698,34774667,29213893
patch1.download=NO</code></pre>



<p class="wp-block-paragraph">An excellent tool for building this configuration file can be found at : <a href="https://viniciusdba.com.br/autoupgrade-composer/">https://viniciusdba.com.br/autoupgrade-composer/</a><br>I must say : <strong>use it!!</strong></p>



<p class="wp-block-paragraph">Some explanation about the parameters :</p>



<ul class="wp-block-list">
<li>source_home : the current Oracle Home used by the instance DB19</li>



<li>target_home : the new Oracle Home targeted</li>



<li>restoration : AutoUpgrade can create a Guaranteed Restore Point before the upgrade/patching operations</li>



<li>drop_grp_after_patching=YES : after a successful AutoUpgrade, by default, don&#8217;t suppress the GRP created before. With this parameter, it will be dropped after successful patching.</li>



<li>folder : the full path to the repository where the patches has been downloaded.</li>



<li>patch : what we want to patch :
<ul class="wp-block-list">
<li>RU : Release Update</li>



<li>OJVM: Oracle Java Virtual Machine</li>



<li>Opatch</li>



<li>DPBP : Data Pump Bundle Patch</li>



<li>id of specific patches</li>



<li>download : we can ask to Auto Upgrade to download itself the patches.</li>
</ul>
</li>
</ul>



<p class="wp-block-paragraph">Now, we have all the stuff to begin our database patching!</p>



<h3 class="wp-block-heading" id="h-analyze-0">Analyze</h3>



<p class="wp-block-paragraph">Just run the following command : </p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
java -jar autoupgrade.jar -config /home/oracle/patch_DB19.cfg -patch -mode analyze
</pre></div>


<p class="wp-block-paragraph">The output look like : </p>



<pre class="wp-block-code"><code>AutoUpgrade Patching 25.3.250509 launched with default internal options
Processing config file ...
+-----------------------------------------+
| Starting AutoUpgrade Patching execution |
+-----------------------------------------+
1 Non-CDB(s) will be analyzed
Type 'help' to list console commands
patch&gt; lsj
+----+-------+---------+---------+-------+----------+-------+----------------+
|Job#|DB_NAME|    STAGE|OPERATION| STATUS|START_TIME|UPDATED|         MESSAGE|
+----+-------+---------+---------+-------+----------+-------+----------------+
| 100|   DB19|PRECHECKS|EXECUTING|RUNNING|  15:15:39|28s ago|Executing Checks|
+----+-------+---------+---------+-------+----------+-------+----------------+
Total jobs 1

patch&gt; status -job 100
Details

	Job No           100
	Oracle SID       DB19
	Start Time       25/07/16 15:15:39
	Elapsed (min):   0
	End time:        N/A

Logfiles

	Logs Base:    /home/oracle/autoupgrade-patching/simple-patching/log/DB19
	Job logs:     /home/oracle/autoupgrade-patching/simple-patching/log/DB19/100
	Stage logs:   /home/oracle/autoupgrade-patching/simple-patching/log/DB19/100/prechecks
	TimeZone:     /home/oracle/autoupgrade-patching/simple-patching/log/DB19/temp
	Remote Dirs:  

Stages
	PENDING          &lt;1 min
	PRECHECKS        ~0 min (RUNNING)

Stage-Progress Per Container

	+--------+---------+
	|Database|PRECHECKS|
	+--------+---------+
	|    DB19|    98 % |
	+--------+---------+
patch&gt; Job 100 completed
------------------- Final Summary --------------------
Number of databases            &#091; 1 ]

Jobs finished                  &#091;1]
Jobs failed                    &#091;0]

Please check the summary report at:
/home/oracle/autoupgrade-patching/simple-patching/log/cfgtoollogs/patch/auto/status/status.html
/home/oracle/autoupgrade-patching/simple-patching/log/cfgtoollogs/patch/auto/status/status.log</code></pre>



<p class="wp-block-paragraph">We control the success or errors that can be occured during analyze : </p>



<pre class="wp-block-code"><code># cat /home/oracle/autoupgrade-patching/simple-patching/log/cfgtoollogs/patch/auto/status/status.log
==========================================
   AutoUpgrade Patching Summary Report
==========================================
&#091;Date]           Wed Jul 16 15:17:31 GMT 2025
&#091;Number of Jobs] 1
==========================================
&#091;Job ID] 100
==========================================
&#091;DB Name]                DB19
&#091;Version Before AutoUpgrade Patching] 19.24.0.0.240716
&#091;Version After AutoUpgrade Patching]  19.28.0.0.250715
------------------------------------------
&#091;Stage Name]    PENDING
&#091;Status]        SUCCESS
&#091;Start Time]    2025-07-16 15:15:39
&#091;Duration]      0:00:00
&#091;Log Directory] /home/oracle/autoupgrade-patching/simple-patching/log/DB19/100/pending
------------------------------------------
&#091;Stage Name]    PRECHECKS
&#091;Status]        SUCCESS
&#091;Start Time]    2025-07-16 15:15:39
&#091;Duration]      0:01:52
&#091;Log Directory] /home/oracle/autoupgrade-patching/simple-patching/log/DB19/100/prechecks
&#091;Detail]        /home/oracle/autoupgrade-patching/simple-patching/log/DB19/100/prechecks/DB19_preupgrade.log
Check passed and no manual intervention needed
------------------------------------------
</code></pre>



<p class="wp-block-paragraph">The analyze is OK, we can proceed further and deploy the patch.</p>



<h3 class="wp-block-heading" id="h-deploy-0">Deploy</h3>



<p class="wp-block-paragraph">Just run the following command : </p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
java -jar autoupgrade.jar -config /home/oracle/patch_DB19.cfg -patch -mode deploy
</pre></div>


<p class="wp-block-paragraph">The output look like : </p>



<pre class="wp-block-code"><code>AutoUpgrade Patching 25.3.250509 launched with default internal options
Processing config file ...
+-----------------------------------------+
| Starting AutoUpgrade Patching execution |
+-----------------------------------------+
1 Non-CDB(s) will be processed
Type 'help' to list console commands
patch&gt; lsj                          
+----+-------+---------+---------+-------+----------+-------+----------------+
|Job#|DB_NAME|    STAGE|OPERATION| STATUS|START_TIME|UPDATED|         MESSAGE|
+----+-------+---------+---------+-------+----------+-------+----------------+
| 101|   DB19|PRECHECKS|EXECUTING|RUNNING|  15:34:17| 5s ago|Executing Checks|
+----+-------+---------+---------+-------+----------+-------+----------------+
Total jobs 1

Details

	Job No           101
	Oracle SID       DB19
	Start Time       25/07/16 15:34:17
	Elapsed (min):   22
	End time:        N/A

Logfiles

	Logs Base:    /home/oracle/autoupgrade-patching/simple-patching/log/DB19
	Job logs:     /home/oracle/autoupgrade-patching/simple-patching/log/DB19/101
	Stage logs:   /home/oracle/autoupgrade-patching/simple-patching/log/DB19/101/patching
	TimeZone:     /home/oracle/autoupgrade-patching/simple-patching/log/DB19/temp
	Remote Dirs:  

Stages
	PENDING          &lt;1 min
	GRP              &lt;1 min
	PREACTIONS       &lt;1 min
	PRECHECKS        1 min
	PREFIXUPS        1 min
	EXTRACT          &lt;1 min
	INSTALL          &lt;1 min
	ROOTSH           &lt;1 min
	DBTOOLS          &lt;1 min
	OPATCH           12 min
	PATCHING         ~5 min (RUNNING)
	POSTCHECKS      
	POSTFIXUPS      
	POSTACTIONS     

Stage-Progress Per Container

	The Stage PATCHING does not have any data to show
Job 101 completed
------------------- Final Summary --------------------
Number of databases            &#091; 1 ]

Jobs finished                  &#091;1]
Jobs failed                    &#091;0]
Jobs restored                  &#091;0]
Jobs pending                   &#091;0]

---- Drop GRP at your convenience once you consider it is no longer needed ----
Drop GRP from DB19: drop restore point AU_PATCHING_9212_DB191928000


Please check the summary report at:
/home/oracle/autoupgrade-patching/simple-patching/log/cfgtoollogs/patch/auto/status/status.html
/home/oracle/autoupgrade-patching/simple-patching/log/cfgtoollogs/patch/auto/status/status.log
</code></pre>



<p class="wp-block-paragraph">We control the success or errors that can be occured during the deploiement: </p>



<pre class="wp-block-code"><code># cat /home/oracle/autoupgrade-patching/simple-patching/log/cfgtoollogs/patch/auto/status/status.log
==========================================
   AutoUpgrade Patching Summary Report
==========================================
&#091;Date]           Wed Jul 16 15:56:46 GMT 2025
&#091;Number of Jobs] 1
==========================================
&#091;Job ID] 101
==========================================
&#091;DB Name]                DB19
&#091;Version Before AutoUpgrade Patching] 19.24.0.0.240716
&#091;Version After AutoUpgrade Patching]  19.28.0.0.250715
------------------------------------------
&#091;Stage Name]    PENDING
&#091;Status]        SUCCESS
&#091;Start Time]    2025-07-16 15:34:18
&#091;Duration]      0:00:00
&#091;Log Directory] /home/oracle/autoupgrade-patching/simple-patching/log/DB19/101/pending
------------------------------------------
&#091;Stage Name]    GRP
&#091;Status]        SUCCESS
&#091;Start Time]    2025-07-16 15:34:18
&#091;Duration]      0:00:01
&#091;Log Directory] /home/oracle/autoupgrade-patching/simple-patching/log/DB19/101/grp
&#091;Detail]        Please drop the following GRPs after {0} completes:
                 AU_PATCHING_9212_DB191928000
------------------------------------------
&#091;Stage Name]    PREACTIONS
&#091;Status]        SUCCESS
&#091;Start Time]    2025-07-16 15:34:19
&#091;Duration]      0:00:00
------------------------------------------
&#091;Stage Name]    PRECHECKS
&#091;Status]        SUCCESS
&#091;Start Time]    2025-07-16 15:34:19
&#091;Duration]      0:01:21
&#091;Log Directory] /home/oracle/autoupgrade-patching/simple-patching/log/DB19/101/prechecks
&#091;Detail]        /home/oracle/autoupgrade-patching/simple-patching/log/DB19/101/prechecks/DB19_preupgrade.log
                Check passed and no manual intervention needed
------------------------------------------
&#091;Stage Name]    PREFIXUPS
&#091;Status]        SUCCESS
&#091;Start Time]    2025-07-16 15:35:40
&#091;Duration]      0:01:20
&#091;Log Directory] /home/oracle/autoupgrade-patching/simple-patching/log/DB19/101/prefixups
&#091;Detail]        /home/oracle/autoupgrade-patching/simple-patching/log/DB19/101/prefixups/prefixups.html
------------------------------------------
&#091;Stage Name]    EXTRACT
&#091;Status]        SUCCESS
&#091;Start Time]    2025-07-16 15:37:00
&#091;Duration]      0:00:49
&#091;Log Directory] /home/oracle/autoupgrade-patching/simple-patching/log/DB19/101/extract
------------------------------------------
&#091;Stage Name]    INSTALL
&#091;Status]        SUCCESS
&#091;Start Time]    2025-07-16 15:37:50
&#091;Duration]      0:00:52
&#091;Log Directory] /home/oracle/autoupgrade-patching/simple-patching/log/DB19/101/install
------------------------------------------
&#091;Stage Name]    ROOTSH
&#091;Status]        SUCCESS
&#091;Start Time]    2025-07-16 15:38:43
&#091;Duration]      0:00:00
&#091;Log Directory] /home/oracle/autoupgrade-patching/simple-patching/log/DB19/101/rootsh
------------------------------------------
&#091;Stage Name]    DBTOOLS
&#091;Status]        SUCCESS
&#091;Start Time]    2025-07-16 15:38:43
&#091;Duration]      0:00:02
&#091;Log Directory] /home/oracle/autoupgrade-patching/simple-patching/log/DB19/101/dbtools
------------------------------------------
&#091;Stage Name]    OPATCH
&#091;Status]        SUCCESS
&#091;Start Time]    2025-07-16 15:38:45
&#091;Duration]      0:12:19
&#091;Log Directory] /home/oracle/autoupgrade-patching/simple-patching/log/DB19/101/opatch
------------------------------------------
&#091;Stage Name]    PATCHING
&#091;Status]        SUCCESS
&#091;Start Time]    2025-07-16 15:51:05
&#091;Duration]      0:05:37
&#091;Log Directory] /home/oracle/autoupgrade-patching/simple-patching/log/DB19/101/patching
------------------------------------------
&#091;Stage Name]    POSTCHECKS
&#091;Status]        SUCCESS
&#091;Start Time]    2025-07-16 15:56:42
&#091;Duration]      0:00:00
&#091;Log Directory] /home/oracle/autoupgrade-patching/simple-patching/log/DB19/101/postchecks
&#091;Detail]        /home/oracle/autoupgrade-patching/simple-patching/log/DB19/101/postchecks/DB19_postupgrade.log
                Check passed and no manual intervention needed
------------------------------------------
&#091;Stage Name]    POSTFIXUPS
&#091;Status]        SUCCESS
&#091;Start Time]    2025-07-16 15:56:43
&#091;Duration]      0:00:02
&#091;Log Directory] /home/oracle/autoupgrade-patching/simple-patching/log/DB19/101/postfixups
&#091;Detail]        /home/oracle/autoupgrade-patching/simple-patching/log/DB19/101/postfixups/postfixups.html
------------------------------------------
&#091;Stage Name]    POSTACTIONS
&#091;Status]        SUCCESS
&#091;Start Time]    2025-07-16 15:56:46
&#091;Duration]      0:00:00
------------------------------------------</code></pre>
</div></div>
</div>



<h3 class="wp-block-heading" id="h-checking">Checking</h3>



<pre class="wp-block-code"><code>sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Wed Jul 16 16:05:31 2025
Version 19.28.0.0.0

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


Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.28.0.0.0

SQL&gt; col oracle_home format a60
select sys_context('USERENV','ORACLE_HOME') as oracle_home from dual; 

ORACLE_HOME
------------------------------------------------------------
/u01/app/oracle/product/19.28/dbhome_1

SQL&gt; col comp_id format a10
col version_full format a15
col status format a15    
select comp_id,
       version_full,
       status
from dba_registry
order by comp_id;  

COMP_ID    VERSION_FULL    STATUS
---------- --------------- ---------------
CATALOG    19.28.0.0.0	   VALID
CATPROC    19.28.0.0.0	   VALID
OWM	   19.28.0.0.0	   VALID
RAC	   19.28.0.0.0	   OPTION OFF
XDB	   19.28.0.0.0	   VALID</code></pre>



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



<p class="wp-block-paragraph">Finaly in few simple steps, we have patching our database. The AutoUpgrade utility is a very powerful tool, easy to use and manage.</p>



<div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<p class="wp-block-paragraph">I hope this blog help you to understand how AutoUpgrade works.<br>And I will encourage you to be familiar with this wonderful tool! </p>



<p class="wp-block-paragraph">In Part II, I will show you some advanced patching that AutoUpgrade can handle!</p>
</div></div>



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



<p class="wp-block-paragraph">See you soon!</p>
<p>L’article <a href="https://www.dbi-services.com/blog/oracle-autoupgrade-easy-way-to-upgrade-your-oracle-database-part-i/">Oracle AutoUpgrade? Easy way to upgrade your Oracle Database! Part I</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-autoupgrade-easy-way-to-upgrade-your-oracle-database-part-i/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>An overview of “Oracle Cloud Infrastructure: everything for an efficient migration” event by dbi services</title>
		<link>https://www.dbi-services.com/blog/an-overview-of-oracle-cloud-infrastructure-everything-for-an-efficient-migration-event-by-dbi-services/</link>
					<comments>https://www.dbi-services.com/blog/an-overview-of-oracle-cloud-infrastructure-everything-for-an-efficient-migration-event-by-dbi-services/#comments</comments>
		
		<dc:creator><![CDATA[Oracle Team]]></dc:creator>
		<pubDate>Wed, 17 May 2023 12:19:51 +0000</pubDate>
				<category><![CDATA[Ansible]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[Cloud]]></category>
		<category><![CDATA[Database Administration & Monitoring]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[MariaDB]]></category>
		<category><![CDATA[OMrun]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[YaK]]></category>
		<category><![CDATA[#yak]]></category>
		<category><![CDATA[Autonomous]]></category>
		<category><![CDATA[Azure]]></category>
		<category><![CDATA[kubernetes]]></category>
		<category><![CDATA[Migration]]></category>
		<category><![CDATA[mongodb]]></category>
		<category><![CDATA[OCI]]></category>
		<category><![CDATA[SQLServer]]></category>
		<category><![CDATA[WebLogic]]></category>
		<category><![CDATA[zdm]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=25334</guid>

					<description><![CDATA[<p>Is the Oracle Cloud a hot topic for you? dbi services organized an event about the Cloud today in Lausanne: &#8220;Oracle Cloud Infrastructure: everything for an efficient migration&#8220;. After a welcome coffee to meet each other, Pascal Zanette shortly introduced the event and the agenda of the day. Our CTO Hervé Schweitzer presented then YaK, [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/an-overview-of-oracle-cloud-infrastructure-everything-for-an-efficient-migration-event-by-dbi-services/">An overview of “Oracle Cloud Infrastructure: everything for an efficient migration” event by dbi services</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">Is the Oracle Cloud a hot topic for you?<br> <a href="https://www.dbi-services.com/" target="_blank" rel="noopener">dbi services</a> organized an event about the Cloud today in Lausanne: &#8220;<a href="https://www.dbi-services.com/news/oracle-cloud-infrastructure-everything-for-an-efficient-migration/" target="_blank" rel="noopener">Oracle Cloud Infrastructure: everything for an efficient migration</a>&#8220;.<br></p>



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



<p class="wp-block-paragraph">After a welcome coffee to meet each other, <a href="https://www.linkedin.com/in/pascal-zanette-a00422/" target="_blank" rel="noopener">Pascal Zanette</a> shortly introduced the event and the agenda of the day.</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2023/05/20230516_083720-1-1024x768.jpg" alt="" class="wp-image-25302"/></figure>



<p class="wp-block-paragraph">Our CTO <a href="https://www.linkedin.com/in/herve-schweitzer/" target="_blank" rel="noopener">Hervé Schweitzer</a> presented then <a href="https://www.dbi-services.com/fr/produits/yak/" target="_blank" rel="noopener">YaK</a>, developed by <a href="https://www.dbi-services.com/" target="_blank" rel="noopener">dbi services</a>.<br>The idea was born 2 years ago, to find a solution to deploy Oracle instances on several Cloud providers (<a href="https://www.oracle.com/cloud/" target="_blank" rel="noopener">Oracle</a>, <a href="https://azure.microsoft.com/en-us/" target="_blank" rel="noopener">Microsoft Azure</a>, <a href="https://aws.amazon.com/?nc1=h_ls" target="_blank" rel="noopener">AWS</a>) and On-Premises:<br>&#8211; in the same heterogeneous way<br>&#8211; avoiding constraints of each Cloud providers solution<br>&#8211; automated through <a href="https://www.ansible.com/" target="_blank" rel="noopener">Ansible</a>.<br>YaK is made of 2 parts:<br>&#8211; <a href="https://gitlab.com/yak4all/yak#get-started-setup-yak-core" target="_blank" rel="noopener">YaK Core</a> &#8211; as an Open Source collection (for the central inventory and instances deployment)<br>&#8211; YaK Components &#8211; based on a subscription (for database deployment and with dbi services best practices integration).<br>Hervé showed how YaK works more in details through a demo, that you can play again <a href="https://www.dbi-services.com/fr/produits/yak/#demo" target="_blank" rel="noopener">here</a>.<br>YaK is already available for <a href="https://www.oracle.com/" target="_blank" rel="noopener">Oracle</a> and <a href="https://www.postgresql.org/" target="_blank" rel="noopener">PostgreSQL</a>. YaK for <a href="https://www.microsoft.com/en-us/sql-server/?rtc=1" target="_blank" rel="noopener">SQL Server</a>, <a href="https://mariadb.com/" target="_blank" rel="noopener">MariaDB</a>, <a href="https://kubernetes.io/" target="_blank" rel="noopener">Kubernetes</a>, <a href="https://www.oracle.com/java/weblogic/" target="_blank" rel="noopener">WebLogic</a>, <a href="https://www.mongodb.com/" target="_blank" rel="noopener">MongoDB</a> and <a href="https://www.alfresco.com/" target="_blank" rel="noreferrer noopener">Alfresco</a> is under development and will come soon, so stay tuned! <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>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2023/05/20230516_084629-1024x768.jpg" alt="" class="wp-image-25303"/></figure>



<p class="wp-block-paragraph"><a href="https://www.linkedin.com/in/marc-wagner-49687b3/" target="_blank" rel="noopener">Marc Wagner</a> presented how to migrate from On-Premises to <a href="https://www.oracle.com/cloud/" target="_blank" rel="noopener">Oracle OCI</a> using <a href="https://www.oracle.com/database/zero-downtime-migration/" target="_blank" rel="noopener">Zero Downtime Migration</a> tool (ZDM).<br>Marc talked about advantages to go to the Cloud (such as scalability and flexibility, no dedicated hardware, less responsibility), but also alerted the audience about things to think about (such as performances and latency, costs monitoring, lock-in risk, sensitive data). Once we decided to make this change, what about downtime to migrate to the Cloud? That&#8217;s why ZDM is interesting: it&#8217;s high available (applying MAA Best Practices), it offers a very short downtime and a minimal impact on production systems and reduces human errors. ZDM allows to migrate to <a href="https://www.oracle.com/cloud/" target="_blank" rel="noopener">Oracle OCI</a> but also to <a href="https://www.oracle.com/cloud/exadata-x9m-cloud-and-on-premises/" target="_blank" rel="noopener">On-Premises Exadata</a>, <a href="https://www.oracle.com/engineered-systems/exadata/cloud-at-customer/" target="_blank" rel="noopener">Exadata Cloud@Customer</a> (ExaCC), <a href="https://www.oracle.com/autonomous-database/" target="_blank" rel="noopener">Autonomous Database</a>, etc&#8230;<br>And finally Marc presented through a live demo how to use ZDM with an Offline Logical Migration workflow to migrate from On-Premises to ADB (you can find a summary <a href="https://www.dbi-services.com/blog/oracle-zero-downtime-migration-offline-logical-database-migration-from-on-premises-to-autonomous-db/" target="_blank" rel="noopener">here</a>).</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2023/05/20230516_101005-1024x768.jpg" alt="" class="wp-image-25304"/></figure>



<p class="wp-block-paragraph">As a last session of the event, <a href="https://www.linkedin.com/in/marc-keller-5b441a/" target="_blank" rel="noopener">Marc Keller</a>, with <a href="https://www.linkedin.com/in/frank-zeindler-b0a07182/" target="_blank" rel="noopener">Frank Zeindler</a> remotely, presented Cloud migration made easier and safer with data validation. Marc explained why an extra validation after a data migration is helpful and how the <a href="https://www.omrun.ch/en/index.html" target="_blank" rel="noopener">OMrun</a> framework can compare data and orchestrate various processes for this purpose. Some OMrun use cases were then explored:<br>
&#8211; Quality assurance for reporting<br>
&#8211; Data integrity monitoring for system changeover and production<br>
&#8211; Data crawling and data cleansing<br>
&#8211; Data masking<br>
&#8211; Data quality assurance during migration to the Cloud.</p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><img decoding="async" data-id="25315" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2023/05/20230516_111644-1024x768.jpg" alt="" class="wp-image-25315"/></figure>
</figure>



<p class="wp-block-paragraph">The event is over. After a nice lunch break with colleagues, customers and attendees, we can come back home keeping in mind the magic triple jump to go to the Cloud (as Marc mentioned during his session):<br>&#8211; <a href="https://www.dbi-services.com/fr/produits/yak/" target="_blank" rel="noopener">dbi services YaK</a><br>&#8211; <a href="https://www.oracle.com/database/zero-downtime-migration/" target="_blank" rel="noopener">Oracle ZDM</a><br>&#8211; <a href="https://www.omrun.ch/en/index.html" target="_blank" rel="noopener">OMrun</a>.</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2023/05/20230516_1206181-1024x768.jpg" alt="" class="wp-image-25325"/></figure>



<p class="wp-block-paragraph">Last thing: don&#8217;t forget that another &#8220;<a href="https://www.dbi-services.com/news/oracle-cloud-infrastructure-everything-for-an-efficient-migration/" target="_blank" rel="noopener">Oracle Cloud Infrastructure: everything for an efficient migration</a>&#8221; event will take place on May 23 in Basel.<br>And some other <a href="https://www.dbi-services.com/news/?event_type%5B%5D=1" target="_blank" rel="noopener">dbi services events</a> will be organized during the year about DevOps, Cloud, Data and much more. So again, stay tuned! <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>



<p class="wp-block-paragraph">By <a href="https://www.linkedin.com/in/elisausai/">Elisa Usai</a></p>
<p>L’article <a href="https://www.dbi-services.com/blog/an-overview-of-oracle-cloud-infrastructure-everything-for-an-efficient-migration-event-by-dbi-services/">An overview of “Oracle Cloud Infrastructure: everything for an efficient migration” event by dbi services</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/an-overview-of-oracle-cloud-infrastructure-everything-for-an-efficient-migration-event-by-dbi-services/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Migrating Non-CDB to Multitenant</title>
		<link>https://www.dbi-services.com/blog/migrating-non-cdb-to-multitenant/</link>
					<comments>https://www.dbi-services.com/blog/migrating-non-cdb-to-multitenant/#respond</comments>
		
		<dc:creator><![CDATA[Oracle Team]]></dc:creator>
		<pubDate>Tue, 14 Feb 2023 20:28:53 +0000</pubDate>
				<category><![CDATA[Database Administration & Monitoring]]></category>
		<category><![CDATA[Database management]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[gold image]]></category>
		<category><![CDATA[Migrating from SUSE to Oracle Enterprise Linux 8]]></category>
		<category><![CDATA[Migration]]></category>
		<category><![CDATA[Multitenant database]]></category>
		<category><![CDATA[Oracle 19c]]></category>
		<category><![CDATA[Oracle Linux 8]]></category>
		<category><![CDATA[SuSE]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=22616</guid>

					<description><![CDATA[<p>By Mouhamadou Diaw Dealing these last days to database migration with a customer, I write this blog to describe the main tasks The context is to migrate databases to a new infrastructure. Below the configuration Source : Linux Suse in a non-multitenant architecture Target : Oracle Enterprise Linux 8 with multitenant The database version is [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/migrating-non-cdb-to-multitenant/">Migrating Non-CDB to Multitenant</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"><strong>By Mouhamadou Diaw</strong></p>



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



<p class="wp-block-paragraph">Dealing these last days to database migration with a customer, I write this blog to describe the main tasks</p>



<p class="wp-block-paragraph">The context is to migrate databases to a new infrastructure. Below the configuration</p>



<p class="wp-block-paragraph"><strong>Source :</strong> Linux Suse in a non-multitenant architecture</p>



<p class="wp-block-paragraph"><strong>Target :</strong> Oracle Enterprise Linux 8 with multitenant</p>



<p class="wp-block-paragraph">The database version is Oracle 19c</p>



<h2 class="wp-block-heading"><strong>Installing Oracle Binaries on the OEL</strong></h2>



<p class="wp-block-paragraph">The first step is to install the Oracle binaries. You can do it by many ways. I created a Gold Image from the source server.</p>



<p class="wp-block-paragraph">The advantage is that I will have the exact patch level than the source environment.</p>



<p class="wp-block-paragraph">The steps are described below</p>



<p class="wp-block-paragraph"><strong>1-Create the Gold Image on the source</strong></p>



<pre class="wp-block-code"><code>&#091;oracle@sourceserver ~]$ echo $ORACLE_HOME
/u00/app/oracle/product/19.14/dbhome_1
&#091;oracle@u027 ~]$ /u00/app/oracle/product/19.14/dbhome_1/runInstaller  -silent -createGoldImage -destinationLocation /u01/software/gold_image/rdbms19.14
Launching Oracle Database Setup Wizard...

Successfully Setup Software.
Gold Image location: /u01/software/gold_image/rdbms19.14/db_home_2023-02-06_09-03-15AM.zip
</code></pre>



<p class="wp-block-paragraph"><strong>2-Copy the Image to the OEL target server and unzip it to the new Oracle_Hom</strong>e</p>



<pre class="wp-block-code"><code>&#091;oracle@targetserver ~]$ unzip -d /u00/app/oracle/product/19.14/dbhome_1 /u01/software/gold_image/rdbms19.14/db_home_2023-02-06_09-03-15AM.zip</code></pre>



<p class="wp-block-paragraph"><strong>3-Launch the installation process on the target OEL server</strong></p>



<p class="wp-block-paragraph">The installation can be graphical or silent method. In my case I used the silent method with a response file</p>



<p class="wp-block-paragraph">With Oracle Enterprise Linux 8, you will need to export the CV_ASSUME_DISTID &nbsp;variable otherwise the install will fail</p>



<pre class="wp-block-code"><code>oracle@targetserver ~]$ export CV_ASSUME_DISTID=OEL7.8

&#091;oracle@targetserver ~]$ /u00/app/oracle/product/19.14/dbhome_1/runInstaller -silent  -responseFile /u01/software/gold_image/db_1914.rsp
Launching Oracle Database Setup Wizard...

The response file for this session can be found at:
 /u00/app/oracle/product/19.14/dbhome_1/install/response/db_2023-02-06_10-00-42AM.rsp

You can find the log of this install session at:
 /tmp/InstallActions2023-02-06_10-00-42AM/installActions2023-02-06_10-00-42AM.log

As a root user, execute the following script(s):
        1. /u00/app/oraInventory/orainstRoot.sh
        2. /u00/app/oracle/product/19.14/dbhome_1/root.sh

Execute /u00/app/oraInventory/orainstRoot.sh on the following nodes:
&#091;targetserver]
Execute /u00/app/oracle/product/19.14/dbhome_1/root.sh on the following nodes:
&#091;targetserver]

Successfully Setup Software.
Moved the install session logs to:
 /u00/app/oraInventory/logs/InstallActions2023-02-06_10-00-42AM
&#091;oracle@targetserver ~]$ 

</code></pre>



<p class="wp-block-paragraph">Then run the 2 scripts as asked</p>



<pre class="wp-block-code"><code>&#091;root@targetserver ~]# /u00/app/oraInventory/orainstRoot.sh
Changing permissions of /u00/app/oraInventory.
Adding read,write permissions for group.
Removing read,write,execute permissions for world.

Changing groupname of /u00/app/oraInventory to oinstall.
The execution of the script is complete.
&#091;root@targetserver ~]# /u00/app/oracle/product/19.14/dbhome_1/root.sh
Check /u00/app/oracle/product/19.14/dbhome_1/install/root_targetserver.sig-ge.ch_2023-02-06_10-02-03-988526328.log for the output of root script
&#091;root@targetserver ~]#
</code></pre>



<p class="wp-block-paragraph"><strong>4-Relink Oracle binaries (optional)</strong></p>



<p class="wp-block-paragraph">This step is optional but I recommend to do it when cloning your environment</p>



<pre class="wp-block-code"><code>&#091;oracle@targetserver ~]$ export ORACLE_HOME=/u00/app/oracle/product/19.14/dbhome_1
&#091;oracle@targetserver ~]$ cd $ORACLE_HOME/bin
&#091;oracle@targetserver ~]$./relink as_installed
</code></pre>



<p class="wp-block-paragraph">And that is all for the binaries. If you have different Oracle version, do the same</p>



<h2 class="wp-block-heading">Migrating the Data to multitenant architecture</h2>



<p class="wp-block-paragraph">You have may options to do that, we can for example list following</p>



<p class="wp-block-paragraph">-datapump</p>



<p class="wp-block-paragraph">-unplug and plug data </p>



<p class="wp-block-paragraph">-Creating the PDB via DB Link</p>



<p class="wp-block-paragraph">I used the third method, i.e using database link</p>



<p class="wp-block-paragraph"><strong>1-On the target server create an empty container</strong></p>



<p class="wp-block-paragraph">I used the silent method. You will have to create your responsefile accordingly.</p>



<pre class="wp-block-code"><code>oracle@u027:/home/oracle/ &#091;rdbms1914] /u00/app/oracle/product/19.14/dbhome_1/bin/dbca -silent -createDatabase -responseFile /home/oracle/dbca_1914.rsp
</code></pre>



<p class="wp-block-paragraph"><strong>2-On the target server create a database link to the source database</strong></p>



<p class="wp-block-paragraph">Let’s say my source database is PROD and the port used is 1521</p>



<p class="wp-block-paragraph">On the CDB$ROOT with SYS or a user with required privilege</p>



<pre class="wp-block-code"><code>SQL&gt; show pdbs

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

SQL&gt; CREATE DATABASE LINK "MIGLINK" CONNECT TO "SYSTEM" IDENTIFIED BY secret USING 'sourceserver:1521/PROD';

Database link created
</code></pre>



<p class="wp-block-paragraph">And now test the DB Link</p>



<pre class="wp-block-code"><code>SQL&gt; show pdbs

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

SQL&gt; select name from v$database@MIGLINK
</code></pre>



<p class="wp-block-paragraph"><strong>3-On the source server, give following privilege to the user used in the DB Link (i.e SYSTEM)</strong></p>



<pre class="wp-block-code"><code>SQL&gt; grant create pluggable database to system;

Grant succeeded.

SQL&gt;
</code></pre>



<p class="wp-block-paragraph"><strong>4-On the target server create the PDB using the DB Link</strong></p>



<p class="wp-block-paragraph">This can be done while the non-cdb database PROD is opened in Read Write mode but it is recommended to open the database in Read Only mode</p>



<pre class="wp-block-code"><code>SQL&gt; CREATE PLUGGABLE DATABASE PROD from non$cdb@MIGLINK;

Pluggable database created.

SQL&gt; show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         5 PROD                           MOUNTED
SQL&gt;
</code></pre>



<p class="wp-block-paragraph">Of course you can change the PDB name .</p>



<p class="wp-block-paragraph"><strong>5-On the target server run the noncdb_to_pdb.sql on the newly created PDB</strong></p>



<p class="wp-block-paragraph">Connect as SYS</p>



<pre class="wp-block-code"><code>SQL&gt; alter session set container=PROD;

Session altered.

SQL&gt; show con_name;

CON_NAME
------------------------------
PROD
SQL&gt; @?/rdbms/admin/noncdb_to_pdb.sql
…
…
  8      END IF;
  9    END;
 10  END;
 11  /

PL/SQL procedure successfully completed.

SQL&gt;
SQL&gt; WHENEVER SQLERROR CONTINUE;
SQL&gt;
SQL&gt;
SQL&gt;
SQL&gt; show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         5 PROD                          MOUNTED
</code></pre>



<p class="wp-block-paragraph">There should not be any error. And then you can now open you PDB in a R/W mode</p>



<pre class="wp-block-code"><code>SQL&gt; alter pluggable database PROD open;

Pluggable database altered.

SQL&gt;
</code></pre>



<p class="wp-block-paragraph">To automatically open the PDB the next time the instance is restarted.</p>



<pre class="wp-block-code"><code>SQL&gt; show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         5 PROD                           READ WRITE NO

SQL&gt; alter pluggable database all save state;

Pluggable database altered.

SQL&gt;
</code></pre>



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



<p class="wp-block-paragraph">As you can see migrating a Non-CDB database to multitenant one is not very difficult. Read Oracle documentation and you will see many information about converting database to CDB architecture</p>
<p>L’article <a href="https://www.dbi-services.com/blog/migrating-non-cdb-to-multitenant/">Migrating Non-CDB to Multitenant</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/migrating-non-cdb-to-multitenant/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>GitLab Migration and Upgrade</title>
		<link>https://www.dbi-services.com/blog/gitlab-migration-and-upgrade/</link>
					<comments>https://www.dbi-services.com/blog/gitlab-migration-and-upgrade/#respond</comments>
		
		<dc:creator><![CDATA[DevOps]]></dc:creator>
		<pubDate>Wed, 08 Feb 2023 17:01:10 +0000</pubDate>
				<category><![CDATA[DevOps]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[GitLab]]></category>
		<category><![CDATA[kubernetes]]></category>
		<category><![CDATA[Migration]]></category>
		<category><![CDATA[OpenShift]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=22315</guid>

					<description><![CDATA[<p>I&#8217;ve worked with my mate Donovan Winter (we are called Thomson and Thompson!) on a very interesting project for one of our customer that&#8217;s worth sharing. They had an old version of GitLab (release 13.3.4) running in a pod in OpenShift and wanted to migrate it into a Virtual Machine under Rocky Linux 8. They [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/gitlab-migration-and-upgrade/">GitLab Migration and Upgrade</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&#8217;ve worked with my mate <strong>Donovan Winter</strong> (we are called Thomson and Thompson!) on a very interesting project for one of our customer that&#8217;s worth sharing. They had an old version of GitLab (release 13.3.4) running in a pod in OpenShift and wanted to migrate it into a Virtual Machine under Rocky Linux 8.</p>



<p class="wp-block-paragraph">They then wanted to upgrade it to the latest GitLab release (release 15.7.3). I&#8217;ll share here all the steps required for doing such migration and upgrade.</p>



<h2 class="wp-block-heading">Setting up the new GitLab Server</h2>



<p class="wp-block-paragraph">The first step is to prepare a new Virtual Machine and install the prerequisite packages and services for GitLab:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
$ sudo dnf install -y curl openssh-server perl checkpolicy policycoreutils-python-utils python3-audit python3-libsemanage python3-setools python3-policycoreutils policycoreutils-python-utils

$ sudo systemctl enable sshd
$ sudo systemctl start sshd

$ sudo firewall-cmd --permanent --add-service=http
$ sudo firewall-cmd --permanent --add-service=https
$ sudo systemctl reload firewalld
</pre></div>


<p class="wp-block-paragraph">Then install GitLab 13.3.4 on this new server as this is the same release as the one in OpenShift:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
$ curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh| sudo bash

$ sudo dnf install gitlab-ce-13.3.4-ce.0.el8
</pre></div>


<p class="wp-block-paragraph">The curl command above adds the GitLab repository in our system so we can then install the GitLab package in release 13.3.4 (in our case). Note also that there are 2 flavours of GitLab: <strong>ce</strong> (Community Edition) and <strong>ee</strong> (Enterprise Edition). We installed the <strong>ce</strong> one because this is the one used in OpenShift and it has to match in order to be able to backup/restore data between these 2 instances.</p>



<p class="wp-block-paragraph">Then, set the initial GitLab configuration by editing the file <strong>/etc/gitlab/gitlab.rb</strong> and removing the <strong>#</strong> in front of the line <strong># gitlab_rails[&#8216;initial_root_password&#8217;] = &#8220;password&#8221;</strong></p>



<p class="wp-block-paragraph">We also changed in this file the URL of the GitLab Server on which to connect for the graphical interface: <strong>external_url &#8216;http://&lt;url_of_this_server&gt;&#8217;</strong></p>



<p class="wp-block-paragraph">Each time this GitLab configuration file is changed, you&#8217;ll need to reconfigure GitLab to take those modifications into account with the following command:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
$ sudo gitlab-ctl reconfigure
</pre></div>


<p class="wp-block-paragraph">In our case we had the following errors after running the reconfigure command:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
Running handlers:
There was an error running gitlab-ctl reconfigure:
execute&#x5B;/opt/gitlab/embedded/bin/initdb -D /var/opt/gitlab/postgresql/data -E UTF8] (postgresql::enable line 75) had an error: Mixlib::ShellOut::ShellCommandFailed: Expected process to exit with &#x5B;0], but received &#039;1&#039;
---- Begin output of /opt/gitlab/embedded/bin/initdb -D /var/opt/gitlab/postgresql/data -E UTF8 ----
STDOUT: The files belonging to this database system will be owned by user &quot;gitlab-psql&quot;.
This user must also own the server process.
STDERR: initdb: invalid locale settings; check LANG and LC_* environment variables
---- End output of /opt/gitlab/embedded/bin/initdb -D /var/opt/gitlab/postgresql/data -E UTF8 ----
Ran /opt/gitlab/embedded/bin/initdb -D /var/opt/gitlab/postgresql/data -E UTF8 returned 1
</pre></div>


<p class="wp-block-paragraph">This can be resolved as follows:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
$ export LC_ALL=&quot;en_US.UTF-8&quot;
$ export LC_CTYPE=&quot;en_US.UTF-8&quot;

$ sudo gitlab-ctl reconfigure
</pre></div>


<p class="wp-block-paragraph">And then the reconfigure was successful.</p>



<h2 class="wp-block-heading">Backup of GitLab in OpenShift</h2>



<p class="wp-block-paragraph">Connect to the OpenShift cluster, backup GitLab and transfer the backup file to the new GitLab server.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
$ oc login --server=https://&lt;cluster-server-name&gt; -u admin
$ oc project gitlab-prod

$ oc get pods
NAME                READY   STATUS    RESTARTS   AGE
gitlab-ce-9-p5xzx   1/1     Running   0          9d
redis-2-jwxzl       1/1     Running   0          1y

$ oc describe pod/gitlab-ce-9-p5xzx
</pre></div>


<p class="wp-block-paragraph">In an OpenShift cluster, you first login to it and then enter into a project (which is the equivalent of a namespace in Vanilla Kubernetes).</p>



<p class="wp-block-paragraph">There are only 2 pods in this project, one that contain the GitLab server and another one with the Redis database. There is no GitLab operator pod that would have helped creating a backup of this instance.</p>



<p class="wp-block-paragraph">Using <strong>describe</strong> on this GitLab pod will show all the environment variables that we may need in our new GitLab server. I&#8217;ll come back to this later on.</p>



<p class="wp-block-paragraph">We&#8217;ll then have to connect to the GitLab pod and do the backup as shown below:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
$ oc rsh gitlab-ce-9-p5xzx
# su git
git@gitlab-ce-9-p5xzx:~/gitlab$ /home/git/gitlab/bin/rake gitlab:backup:create
</pre></div>


<p class="wp-block-paragraph">This GitLab pod didn’t contain any of the usual GitLab binaries in <strong>/usr/bin</strong> so we can only rely on the rake tool that is part of the core of GitLab in order to do a backup. The backup file is then stored into the folder <strong>/home/git/data/backups</strong> of the pod as configured in its configuration file <strong><strong>/etc/gitlab/gitlab.rb</strong></strong></p>



<p class="wp-block-paragraph">We then just need to transfer this backup file using the OpenShift command below and transfer it to the new GitLab server:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
$ oc rsync gitlab-ce-9-p5xzx:/home/git/data/backups/1673909524_2023_01_31_13.3.4_gitlab_backup.tar ./

$ scp &lt;source&gt; &lt;destination&gt;
</pre></div>


<h2 class="wp-block-heading">Restore data in the new GitLab Server</h2>



<p class="wp-block-paragraph">First, set the backup path into the file <strong>/etc/gitlab/gitlab.rb</strong> by uncommenting and editing the following line : <strong>gitlab_rails[&#8216;backup_path&#8217;] = &#8220;/data/gitlab/backups&#8221;</strong></p>



<p class="wp-block-paragraph">Create this new backup repository and make git the owner :</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
$ sudo mkdir -p /data/gitlab/backups &amp;&amp; sudo chown -R git:git /data/gitlab
</pre></div>


<p class="wp-block-paragraph">Copy the backup file to this new repository and set the owner of this file to git:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
$ sudo cp 1673909524_2023_01_31_13.3.4_gitlab_backup.tar /data/gitlab/backups/

$ sudo chown git:git /data/gitlab/backups/1673909524_2023_01_31_13.3.4_gitlab_backup.tar
</pre></div>


<p class="wp-block-paragraph">Stop only the GitLab processes that are connected to the database:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
$ sudo gitlab-ctl stop unicorn 
$ sudo gitlab-ctl stop puma 
$ sudo gitlab-ctl stop sidekiq
</pre></div>


<p class="wp-block-paragraph">Reconfigure to apply changes in the <strong>gitlab.rb</strong> file (the backup path set above)</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
$ sudo gitlab-ctl reconfigure
</pre></div>


<p class="wp-block-paragraph">As the backup file has been copied into the backup folder of the new GitLab Server, we just have to restore it and restart everything:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
$ sudo gitlab-backup restore BACKUP=1673909524_2023_01_31_13.3.4

$ sudo gitlab-ctl reconfigure 
$ sudo gitlab-ctl restart
$ sudo gitlab-rake gitlab:check SANITIZE=true
</pre></div>


<p class="wp-block-paragraph">At this stage we have successfully migrated GitLab 13.3.4 from OpenShift to a new VM. Let&#8217;s now continue with the upgrade process to the latest release.</p>



<h2 class="wp-block-heading">GitLab Upgrade</h2>



<p class="wp-block-paragraph">GitLab provides a great tool (thank you to my mate <strong>Donovan Winter</strong> &#8211; one of our rising star in DevOps and our GitLab guru &#8211; for finding this out!) to see at a glance the upgrade path to follow by using the following link <a href="https://gitlab-com.gitlab.io/support/toolbox/upgrade-path" target="_blank" rel="noreferrer noopener">https://gitlab-com.gitlab.io/support/toolbox/upgrade-path</a></p>



<p class="wp-block-paragraph">Below is the path to follow:</p>



<p class="wp-block-paragraph">[`13.1.11`](<a href="https://docs.gitlab.com/ee/update/#1310" target="_blank" rel="noreferrer noopener">https://docs.gitlab.com/ee/update/#1310</a>)</p>



<p class="wp-block-paragraph">-&gt; [`13.8.8`](<a href="https://docs.gitlab.com/ee/update/#1388" target="_blank" rel="noreferrer noopener">https://docs.gitlab.com/ee/update/#1388</a>)</p>



<p class="wp-block-paragraph">-&gt; [`13.12.15`](<a href="https://docs.gitlab.com/ee/update/#13120" target="_blank" rel="noreferrer noopener">https://docs.gitlab.com/ee/update/#13120</a>)</p>



<p class="wp-block-paragraph">-&gt; [`14.0.12`](<a href="https://docs.gitlab.com/ee/update/#1400" target="_blank" rel="noreferrer noopener">https://docs.gitlab.com/ee/update/#1400</a>)</p>



<p class="wp-block-paragraph">-&gt; [`14.3.6`](<a href="https://docs.gitlab.com/ee/update/#1430" target="_blank" rel="noreferrer noopener">https://docs.gitlab.com/ee/update/#1430</a>)</p>



<p class="wp-block-paragraph">-&gt; [`14.9.5`](<a href="https://docs.gitlab.com/ee/update/#1490" target="_blank" rel="noreferrer noopener">https://docs.gitlab.com/ee/update/#1490</a>)</p>



<p class="wp-block-paragraph">-&gt; [`14.10.Z`](<a href="https://docs.gitlab.com/ee/update/#14100" target="_blank" rel="noreferrer noopener">https://docs.gitlab.com/ee/update/#14100</a>)</p>



<p class="wp-block-paragraph">-&gt; [`15.0.Z`](<a href="https://docs.gitlab.com/ee/update/#1500" target="_blank" rel="noreferrer noopener">https://docs.gitlab.com/ee/update/#1500</a>)</p>



<p class="wp-block-paragraph">-&gt; [`15.1.Z`](<a href="https://docs.gitlab.com/ee/update/#1510" target="_blank" rel="noreferrer noopener">https://docs.gitlab.com/ee/update/#1510</a>) (for GitLab instances with multiple web nodes)</p>



<p class="wp-block-paragraph">-&gt; [`15.4.0`](<a href="https://docs.gitlab.com/ee/update/#1540" target="_blank" rel="noreferrer noopener">https://docs.gitlab.com/ee/update/#1540</a>)</p>



<p class="wp-block-paragraph">-&gt; [latest `15.Y.Z`](<a href="https://gitlab.com/gitlab-org/gitlab/-/releases" target="_blank" rel="noreferrer noopener">https://gitlab.com/gitlab-org/gitlab/-/releases</a>)</p>



<p class="wp-block-paragraph">Below are all the commands of this upgrade path:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
# Upgrade to 13.8.8
$ sudo dnf install -y gitlab-ce-13.8.8

# Upgrade to 13.12.15
$ sudo dnf install -y gitlab-ce-13.12.15

# Upgrade to 14.0.12
$ sudo dnf install -y gitlab-ce-14.0.12

# Upgrade to 14.3.6
$ sudo dnf install -y gitlab-ce-14.3.6
$ sudo gitlab-ctl restart redis
$ sudo gitlab-ctl restart postgresql
$ sudo gitlab-rake db:migrate

# Upgrade to 14.9.5
$ sudo dnf install -y gitlab-ce-14.9.5

# Upgrade to 14.10.5
$ sudo dnf install -y gitlab-ce-14.10.5

# Upgrade to 15.0.5
$ sudo dnf install -y gitlab-ce-15.0.5

# Upgrade to 15.4.6
$ sudo dnf install -y gitlab-ce-15.4.6
$ sudo gitlab-ctl restart redis

# Upgrade to 15.7.3
$ sudo dnf install -y gitlab-ce-15.7.3
$ sudo gitlab-ctl restart redis
</pre></div>


<p class="wp-block-paragraph">When Redis or Postgresql needs to be restarted, it is mentioned at the end of output of the release installation. For some release, this is required because the running service version is different than the new one.</p>



<p class="wp-block-paragraph">The new GitLab server is now upgraded to release 15.7.3</p>



<h2 class="wp-block-heading">Final configuration</h2>



<p class="wp-block-paragraph">You may remember that at the very beginning we&#8217;ve looked at the environment variables of the GitLab pod. It is now time to transfer the required parameters to this new shiny GitLab server to complete our migration. In our case we only had to set back the parameters used for SMTP. For everything else, we kept the default settings of the new GitLab server. Below are the SMTP parameters of the file <strong>/etc/gitlab/gitlab.rb</strong></p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
gitlab_rails&#x5B;&#039;gitlab_email_enabled&#039;] = true
gitlab_rails&#x5B;&#039;gitlab_email_from&#039;] = &#039;no-reply@&lt;smtp_domain&gt;&#039;
gitlab_rails&#x5B;&#039;smtp_enable&#039;] = true
gitlab_rails&#x5B;&#039;smtp_address&#039;] = &quot;mail.&lt;smtp_domain&gt;&quot;
gitlab_rails&#x5B;&#039;smtp_port&#039;] = 25
gitlab_rails&#x5B;&#039;smtp_domain&#039;] = &quot;smtp_domain&quot;
</pre></div>


<p class="wp-block-paragraph">As usual we reconfigure GitLab to take those parameters into account:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
$ sudo gitlab-ctl reconfigure
</pre></div>


<p class="wp-block-paragraph">To test that SMTP is working properly, you can do a test and send an email to yourself, if it works (and it did for us) you are all set!</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
$ sudo gitlab-rails console
&gt; Notify.test_email(&#039;benoit.entzmann@dbi-services.com&#039;, &#039;Benoit Test&#039;, &#039;Test ok :)&#039;).deliver_now
</pre></div>


<h2 class="wp-block-heading">Migration and Upgrade done!</h2>



<p class="wp-block-paragraph">This is it! Those were all the steps required to migrate and upgrade a GitLab instance from a pod in OpenShift to a Virtual Machine.</p>



<p class="wp-block-paragraph">I hope this will help you if you have to do the same operation. Note that this procedure is also valid if you want to migrate and upgrade from another server (or Virtual Machine) instead of a pod in a Kubernetes cluster or if you just want to upgrade a GitLab instance. Just follow the steps in the section that match your needs!</p>



<p class="wp-block-paragraph">For a migration from another GitLab server, the backup is easily done with the command <strong>sudo gitlab-backup create</strong> on that instance and then you can follow this procedure for the restore (and upgrade if required).</p>



<p class="wp-block-paragraph">Have fun with it!</p>
<p>L’article <a href="https://www.dbi-services.com/blog/gitlab-migration-and-upgrade/">GitLab Migration and Upgrade</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/gitlab-migration-and-upgrade/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Import tnsnames.ora in LDAP directory</title>
		<link>https://www.dbi-services.com/blog/import-tnsnames-ora-in-ldap-directory/</link>
					<comments>https://www.dbi-services.com/blog/import-tnsnames-ora-in-ldap-directory/#respond</comments>
		
		<dc:creator><![CDATA[Oracle Team]]></dc:creator>
		<pubDate>Fri, 04 Feb 2022 17:00:26 +0000</pubDate>
				<category><![CDATA[Database Administration & Monitoring]]></category>
		<category><![CDATA[directory naming]]></category>
		<category><![CDATA[import]]></category>
		<category><![CDATA[ldap]]></category>
		<category><![CDATA[Migration]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[TNS]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/import-tnsnames-ora-in-ldap-directory/</guid>

					<description><![CDATA[<p>This post gives a short intro to directory naming, shows how to import from tnsnames.ora to an LDAP directory. Finally, as an alternative, you get an example how a TNS connection string looks like in ldif file format. LDIF can be used universally to export and importing data to LDAP directories. What is directory naming? [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/import-tnsnames-ora-in-ldap-directory/">Import tnsnames.ora in LDAP directory</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>This post gives a short intro to directory naming, shows how to import from tnsnames.ora to an LDAP directory. Finally, as an alternative, you get an example how a TNS connection string looks like in ldif file format. LDIF can be used universally to export and importing data to LDAP directories.</p>
<p><span id="more-17105"></span></p>
<h3>What is directory naming?</h3>
<p>In order to connect to a database, you either need to pass a DB connection string or you are using an alias to lookup up the string. When using an alias, there are two ways to connect to an Oracle database:</p>
<ol style="list-style-type: lower-alpha">
<li><strong>Local naming</strong><br />
Lookup DB connection strings locally in a tnsnames.ora file<a href="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/02/local_naming.png"><img fetchpriority="high" decoding="async" class="alignnone wp-image-54232 " src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/02/local_naming.png" alt="" width="589" height="226" /></a><br />
There is a variant when the connection is &#8220;directly&#8221; established using local application configuration in application or a jdbc string:<br />
<a href="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/02/local_naming_configuration.png"><img decoding="async" class="alignnone wp-image-54231" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/02/local_naming_configuration.png" alt="" width="593" height="186" /></a></li>
<li><strong>Directory naming</strong><br />
Lookup DB connection strings remotely in a LDAP directory<a href="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/02/directory_naming.png"><img decoding="async" class="alignnone wp-image-54230" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/02/directory_naming.png" alt="" width="600" height="133" /></a><br />
LDAP lookup is also possible via jdbc:<br />
<a href="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/02/directory_naming_jdbc_.png"><img loading="lazy" decoding="async" class="alignnone wp-image-54267" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/02/directory_naming_jdbc_.png" alt="" width="600" height="167" /></a></li>
</ol>
<p>This diagram summarises all the possibilities :</p>
<p><a href="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/02/diagram.png"><img loading="lazy" decoding="async" class="alignnone wp-image-54291 size-full" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/02/diagram.png" alt="" width="511" height="611" /></a></p>
<p>Directory naming can be compared to DNS, all you aliases are in one central LDAP server (like in a DNS server).<br />
If you do local naming, you use a local configuration file that can be compared to /etc/hosts.<br />
The data structure of both tnsnames.ora file or LDAP server used is a very simple key-value-store, it&#8217;s actually &lt;Alias&gt;=&lt;DB connection string&gt;</p>
<p>Directory naming has some benefits over local naming:</p>
<ul>
<li>There is a single source of &#8220;truth&#8221; in one central directory. Much easier to manage. You don&#8217;t have to distribute tnsnames.ora files to the clients.<br />
It&#8217;s advisable to run LDAP highly availabe, for example configuring replication between several LDAP servers and having load balancers distribute traffic.</li>
<li>On every client, all connections are available. Useful when accessing a DB from remote, for example remote PDB cloning, using DB links, Data Guard Observer, doing remote RMAN backup &amp; restore/recovery or cloning, etc.</li>
</ul>
<h3>Mass import from tnsnames.ora to LDAP Server</h3>
<p>In the following example we are using Oracle Unified Directory as an LDAP directory. You are free to choose other LDAP directories to use for directory naming: OpenLDAP or Active Directory to name just a few.<br />
Once you setup OUD for directory naming, you may want to do an initial load with contents from local tnsnames.ora file. In the directory your environment variable TNS_ADMIN points to, make sure to have these three files present:</p>
<p><strong>sqlnet.ora<br />
</strong>contains information on SQL*net configuration, important parameters are:</p>
<pre class="brush: text; gutter: false; first-line: 1">NAMES.DEFAULT_DOMAIN = company.com # default domain if domains are used
NAMES.DIRECTORY_PATH = (LDAP) # Where to lookup aliass, multi values possible, for example (TNSNAMES, LDAP) to first look locally, then on LDAP
</pre>
<p>&nbsp;</p>
<p><strong>ldap.ora<br />
</strong>contains information about your LDAP directory, important parameters are:</p>
<pre class="brush: text; gutter: false; first-line: 1">DIRECTORY_SERVERS     = (loadbalancer.company.com:1389) # Adress of the LDAP server
DEFAULT_ADMIN_CONTEXT = "dc=company,dc=com" # Context where alias entries are stored
DIRECTORY_SERVER_TYPE = OID # Type of LDAP server
</pre>
<p>&nbsp;</p>
<p><strong>tnsnames.ora</strong><br />
contains aliases and connections strings, example:</p>
<pre class="brush: text; gutter: false; first-line: 1">TESTDB = (DESCRIPTION=
           (ADDRESS_LIST=
              (ADDRESS=
                  (PROTOCOL=TCP)
                  (Host=testdb.company.com)
                  (Port=1521)
              )
           )
           (CONNECT_DATA=
              (SERVICE_NAME=testdb.company.com)
           )
        )
</pre>
<p>&nbsp;</p>
<p>On the client you would like to do the mass import, make sure to have either have the Oracle client or RDBMS software installed. Here, I&#8217;m using Oracle Client 12.2 64Bit on Windows. It&#8217;s quite an old version, but it fits our purpose. Both in Oracle client or RDBMS software, there is a tool called &#8220;Net Manager&#8221;. By reading the configuration files mentioned above, it&#8217;s able to connect both to remote LDAP servers and local tnsnames.ora file.</p>
<p>Startup Net Manager. In the menu, choose &#8220;COMMAND &#8211; DIRECTORY &#8211; EXPORT NET SERVICE NAMES&#8221;:<br />
<a href="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/02/import1.png"><img loading="lazy" decoding="async" class="alignnone wp-image-54269 size-full" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/02/import1.png" alt="" width="379" height="136" /></a></p>
<p>After authenticating to the LDAP server, a wizard shows up on which you are able to choose which aliases to add to LDAP directory:<br />
<a href="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/02/import2.png"><img loading="lazy" decoding="async" class="alignnone wp-image-54271 size-full" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/02/import2.png" alt="" width="595" height="354" /></a></p>
<p><a href="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/02/import3.png"><img loading="lazy" decoding="async" class="alignnone wp-image-54273 size-full" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/02/import3.png" alt="" width="592" height="354" /></a></p>
<h3>Alternative: Use LDIF to export and import LDAP data</h3>
<p>LDIF file format is easiest if you want to transfer data between LDAP directories. It&#8217;s also possible to create LDIF files containing TNS data. See the following example LDIF record for alias &#8220;TESTDB&#8221;:</p>
<pre class="brush: text; gutter: false; first-line: 1">dn: CN=TESTDB,cn=OracleContext,dc=company,dc=com
orclNetDescString: (DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(Host=testdb.company.com)(Port=1521)))(CONNECT_DATA=(SERVICE_NAME=testdb.company.com)))
objectClass: top
objectClass: orclNetService
CN: TESTDB
</pre>
<p>Aliases are stored in LDAP context &#8220;cn=OracleContext,dc=company,dc=com&#8221;.<br />
&#8220;orclNetDescString&#8221; contains the actual DB connection string.<br />
&#8220;CN&#8221; contains the alias value and is used to lookup a connection string.</p>
<p>L’article <a href="https://www.dbi-services.com/blog/import-tnsnames-ora-in-ldap-directory/">Import tnsnames.ora in LDAP directory</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.dbi-services.com/blog/import-tnsnames-ora-in-ldap-directory/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Oracle autoupgrade on Windows and plugin to a Container DB with virtual accounts</title>
		<link>https://www.dbi-services.com/blog/oracle-autoupgrade-on-windows-and-plugin-to-a-container-db-with-virtual-accounts/</link>
					<comments>https://www.dbi-services.com/blog/oracle-autoupgrade-on-windows-and-plugin-to-a-container-db-with-virtual-accounts/#respond</comments>
		
		<dc:creator><![CDATA[Clemens Bleile]]></dc:creator>
		<pubDate>Mon, 08 Feb 2021 10:49:27 +0000</pubDate>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[autoupgrade]]></category>
		<category><![CDATA[Migration]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[Windows]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/oracle-autoupgrade-on-windows-and-plugin-to-a-container-db-with-virtual-accounts/</guid>

					<description><![CDATA[<p>In a project I recently had to upgrade an Oracle 12.2.-DB to 19.9. and at the same time migrate from the non-container architecture to the container architecture. The interesting part here is to do this on Windows. Actually both steps (upgrade and plugin) are possible using the autoupgrade tool , which is the preferred tool [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/oracle-autoupgrade-on-windows-and-plugin-to-a-container-db-with-virtual-accounts/">Oracle autoupgrade on Windows and plugin to a Container DB with virtual accounts</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>In a project I recently had to upgrade an Oracle 12.2.-DB to 19.9. and at the same time migrate from the non-container architecture to the container architecture. The interesting part here is to do this on Windows. Actually both steps (upgrade and plugin) are possible using the <a href="https://mikedietrichde.com/2019/04/29/the-new-autoupgrade-utility-in-oracle-19c/">autoupgrade tool</a> , which is the preferred tool to do Oracle upgrades today. </p>
<p>Before doing the upgrade at the customer, I performed 2 tests in my personal environment:</p>
<p>&#8211; Upgrade 12.2. to 19.9. and the plugin to a container-DB in 2 separate steps<br />
&#8211; Upgrade 12.2. to 19.9. and the plugin to a container-DB in 1 step (i.e. calling &#8220;autoupgrade -mode deploy&#8221; only once)</p>
<p>Doing the upgrade and the plugin in 2 steps requires to manually create the Windows services again after the upgrade finished using the oradim-utility. I.e. first step is the upgrade, which automatically uses a temporary Windows service. At the end of the upgrade new services have to be created manually, because autoupgrade has no clue about the password of the user running the Oracle services. I.e. I used the following config file upgrade_config_122_199_SIMC.cfg.txt:</p>
<pre><code>
# Global parameter
# ================

global.autoupg_log_dir=D:Downloadsoracle19cautoupgradelogs
global.target_home=D:appcblvirtualproduct19.9.0dbhome_1
global.target_version=19


# Database parameter SIMC
# =======================

upg1.dbname=simc
upg1.start_time=NOW
upg1.source_home=D:appcblvirtualproduct12.2.0dbhome_1
upg1.sid=simc
upg1.upgrade_node=dbi-pc-cbl
# upg1.add_after_upgrade_pfile=D:Downloadsoracle19cautoupgradepfileadd_after_init.ora
</code></pre>
<p>The commands for the upgrade were</p>
<pre><code>
%ORACLE_HOME%jdkbinjava -jar autoupgrade.jar -config configupgrade_config_122_199_SIMC.cfg.txt -mode analyze
%ORACLE_HOME%jdkbinjava -jar autoupgrade.jar -config configupgrade_config_122_199_SIMC.cfg.txt -mode fixups
%ORACLE_HOME%jdkbinjava -jar autoupgrade.jar -config configupgrade_config_122_199_SIMC.cfg.txt -mode deploy
</code></pre>
<p>And finally executed the oradim-commands on the cmd-prompt:</p>
<pre><code>
oradim -delete -sid SIMC
oradim -new -sid SIMC -startmode auto -spfile -shutmode immediate
</code></pre>
<p>The second step then was to plugin the non-container-DB with the following config file:</p>
<pre><code>
# Global parameter
# ================

global.autoupg_log_dir=D:Downloadsoracle19cautoupgradelogs3
global.target_home=D:appcblvirtualproduct19.9.0dbhome_1
global.target_version=19


# Database parameter SIMC
# =======================

upg1.dbname=simc
upg1.start_time=NOW
upg1.source_home=D:appcblvirtualproduct19.9.0dbhome_1
upg1.sid=simc
upg1.upgrade_node=dbi-pc-cbl
# upg1.add_after_upgrade_pfile=D:Downloadsoracle19cautoupgradepfileadd_after_init.ora
upg1.target_cdb=cdbsimc
upg1.target_pdb_name=PDBSIMC
upg1.target_pdb_copy_option=file_name_convert=('D:APPCBLVIRTUALORADATASIMC','D:APPCBLVIRTUALORADATACDBSIMCSIMC')
</code></pre>
<p>As the source and target ORACLE_HOME are the same, no upgrade actually happens, but just the plugin.</p>
<p>During installation of Oracle I did choose to use the virtual account. This worked fine for the migration in 2 steps. Later on we&#8217;ll see that the virtual account causes issues during plugin when doing the upgrade and plugin in 1 step.</p>
<p>See <a href="https://www.dbi-services.com/blog/oracle-12-2-windows-virtual-account/">this blog</a> with more information about the virtual account on Windows.</p>
<p>Doing the upgrade and plugin in one step has the following advantage:</p>
<p>There&#8217;s no need to manually create the Windows service, because the services of the pre-created container-DB are already there.</p>
<p>To do the upgrade and plugin in one step I used the following autoupgrade-config-file after creating an empty container db CDBSIMC:</p>
<pre><code>
# Global parameter
# ================

global.autoupg_log_dir=D:Downloadsoracle19cautoupgradelogs2
global.target_home=D:appcblvirtualproduct19.9.0dbhome_1
global.target_version=19


# Database parameter SIMC
# =======================

upg1.dbname=simc
upg1.start_time=NOW
upg1.source_home=D:appcblvirtualproduct12.2.0dbhome_1
upg1.sid=simc
upg1.upgrade_node=dbi-pc-cbl
# upg1.add_after_upgrade_pfile=D:Downloadsoracle19cautoupgradepfileadd_after_init.ora
upg1.target_cdb=cdbsimc
upg1.target_pdb_name=PDBSIMC
upg1.target_pdb_copy_option=file_name_convert=('D:APPCBLVIRTUALORADATASIMC','D:APPCBLVIRTUALORADATACDBSIMCSIMC')
</code></pre>
<p>The upgrade went through, but the plugin failed with the following error:</p>
<p>createpdb_simc_PDBSIMC.log: </p>
<pre><code>
Start of SQL*Plus output

SQL*Plus: Release 19.0.0.0.0 - Production on Fri Jan 29 22:54:33 2021
Version 19.9.0.0.0

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

SQL&gt; SQL&gt; Connected.
SQL&gt; SQL&gt; old   1: create pluggable database "&amp;pdbName" &amp;asClone using '&amp;xmlFilePath' &amp;fileNameConvertOption tempfile reuse
new   1: create pluggable database "PDBSIMC" as clone using 'D:Downloadsoracle19cautoupgradelogs2simcsimc105noncdbtopdbPDBSIMC.xml' COPY file_name_convert=('D:APPCBLVIRTUALORADATASIMC','D:APPCBLVIRTUALORADATACDBSIMCSIMC') tempfile reuse
create pluggable database "PDBSIMC" as clone using 'D:Downloadsoracle19cautoupgradelogs2simcsimc105noncdbtopdbPDBSIMC.xml' COPY file_name_convert=('D:APPCBLVIRTUALORADATASIMC','D:APPCBLVIRTUALORADATACDBSIMCSIMC') tempfile reuse
*
ERROR at line 1:
ORA-19505: failed to identify file
"D:APPCBLVIRTUALORADATASIMCSYSTEM01.DBF"
ORA-27041: unable to open file
OSD-04002: unable to open file
O/S-Error: (OS 5) Access is denied.
</code></pre>
<p>REMARK: As you can see the plugin is actually a &#8220;Clone&#8221;. I.e. the original datafiles are kept to be able to go back. </p>
<p>The reason for the issue was that the 12.2.-Window-service runs under permission of the group ORA_OraDB12Home1_SVCACCTS and hence permission to access the associated DB-files are also granted to that group. This does not change during the upgrade to 19c, but of course can be adjusted with oradim. As we skipped the manual step with oradim, the 19c-services for the container DB CDBSIMC (which runs in group ORA_OraDB19Home1_SVCACCTS) do not have access to the DB-files to clone them.</p>
<p>The workaround in my environment was to grant full rights on the db-files to group ORA_OraDB19Home1_SVCACCTS prior to the upgrade/plugin. </p>
<p>Afterwards my upgrade and plugin went through with the following content in the createpdb_simc_PDBSIMC.log:</p>
<pre><code>
Start of SQL*Plus output

SQL*Plus: Release 19.0.0.0.0 - Production on Sat Jan 30 01:15:55 2021
Version 19.9.0.0.0

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

SQL&gt; SQL&gt; Connected.
SQL&gt; SQL&gt; old   1: create pluggable database "&amp;pdbName" &amp;asClone using '&amp;xmlFilePath' &amp;fileNameConvertOption tempfile reuse
new   1: create pluggable database "PDBSIMC" as clone using 'D:Downloadsoracle19cautoupgradelogs5simcsimc100noncdbtopdbPDBSIMC.xml' COPY file_name_convert=('D:APPCBLVIRTUALORADATASIMC','D:APPCBLVIRTUALORADATACDBSIMCSIMC') tempfile reuse

Pluggable database created.
</code></pre>
<p>The best solution here is of course to use the same local account for all Oracle DB-services and not the virtual account. If you plan to use the virtual account then it is a good idea from the beginning to use the same value for the registry entry ORACLE_SVCUSER for all installed versions. E.g. I used ORA_DBSVCACCTS instead of the defaults ORA_OraDB12Home1_SVCACCTS (for 12.2.) and ORA_OraDB19Home1_SVCACCTS (for 19c) during my tests successfully.</p>
<p>L’article <a href="https://www.dbi-services.com/blog/oracle-autoupgrade-on-windows-and-plugin-to-a-container-db-with-virtual-accounts/">Oracle autoupgrade on Windows and plugin to a Container DB with virtual accounts</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-autoupgrade-on-windows-and-plugin-to-a-container-db-with-virtual-accounts/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>A typical ODA project (and why I love Oracle Database Appliance)</title>
		<link>https://www.dbi-services.com/blog/a-typical-oda-project-and-why-i-love-oracle-database-appliance/</link>
					<comments>https://www.dbi-services.com/blog/a-typical-oda-project-and-why-i-love-oracle-database-appliance/#respond</comments>
		
		<dc:creator><![CDATA[Jérôme Dubar]]></dc:creator>
		<pubDate>Tue, 08 Dec 2020 16:47:43 +0000</pubDate>
				<category><![CDATA[Database Administration & Monitoring]]></category>
		<category><![CDATA[Database management]]></category>
		<category><![CDATA[Hardware & Storage]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[19c]]></category>
		<category><![CDATA[benefits]]></category>
		<category><![CDATA[Data Guard]]></category>
		<category><![CDATA[Migration]]></category>
		<category><![CDATA[ODA]]></category>
		<category><![CDATA[odacli]]></category>
		<category><![CDATA[Oracle database appliance]]></category>
		<category><![CDATA[project]]></category>
		<category><![CDATA[typical project]]></category>
		<category><![CDATA[X7-2HA]]></category>
		<category><![CDATA[X7-2M]]></category>
		<category><![CDATA[X7-2S]]></category>
		<category><![CDATA[x8-2ha]]></category>
		<category><![CDATA[x8-2m]]></category>
		<category><![CDATA[x8-2s]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/a-typical-oda-project-and-why-i-love-oracle-database-appliance/</guid>

					<description><![CDATA[<p>Introduction You can say everything about Oracle infrastructure possibilities but nothing compares to experience based on the realization of real projects. I did quite a lot of ODA projects during the past years (on other platforms too), and I would like to tell you why I trust this solution. And for that, I will tell [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/a-typical-oda-project-and-why-i-love-oracle-database-appliance/">A typical ODA project (and why I love Oracle Database Appliance)</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>Introduction</h2>
<p>You can say everything about Oracle infrastructure possibilities but nothing compares to experience based on the realization of real projects. I did quite a lot of ODA projects during the past years (on other platforms too), and I would like to tell you why I trust this solution. And for that, I will tell you the story of one of my latest ODA project.</p>
<h2>Before choosing ODAs</h2>
<p>A serious audit of the current infrastructure is needed, don&#8217;t miss that point. Sizing the storage, the memory, the licenses takes several days, but you will need that study. You cannot take good decisions being blind.</p>
<p>The metrics I would recommend to collect for designing your new ODA infrastructure are:<br />
&#8211; the needed segregation (PROD/UAT/DEV/TEST/DR&#8230;)<br />
&#8211; the DBTime from actual databases consolidated for each group<br />
&#8211; the size and growth forecast for each database<br />
&#8211; the memory usage for SGA and PGA, and the memory advised by Oracle inside each database<br />
&#8211; an overview of future projects coming in the next years<br />
&#8211; an overview of legacy applications that will stop to use Oracle in the next years</p>
<p>Once done, this audit will help you to choose how many ODAs, which type of ODA, how many disks on each ODA and so on. For this particular project, the audit was done several months before and led to an infrastructure composed of 6 X8-2M ODAs with various disk configurations.</p>
<h2>Before delivery</h2>
<p>I usually provide an Excel file to my customer for collecting essential information for the new environment:<br />
&#8211; hostnames of the servers<br />
&#8211; purpose of each server<br />
&#8211; public network configuration (IP, netmask, gateway, DNS, NTP, domain)<br />
&#8211; ILOM network configuration (IP, netmask, gateway &#8211; this is for the management interface)<br />
&#8211; additional networks configuration (for backup or administration networks if additional interfaces have been ordered)<br />
&#8211; the DATA/RECO repartition of the disks<br />
&#8211; the target uid and gid for Linux users on ODA<br />
&#8211; the version(s) of the database needed<br />
&#8211; the number of cores to enable on each ODA (if using Enterprise Edition &#8211; this is how licenses are configured)</p>
<p>With this file, I&#8217;m pretty sure to have almost everything before the server are delivered.</p>
<h2>Delivery day</h2>
<p>Once the ODAs are delivered, you&#8217;ll first need to rack them into your datacenters and plug the power and network cables. If you are well organized, you&#8217;ll have done the network patching before and the cable would be ready to plug in. Racking an ODA S and M is easy, less than one hour. Even less if you&#8217;re used to racking servers. For ODA HA it&#8217;s a little bit more complicated, because 1 ODA HA is actually 2 servers and 1 DAS storage enclosure, or 2 DAS enclosures if you ordered the maximum disk configuration. But these are normal servers, and it shouldn&#8217;t be too long or too complicated.</p>
<h2>1st Day</h2>
<p>The first day is an important day because you can do a lot if everything is prepared.</p>
<p>You&#8217;ll need several zipfiles to download from MOS to deploy an ODA, and these zipfiles are quite big, 10 to 40GB depending on your configuration. Don&#8217;t wait to download them from the links in the <a href="https://docs.oracle.com/en/engineered-systems/oracle-database-appliance/" rel="noopener noreferrer" target="_blank">documentation</a>. You can choose an older software version than current one, but commonly it&#8217;s a good idea to deploy the very latest version. You need to download:<br />
&#8211; the ISO file for bare metal reimaging<br />
&#8211; the GI clone<br />
&#8211; the DB clones for the database versions you planned to use<br />
&#8211; the patch files, because you probably need them (we will see why later)</p>
<p>During the download, you can connect to the ILOM IP of the server and configure static IP address. Gathering the IP of the ILOM will need the help from the network/system team, because each ILOM first looks up for a dynamic IP from DHCP, therefore you need to change it.</p>
<p>Once everything is downloaded, you can start the reimaging of the first ODA from the ILOM of the server, then a few minutes later on the second one if you&#8217;ve got multiple ODAs. After the reimaging, you will use the configure-firstnet script on each ODA to configure basic network settings on public interface to be able to connect to the server itself.</p>
<p>Once the first ODA is ready, I usually prepare the json file for appliance deployment from the template and according to the settings provided in the excel file. It takes me about 1 hour to make sure nothing is wrong or missing, and then I start the appliance creation. I always create the appliance with a DBTEST database to make sure everything is fine up to database creation. During the first appliance creation, I copy the json file to the other ODA, change the few parameters that differ from the previous one, and also start the appliance creation.</p>
<p>Once done, I deploy the additional dbhomes if needed on both ODAs in parallel.</p>
<p>Then, I check the version of the components with odacli describe-components. You may know that a reimage does not update the microcodes of the ODAs, you should be aware of that. If firmware/bios/ILOM are not up-to-date, you need to apply the patch on top of your deployment, even if the software side is OK. So copy the patch on both ODAs, and apply it. It will probably need a reboot or two.</p>
<p>Once done, I usually configure the number of cores with odacli update-cpucores to match the license. If my customer only has Standard Edition licenses, I also decrease the number of cores to make sure to benefit from maximum CPU speed. <a href="https://www.dbi-services.com/blog/boost-your-cpu-speed-with-standard-edition-2-on-oda/" rel="noopener noreferrer" target="_blank">See why here</a>.</p>
<p>Finally, I do a sanity check of the 2 ODAs, checking if everything is running fine.</p>
<p>At the end of this first day, 2 ODAs are ready to use.</p>
<h2>2nd Day</h2>
<p>I&#8217;m quite anxious about my ODAs not being exactly identical. So the next day, I deployed the other ODAs. For this particular project, it was a total of 6 ODAs with various disk and license configuration, but the deployment method is the same.</p>
<p>Based on what I did the previous day, I deployed quite easily the 4 other ODAs with their own json deployment file. Then I applied the patch, configured the license, and did the sanity checks.</p>
<p>At the end of this second day, my 6 ODAs were ready to use.</p>
<h2>3rd day</h2>
<p>2 ODAs came with hardware warnings, and most of the time these warning are false positive. So I did a check from the ILOM CLI, reset the alerts and restart the ILOM. That solved the problem.</p>
<p>As documentation is something quite important for me and for my customer, I spent the rest of the day on consolidating all information and provide a first version of the documentation to the customer. </p>
<h2>4th Day</h2>
<p>The fourth day was actually the next week. During this time, my customer created a first development database and put it on &#8220;production&#8221; without any problem.</p>
<p>With every new ODA software release, new features are available. And I think it&#8217;s worth it to test these features because it can bring you something very usefull.</p>
<p>This time, I was quite curious about the Data Guard feature now included with odacli. Data Guard manual configuration is always quite long, it&#8217;s not very difficult but a lot of steps are needed to achieve this kind of configuration. And you have to do it for each database, meaning that it can takes days to put all your databases under Data Guard protection.</p>
<p>So I proposed to my customer to test the Data Guard implementation with odacli. I created a test database dedicated for that purpose, and followed the online documentation. It took me all the day, but I was able to create the standby, to configure Data Guard, to do a switchover, to do the switchback and to make a clean and complete procedure for the customer. You need to do that because the documentation has 1 or 2 steps that need more accuracy, and 1 or 2 others that need to be adapt to the customer&#8217;s environment.</p>
<p>This new feature will definitely simplify the Data Guard configuration, please <a href="https://www.dbi-services.com/blog/configure-data-guard-with-odacli-on-oda/" rel="noopener noreferrer" target="_blank">take a look at my blog post</a> if you&#8217;d like to test it.</p>
<h2>5th Day</h2>
<p>The goal of this day was to make a procedure for configuring Data Guard between the old platform and the new one. An ACFS to ASM conversion was needed, as well. So we worked on that point, made a lot of tests and finally provide a procedure for most cases. A DUPLICATE DATABASE FOR STANDBY with a BACKUP LOCATION was used in that procedure.</p>
<p>This procedure is not ODA specific, most of the advanced operations on ODA are done using classic tools.</p>
<h2>6th, 7th and 8th days</h2>
<p>These days were dedicated to the ODA workshop. It&#8217;s the perfect timing for this training, because the customer already had quite a lot of information during the deployment, and the servers are not yet on production meaning that we can use them for demos and exercises. At dbi services, we make our own training material. Regarding the ODA workshop, it&#8217;s start from the history of ODA until the lifecycle management of the plaform. You need 2 to 3 days to have a good overview of the solution and to get ready to work on it.</p>
<h2>9th and 10th days</h2>
<p>These days were actually extra days in my opinion, extra days are not useless day. Most often, it&#8217;s a good addition because there&#8217;s always the need to go deeper for some themes. </p>
<p>This time, we need to refine the Data Guard procedure and test it with older versions: 12.2, 12.1 and 11.2. We discovered that it didn&#8217;t work for 11.2, and we tried to debug. Finally, we decided to use only the ODA Data Guard feature for 12.1 and later versions, it was OK because only a few databases will not be able to go higher than 11.2. We also found that configuring Data Guard from scratch only takes 40 minutes, including the backup/restore operations (for the smallest possible database), it definitely validated the efficiency of this method over manual configuration.</p>
<p>We also studied the best way to create additional listeners, because odacli does not include the listener management. Using srvctl to do that was quite convenient and clean, so we provided a procedure to configure these listeners, and we also tested the Data Guard feature with these dedicated listeners, it was OK.</p>
<p>Last task was to provide a procedure for ACFS to ASM migration. Once migrated to 19c, 11gR2 databases can be moved to ASM to get rid of ACFS (as ASM has been chosen by the customer for all 12c and later databases). odacli does not provide a mechanism to move from ACFS to ASM, but it&#8217;s possible to restore an ACFS database to ASM quite easily.</p>
<p>Actually, these 2 days were very efficient. And I also had enough time to send the v1.1 of the documentation with all the procedures we elaborated together with my customer.</p>
<h2>The next days</h2>
<p>For this project, my job was limited to deploying/configuring the ODAs and training my customer plus giving him the best practices. With a team of experimented DBAs, it will be quite easy now to continue without me, the next task being to migrate each database to this new infrastructure. Even on ODA, the migration process takes days because there is a lot of databases coming from different versions.</p>
<h2>Conclusion</h2>
<p>ODA is a great platform to optimize your work, starting from the migration project. You don&#8217;t loose time because this solution is ready to use. I don&#8217;t think it&#8217;s possible to be as efficient with another on-premise platform. For sure, you will save a lot of time, you will have less problems, you will manage everything by yourself, the performance will be good. ODA is probably the best option for achieving this kind of project with minimal risk and maximal efficiency.</p>
<p>L’article <a href="https://www.dbi-services.com/blog/a-typical-oda-project-and-why-i-love-oracle-database-appliance/">A typical ODA project (and why I love Oracle Database Appliance)</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/a-typical-oda-project-and-why-i-love-oracle-database-appliance/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Documentum &#8211; Some things to take care of when migrating/upgrading</title>
		<link>https://www.dbi-services.com/blog/documentum-some-things-to-take-care-of-when-migrating-upgrading/</link>
					<comments>https://www.dbi-services.com/blog/documentum-some-things-to-take-care-of-when-migrating-upgrading/#comments</comments>
		
		<dc:creator><![CDATA[Morgan Patou]]></dc:creator>
		<pubDate>Tue, 14 Jul 2020 17:21:50 +0000</pubDate>
				<category><![CDATA[Application integration & Middleware]]></category>
		<category><![CDATA[Enterprise content management]]></category>
		<category><![CDATA[Documentum]]></category>
		<category><![CDATA[Migration]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[Upgrade]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/documentum-some-things-to-take-care-of-when-migrating-upgrading/</guid>

					<description><![CDATA[<p>Over the years I have been working with Documentum, I participated in many migrations and/or upgrades. Just like everything else, this obviously builds up some experience but what if you are pretty new to Documentum and it is your first time working on one? Sure, there is the Documentation from OpenText, which is several dozens [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/documentum-some-things-to-take-care-of-when-migrating-upgrading/">Documentum &#8211; Some things to take care of when migrating/upgrading</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Over the years I have been working with Documentum, I participated in many migrations and/or upgrades. Just like everything else, this obviously builds up some experience but what if you are pretty new to Documentum and it is your first time working on one? Sure, there is the Documentation from OpenText, which is several dozens of pages (~140, depending on versions) of intense fun so prepare a lot of coffee, you will definitively need some. Except for the documentation, there isn&#8217;t much information available so I was thinking about writing a rather short blog to list some key things to absolutely look at if you don&#8217;t want to lose all your work or worse. This is obviously not going to be an exhaustive list, it&#8217;s not really possible, else it would be in the documentation directly.</p>
<p>The definition of a migration and an upgrade can be found on the documentation. If these two keywords aren&#8217;t clear to you, you should definitively go take a look because it can be very confusing, especially some elements of the definition from OpenText. Alright so here are a few key takeaways:</p>
<ul>
<li><strong>Read the documentation</strong>. Yeah, I know it&#8217;s annoying and you will have to excuse me but I had to. There is a lot of crucial information in the documentation, so you don&#8217;t really have the choice. This will really help.</li>
</ul>
<pre></pre>
<ul>
<li><strong>Look at the supported versions early (clients included!)</strong>. A migration or an upgrade, for Documentum, is a rather complex project and the process that you will need to apply to attain your goal will heavily depend on supported versions. The result will obviously always be the same (the repository is migrated/upgraded) but the path to reach it can be very different. It&#8217;s not so easy to define the correct &amp; supported path because there are many possibilities and many things to take into consideration. In addition, there might also be version specific requirements. For example if you are planning to upgrade a Content Server to 16.7 or above, then all DFC Clients (xPlore, DA, D2, &#8230;) will also need to be 16.7 or above so this needs to come into the picture.</li>
</ul>
<pre></pre>
<ul>
<li><strong>Think about the data availability</strong>. In the migration/upgrade process, you could opt to keep the source system intact and perform the upgrade on a staging environment before moving to the target system: for example to move from a VM to Docker/Kubernetes. Technically, you don&#8217;t need the data on the staging to do an in-place upgrade of the repository, all you need is the Database (export the DB from the source and import it into the DB of the staging). However, performing the in-place upgrade on the staging will create some objects in the repository and these objects will therefore have their data created on the staging data folder. Therefore, if the target system isn&#8217;t the staging one, you will then be missing some data because it stayed in the staging while the data that you have on the target is the data from the source (or a copy of the data from the source). If you are following me, you can obviously just perform an additional copy of the staging upgraded data (it&#8217;s mainly jar, txt and xml files created by DARs installation), that&#8217;s simple because you can easily find which data were created by the upgrade. The purpose of the staging is usually to have the binaries for the upgrade so the initial data will be almost empty, most probably still using the folder &#8220;<em>content_storage_01/&lt;hexa_id&gt;/80/00/0x</em>&#8221; with x usually equal to 3/4/5. While the data created by the upgrade process will have a much higher id (the next available id, based on the source DB) like &#8220;<em>content_storage_01/&lt;hexa_id&gt;/80/8d/6x</em>&#8221; for example. I didn&#8217;t test it so that might just be a wild guess but maybe re-installing the DARs would have the same effect? That would be something to test&#8230;</li>
</ul>
<pre></pre>
<ul>
<li><strong>Think about encryptions</strong>. Whether you are using an AEK key or a Lockbox, you will need to take care about the repository encryption (same for data encryption if you have a TCS license). The simpler is usually to copy the original AEK/Lockbox with its associated repository(ies). However, you might not have this luxury, especially if the source is an old version (AEK needs to be upgraded?).</li>
</ul>
<pre></pre>
<ul>
<li><strong>Think about passwords (can also be seen as related to the point about encryption)</strong>. You can change all passwords if you want between the source and the target but that will obviously add an overhead. It&#8217;s usually simpler to change passwords (if required) once the migration/upgrade is completed but for that, you will probably want to first copy the AEK/Lockbox. That reminds me of blogs I wrote several years ago about password changes on various Documentum components/layers, like for the <a href="https://www.dbi-services.com/blog/documentum-change-password-1-cs-aek-and-lockbox/" target="_blank" rel="noopener noreferrer">Lockbox</a>.</li>
</ul>
<pre></pre>
<ul>
<li><strong>Think about the Global Registry Repository</strong>. In case of migration, the GR doesn&#8217;t really need to be migrated, that is only if the Repository that you want to migrate isn&#8217;t the GR, obviously ;). However, there might be some data specific for the normal Repository inside the GR, like D2 Keystore information (D2 4.7+) for example. It&#8217;s usually faster to just recreate the needed objects/configurations on the target system, compared to the need to duplicate all efforts to migrate another repo (the GR).</li>
</ul>
<pre></pre>
<ul>
<li><strong>Use the same docbase id</strong>. This might sound silly but I prefer to say it, to be sure. If your process involves a different target system, then you will need to install an empty repository on it. It&#8217;s not strictly mandatory to use the same docbase id because you can always manually create the needed folder structure on the target system (log folders, data folders, aso&#8230;) as well as the needed files (server.ini, dbpasswd.txt, start/stop scripts, ServerApps/ACS config for the repository, aso&#8230;). However, doing this manually would take a lot of time to make sure nothing is forgotten while creating the repository, in silent at least, just needs one command to be executed and that&#8217;s it. Since you are going to create a repository anyway, you might as well just use directly the correct docbase id from the source. Starting with the CS 7.3, if you want to change the docbase id of a Repository, that&#8217;s possible. You don&#8217;t have to remove it completely, you can just use the &#8220;MigrationUtil&#8221; utility (See <a href="https://www.dbi-services.com/blog/documentum-migrationutil-1-change-docbase-id/" target="_blank" rel="noopener noreferrer">this blog</a> for an example).</li>
</ul>
<pre></pre>
<ul>
<li><strong>Make sure there are no locked objects</strong>. As far as I remember, the documentation only specify that the <em>dm_server_config</em> objects must not be locked. In reality, you must really check all <em>dm_sysobject</em>. It&#8217;s not a problem if some user&#8217;s documents are locked since the migration/upgrade process will not update them but Documentum OOTB objects shouldn&#8217;t otherwise some steps might fail, even sometimes silently which is then pretty hard to detect. I&#8217;m saying this for the dm_ objects but it also applies to other types of objects. For example, if you have a d2_dictionary_archive object locked, then running a D2 Config Import will fail and this is just one of many many cases so better be safe than sorry.</li>
</ul>
<pre></pre>
<ul>
<li><strong>Look for version specific steps</strong>. I already gave an example above about the CS 16.7+ that needs all DFC clients to be 16.7+ as well but there are other things. For example, if you are trying to upgrade to 16.7+ and if you are using a Lockbox, you will first need to extract the AEK Key from the Lockbox since it has been deprecated (See <a href="https://www.dbi-services.com/blog/documentum-upgrade-switch-from-lockbox-to-aek-key/" target="_blank" rel="noopener noreferrer">this blog</a> for guidance).</li>
</ul>
<pre></pre>
<ul>
<li><strong>Verify the components and the logs after</strong>. That&#8217;s another point that sounds silly but it&#8217;s so important&#8230; Documentum is a very complex software and there are so many things happening. I have seen so many times things that apparently went well (even according to the main logs) and when you actually start digging into it (looking into Repository objects, looking into sub-logs generated by sub-methods and such), you start seeing a whole new world. Some examples:
<ol>
<li><a href="https://www.dbi-services.com/blog/documentum-upgrade-missing-dars-after-upgrade/" target="_blank" rel="noopener noreferrer">DARs missing or not installed at all</a> (don&#8217;t forget the preserve_existing_types=F during upgrades)</li>
<li><a href="https://www.dbi-services.com/blog/documentum-upgrade-duplicate-jms-and-acs-config-objects/" target="_blank" rel="noopener noreferrer">Duplicate ACS &amp; JMS objects</a></li>
<li><a href="https://www.dbi-services.com/blog/documentum-upgrade-corrupt-lockbox-with-cs-16-4/" target="_blank" rel="noopener noreferrer">Lockbox not upgraded (corrupt)</a> (new parameter in 16.4 binaries upgrade)</li>
<li><a href="https://www.dbi-services.com/blog/documentum-upgrade-dm_datadictionarypublisher-with-wrong-target-server/" target="_blank" rel="noopener noreferrer">Wrong target_server for the dm_DataDictionaryPublisher job</a></li>
<li><a href="https://www.dbi-services.com/blog/documentum-upgrade-castor-is-locked/" target="_blank" rel="noopener noreferrer">Locked Castor objects due to bug in EBS (introduced in previous patch)</a></li>
<li>JMS or ACS URLs reset to http://localhost</li>
<li>JMS that lose its HTTPS configuration</li>
<li>aso&#8230;</li>
</ol>
</li>
</ul>
<pre></pre>
<ul>
<li><strong>Stay patient and open-minded</strong>. Don&#8217;t worry, the migration/upgrade will probably fail but that&#8217;s OK, you are here to fix it ;).</li>
</ul>
<p>These are just some key points I like to keep in mind. If there are some you would like to share, feel free and I can also add them to the list.</p>
<p>L’article <a href="https://www.dbi-services.com/blog/documentum-some-things-to-take-care-of-when-migrating-upgrading/">Documentum &#8211; Some things to take care of when migrating/upgrading</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/documentum-some-things-to-take-care-of-when-migrating-upgrading/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Some myths about PostgreSQL vs. Oracle</title>
		<link>https://www.dbi-services.com/blog/some-myths-about-postgresql-vs-oracle/</link>
					<comments>https://www.dbi-services.com/blog/some-myths-about-postgresql-vs-oracle/#respond</comments>
		
		<dc:creator><![CDATA[Open source Team]]></dc:creator>
		<pubDate>Wed, 24 Jun 2020 15:42:04 +0000</pubDate>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[CDB]]></category>
		<category><![CDATA[Data Guard]]></category>
		<category><![CDATA[Migration]]></category>
		<category><![CDATA[multitenant]]></category>
		<category><![CDATA[PDB]]></category>
		<category><![CDATA[Pluggable Databases]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/some-myths-about-postgresql-vs-oracle/</guid>

					<description><![CDATA[<p>By Franck Pachot . I originally wrote this as a comment on the following post that you may find on internet: https://www.2ndquadrant.com/en/blog/oracle-to-postgresql-reasons-to-migrate/ but my comment was not published (many links in it&#8230; I suppose it has been flagged as spam?) so I put it there. You should never take any decision on what you read [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/some-myths-about-postgresql-vs-oracle/">Some myths about PostgreSQL vs. Oracle</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>By Franck Pachot</h2>
<p>.<br />
I originally wrote this as a comment on the following post that you may find on internet:<br />
<a href="https://www.2ndquadrant.com/en/blog/oracle-to-postgresql-reasons-to-migrate/" rel="noopener noreferrer" target="_blank">https://www.2ndquadrant.com/en/blog/oracle-to-postgresql-reasons-to-migrate/</a><br />
but my comment was not published (many links in it&#8230; I suppose it has been flagged as spam?) so I put it there. </p>
<p>You should never take any decision on what you read on the internet without verifying. It is totally valid to consider a move to Open Source databases, but doing it without good understanding is a risk for your migration project success.</p>
<h3>In <em>italics</em> are the quotes from the article.</h3>
<p>Kirk,<br />
As you do a comparison and link to a list of PostgreSQL features, let me refine the name and description of the Oracle features you compare to, so that people can find them and do a fair comparison. I&#8217;m afraid they may not recognize the names and descriptions you provide, at least in current versions. As an example, nobody will get search hits for &#8220;Federation&#8221;, or &#8220;plSQL&#8221;, or &#8220;HTML DB&#8221;… in the Oracle documentation but they will find &#8220;Oracle Gateway&#8221;, &#8220;PL/SQL&#8221;, &#8220;APEX&#8221;…<br />
<em></p>
<h3>Federation vs. Foreign Data Wrappers</h3>
<p></em><br />
There is no feature called &#8220;Federation&#8221;. <br />
The closest from your description is Database links and Heterogeneous Services through Database Gateway. They go further than FDW in many points. But anyway, I would never use that for ETL. ETL needs optimized bulk loads and there are other features for that (like External Tables to read files, and direct-path inserts to fast load). If your goal is to federate and distribute some small reference tables, then Materialized Views is the feature you may look for.<br />
<a href="https://docs.oracle.com/en/database/oracle/oracle-database/20/heter/introduction.html#GUID-EC402025-0CC0-401F-AF93-888B8A3089FE" rel="noopener noreferrer" target="_blank">https://docs.oracle.com/en/database/oracle/oracle-database/20/heter/introduction.html#GUID-EC402025-0CC0-401F-AF93-888B8A3089FE</a><br />
<em></p>
<h3>plSQL vs. everything else</h3>
<p></em><br />
<em>&#8220;Oracle has a built-in programming language called plSQL.&#8221;</em><br />
PL/SQL is more than that. It is compiled (to pcode or native), manages dependencies (tracks dependencies on schema objects), optimized for data access (UDF can even be compiled to run within the SQL engine), can be multithreaded (Parallel Execution). That&#8217;s different from PL/pgSQL which is interpreted at execution time. You mention languages as <em>&#8220;as plug-ins&#8221;</em> and for this, there are other ways to run different languages (external procedures, OJCM, External Table preprocessor,…) but when it comes to performance, transaction control, dependency tracking,… that&#8217;s PL/SQL.<br />
<a href="https://docs.oracle.com/en/database/oracle/oracle-database/20/lnpls/overview.html#GUID-17166AA4-14DC-48A6-BE92-3FC758DAA940" rel="noopener noreferrer" target="_blank">https://docs.oracle.com/en/database/oracle/oracle-database/20/lnpls/overview.html#GUID-17166AA4-14DC-48A6-BE92-3FC758DAA940</a><br />
<em></p>
<h3>Application programming</h3>
<p></em><br />
Providing an <em>&#8220;API to communicate with the database&#8221;</em> is not about open source as the main goal is: encapsulation and hide implementation details. In order to access internal structures, which is what you mention, Oracle provides relational views (known as V$ views) accessible with the most appropriate API for a relational database: SQL<br />
<a href="https://docs.oracle.com/en/database/oracle/oracle-database/20/refrn/dynamic-performance-views.html#GUID-8C5690B0-DE10-4460-86DF-80111869CF4C" rel="noopener noreferrer" target="_blank">https://docs.oracle.com/en/database/oracle/oracle-database/20/refrn/dynamic-performance-views.html#GUID-8C5690B0-DE10-4460-86DF-80111869CF4C</a><br />
<em></p>
<h3>Internationalization and Localization</h3>
<p></em><br />
The <em>&#8220;globalization toolkit&#8221;</em> is only one part of the globalization features. You can also use any <em>&#8220;any character encoding, collation and code page&#8221;</em> but not relying on the OS implementation of it makes it cross-platform compatible and OS upgrade compatible (see <a href="https://wiki.postgresql.org/wiki/Locale_data_changes" rel="noopener noreferrer" target="_blank">https://wiki.postgresql.org/wiki/Locale_data_changes</a>)<br />
<a href="https://docs.oracle.com/en/database/oracle/oracle-database/20/nlspg/overview-of-globalization-support.html#GUID-6DD587EE-6686-4802-9C08-124B495978D5" rel="noopener noreferrer" target="_blank">https://docs.oracle.com/en/database/oracle/oracle-database/20/nlspg/overview-of-globalization-support.html#GUID-6DD587EE-6686-4802-9C08-124B495978D5</a><br />
<em></p>
<h3>Web Development</h3>
<p></em><br />
<em>&#8220;Oracle acknowledges the existence of HTML through HTML DB. PostgreSQL natively supports JSON, XML and plugs in Javascript&#8221;</em>. HTML DB can be found in paper books, but the name is &#8220;APEX&#8221; since 2006. And it is not (only) about HTML, JSON, or XML but is a low-code Rapid Application Development with no equivalent for other databases.<br />
Support for the structures and languages you mention are all there. The latest trend being JSON: <a href="https://docs.oracle.com/en/database/oracle/oracle-database/20/adjsn/index.html" rel="noopener noreferrer" target="_blank">https://docs.oracle.com/en/database/oracle/oracle-database/20/adjsn/index.html</a><br />
<em></p>
<h3>Authentication</h3>
<p></em><br />
<em>&#8220;Oracle has a built-in authentication system.&#8221;</em><br />
Yes, to be platform-independent, and has many other External Authentication: <a href="https://docs.oracle.com/en/database/oracle/oracle-database/20/dbseg/configuring-authentication.html#GUID-BF8E5E84-FE7E-449C-8081-755BAA4CF8DB" rel="noopener noreferrer" target="_blank">https://docs.oracle.com/en/database/oracle/oracle-database/20/dbseg/configuring-authentication.html#GUID-BF8E5E84-FE7E-449C-8081-755BAA4CF8DB</a><br />
<em></p>
<h3>Extensibility</h3>
<p></em><br />
<em>&#8220;Oracle has a plug-in system&#8221;</em>. I don&#8217;t know what you are referring to. Oracle is multi-platform proprietary software. Commercial, which means with vendor supported. There are a lot of APIs for extensions, but the vendor must have to control what runs in the engine in order to provide support.<br />
<em></p>
<h3>Read Scalability</h3>
<p></em><br />
<em>&#8220;PostgreSQL can create a virtually unlimited read cluster&#8221;</em>. Oracle has active/active cluster (called RAC) and read replicas (called Active Data Guard). For horizontal scalability, you use the same as for vertical (Parallel Execution) across multiple nodes (in sync, with instance affinity on partitions,…)<br />
<a href="https://docs.oracle.com/en/database/oracle/oracle-database/20/vldbg/parallel-exec-intro.html#GUID-F9A83EDB-42AD-4638-9A2E-F66FE09F2B43" rel="noopener noreferrer" target="_blank">https://docs.oracle.com/en/database/oracle/oracle-database/20/vldbg/parallel-exec-intro.html#GUID-F9A83EDB-42AD-4638-9A2E-F66FE09F2B43</a><br />
<em></p>
<h3>Cost</h3>
<p></em><br />
<em>&#8220;they don&#8217;t mind charging you again for every single instance.&#8221;</em> <br />
No, that&#8217;s wrong, license metrics are on processors (CPU) or users (NUP). You run as many instances as you want on your licensed servers for your licensed users: <a href="https://www.oracle.com/a/ocom/docs/corporate/oracle-software-licensing-basics.pdf" rel="noopener noreferrer" target="_blank">https://www.oracle.com/a/ocom/docs/corporate/oracle-software-licensing-basics.pdf</a><br />
<em>&#8220;jamming everything into a single instance just to reduce costs&#8221;</em>. <br />
No, database consolidation is recommended to scale the management of multiple databases, but not for licensing costs. If you go there, there are a lot of features to allow isolation and data movement in consolidated databases: Multitenant, Resource Manager, Online Relocate, Lockdown Profiles,…<br />
<em></p>
<h3>Performance</h3>
<p></em><br />
<em>&#8220;differentiate the tuning parameters for your warehouse to OLTP to reporting to the data lake&#8221;</em>: I already mentioned the point about read replicas and about multiple instances in a server. But with oracle, all the parameters I want to set different for OLTP or reporting do not require another instance. They can be set at session or PDB level. As Oracle does not need the filesystem buffer cache, there&#8217;s no need to separate on different servers to avoid noisy neighbours. </p>
<p>I hope this helps to look further at the features. There are many reasons to migrate and the main one is the will to move from a commercial model (with license and support) to an open-source one (start with low cost, help from community). But decision must be made on facts and not rumours.</p>
<p>Franck.</p>
<p>L’article <a href="https://www.dbi-services.com/blog/some-myths-about-postgresql-vs-oracle/">Some myths about PostgreSQL vs. 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/some-myths-about-postgresql-vs-oracle/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Migrating an Oracle instance to AWS Aurora – 4 – AWS DMS Change Data Capture (CDC)</title>
		<link>https://www.dbi-services.com/blog/migrating-an-oracle-instance-to-aws-aurora-4-aws-dms-change-data-capture-cdc/</link>
					<comments>https://www.dbi-services.com/blog/migrating-an-oracle-instance-to-aws-aurora-4-aws-dms-change-data-capture-cdc/#respond</comments>
		
		<dc:creator><![CDATA[Daniel Westermann]]></dc:creator>
		<pubDate>Mon, 23 Mar 2020 09:41:44 +0000</pubDate>
				<category><![CDATA[Database Administration & Monitoring]]></category>
		<category><![CDATA[Aurora]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[Migration]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/migrating-an-oracle-instance-to-aws-aurora-4-aws-dms-change-data-capture-cdc/</guid>

					<description><![CDATA[<p>This is the last post in this little series about migrating on Oracle instance to AWS Aurora with PostgreSQL compatibility. For the previous one you can check here, here and here. In this post we&#8217;ll look at how you can configure change data capture so that changes on the source Oracle instance are automatically replicated [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/migrating-an-oracle-instance-to-aws-aurora-4-aws-dms-change-data-capture-cdc/">Migrating an Oracle instance to AWS Aurora – 4 – AWS DMS Change Data Capture (CDC)</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>This is the last post in this little series about migrating on Oracle instance to AWS Aurora with PostgreSQL compatibility. For the previous one you can check <a href="https://www.dbi-services.com/blog/migrating-an-oracle-instance-to-aws-aurora-1-setting-up-the-base-infrastructure/" target="_blank" rel="noopener noreferrer">here</a>, <a href="https://www.dbi-services.com/blog/migrating-an-oracle-instance-to-aws-aurora-2-the-aws-schema-conversion-tool-sct/" target="_blank" rel="noopener noreferrer">here</a> and <a href="https://www.dbi-services.com/blog/migrating-an-oracle-instance-to-aws-aurora-3-data-replication-with-aws-dms/" target="_blank" rel="noopener noreferrer">here</a>. In this post we&#8217;ll look at how you can configure change data capture so that changes on the source Oracle instance are automatically replicated to the target Aurora instance. In a real life migration this is what you probably need as long down times are usually not acceptable. We&#8217;ll be starting from exactly the same state we left of in the previous post.</p>
<p><span id="more-13752"></span></p>
<p>We&#8217;ve initially loaded the source &#8220;SH&#8221; schema from Oracle to AWS Aurora and now we want to replicate all the changes that are happening on the source to the target as well. Remember that AWS DMS sits between the source and the target and the we need a source end point and a target end point:<br />
<a href="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/04/aws_dms_cdc_1.png"><img loading="lazy" decoding="async" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/04/aws_dms_cdc_1.png" alt="" width="975" height="485" class="aligncenter size-full wp-image-38427" /></a></p>
<p>We can use exactly the same end points as in the previous post (nothing to add or modify here):<br />
<a href="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/04/aws_dms_cdc_2.jpg"><img loading="lazy" decoding="async" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/04/aws_dms_cdc_2.jpg" alt="" width="1000" height="171" class="aligncenter size-full wp-image-38430" /></a></p>
<p>What we need to configure is a new database migration task. We still have the task we used to do the initial loading which could be modified but I prefer to keep it separated and will go ahead with a new task:<br />
<a href="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/04/aws_dms_cdc_3.jpg"><img loading="lazy" decoding="async" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/04/aws_dms_cdc_3.jpg" alt="" width="1000" height="137" class="aligncenter size-full wp-image-38431" /></a></p>
<p>We&#8217;ll be using the same replication instance and the same end points but &#8220;Migration type&#8221; will be &#8220;Replicate data changes only&#8221;. We already enabled &#8220;supplemental logging&#8221; in the last post so the warning can be ignored:<br />
<a href="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/04/aws_dms_cdc_4.jpg"><img loading="lazy" decoding="async" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/04/aws_dms_cdc_4.jpg" alt="" width="800" height="723" class="aligncenter size-full wp-image-38432" /></a></p>
<p>We&#8217;ll go with the default task settings:<br />
<a href="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/04/aws_dms_cdc_5.jpg"><img loading="lazy" decoding="async" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/04/aws_dms_cdc_5.jpg" alt="" width="800" height="775" class="aligncenter size-full wp-image-38434" /></a></p>
<p>As I know that nothing happened on the source I do not need to specify a specific start point for the replication. The same is true for the tables on the target: I already know that the tables are there and that the content of the tables on the target is the same as on the source. For the LOB stuff I&#8217;ll go with the defaults as well.</p>
<p>The table mappings section is configured the same as we did it for the initial load previously. We want to replicate all tables in the &#8220;SH&#8221; schema:<br />
<a href="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/04/aws_dms_cdc_6.jpg"><img loading="lazy" decoding="async" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/04/aws_dms_cdc_6.jpg" alt="" width="800" height="666" class="aligncenter size-full wp-image-38435" /></a></p>
<p>Finally all the defaults for the remaining parameters of the task:<br />
<a href="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/04/aws_dms_cdc_7.jpg"><img loading="lazy" decoding="async" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/04/aws_dms_cdc_7.jpg" alt="" width="800" height="215" class="aligncenter size-full wp-image-38437" /></a></p>
<p>While the task is creating:<br />
<a href="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/04/aws_dms_cdc_8.jpg"><img loading="lazy" decoding="async" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/04/aws_dms_cdc_8.jpg" alt="" width="1000" height="244" class="aligncenter size-full wp-image-38438" /></a></p>
<p>&#8230; you&#8217;ll see that LogMiner is starting on the source Oracle instance:</p>
<pre class="brush: bash; gutter: true; first-line: 1">
2020-03-23T08:44:08.261039+01:00
Thread 1 advanced to log sequence 39 (LGWR switch)
  Current log# 3 seq# 39 mem# 0: /u03/oradata/DB19/redog3m1DB19.dbf
  Current log# 3 seq# 39 mem# 1: /u04/oradata/DB19/redog3m2DB19.dbf
2020-03-23T08:44:08.398220+01:00
ARC2 (PID:4670): Archived Log entry 15 added for T-1.S-38 ID 0x2c7a7c94 LAD:1
2020-03-23T08:54:41.598409+01:00
LOGMINER: summary for session# = 2147484673
LOGMINER: StartScn: 1084978 (0x0000000000108e32)
LOGMINER: EndScn: 1085221 (0x0000000000108f25)
LOGMINER: HighConsumedScn: 0
LOGMINER: PSR flags: 0x0
LOGMINER: Session Flags: 0x4000441
LOGMINER: Session Flags2: 0x0
LOGMINER: Read buffers: 4
LOGMINER: Region Queue size: 256
LOGMINER: Redo Queue size: 4096
LOGMINER: Memory LWM: limit 10M, LWM 12M, 80%
LOGMINER: Memory Release Limit: 0M
LOGMINER: Max Decomp Region Memory: 1M
LOGMINER: Transaction Queue Size: 1024
2020-03-23T08:54:41.627157+01:00
LOGMINER: Begin mining logfile for session -2147482623 thread 1 sequence 39, /u03/oradata/DB19/redog3m1DB19.dbf
2020-03-23T08:54:46.780204+01:00
LOGMINER: summary for session# = 2147485697
LOGMINER: StartScn: 1085020 (0x0000000000108e5c)
LOGMINER: EndScn: 1085288 (0x0000000000108f68)
LOGMINER: HighConsumedScn: 0
LOGMINER: PSR flags: 0x0
LOGMINER: Session Flags: 0x4000441
LOGMINER: Session Flags2: 0x0
LOGMINER: Read buffers: 4
LOGMINER: Region Queue size: 256
LOGMINER: Redo Queue size: 4096
LOGMINER: Memory LWM: limit 10M, LWM 12M, 80%
LOGMINER: Memory Release Limit: 0M
LOGMINER: Max Decomp Region Memory: 1M
LOGMINER: Transaction Queue Size: 1024
2020-03-23T08:54:46.788212+01:00
LOGMINER: Begin mining logfile for session -2147481599 thread 1 sequence 39, /u03/oradata/DB19/redog3m1DB19.dbf
2020-03-23T08:54:51.861617+01:00
LOGMINER: summary for session# = 2147486721
LOGMINER: StartScn: 1085087 (0x0000000000108e9f)
LOGMINER: EndScn: 1085362 (0x0000000000108fb2)
LOGMINER: HighConsumedScn: 0
LOGMINER: PSR flags: 0x0
LOGMINER: Session Flags: 0x4000441
LOGMINER: Session Flags2: 0x0
LOGMINER: Read buffers: 4
LOGMINER: Region Queue size: 256
LOGMINER: Redo Queue size: 4096
LOGMINER: Memory LWM: limit 10M, LWM 12M, 80%
LOGMINER: Memory Release Limit: 0M
LOGMINER: Max Decomp Region Memory: 1M
LOGMINER: Transaction Queue Size: 1024
2020-03-23T08:54:51.868450+01:00
LOGMINER: Begin mining logfile for session -2147480575 thread 1 sequence 39, /u03/oradata/DB19/redog3m1DB19.dbf
</pre>
<p>The task itself will report it&#8217;s status as &#8220;Replication ongoing&#8221; a few moments later:<br />
<a href="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/04/aws_dms_cdc_9.jpg"><img loading="lazy" decoding="async" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/04/aws_dms_cdc_9.jpg" alt="" width="1000" height="234" class="aligncenter size-full wp-image-38440" /></a></p>
<p>Having a look at the table statistics section of the tasks of course all is reported as zero at the moment:<br />
<a href="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/04/aws_dms_cdc_10.jpg"><img loading="lazy" decoding="async" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/04/aws_dms_cdc_10.jpg" alt="" width="1000" height="398" class="aligncenter size-full wp-image-38441" /></a></p>
<p>Time to do some changes in Oracle and check if these changes will be properly replicated to the Aurora target instance. Let&#8217;s create a new table on the Oracle side:</p>
<pre class="brush: sql; gutter: true; first-line: 1">
SQL&gt; create table sh.test ( a number );

Table created.
</pre>
<p>This table will show up in the AWS DMS console quite fast:<br />
<a href="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/04/aws_dms_cdc_11.jpg"><img loading="lazy" decoding="async" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/04/aws_dms_cdc_11.jpg" alt="" width="1000" height="439" class="aligncenter size-full wp-image-38442" /></a></p>
<p>&#8230; and is also available on the target Aurora side:</p>
<pre class="brush: sql; gutter: true; first-line: 1">
postgres=&gt; \d "SH"."TEST"
           Table "SH.TEST"
 Column |      Type      | Modifiers 
--------+----------------+-----------
 A      | numeric(38,10) | 

postgres=&gt; select * from "SH"."TEST";
 A 
---
(0 rows)
</pre>
<p>Inserting data on the source:</p>
<pre class="brush: sql; gutter: true; first-line: 1">
SQL&gt; insert into sh.test values(1);

1 row created.

SQL&gt; commit;

Commit complete.
</pre>
<p>&#8230; and nothing happens on the target side. Why does DDL succeed but DML not? Well, first of all it takes some time for the changes to show up in the console. Doing some more inserts on the source and waiting some time:</p>
<pre class="brush: sql; gutter: true; first-line: 1">
SQL&gt; insert into sh.test values(2);

1 row created.

SQL&gt; commit;    

Commit complete.

SQL&gt; insert into sh.test values(3);

1 row created.

SQL&gt; commit;

Commit complete.
</pre>
<p>&#8230; the changes are actually recorded:<br />
<a href="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/04/aws_dms_cdc_12.jpg"><img loading="lazy" decoding="async" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/04/aws_dms_cdc_12.jpg" alt="" width="1000" height="451" class="aligncenter size-full wp-image-38445" /></a></p>
<p>&#8230; but nothing arrives on the target:</p>
<pre class="brush: sql; gutter: true; first-line: 1">
postgres=&gt; select * from "SH"."TEST";
 A 
---
(0 rows)
</pre>
<p>Why that? Let&#8217;s do some more inserts:</p>
<pre class="brush: sql; gutter: true; first-line: 1">
SQL&gt; insert into sh.test select -1 from dba_objects;

23522 rows created.

SQL&gt; commit;

Commit complete.
</pre>
<p>This is reported as &#8220;1&#8221; insert in the console as the number of inserts switched from 6 to 7:<br />
<a href="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/04/aws_dms_cdc_13.jpg"><img loading="lazy" decoding="async" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/04/aws_dms_cdc_13.jpg" alt="" width="1000" height="445" class="aligncenter size-full wp-image-38447" /></a></p>
<p>Some picture, nothing there on the target. The issues was, that supplemental logging needs to be enabled for each table or on the database level, and this is what I did:</p>
<pre class="brush: sql; gutter: true; first-line: 1">
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;
</pre>
<p>Re-creating the table on Oracle side:</p>
<pre class="brush: sql; gutter: true; first-line: 1">
SQL&gt; drop table sh.test;

Table dropped.

SQL&gt; create table sh.test ( a number primary key );

Table created.

SQL&gt; insert into sh.test values(1);

1 row created.

SQL&gt; insert into sh.test values(2);

1 row created.

SQL&gt; commit;

Commit complete.

SQL&gt; 
</pre>
<p>From now on new data is showing up in the target Aurora instance:</p>
<pre class="brush: sql; gutter: true; first-line: 1">
postgres=&gt; select * from "SH"."TEST";
      A       
--------------
 1.0000000000
 2.0000000000
(2 rows)

postgres=&gt; 
</pre>
<p>So, again, quite easy to setup. Of course the usual bits apply as for every logical replication: You should have primary keys or at least unique keys on the source tables for the replication to run performant and smooth. Another point to add here: When you check the settings of the replication task there is one important parameter that should be enabled (you need to stop the task, otherwise it can not be modified):<br />
<a href="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/04/aws_dms_cdc_14.png"><img loading="lazy" decoding="async" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2022/04/aws_dms_cdc_14.png" alt="" width="800" height="520" class="aligncenter size-full wp-image-38451" /></a></p>
<p>Enabling this will create additional tables in the target Aurora instance and these give you more information on what is going on with the replication:</p>
<pre class="brush: sql; gutter: true; first-line: 1">
postgres=&gt; select * from pg_tables where tablename like 'awsdms%';
 schemaname  |        tablename        | tableowner | tablespace | hasindexes | hasrules | hastriggers | rowsecurity 
-------------+-------------------------+------------+------------+------------+----------+-------------+-------------
 public      | awsdms_apply_exceptions | postgres   |            | f          | f        | f           | f
 aws_postgis | awsdms_apply_exceptions | postgres   |            | f          | f        | f           | f
 public      | awsdms_history          | postgres   |            | t          | f        | f           | f
 public      | awsdms_status           | postgres   |            | t          | f        | f           | f
 public      | awsdms_suspended_tables | postgres   |            | t          | f        | f           | f
(5 rows)
</pre>
<p>Here is an example of the replication history:</p>
<pre class="brush: sql; gutter: true; first-line: 1">
postgres=&gt; select * from awsdms_history;
      server_name      |         task_name          |   timeslot_type   |      timeslot       | timeslot_duration | timeslot_latency | timeslot_records | timeslot_volume 
-----------------------+----------------------------+-------------------+---------------------+-------------------+------------------+------------------+-----------------
 localhost.localdomain | XEBQFBY6EH6SQNN6CBBMO25364 | CHANGE PROCESSING | 2020-03-23 09:42:29 |                 0 |                0 |                0 |               0
 localhost.localdomain | XEBQFBY6EH6SQNN6CBBMO25364 | CHANGE PROCESSING | 2020-03-23 09:47:29 |                 5 |                0 |            70592 |              28
 localhost.localdomain | XEBQFBY6EH6SQNN6CBBMO25364 | CHANGE PROCESSING | 2020-03-23 09:52:29 |                 5 |                0 |                6 |               0
 localhost.localdomain | XEBQFBY6EH6SQNN6CBBMO25364 | CHANGE PROCESSING | 2020-03-23 09:57:30 |                 5 |                0 |                0 |               0
 localhost.localdomain | XEBQFBY6EH6SQNN6CBBMO25364 | CHANGE PROCESSING | 2020-03-23 10:02:31 |                 5 |                0 |                0 |               0
 localhost.localdomain | XEBQFBY6EH6SQNN6CBBMO25364 | CHANGE PROCESSING | 2020-03-23 10:07:31 |                 5 |                0 |                0 |               0
 localhost.localdomain | XEBQFBY6EH6SQNN6CBBMO25364 | CHANGE PROCESSING | 2020-03-23 10:12:32 |                 5 |                0 |                0 |               0
 localhost.localdomain | XEBQFBY6EH6SQNN6CBBMO25364 | CHANGE PROCESSING | 2020-03-23 10:17:32 |                 5 |                0 |                0 |               0
 localhost.localdomain | XEBQFBY6EH6SQNN6CBBMO25364 | CHANGE PROCESSING | 2020-03-23 10:22:39 |                 0 |                0 |                0 |               0
(9 rows)
</pre>
<p>These tables can be used to monitor the replication, especially the apply exceptions. </p>
<p>To conclude this final post: The AWS Schema Conversion Tool is a great help for converting the schema and even comes with some Oracle compatibility. Use it, it saves a lot of manual work. AWS DMS on the other side is really easy to implement, the initial load is really easy to setup and change data capture works as expected. Of course this was only a playground and real issues will pop up when you do a real migration, especially when you have to migrate business logic inside the database.</p>
<p>L’article <a href="https://www.dbi-services.com/blog/migrating-an-oracle-instance-to-aws-aurora-4-aws-dms-change-data-capture-cdc/">Migrating an Oracle instance to AWS Aurora – 4 – AWS DMS Change Data Capture (CDC)</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/migrating-an-oracle-instance-to-aws-aurora-4-aws-dms-change-data-capture-cdc/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Page Caching using Disk: Enhanced 
Lazy Loading (feed)

Served from: www.dbi-services.com @ 2026-09-14 20:12:40 by W3 Total Cache
-->