Monday, November 8, 2021

First Build OIC Journey Starts Here

My First Build OIC Journey Starts Here


OIC – Oracle Integration Cloud is a cloud based Integration tool. It seamlessly integrates on-prem applications with Oracle Cloud (SaaS) or other Cloud Apps (as Workday, Salesforce etc.) to other Cloud Apps.

Looks cool , here is my first app driver orchestration in OIC





Monday, July 12, 2021

First Build, DevOps Journey Starts here

 My first successful build in Oracle Cloud Services. My DevOps Journey Starts here.


Monday, March 15, 2021

Useful Script to Analyze last 30 days of OutofMemory Error on Oracle E-Business Suite OPP

 

Useful Script to Analyze last 30 days of OutofMemory Error on Oracle E-Business Suite OPP ( Output Post Processor ) Logs

First Spool the logfile that is required for analysis. Here I am spooling from fnd tables. you can use find command to get the last 30 days of OPP logs.

cd /tmp;mkdir OPPAnalysis;cd OPPAnalysis
sqlplus apps
spool opp_last30DaysLog.lst
set linesize 1000 pagesize 0
select logfile_name from fnd_concurrent_processes where trunc(creation_date)>trunc(sysdate-30) and logfile_name like '%OPP%';
spool off

Script below gets into each of the logs generated above and finds the OutOfMemoryError Tag then pulls the Request ID. Then for each of the Request ID it fetches if the failue is on OutOfMemory and then pulls the relevant templates. These templates are the cause of Out of Memory.

cat OPPOutOfMemoryDiag.sh
for log in $(cat opp_last30DaysLog.lst|grep OPP|grep txt)
do
 opp_request=$(grep -i UNEXPECTED $log|grep -i OutOfMemoryError|grep ":RT"|cut -d'[' -f4|cut -d']' -f1|cut -d':' -f2|cut -c 3-)
 if [ "$1" = "-debug" ]
  then
   echo
   echo $log
   echo $opp_request
  fi
 if [ ! -z $opp_request ]
 then
  echo $(echo $log|rev|cut -d'/' -f1|rev)" - "$(stat $log|grep Modify|cut -d":" -f2-)" - "$(grep -b1 $opp_request $log|grep -i Template|cut -d'-' -f2)
 fi
done



[oracle@testserver OPPAnalysis]$ sh OPPOutOfMemoryDiag.sh
FNDOPP548310.txt -  2091-11-04 07:05:02.190691000 -0600 - Template code: EXCELLOAD
FNDOPP548311.txt -  2091-11-04 07:06:32.195461000 -0600 - Template code: EXCELLOAD
FNDOPP548345.txt -  2091-11-04 09:50:20.855625000 -0600 - Template code: EXCELLOAD
FNDOPP547385.txt -  2091-11-23 11:50:16.076419000 -0600 - Template code: PDFOUTUT
FNDOPP548385.txt -  2091-11-06 07:20:16.937702000 -0600 - Template code: EXCELLOAD
FNDOPP548395.txt -  2091-11-06 07:20:19.119176000 -0600 - Template code: EXCELLOAD
FNDOPP548320.txt -  2091-11-07 07:20:12.012239000 -0600 - Template code: EXCELLOAD
FNDOPP548347.txt -  2091-11-03 08:27:41.649406000 -0600 - Template code: EXCELLOAD
FNDOPP548359.txt -  2091-11-08 09:02:02.276215000 -0600 - Template code: EXCELLOAD
FNDOPP548368.txt -  2091-11-08 10:22:16.784284000 -0600 - Template code: EXCELLOAD
FNDOPP548377.txt -  2091-11-08 10:35:22.024312000 -0600 - Template code: PDFOUTUT
FNDOPP548393.txt -  2091-11-03 09:18:51.866628000 -0600 - Template code: PDFOUTUT
FNDOPP548392.txt -  2091-11-08 12:47:33.709433000 -0600 - Template code: PDFOUTUT
FNDOPP548311.txt -  2091-11-09 07:08:49.778074000 -0600 - Template code: PDFOUTUT
FNDOPP548312.txt -  2091-11-09 07:17:04.803232000 -0600 - Template code: PDFOUTUT
FNDOPP548320.txt -  2091-11-10 07:11:10.239378000 -0600 - Template code: PDFOUTUT
FNDOPP548325.txt -  2091-11-10 07:15:11.158641000 -0600 - Template code: PDFOUTUT
FNDOPP549346.txt -  2091-11-12 07:19:48.004048000 -0600 - Template code: PDFOUTUT
FNDOPP549349.txt -  2091-11-12 07:09:20.415082000 -0600 - Template code: EXCELLOAD
FNDOPP549368.txt -  2091-11-13 07:20:13.214100000 -0600 - Template code: EXCELLOAD
FNDOPP549375.txt -  2091-11-13 07:15:32.330791000 -0600 - Template code: PDFOUTUT
FNDOPP549391.txt -  2091-11-14 07:16:11.077493000 -0600 - Template code: EXCELLOAD
FNDOPP549394.txt -  2091-11-14 07:09:31.057564000 -0600 - Template code: EXCELLOAD
[oracle@testserver OPPAnalysis]$ 

