# mydb01:/orainst/product/19c:Y cdb:/orainst/product/19c:NTo extract the database names:
grep "^[^#]" /etc/oratab | awk -F':' '{print $1}'Result:
mydb01 cdb
Minimalistic Oracle contains a collection of practical examples from my encounters with Oracle technologies. When relevant, I also write about other technologies, like Linux or PostgreSQL. Many of the posts starts with "how to" since they derive directly from my own personal experience. My goal is to provide simple examples, so that they can be easily adapted to other situations.
# mydb01:/orainst/product/19c:Y cdb:/orainst/product/19c:NTo extract the database names:
grep "^[^#]" /etc/oratab | awk -F':' '{print $1}'Result:
mydb01 cdb
for l in $(cat file.txt|grep 'Status'| awk -F' ' '{print $2}'); do
if [ $l != "SUCCESS" ]; then
echo $l ": Errors found. Please check logfile status.log"
else
echo "Readjust memory for the remaining cdb instance"
su - oracle <<!
-- code here --
!
runAdjustMemory
fi
done
During execution, my script failed with
./myscript.sh: line 32: warning: here-document at line 20 delimited by end-of-file (wanted `!') ./myscript.sh: line 33: syntax error: unexpected end of file
for l in $(cat file.txt|grep 'Status'| awk -F' ' '{print $2}'); do
if [ $l != "SUCCESS" ]; then
echo $l ": Errors found. Please check logfile status.log"
else
echo "Readjust memory for the remaining cdb instance"
su - oracle <<!
-- code here --
!
runAdjustMemory
fi
done
oracle@oric-dbserver01:[mydb01]# sqlplus / as sysdba SQL*Plus: Release 19.0.0.0.0 - Production on Wed Apr 17 10:43:56 2024 Version 19.22.0.0.0 Copyright (c) 1982, 2023, Oracle. All rights reserved. ERROR: ORA-28547: connection to server failed, probable Oracle Net admin errorCause:
oracle@oric-dbserver01:[mydb01]# oerr ora 28547 A failure occurred during initialization of a network connection from a client process to the Oracle server. ... The most frequent specific causes are: [ oracle lists several potential causes here ] The character set of the database is not recognized by the client process, which may be caused by an incorrect or unnecessary setting of the ORA_NLS10 client environment variable or by a new or user-defined character set installed in the Oracle server and used for the database.
export ORA_NLS10=$ORACLE_HOME/nls/data/9idataWhen this is done, sqlplus will work.
dbca -createDatabase -responsefile /home/oracle/scripts/cdb.rsp -silentThe following error kept coming up:
[FATAL] [DBT-05509] Failed to connect to the specified database (cdb). CAUSE: OS Authentication might be disabled for this database (cdb). ACTION: Specify a valid sysdba user name and password to connect to the database.Solution:
export ORA_NLS10=$ORACLE_HOME/nls/data/9idataOtherwise Oracle won't be able to find the language files it needs to create the database.
SYS@mydb01>SQL>alter database "mydb01" open resetlogs; alter database "mydb01" open resetlogs * ERROR at line 1: ORA-00603: ORACLE server session terminated by fatal error ORA-01092: ORACLE instance terminated. Disconnection forced ORA-12701: CREATE DATABASE character set is not knownAs part of the EBS 12.1.3 installation guide, the parameter ORA_NLS10 is pointing to $ORACLE_HOME/nls/data/9idata, where all the NLS files are unpacked during installation.
export ORA_NLS10=$ORACLE_HOME/nls/data/9idata
and rerun the installation scripts.
while true; do if [ -f /u01/createdb.log ]; then tail -f /u01/createdb.log fi done
sqlplus / as sysdba Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.22.0.0.0 SYS@cdb>SQL> alter session set container=PDB$SEED; Session altered. SYS@cdb>SQL>alter session set "_oracle_script"=TRUE; Session altered. SYS@cdb>SQL>alter pluggable database pdb$seed close immediate instances=all; Pluggable database altered. SYS@cdb>SQL>alter pluggable database pdb$seed OPEN READ WRITE; Pluggable database altered. SYS@cdb>SQL>select open_mode from v$database; OPEN_MODE -------------------- READ WRITE SYS@cdb>SQL>show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ WRITE NO SYS@cdb>SQL>exit
pmon=`ps -fu oracle | grep pmon_$1 | grep -v grep | awk '{ print $8}'`
echo $pmon
ora_pmon_cdb ora_pmon_mydb01
for pname in $pmon; do
echo $pname
done
Output:
ora_pmon_cdb ora_pmon_mydb01The for loop construct seem to take space as a delimter by default, so in this case it works out well.
analyze_status=`cat /u01/oracle/cfgtoollogs/upgrade/auto/autoupgrade.log | grep 'ANALYZE and FIXUPS' | awk 'NR==1'`Output of the command is:
echo $analyze_status ANALYZE and FIXUPS modes are not run when converting a Non-CDB database to a PDBWithout the NR==1 I get the same sentence repeated twice:
ANALYZE and FIXUPS modes are not run when converting a Non-CDB database to a PDB ANALYZE and FIXUPS modes are not run when converting a Non-CDB database to a PDB
su - oracle <<! echo " set lines 10 set pages 0 set trimspool on set verify off set heading off set feedback off set echo off spool /tmp/count_options.out SELECT TRIM(COUNT(*)) FROM DBA_REGISTRY; " > /tmp/count_options.sql sqlplus -s / as sysdba @/tmp/count_options.sql !Output is:
/tmp]# cat count_options.out 4Note that without the TRIM function, the output will be
/tmp]# cat count_options.out 4The -s switch will execute sqlplus silently, without it, the output would be
cat count_options.out 4 SYS@mydb01>SQL>
LOGGING_LISTENER=onThen restart the listener. Logging starts:
lsnrctl start
LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 07-MAR-2024 11:22:33
Copyright (c) 1991, 2023, Oracle. All rights reserved.
Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 19.0.0.0.0 - Production
Start Date 07-MAR-2024 11:11:35
Uptime 0 days 0 hr. 10 min. 57 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /orainst/product/19c/network/admin/listener.ora
Listener Log File /orainst/diag/tnslsnr/myserver/listener/alert/log.xml
I then put a tail on the listener log and register the services with the listener manually:
sqlplus / as sysdba alter system register;
07-MAR-2024 10:37:56 * service_register_NSGR * 1194 TNS-01194: The listener command did not arrive in a secure transportLook up the error:
oracle@myserver.oric.no:[cdb]# oerr tns 01194
01194, 00000, "The listener command did not arrive in a secure transport"
// *Cause: Most of the listener administrative commands are only intended to
// be issued in a secure transport, which are configured in
// secure_control_ parameter. If the parameter is set, then the listener
// accepts administrative requests only on those secure transports.
// *Action: Make sure the command is issued using a transport specified
// in secure transport list.
I then noticed that my listener.ora parameter SECURE_REGISTER_LISTENER was set to TCP:
SECURE_REGISTER_LISTENER = (TCP)To allow for dynamic instance registration, I needed to allow for the other protocol, IPC, too:
SECURE_REGISTER_LISTENER = (TCP,IPC)My tests showed that they both need to be present, in that particular order.
ADR_BASE_LISTENER = /orainst/oracle LOGGING_LISTENER=on TRACE_LEVEL_LISTENER=off SECURE_REGISTER_LISTENER = (TCP,IPC) SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (ORACLE_HOME = /orainst/oracle/product/19c) (SID_NAME = cdb) ) ) LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) ) )and still allow for remote client connections over TCP.
systemctl stop postgresql-15 systemctl disable postgresql-15Remove the packages using "yum remove":
rpm -qa | grep postgres | xargs yum remove -y
cd $TNS_ADMIN rm listener.ora3. Create new listener.ora directly under $TNS_ADMIN
cd $TNS_ADMIN vi listener.ora -- add the following -- cdb = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = minserver.skead.no)(PORT = 1521)) ) ) SID_LIST_cdb = (SID_LIST = (SID_DESC = (ORACLE_HOME= /orasw/oracle/product/19_21) (SID_NAME = cdb) ) ) USE_SID_AS_SERVICE_cdb = ON STARTUP_WAIT_TIME_cdb = 0 CONNECT_TIMEOUT_cdb = 10 TRACE_LEVEL_cdb = ADMIN LOG_DIRECTORY_cdb = /orasw/oracle/product/19_21/network/admin LOG_FILE_cdb = cdb TRACE_DIRECTORY_cdb = /orasw/oracle/product/19_21/network/admin TRACE_FILE_cdb = cdb ADMIN_RESTRICTIONS_cdb = ON SUBSCRIBE_FOR_NODE_DOWN_EVENT_cdb = OFF # added parameters for bug# 9286476 LOG_STATUS_cdb = ON INBOUND_CONNECT_TIMEOUT_cdb = 60 # ADR is only applicable for 11gDB DIAG_ADR_ENABLED_cdb = ON ADR_BASE_cdb = /orasw/oracle/product/19_21/admin/mydb_myserver #IFILE=/orasw/oracle/product/19_21/network/admin/mydb_myserver/listener_ifile.ora4. Run autoconfig
cd $ORACLE_HOME/appsutil/scripts/mydb_myserver/ ./adautocfg.sh Enter the APPS user password: Result: autoconfig succeeds.5. Create a new softlink under $TNS_ADMIN
cd $TNS_ADMIN ln -s mindb_minserver/listener.ora listener.ora
echo "Test: are there subdirectories in /orainst/oracle/cfgtoollogs/dbca/cdb ?" ls $(pwd)/*/ > /dev/null 2>&1 if [ $? == 0 ]; then echo "Yes" export PDBDIR=`ls -d */ | awk -F '/' '{ print $1 }'` grep ERROR --exclude-dir=${PDBDIR} * | egrep -v $ignorelist else echo "No" grep ERROR * | egrep -v $ignorelist fiThe code above is based on a finding in this post on Stack Overflow.
cd /orasw/oracle/cfgtoollogs/dbca/cdb export PDBDIR=`ls -d */ | awk -F '/' '{ print $1 }'` export ignorelist='ORA_IGNORE_CVU_ERRORS|exectask.sh|utlrp0.log|RMANUtil\$RMANUtilErrorListener.handleError:1386|RMANUtil\$RMANUtilErrorListener.handleError:1383|RMANEngine.readSqlOutput:1046' grep ERROR --exclude-dir=${PDBDIR} * | egrep -v $ignorelistThe errors I have excluded are based on my own observations on what's important or not during dbca usage.
# 080224: Created # Check if there is only one controlfile present. If yes, create two new ones in the desired locations #!/bin/bash #cleanup old files chkcntrfiles() { rm -f /tmp/chk_cntrfile_location.sql rm -f /tmp/chk_cntrfile_location.log sqlfile=/tmp/chk_cntrfile_location.sql logfile=/tmp/chk_cntrfile_location.log echo "Check controlfile locations in database " $ORACLE_SID cat << EoF > ${sqlfile} set lines 200 heading off feedback off verify off echo off termout off set pages 0 set trimspool on col name format a70 spool ${logfile} select name from v\$controlfile; exit EoF cd /home/oracle/&&sqlplus -s -L / as sysdba @${sqlfile} } chkcntrfiles if [ `cat ${logfile} | wc -l` -ge 2 ]; then echo "There are at least 2 controlfiles present" else echo "There is only one controfile present." echo "Will now shutdown db and make another copy" echo "shutdown immediate" | sqlplus / as sysdba export org_contr_file=`cat ${logfile}` cp -v $org_contr_file /disk1/oradata/$ORACLE_SID/control01.ctl cp -v $org_contr_file /disk2/fra/$ORACLE_SID/control02.ctl echo "startup nomount" | sqlplus / as sysdba echo "alter system set control_files='/disk1/oradata/$ORACLE_SID/control01.ctl','/disk2/fra/$ORACLE_SID/control02.ctl' scope=spfile;" | sqlplus / as sysdba echo "startup mount force;" | sqlplus / as sysdba echo "Check new controlfile locations in database " $ORACLE_SID chkcntrfiles if [ ! `cat ${logfile} | wc -l` -ge 2 ]; then echo "We tried creating two new controlfiles but failed for some reason. Manual checkup required." exit 1 fi echo "Alles OK!" echo "alter database open;" | sqlplus / as sysdba fi exit
echo $ORACLE_SID testdb01 echo $ORACLE_HOME=/orasw/oracle/product/current ls -la /orasw/oracle/product/current lrwxrwxrwx 1 oracle dba 12 Jan 31 08:34 /orasw/oracle/product/current -> 19.21 ls -la sqlplus / as sysdbaThe above statement will not be able to connect to your instance.
sqlplus sys@testdb01 as sysdba SQL*Plus: Release 19.0.0.0.0 - Production on Wed Jan 31 08:38:42 2024 Version 19.21.0.0.0 Copyright (c) 1982, 2022, Oracle. All rights reserved. Enter password: Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.21.0.0.0 SYS@testdb01>SQL>show user USER is "SYS"So in order to create a bequeath session, you need an ORACLE_HOME variable that does not use symbolic links.
============================== Inside searchFileContents()... ============================== log_file: /u01/app/oracle/product/19x00_231017/appsutil/log/TXK_POST_PDB_Fri_Jan_26_19_15_34_2024/validate_system_password.log pattern: ERROR ================ Pattern found... ================ EXIT STATUS: 1 Invalid SYSTEM database user credentials. LOG FILE: /u01/app/oracle/product/19x00_231017/appsutil/log/TXK_POST_PDB_Fri_Jan_26_19_15_34_2024/validate_system_password.log. *******FATAL ERROR******* PROGRAM : (/u01/app/oracle/product/19x00_231017/appsutil/bin/txkPostPDBCreationTasks.pl) TIME : Fri Jan 26 19:18:47 2024 FUNCTION: main::validateSystemSchemaCredentials [ Level 1 ] ERRORMSG: Invalid SYSTEM database user credentials. *******FATAL ERROR******* PROGRAM : (/u01/app/oracle/product/19x00_231017/appsutil/bin/txkPostPDBCreationTasks.pl) TIME : Fri Jan 26 19:18:47 2024 FUNCTION: main::validateSystemSchemaCredentials [ Level 1 ] ERRORMSG: Invalid SYSTEM database user credentials.So the system password was not set correctly. Note that this is the only error in the logfile. All other tests had passed!
export ORACLE_SID=cdb sqlplus / as sysdba alter user system identified by by mysecretpassword container=all;Test your connection, preferrably from the apptier. Log on to the PDB, in this case EBSTEST, using the system account:
sqlplus system@EBSTEST Enter password: Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production SQL> show user USER is "SYSTEM"So the password is now confirmed to be correct.
export ORACLE_SID=cdb # source the environment cd $ORACLE_HOME/appsutil . ./txkSetCfgCDB.env dboraclehome=<your 19c OH path here> perl $ORACLE_HOME/appsutil/bin/txkPostPDBCreationTasks.pl -dboraclehome=<your 19c OH path here> \ -outdir=<your 19c OH path here>/appsutil/log -cdbsid=cdb -pdbsid=EBSTEST \ -appsuser=<APPSUSER> -dbport=<LISTENING PORT> -servicetype=onpremise
select name, value from v$parameter where name = 'utl_file_dir'; and select name, value from v$parameter where name = 'utl_file_dir';should yield the same output as the text file found in your $ORACLE_HOME/dbs/EBSTEST_utlfiledir.txt file.
$ORACLE_HOME/dbs/EBSTEST_utlfiledir.txtshowed
/sw/oracle/product/temp/EBSTEST /usr/tmp/EBSTEST /<oracle_19c_home>/appsutil/outbound/EBSTEST_<myservername>Second, it creates two environment files in your $ORACLE_HOME that can be used to source the cdb and the PDB environments,respectively. The are called
set lines 200 col patch_name format a30 SELECT DISTINCT a.bug_number,e.patch_name, e.patch_type, TRUNC(c.end_date) applied_Date FROM ad_bugs a, ad_patch_run_bugs b, ad_patch_runs c, ad_patch_drivers d , ad_applied_patches e WHERE a.bug_id = b.bug_id AND b.patch_run_id = c.patch_run_id AND c.patch_driver_id = d.patch_driver_id AND d.applied_patch_id = e.applied_patch_id AND a.bug_number in ('8796558') ORDER BY 2 DESC; BUG_NUMBER PATCH_NAME PATCH_TYPE APPLIED_DATE ------------------------------ ------------------------------ ------------------------------ ------------ 8796558 22644544 PATCH-SET 04-SEP-19 8796558 21236633 PATCH-SET 27-MAI-16 8796558 19030202 PATCH-SET 15-DES-15 8796558 17774755 PATCH-SET 11-OKT-14 22644544 --> Oracle E-Business Suite Release 12.1.3+ Recommended Patch Collection 5 [RPC5] 21236633 --> Oracle E-Business Suite Release 12.1.3+ Recommended Patch Collection 4 [RPC4] 19030202 --> Oracle E-Business Suite Release 12.1.3+ Recommended Patch Collection 2 [RPC2] 17774755 --> Oracle E-Business Suite Release 12.1.3+ Recommended Patch Collection 1 [RPC1]
[FATAL] [DBT-50000] Unable to check available system memory. CAUSE: An exception occured while checking kernel parameter. *ADDITIONAL INFORMATION:* Exception details - The default location for framework home is not available. It must be specifiedCause:
mkdir -p /u01/ora19c/tmpOpen .bash_profile, and add the following
OWNER=ora19c;export OWNER TMP=/u01/$OWNER/tmp;export TMP TMPDIR=/u01/$OWNER/tmp;export TMPDIRLaunch dbca again. It should now proceed as expected.
dbca -J-Djava.io.tmpdir=/home/oracle/tmp
set lines 200 col member format a50 select s.group#,s.thread#,s.sequence#,s.archived,s.status,f.member, f.type from v$standby_log s, v$logfile f where f.type = 'STANDBY' and s.group# = f.group#; GROUP# THREAD# SEQUENCE# ARC STATUS MEMBER TYPE ---------- ---------- ---------- --- ---------- -------------------------------------------------- ------- 6 1 0 YES UNASSIGNED /data03/oradata/prod01/onlinelog/stb_redo06.log STANDBY 7 1 0 YES UNASSIGNED /data03/oradata/prod01/onlinelog/stb_redo07.log STANDBY 8 1 0 YES UNASSIGNED /data03/oradata/prod01/onlinelog/stb_redo08.log STANDBY 9 1 0 YES UNASSIGNED /data03/oradata/prod01/onlinelog/stb_redo09.log STANDBY 10 1 0 YES UNASSIGNED /data03/oradata/prod01/onlinelog/stb_redo10.log STANDBY 11 1 0 YES UNASSIGNED /data03/oradata/prod01/onlinelog/stb_redo11.log STANDBYSyntax for dropping:
SQL> alter database drop standby logfile group n;In my case
alter database drop standby logfile group 6; alter database drop standby logfile group 7;etc etc.
The official Oracle 19c Alter Database documentation is here
ebs@ebsserver1.oric.no 35642926]$ $ADMIN_SCRIPTS_HOME/adstpall.sh –skipNM -skipAdmin You are running adstpall.sh version 120.22.12020000.7 Enter the WebLogic Server password: adstpall.sh: too few arguments specified. USAGE: adstpall.shReason: You have copied the text directly from step 5 in the documentation[-skipNM] [-skipAdmin] [-nothreading] adstpall.sh -secureapps [-skipNM] [-skipAdmin] adstpall.sh -nodbchk [-skipNM] [-skipAdmin] adstpall.sh -mode=allnodes adstpall.sh: exiting with status 1
$ $ADMIN_SCRIPTS_HOME/adstpall.sh –skipNM -skipAdmin
Workaround: execute it with the correct dash
$ $ADMIN_SCRIPTS_HOME/adstpall.sh -skipNM -skipAdmin
Thanks to Marco DeDecker from Oracle Netherlands for finding and pointing out this error.