sh OPPOutOfMemoryDiag.sh -debug 
the above -debug options helps get more details

Next Steps
Now that you have found the template that is causing Heap Out Of Memory Error , the next step is to fix it.

There are two options
Option 1: more Heap upto 2gb , if you need more than 2gb Heap move to 64 bit Java
Option 2: move from ram to disk based procesing

Both these options are covered in detail
E-Business Suite Output BI Publisher Post Processor (OPP) Log Contains Error "java.lang.OutOfMemoryError: Java heap space" (Doc ID 1268217.1)

The best recommended for EXCEL and BULK programs is to move to Disk Based Processing.

Configure the XML Publisher Administrator Configuration settings.
  1. As XML Publisher Administrator navigate to Administration->Configuration.
  2. Under Temporary Directory pick a temporary file location on your concurrent processing node. This should be at least 5GB or 20x larger than largest XML data file you generate
  3. Under FO Processing, set:
    • Use XML Publisher's XSLT processor set to True
    • Confirm the profile 'scalable feature of XSLT processor' is set to False at the global level
    • Enable profile 'scalable feature of XSLT processor' be setting to True at the individual template level for the failing template
    • Enable XSLT runtime optimization set to True

Thursday, March 11, 2021

Grafana for OCI Monitoring in Docker running on Windows

 Grafana for OCI Monitoring in Docker on Windows


Step 1: Install Docker Desktop on Windows

https://docs.docker.com/docker-for-windows/install/


Step 2: Download and Install WSL 2

https://docs.microsoft.com/en-us/windows/wsl/install-win10


Step 3: Make Sure Docker Desktop on Windows is Running


Step 4: Sign-in to Docker [ optional ]


Step 5: Install Grafana on Docker

https://grafana.com/docs/grafana/latest/administration/configure-docker/


Run Grafana container with persistent storage (recommended)

# create a persistent volume for your data in /var/lib/grafana (database and plugins)

docker volume create grafana-storage


# start grafana

docker run -d -p 3000:3000 --name=grafana -v grafana-storage:/var/lib/grafana grafana/grafana



Step 6 : Launch URL and Validate



Step 7 : Launch CLI



Install the Data Source Plugin. From the command line, use grafana-cli to install the plugin

# grafana-cli plugins install oci-metrics-datasource



Step 8 : Setup OCI - CLI on Docker


Follow Instruction

https://blogs.oracle.com/developers/get-going-quickly-with-command-line-interface-for-oracle-cloud-infrastructure-using-docker-container


Step 9 : Move the .oci folder from host to grafana docker image


PS C:\Users\skrajend> docker ps

CONTAINER ID   IMAGE             COMMAND     CREATED             STATUS          PORTS                    NAMES

e647e4022bc0   grafana/grafana   "/run.sh"   About an hour ago   Up 17 minutes   0.0.0.0:3000->3000/tcp   grafana

PS C:\Users\skrajend>


PS C:\Users\skrajend> docker cp .oci e647e4022bc0:/home/grafana


Step 10 : Configure the key_file in OCI config file


Login into the docker container as root user


PS C:\Users\skrajend> docker exec -it --user root e647e4022bc0 /bin/sh

/usr/share/grafana # cd /home/grafana


Use vi editor and \uUpdate key_file with the correct path and save the config file


/home/grafana/.oci # cat config|grep -i key

key_file=/home/grafana/.oci/oci_api_key.pem

/home/grafana/.oci #


Step 11 : Change Owner of the .oci folder to grafana


/home/grafana/ # chown -Rf grafana:root .oci



Step 12: Restart grafana docker



Step 13 : Login into Grafana and Validate OCI Data Source


Step 14 : Configure the Tenancy in the Data Source


 

Step 15 : Loading OCI Compute Instance Monitoring Plugin from Grafana Plugin Website




Import the Plugin via the ID 


Select the data source as Oracle Cloud Infrastructure Metric



Validate the Grafana Dashboard




Happy Learning with Grafana






Tuesday, February 9, 2021

OCI CLI to List all the Boot Volumes Backup Policy Assignment

OCI CLI to List all the Boot Volumes Backup Policy Assignment

This bash scripts needs the tenancy ID to be updated. It loops through all the compartments and then it all availability-domain ,  then fetches the boot volume details. From the boot volume it fetches the asset-id and then validates block volume policy assignment. If there is no policy assigned then the policy status is marked as FAILURE. If you intend to have backups enabled , create a new backup policy of your choice or assign already existing one.


ociCompartmentList=$(oci iam compartment list --compartment-id ocid1.tenancy.oc1..aaaa1111222334)
for c in $(echo "$ociCompartmentList" | jq '.data | keys | .[]')
do
        compartment_ocid=$(echo "$ociCompartmentList" | jq -r ".data[$c].\"id\"")
        ociadList=$(oci iam availability-domain list)
        for a in $(echo "$ociadList" | jq '.data | keys | .[]')
        do
                ociAD=$(echo "$ociadList" | jq -r ".data[$a].\"name\"")
                ocibootvList=$(oci bv boot-volume list -c $compartment_ocid --availability-domain $ociAD)
                for i in $(echo "$ocibootvList" | jq '.data | keys | .[]')
                do
                        bvID=$(echo "$ocibootvList" | jq -r ".data[$i].\"id\"")
                        bvName=$(echo "$ocibootvList" | jq -r ".data[$i].\"display-name\"")
                        lifecycle=$(echo "$ocibootvList" | jq -r ".data[$i].\"lifecycle-state\"")
                        bvPolicyAList=$(oci bv volume-backup-policy-assignment get-volume-backup-policy-asset-assignment --asset-id $bvID)
                        ociAssignedPolicyID=$(echo "$bvPolicyAList" | jq -r ".data[].\"id\"")
                        if [ -z "$ociAssignedPolicyID" ]
                        then
                                echo "BootVolume : $bvName | Backup Policy : FAILURE"
                        else
                                echo "BootVolume : $bvName | Backup Policy : AVAILABLE"
                        fi
                done
        done
done 

Boot Volume: ebstestserver-001(Boot Volume)| Backup Policy: AVAILABLE
Boot Volume: ebstestserver-002(Boot Volume)| Backup Policy: AVAILABLE
Boot Volume: ebstestserver-003(Boot Volume)| Backup Policy: AVAILABLE
Boot Volume: ebstestserver-001(Boot Volume)| Backup Policy: AVAILABLE
Boot Volume: ebstestserver-004(Boot Volume)| Backup Policy: AVAILABLE
Boot Volume: ebstestserver-005(Boot Volume)| Backup Policy: AVAILABLE
Boot Volume: ebstestserver-001(Boot Volume)| Backup Policy: AVAILABLE
Boot Volume: ebstestserver-006(Boot Volume)| Backup Policy: AVAILABLE
Boot Volume: ebstestserver-006(Boot Volume)| Backup Policy: AVAILABLE
Boot Volume: ebstestserver-007(Boot Volume)| Backup Policy: AVAILABLE
Boot Volume: ebstestserver-008(Boot Volume)| Backup Policy: AVAILABLE
Boot Volume: ebstestserver-009(Boot Volume)| Backup Policy: AVAILABLE
Boot Volume: ebstestserver-010(Boot Volume)| Backup Policy: AVAILABLE
Boot Volume: ebstestserver-011(Boot Volume)| Backup Policy: AVAILABLE
Boot Volume: ebstestserver-012(Boot Volume)| Backup Policy: AVAILABLE
Boot Volume: ebstestserver-013(Boot Volume)| Backup Policy: AVAILABLE
Boot Volume: ebstestserver-014(Boot Volume)| Backup Policy: AVAILABLE
Boot Volume: ebstestserver-015(Boot Volume)| Backup Policy: AVAILABLE
Boot Volume: ebstestserver-016(Boot Volume)| Backup Policy: AVAILABLE
Boot Volume: ebstestserver-017(Boot Volume)| Backup Policy: AVAILABLE
Boot Volume: ebstestserver-018(Boot Volume)| Backup Policy: FAILURE
Boot Volume: ebstestserver-019(Boot Volume)| Backup Policy: FAILURE
Boot Volume: ebstestserver-020(Boot Volume)| Backup Policy: FAILURE
 

Monday, February 8, 2021

OCI CLI to List all the Boot Volumes and its LifeCycle State in the Tenancy

OCI CLI to List all the Boot Volumes and its LifeCycle State in the Tenancy

This bash scripts needs the tenancy ID to be updated. It loops through all the compartments and then it all availability-domain ,  then fetches the boot volume details.


ociCompartmentList=$(oci iam compartment list --compartment-id ocid1.tenancy.oc1..aaaa1111222334)
for c in $(echo "$ociCompartmentList" | jq '.data | keys | .[]')
do
 compartment_ocid=$(echo "$ociCompartmentList" | jq -r ".data[$c].\"id\"")
 ociadList=$(oci iam availability-domain list)
 for a in $(echo "$ociadList" | jq '.data | keys | .[]')
 do
  ociAD=$(echo "$ociadList" | jq -r ".data[$a].\"name\"")
  ocibootvList=$(oci bv boot-volume list -c $compartment_ocid --availability-domain $ociAD)
  for i in $(echo "$ocibootvList" | jq '.data | keys | .[]')
  do
  bvName=$(echo "$ocibootvList" | jq -r ".data[$i].\"display-name\"")
  lifecycle=$(echo "$ocibootvList" | jq -r ".data[$i].\"lifecycle-state\"")
  echo "BootVolume : $bvName | LifeCycle: $lifecycle"
  done
 done
done

Boot Volume: ebstestserver-001(Boot Volume)| LifeCycle: RUNNING
Boot Volume: ebstestserver-002(Boot Volume)| LifeCycle: RUNNING
Boot Volume: ebstestserver-003(Boot Volume)| LifeCycle: RUNNING
Boot Volume: ebstestserver-004(Boot Volume)| LifeCycle: RUNNING
Boot Volume: ebstestserver-005(Boot Volume)| LifeCycle: RUNNING
Boot Volume: ebstestserver-006(Boot Volume)| LifeCycle: RUNNING
Boot Volume: ebstestserver-007(Boot Volume)| LifeCycle: RUNNING
Boot Volume: ebstestserver-008(Boot Volume)| LifeCycle: RUNNING
Boot Volume: ebstestserver-009(Boot Volume)| LifeCycle: RUNNING
Boot Volume: ebstestserver-010(Boot Volume)| LifeCycle: RUNNING
Boot Volume: ebstestserver-011(Boot Volume)| LifeCycle: RUNNING
Boot Volume: ebstestserver-012(Boot Volume)| LifeCycle: RUNNING
Boot Volume: ebstestserver-013(Boot Volume)| LifeCycle: RUNNING
Boot Volume: ebstestserver-014(Boot Volume)| LifeCycle: RUNNING
Boot Volume: ebstestserver-015(Boot Volume)| LifeCycle: RUNNING
Boot Volume: ebstestserver-016(Boot Volume)| LifeCycle: RUNNING
Boot Volume: ebstestserver-017(Boot Volume)| LifeCycle: RUNNING
Boot Volume: ebstestserver-018(Boot Volume)| LifeCycle: RUNNING
Boot Volume: ebstestserver-019(Boot Volume)| LifeCycle: RUNNING
Boot Volume: ebstestserver-020(Boot Volume)| LifeCycle: RUNNING
 

Saturday, January 30, 2021

OCI CLI to List all the Database and the Backup Status


OCI CLI to List all the Database and the Backup Status


This bash scripts needs the tenancy ID to be updated. It loops through all the compartments and then fetches the backup details of each database.  It validates if the database is a Standby and skips validation. It pulls only database with role as PRIMARY. It validates if Auto Backup is enabled and also it validate if recovery window is 30 days. Feel free to customize it to your requirement. It is not coded for RAC Instances , please customize it.


ociCompartmentList=$(oci iam compartment list --compartment-id ocid1.tenancy.oc1..aaaa1111222334)
for c in $(echo "$ociCompartmentList" | jq '.data | keys | .[]')
do
        compartment_ocid=$(echo "$ociCompartmentList" | jq -r ".data[$c].\"id\"")
        ocidbList=$(oci db database list -c $compartment_ocid)
        for i in $(echo "$ocidbList" | jq '.data | keys | .[]')
        do
                dbid=$(echo "$ocidbList" | jq -r ".data[$i].\"id\"")
                dbrole=$(oci db data-guard-association list --database-id $dbid| jq -r ".data[].\"role\"")
                if [    -z $dbrole ]
                then
                        echo "Stand alone Database , No Role Assigned , Setting to Primary"
                        dbrole="PRIMARY"
                fi
                if [ $dbrole == "PRIMARY" ]
                then
                        dbname=$(echo "$ocidbList" | jq -r ".data[$i].\"db-name\"")
                        dbsystemid=$(echo "$ocidbList" | jq -r ".data[$i].\"db-system-id\"")
                        dbbackupconfig=$(echo "$ocidbList" | jq -r ".data[$i].\"db-backup-config\"")
                        dbautoBackupEnabled=$(echo "$dbbackupconfig" | jq -r ".\"auto-backup-enabled\"")
                        dbrecoveryWindow=$(echo "$dbbackupconfig" | jq -r ".\"recovery-window-in-days\"")
                        hostname=$(oci db node list -c $compartment_ocid --db-system-id $dbsystemid| jq -r ".data[].\"hostname\"")
                        if [ $dbautoBackupEnabled == "true" ]
                        then
                                echo "Hostname: $hostname | Database: $dbname | AutoBackup: $dbautoBackupEnabled | SUCCESS"
                        else
                                echo "Hostname: $hostname | Database: $dbname | AutoBackup: $dbautoBackupEnabled | FAILURE"
                        fi
                        if [ $dbrecoveryWindow == "30" ]
                        then
                                echo "Hostname: $hostname | Database: $dbname | RecoveryWindow: $dbrecoveryWindow | SUCCESS"
                        else
                                echo "Hostname: $hostname | Database: $dbname | RecoveryWindow: $dbrecoveryWindow | FAILURE"
                        fi
                else
                        echo "Hostname: $hostname | Database: $dbname | Role : $dbrole - Skipping"
                fi
        done
done 


Hostname: ebstestserver-001| Database: TEST1 |AutoBackup: true |SUCCESS
Hostname: ebstestserver-001| Database: TEST1 |RecoveryWindow: 30 |SUCCESS
Hostname: ebstestserver-002| Database: TEST2 |AutoBackup: false |FAILURE
Hostname: ebstestserver-003| Database: TEST3 |AutoBackup: true |SUCCESS
Hostname: ebstestserver-001| Database: TEST3 |RecoveryWindow: 30 |SUCCESS
Hostname: ebstestserver-004| Database: TEST4 |AutoBackup: true |SUCCESS
Hostname: ebstestserver-005| Database: TEST5 |AutoBackup: true |SUCCESS
Hostname: ebstestserver-001| Database: TEST5 |RecoveryWindow: 10 |FAILURE

Wednesday, January 27, 2021

OCI CLI to List all the Database and its Host Lifecycle

 OCI CLI to List all the Database and its Host Lifecycle


This bash scripts needs the tenancy ID to be updated. It loops through all the compartments and then fetches the life cycle of each database and it respective hosts. 

The below code fetches lifecycle of  the hosts where the database is running.

ociCompartmentList=$(oci iam compartment list --compartment-id ocid1.tenancy.oc1..aaaa1111222334)
for c in $(echo "$ociCompartmentList" | jq '.data | keys | .[]')
do
 compartment_ocid=$(echo "$ociCompartmentList" | jq -r ".data[$c].\"id\"")
 ocidbList=$(oci db database list -c $compartment_ocid)
 for i in $(echo "$ocidbList" | jq '.data | keys | .[]')
 do
ocidbnodeList=$(oci db node list -c $compartment_ocid --db-system-id $(echo $ocidbList | jq -r ".data[$i].\"db-system-id\""))
hostname=$(echo "$ocidbnodeList" | jq -r ".data[].\"hostname\"")
lifecycle=$(echo "$ocidbnodeList" | jq -r ".data[].\"lifecycle-state\"")
echo "Hostname: $hostname | LifeCycle: $lifecycle"
 done
done

Hostname: ebstestserver-001| LifeCycle: RUNNING
Hostname: ebstestserver-002| LifeCycle: RUNNING
Hostname: ebstestserver-003| LifeCycle: RUNNING
Hostname: ebstestserver-004| LifeCycle: RUNNING
Hostname: ebstestserver-005| LifeCycle: RUNNING

The below code fetches the lifecycle of the database along with the hostnames

ociCompartmentList=$(oci iam compartment list --compartment-id ocid1.tenancy.oc1..aaaa1111222334)
for c in $(echo "$ociCompartmentList" | jq '.data | keys | .[]')
do
 compartment_ocid=$(echo "$ociCompartmentList" | jq -r ".data[$c].\"id\"")
 ocidbList=$(oci db database list -c $compartment_ocid)
 for i in $(echo "$ocidbList" | jq '.data | keys | .[]')
 do
dbname=$(echo "$ocidbList" | jq -r ".data[$i].\"db-name\"")
dbsystemid=$(echo "$ocidbList" | jq -r ".data[$i].\"db-system-id\"")
lifecycle=$(echo "$ocidbList" | jq -r ".data[$i].\"lifecycle-state\"")
hostname=$(oci db node list -c $compartment_ocid --db-system-id $dbsystemid| jq -r ".data[].\"hostname\"")
echo "Hostname: $hostname | Database: $dbname | LifeCycle: $lifecycle"
 done
done

Hostname: ebstestserver-001| Database: TEST1 |LifeCycle: RUNNING
Hostname: ebstestserver-002| Database: TEST2 |LifeCycle: RUNNING
Hostname: ebstestserver-003| Database: TEST3 |LifeCycle: RUNNING
Hostname: ebstestserver-004| Database: TEST4 |LifeCycle: RUNNING
Hostname: ebstestserver-005| Database: TEST5 |LifeCycle: RUNNING

Note : The script is helps to get the state of single instance vm db systems. for RAC you may have to modify it.

OCI CLI to List all the Hosts Lifecycle

OCI CLI to List all the Hosts Lifecycle

This bash scripts needs the tenancy ID to be updated. It loops through all the compartments and then fetches the life cycle of each hosts. 

ociCompartmentList=$(oci iam compartment list --compartment-id ocid1.tenancy.oc1..aaaa1111222334)
for c in $(echo "$ociCompartmentList" | jq '.data | keys | .[]')
do
 compartment_ocid=$(echo "$ociCompartmentList" | jq -r ".data[$c].\"id\"")
 ociinstanceList=$(oci compute instance list -c $compartment_ocid)
 for i in $(echo "$ociinstanceList" | jq '.data | keys | .[]')
 do
   hostname=$(echo "$ociinstanceList" | jq -r ".data[$i].\"display-name\"")
   lifecycle=$(echo "$ociinstanceList" | jq -r ".data[$i].\"lifecycle-state\"")
   echo "Hostname: $hostname | LifeCycle: $lifecycle"
 done
done

Hostname: ebstestserver-001| LifeCycle: RUNNING
Hostname: ebstestserver-002| LifeCycle: RUNNING
Hostname: ebstestserver-003| LifeCycle: RUNNING
Hostname: ebstestserver-004| LifeCycle: RUNNING
Hostname: ebstestserver-005| LifeCycle: RUNNING
Hostname: ebstestserver-006| LifeCycle: RUNNING
Hostname: ebstestserver-007| LifeCycle: RUNNING
Hostname: ebstestserver-008| LifeCycle: RUNNING
Hostname: ebstestserver-009| LifeCycle: RUNNING
Hostname: ebstestserver-010| LifeCycle: RUNNING
Hostname: ebstestserver-011| LifeCycle: RUNNING
Hostname: ebstestserver-012| LifeCycle: RUNNING
Hostname: ebstestserver-013| LifeCycle: RUNNING
Hostname: ebstestserver-014| LifeCycle: RUNNING
Hostname: ebstestserver-015| LifeCycle: RUNNING
Hostname: ebstestserver-016| LifeCycle: RUNNING
Hostname: ebstestserver-017| LifeCycle: RUNNING
Hostname: ebstestserver-018| LifeCycle: RUNNING
Hostname: ebstestserver-019| LifeCycle: RUNNING
Hostname: ebstestserver-020| LifeCycle: RUNNING

Hope it helps.

Saturday, January 9, 2021

Ignore Python Warning

 Ignore Python Warning


# compartmentList=$(oci iam compartment list)

/usr/lib/python3.6/site-packages/oci/packages/cryptography/hazmat/bindings/openssl/binding.py:179: CryptographyDeprecationWarning: OpenSSL version 1.0.2 is no longer supported by the OpenSSL project, please upgrade. The next version of cryptography will completely remove support for it.

  utils.CryptographyDeprecationWarning,


here is a way to ignore the warning if you have updated packages

# export PYTHONWARNINGS="ignore"

# compartmentList=$(oci iam compartment list)

#


Monday, January 4, 2021

EBS 12.2 ADOP SQL to Find Session Details

EBS 12.2 ADOP SQL to Find Session Details 

A Simple and Useful SQL to find the list of Patches and Actions that are performed in each Patching Cycle. Hope it helps.


set pagesize 200;
set linesize 200;
column adop_session_id format 999999999999;
column activity format a15;
column status format a15;
column applied_fs format a10;
column patch_fs format a10;
column options format a10;
column node format a15;
column start_date format a17;
column end_date format a17;
column clone_status format a20;
column adop_session_id new_value sid noprint
ttitle left 'Session ID : ' sid skip 2
break on adop_session_id skip page
select 
adop_session_id,
node_name node,
decode(length(trim(translate(bug_number, ' +-.0123456789', ' '))),null,'Patch-'||bug_number,bug_number) activity,
status ,
upper(decode(substr(applied_file_system_base,1,1),'/',substr(applied_file_system_base,-3),applied_file_system_base)) applied_fs,
upper(decode(substr(patch_file_system_base,1,1),'/',substr(patch_file_system_base,-3),patch_file_system_base)) patch_fs,
upper(adpatch_options) options,
to_char(start_date,'DD-Mon-YYYY HH24:MI') start_date,
to_char(end_date,'DD-Mon-YYYY HH24:MI') end_date,
clone_status,
autoconfig_status
from apps.ad_adop_session_patches
order by adop_session_id,start_date; 


Sunday, January 3, 2021

File System for Oracle EBS Release 12

Well there are many ways to get Oracle EBS Release 12 installed, I am here going to write about Enterprise Deployments. 

Shared vs Non-Shared - when enterprise deployments are considered you may need multiple nodes for your internal Private tier and for your external DMZ tier. The code for EBS has to be available on all the nodes so that it can be accessed by end users through various services like http , forms , concurrent manager... The code becomes easy to maintain if it is Shared and one single repository is used by all these multi-node in an enterprise deployments. Config becomes easy , Patching becomes easy... Having them in the Non-Shared isolates the code and becomes tought to maintain it. Though EBS 12 provides various tools to keep them in sync but it gets complex as you grow. So choosing a Shared file system is a good decision for enterprise deployments.

Shared Storage that are commonly available are NFS/ZFS , in OCI we have FSS 

Here is another option that might be interesting in OCI which is attaching a volume to multiple instances.






Please be aware of the limitation and do review before considering this solution.

- Concurrent write operations to block volumes are not provided so basically you can have only one instance write to it at a time. well there must be a solution for this... not one there are many... Cluster Aware Solution. There are many options listed from differnet vendors which you can find here https://en.wikipedia.org/wiki/Clustered_file_system 

Oracle Cluster File System so called as OCFS2 (version 2) is a Cluster Aware solution provided by Oracle. Similar solutions are provided by GlusterFS , Veritas , GFS2 , VMFS

In OCI there are three simple steps to get this for your Enterprise Deployments

  • Create your EBS deployments and attach block volume to the middleware instances as Read/Write-Sharable
  • Setup OCFS2 
  • Create File Systems on OCFS2
  • Mount the File System 
  • Install/Clone EBS with Shared APPL_TOP Option
Detailed documentation on how to setup OCFS2 is available in the Linux Admin Guide

Also there is a video guide by Oracle on how to setup OCFS2 on OCI



Saturday, January 2, 2021

Popular Posts