This topic describes the process of provisioning a virtual EBS R12.2 instance.

Maintain the integrity in names(CDB name, PDB name, DB hostname, /etc/hosts file format nomenclature). During dbTechStack, vPDB or vDB provisioning, maintain the same lower case and use the same name vPDB during virtual Appstier provision as well. There is no restriction on using UPPER or LOWER case characters. However, it is recommended to maintain consistency.

Prerequisites

Snapshot Coordination

Changes applied to EBS and picked up only in certain dSource snapshots may make certain combinations of snapshots across the appsTier and dbTier incompatible. When provisioning, refreshing or rewinding a virtual EBS instance, be sure the points in time you select for each dataset are compatible with each other.

Provisioning the EBS dbTechStack

  1. Login to the Delphix Management application.

  2. Click Manage.
  3. Select Datasets.
  4. Select the dbTechStack dSource.

  5. Click the TimeFlow tab.
  6. Select a dSource snapshot.
    All snapshots will have staged configuration prepared by  adpreclone.pl  and any hook operations placed on the dSource.

  7. Click Provision
    The Provision vFiles wizard will open.

  8. Select an Environment. 
    This environment will host the virtual dbTechStack and be used to execute hook operations specified in step 16.

  9. Select an Environment User.
    This user should be the oracle user-outlined in Preparing Target EBS R12.2 Environments for Provisioning.

  10. Enter a Mount Path for the virtual dbTechStack files.

  11. Enter the EBS-specific parameters for the virtual dbTechStack. A subset of these parameters is discussed in more detail below.

    1. The Privileged OS Account (Optional) field should contain the high privileged user when the low privileged user is being used for provisioning.
    2. Ensure that the Target DB Hostname value is the short hostname, not the fully-qualified hostname.

    3. The Target DB/CDB SID is the new database SID (CDB SID in case of 19c) that is required to configure virtual dbTechStack.
    4. The Target PDB Name field is added for the pluggable database to be configured for Oracle 19c database. Please leave this field empty when using Oracle 11g/12c database.
    5. The Target APPS Password is the new apps password that is required to configure virtual dbTechStack. This password is encrypted when stored within the Delphix Engine and is available as an environment variable to the adcfgclone process.
    6. Enable the Disable RAC option if you want to permit the Delphix Engine to automatically disable the RAC option for the binaries when applicable. 
      This option is necessary if provisioning from a dSource with RAC dbTier because the binaries are relinked with the rac_on option even after running adcfgclone. If the source binaries already have the RAC option disabled (also the case for SI dbTier), the Delphix Engine ignores this option.
    7. Enable the Cleanup Before Provision option if you want to permit the Delphix Engine to automatically clean up stale EBS configuration during a refresh. This option is recommended, but only available if your Oracle Home is patched with Oracle Universal Installer (OUI) version 10.2 or above.

      1. With this option enabled, the Delphix Engine will inspect the target environment's oraInventory prior to refreshing this virtual dbTechStack. If any Oracle Homes are already registered within the specified Mount Path, the Delphix Engine will detach them from the inventory prior to running adcfgclone. These homes must be detached prior to running post-clone configuration. If they are not detached, adcfgclone will fail, citing conflicting oraInventory entries as an issue.

      2. Without this option enabled, Oracle Homes that conflict with the specified Mount Path will be reported in an error instead of automatically detached. For refresh to succeed, you must manually detach conflicting Oracle Homes prior to refresh.

  12. Click Next.

  13. Enter a vFiles Name.

  14. Select a Target Group for the vFiles.
    If necessary, click the green Plus icon to add a new group.

  15. Select a Snapshot Policy for the vFiles.
    If necessary, click the Plus icon to create a new policy.

    Snapshot conflicts

    When Snapshot is running against the dbTechStack, database, or appsTier, the Delphix Engine also executes pre-clone logic to ensure the latest configuration is staged in the captured snapshots. Unfortunately, if multiple Snapshots are running against the same EBS instance concurrently, this pre-clone logic may fail and produce bad snapshots.

    To avoid SnapSync conflicts, spread out your SnapSync policies for an EBS instance by one hour or more.

  16. Click Next.

  17. Enter any custom hook operations that are needed to help correctly manage the virtual dbTechStack files.
    For more information about these hooks, when they are run, and how operations are written.
    The Configure Clone hook will be run after the  adcfgclone.pl  tool has both mounted and configured the dbTechStack.

  18. Click Next.  
  19. Click Submit.     

When provisioning starts, you can review the progress of the job in the Datasets panel, or in the Job History panel of the Dashboard. When provisioning is complete, the dbTechStack vFiles will be included in the group you designated and listed in the Datasets panel. If you select the dbTechStack vFiles in the Datasets panel and click the Configuration tab, you can view information about the virtual files and its Data Management settings.

For tips on monitoring the progress of dbTechStack provisioning, see Monitoring EBS R12.2 dbTechStack Provisioning Progress.

Registering the EBS dbTechStack

Register the freshly-provisioned dbTechStack with the Delphix Engine.

  1. Login to the Delphix Management application.

  2. Click Manage.
  3. Select Environments.
  4. Select the target dbTier environment.

  5. Click the Databases tab.

  6. Click the Plus icon next to Add Dataset Home.

  7. Select Oracle as your Dataset Home Type.

  8. Enter an Installation Home.
    This path should be the value of  $ORACLE_HOME  on your target dbTier; this path will live under the mount path specified when you provisioned the virtual dbTechStack. 
    Commonly, this path looks like /u01/oracle/VIS/11.2.0.

  9. Click the checkmark to save your dataset home.
    If necessary, scroll down the list of dataset homes to view and edit this dataset home.
  10. Refresh the dbTier environment.
    Refreshing the environment will discover an EBS database listener and ensure it is available for selection when provisioning the EBS database. 

    1. Click the Refresh button in the bottom right-hand corner of the environment card.

Provisioning the Oracle Database

  1. Provision the EBS database to the target dbTier environment by following the steps outlined in Provisioning an Oracle VDB. For Oracle EBS database for 19c MT, provision the database by following the steps outlined in Provisioning an Oracle Virtual Pluggable Database

    Snapshot conflicts

    When Snapshot is running against the dbTechStack, database, or appsTier, the Delphix Engine also executes pre-clone logic to ensure the latest configuration is staged in the captured snapshots. Unfortunately, if multiple Snapshots are running against the same EBS instance concurrently, this pre-clone logic may fail and produce bad snapshots.

    To avoid SnapSync conflicts, spread out your SnapSync policies for an EBS instance by one hour or more.

  2. Select the correct Installation Home.
    This should be the virtual dbTechStack you just added to the Delphix Engine.

  3. Enter the SID same as what's provided to the virtual dbTechStack you just added to the Delphix Engine.

  4. Click Advanced.
  5. Select the correct Oracle Node Listeners value.
    This should be the listener corresponding to the virtual dbTechStack you just added to the Delphix Engine.
  6. Add the EBS R12.2 dbTier environment file as a Custom Environment Variables entry
  7. This file can be specified as an Environment File with Path Parameters of $ORACLE_HOME/<CONTEXT_NAME>.env . 
    Replace <CONTEXT_NAME> with the virtual EBS instance's context name. The Delphix Engine will expand the $ORACLE_HOME variable at runtime. 
    For more information, see Customizing Oracle VDB Environment Variables.

  8. Add a Run Bash Shell Command operation to the Configure Clone hook to ensure thatadcfgcloneis run against the newly provisioned database for a high privileged useras shown in the script below.

    Configure Clone First Hook for a High Privileged User

    #NOTE: Ensure the below environment variables will be set up correctly by the shell. If not, hardcode or generate the values below.
    CONTEXT_NAME=${ORACLE_SID}_$(hostname -s)
    APPS_PASSWD=$(cat /var/tmp/${ORACLE_SID}_source_apps_file.txt)
       
    . ${ORACLE_HOME}/${CONTEXT_NAME}.env
       
    sqlplus "/ as sysdba" <<EOF
    @${ORACLE_HOME}/appsutil/install/${CONTEXT_NAME}/adupdlib.sql so
    EOF
       
    perl ${ORACLE_HOME}/appsutil/clone/bin/adcfgclone.pl dbconfig ${ORACLE_HOME}/appsutil/${CONTEXT_NAME}.xml <<EOF
    ${APPS_PASSWD}
    EOF

    Configure Clone First Hook for a 19c Multi-Tenant High Privileged User

    # NOTE: Ensure the below environment variables will be set up correctly by the
    # shell. If not, hardcode or generate the values below.
    CONTEXT_NAME=${DELPHIX_PDB_NAME}_$(hostname -s)
    APPS_PASSWD=$(cat /var/tmp/${ORACLE_SID}_source_apps_file.txt)
    . ${ORACLE_HOME}/${ORACLE_SID}_$(hostname -s).env
    # Check for local_listener parameter is set for PDB, otherwise set it appropriately
    check_value=$(sqlplus -s "/ as sysdba" <<EOF
    alter session set container="${DELPHIX_PDB_NAME}";
    show parameter local_listener;
    EOF
    )
    local_listener=$(echo $check_value | awk '{print $11}')
    value=(${local_listener//:/ })
    host=$(echo ${value[0]})
    port=$(echo ${value[1]})
    curr_port=$(cat ${ORACLE_HOME}/network/admin/listener.ora | grep PORT | awk '{print $9}' | sed 's/)//g')
    if [[ $port != $curr_port || $host != `hostname -s` ]]; then
     sqlplus -s "/ as sysdba" <<EOF
     alter session set container="${DELPHIX_PDB_NAME}";
     alter system set local_listener='`hostname -s`:${curr_port}';
     alter system register;
    EOF
    fi
    sqlplus "/ as sysdba" <<EOF
    @${ORACLE_HOME}/appsutil/install/${CONTEXT_NAME}/adupdlib.sql so
    EOF
    . ${ORACLE_HOME}/${CONTEXT_NAME}.env
    perl ${ORACLE_HOME}/appsutil/clone/bin/adcfgclone.pl dbconfig ${ORACLE_HOME}/appsutil/${CONTEXT_NAME}.xml <<EOF # noqa
    ${APPS_PASSWD}
    EOF
  9. Configure Clone hook to ensure that adcfgclone is run against the newly provisioned database for a low privileged user, as shown in the script below.


    Customers have to identify the DLPX_DB_EXEC_SCRIPT value from their remote environment, this would always be inside the toolkit directory provided while adding the environment on Delphix Engine.

    Configure Clone First Hook for a Low Privileged User

    # NOTE: Ensure the below environment variables will be set up correctly by the shell. If not, hardcode or generate the values below.
     
    DLPX_DB_EXEC_SCRIPT=<Remote BIN location for dlpx_db_exec script>
    DLPX_PRIV_USER=oravis
    APPS_PASSWD=$(cat /var/tmp/${ORACLE_SID}_source_apps_file.txt)
    CONTEXT_NAME=${ORACLE_SID}_$(hostname -s)
     
    "${DLPX_DB_EXEC_SCRIPT}" -u"${DLPX_PRIV_USER}" ". ${ORACLE_HOME}/${CONTEXT_NAME}.env; sqlplus \”/ as sysdba\” <<-EOF
    @${ORACLE_HOME}/appsutil/install/${CONTEXT_NAME}/adupdlib.sql so
    EOF
    "
     
    "${DLPX_DB_EXEC_SCRIPT}" -u"${DLPX_PRIV_USER}" ". ${ORACLE_HOME}/${CONTEXT_NAME}.env; perl ${ORACLE_HOME}/appsutil/clone/bin/adcfgclone.pl dbconfig ${ORACLE_HOME}/appsutil/${CONTEXT_NAME}.xml <<-EOF1
    ${APPS_PASSWD}
    EOF1
    "

    When prompted, if your environment is on R12.TXK.C.Delta.13 or later, enter the password for the EBS_SYSTEM user, if your environment is on R12.TXK.C.Delta.12 or earlier, enter the password for the SYSTEM user, or if your source EBS setup is running on AD-TXK Delta 13 then you need to supply the EBS_SYSTEM schema password in the below second hook script.
    This requirement is outlined in the FAQ: Oracle E-Business Suite and System Schema Migration (DocID 2758999.1) Using UTL_FILE_DIR or Database Directories for PL/SQL File I/O in Oracle E-Business Suite Releases 12.1 and 12.2 (DocID 2525754.1) found at http://docs.oracle.com.

    Configure Clone First Hook for a 19c Multi-Tenant Low Privileged User

    # NOTE: Ensure the below environment variables will be set up correctly by the shell. If not, hardcode or generate the values below.
    DLPX_DB_EXEC_SCRIPT=<Remote BIN location till dlpx_db_exec script>
    DLPX_PRIV_USER=oravis
    APPS_PASSWD=$(cat /var/tmp/${ORACLE_SID}_source_apps_file.txt)
    CONTEXT_NAME=${DELPHIX_PDB_NAME}_$(hostname -s)
    
    "${DLPX_DB_EXEC_SCRIPT}" -u"${DLPX_PRIV_USER}" ". ${ORACLE_HOME}/${ORACLE_SID}_$(hostname -s).env;"
    
    # Check for local_listener parameter is set for PDB, otherwise set it appropriately
    check_value=$("${DLPX_DB_EXEC_SCRIPT}" -u"${DLPX_PRIV_USER}" ". ${ORACLE_HOME}/${CONTEXT_NAME}.env; sqlplus -s \"/ as sysdba\" <<-EOF
    alter session set container="${DELPHIX_PDB_NAME}";
    show parameter local_listener;
    EOF
    ")
    
    local_listener=$(echo $check_value | awk '{print $11}')
    value=(${local_listener//:/ })
    host=$(echo ${value[0]})
    port=$(echo ${value[1]})
    
    curr_port=$(cat ${ORACLE_HOME}/network/admin/listener.ora | grep PORT | awk '{print $9}' | sed 's/)//g')
    
    if [[ $port != $curr_port || $host != `hostname -s` ]]; then
    	"${DLPX_DB_EXEC_SCRIPT}" -u"${DLPX_PRIV_USER}" ". ${ORACLE_HOME}/${ORACLE_SID}_$(hostname -s).env; sqlplus -s \"/ as sysdba\" <<EOF
    	alter session set container="${DELPHIX_PDB_NAME}";
    	alter system set local_listener='`hostname -s`:${curr_port}';
    	alter system register;
    EOF
    "
    fi
    "${DLPX_DB_EXEC_SCRIPT}" -u"${DLPX_PRIV_USER}" ". ${ORACLE_HOME}/${ORACLE_SID}_$(hostname -s).env; sqlplus \"/ as sysdba\" <<-EOF
    @${ORACLE_HOME}/appsutil/install/${CONTEXT_NAME}/adupdlib.sql so
    EOF
    "
    "${DLPX_DB_EXEC_SCRIPT}" -u"${DLPX_PRIV_USER}" ". ${ORACLE_HOME}/${CONTEXT_NAME}.env; perl ${ORACLE_HOME}/appsutil/clone/bin/adcfgclone.pl dbconfig ${ORACLE_HOME}/appsutil/${CONTEXT_NAME}.xml <<-EOF1
    ${APPS_PASSWD}
    EOF1
    " 
  10. If the EBS database is Oracle 12.1 or above, add a Run Bash Shell Command operation to the Configure Clone hook to ensure that sqlnet.ora or sqlnet_ifile.ora specify a value for SQLNET.ALLOWED_LOGON_VERSION_SERVERfor a high privileged user, as shown in the script below.
    This requirement is outlined in Cloning Oracle E-Business Suite Release 12.2 with Rapid Clone (Doc ID 1383621.1) found at http://docs.oracle.com.

    Configure Clone Second Hook for a High Privileged User

    #NOTE: Ensure the below environment variables will be set up correctly by the shell. If not, hardcode or generate the values below.
    #If you are using sqlnet_ifile.ora, change the script below to reflect sqlnet_ifile.ora
    
    CONTEXT_NAME=${ORACLE_SID}_$(hostname -s)
    TNS_ADMIN=${ORACLE_HOME}/network/admin/${CONTEXT_NAME}
    check_value=$(sqlplus -s "/ as sysdba" <<EOF
    set head off termout off feedback off wrap off
    select DISPLAY_VALUE from v\\$parameter where NAME='sec_case_sensitive_logon';
    EOF
    )
         
    if [[ ${check_value} -eq "FALSE" ]]; then
        sed -i '$ i\SQLNET.ALLOWED_LOGON_VERSION_SERVER = 8' ${TNS_ADMIN}/sqlnet.ora
    elif [[ ${check_value} -eq "TRUE" ]]; then
        sed -i '$ i\SQLNET.ALLOWED_LOGON_VERSION_SERVER = 10' ${TNS_ADMIN}/sqlnet.ora
    else
        echo "sec_case_sensitive_logon parameter is not set in the database. So the sqlnet.ora has not been updated."
    fi

    When prompted, if your environment is on R12.TXK.C.Delta.13 or later, enter the password for the EBS_SYSTEM user, if your environment is on R12.TXK.C.Delta.12 or earlier, enter the password for the SYSTEM user, or if your source EBS setup is running on AD-TXK Delta 13 then you need to supply the EBS_SYSTEM schema password in the below second hook script.
    This requirement is outlined in the FAQ: Oracle E-Business Suite and System Schema Migration (DocID 2758999.1) Using UTL_FILE_DIR or Database Directories for PL/SQL File I/O in Oracle E-Business Suite Releases 12.1 and 12.2 (DocID 2525754.1) found at http://docs.oracle.com.

    Configure Clone Second Hook for a 19c Multi-Tenant High Privileged User

    #Set the target UTL_FILE_DIR values in the Oracle 19c database in the below variable UTL_FILE_DIR_PATH separated by commas
    #Example UTL_FILE_DIR_PATH=/u01/oracle/VIS/temp/VISPDB,/u01/oracle/VIS/19.3.0/appsutil/outbound/UTL,/u01/tmp
    
    #UTL_FILE_DIR_PATH=<provide utl_file_dir locations separated by commas>
    DLPX_HOSTNAME=$(hostname -s)
    TIMESTAMP=$(date +%d-%m-%Y_%H-%M-%S)
    CONTEXT_NAME=${DELPHIX_PDB_NAME}_${DLPX_HOSTNAME}
    APPS_PASSWD=$(cat /var/tmp/${ORACLE_SID}_source_apps_file.txt)
    SYSTEM_PASSWD=manager
    DIR_OBJ_PATH="${ORACLE_HOME}/appsutil/outbound/${DELPHIX_PDB_NAME}_${DLPX_HOSTNAME}"
    checkExists() {
    if [[ ! -f $1 ]]; then
    	echo "$1 does not exist."
    	exit 1
    fi
    }
    checkExists "${ORACLE_HOME}/${CONTEXT_NAME}.env"
    checkExists "${ORACLE_HOME}/appsutil/bin/txkCfgUtlfileDir.pl"
    . ${ORACLE_HOME}/${CONTEXT_NAME}.env
    echo ${APPS_PASSWD} | perl ${ORACLE_HOME}/appsutil/bin/txkCfgUtlfileDir.pl -contextfile=${ORACLE_HOME}/appsutil/${DELPHIX_PDB_NAME}_${DLPX_HOSTNAME}.xml -oraclehome=${ORACLE_HOME} -outdir=${ORACLE_HOME}/appsutil/log -mode=getUtlFileDir
    checkExists "${ORACLE_HOME}/dbs/${DELPHIX_PDB_NAME}_utlfiledir.txt"
    cp "${ORACLE_HOME}/dbs/${DELPHIX_PDB_NAME}_utlfiledir.txt" "${ORACLE_HOME}/dbs/${DELPHIX_PDB_NAME}_utlfiledir.txt${TIMESTAMP}"
    cat /dev/null > "${ORACLE_HOME}/dbs/${DELPHIX_PDB_NAME}_utlfiledir.txt"
    if [ -z "$UTL_FILE_DIR_PATH" ]; then
    	mkdir -p "${ORACLE_HOME}/appsutil/outbound/${DELPHIX_PDB_NAME}_${DLPX_HOSTNAME}"
        echo "${ORACLE_HOME}/appsutil/outbound/${DELPHIX_PDB_NAME}_${DLPX_HOSTNAME}" > "${ORACLE_HOME}/dbs/${DELPHIX_PDB_NAME}_utlfiledir.txt"
        mkdir -p "${ORACLE_BASE}/temp/${DELPHIX_PDB_NAME}"
        echo "${ORACLE_BASE}/temp/${DELPHIX_PDB_NAME}" >> "${ORACLE_HOME}/dbs/${DELPHIX_PDB_NAME}_utlfiledir.txt"
    else
    	echo $UTL_FILE_DIR_PATH | awk -F, '{ for (i = 1; i < NF+1; ++i ) print $i >> "${ORACLE_HOME}/dbs/${DELPHIX_PDB_NAME}_utlfiledir.txt" }'
    fi
    { echo ${APPS_PASSWD}; echo ${SYSTEM_PASSWD}; } | perl ${ORACLE_HOME}/appsutil/bin/txkCfgUtlfileDir.pl -contextfile=${ORACLE_HOME}/appsutil/${DELPHIX_PDB_NAME}_${DLPX_HOSTNAME}.xml -oraclehome=${ORACLE_HOME} -outdir=${ORACLE_HOME}/appsutil/log -mode=setUtlFileDir
    { echo ${APPS_PASSWD}; echo ${SYSTEM_PASSWD}; echo ${DIR_OBJ_PATH}; } | perl ${ORACLE_HOME}/appsutil/bin/txkCfgUtlfileDir.pl -contextfile=${ORACLE_HOME}/appsutil/${DELPHIX_PDB_NAME}_${DLPX_HOSTNAME}.xml -oraclehome=${ORACLE_HOME} -outdir=${ORACLE_HOME}/appsutil/log -mode=createDirObject
    echo ${APPS_PASSWD} | perl ${ORACLE_HOME}/appsutil/bin/txkCfgUtlfileDir.pl -contextfile=${ORACLE_HOME}/appsutil/${DELPHIX_PDB_NAME}_${DLPX_HOSTNAME}.xml -oraclehome=${ORACLE_HOME} -outdir=${ORACLE_HOME}/appsutil/log -mode=syncUtlFileDir -skipautoconfig=yes
  11. Configure Clone hook to ensure that sqlnet.ora or sqlnet_ifile.ora specify a value for SQLNET.ALLOWED_LOGON_VERSION_SERVER for a low privileged user, as shown in the script below.

    Configure Clone Second Hook for a Low Privileged User

    # NOTE: Ensure the below environment variables will be set up correctly by the shell. If not, hardcode or generate the values below.
    # If you are using sqlnet_ifile.ora, change the script below to reflect sqlnet_ifile.ora
    DLPX_DB_EXEC_SCRIPT=<Remote BIN location for dlpx_db_exec script>
    DLPX_PRIV_USER=oravis
    CONTEXT_NAME=${ORACLE_SID}_$(hostname -s)
    TNS_ADMIN=${ORACLE_HOME}/network/admin/${CONTEXT_NAME}
     
    check_value=$("${DLPX_DB_EXEC_SCRIPT}" -u"${DLPX_PRIV_USER}" ". ${ORACLE_HOME}/${CONTEXT_NAME}.env; sqlplus \"/ as sysdba\" <<-EOF
    set head off termout off feedback off wrap off
    select DISPLAY_VALUE from v\\$parameter where NAME='sec_case_sensitive_logon';
    EOF
    ")
         
    if [[ ${check_value} -eq "FALSE" ]]; then
        "${DLPX_DB_EXEC_SCRIPT}" -u"${DLPX_PRIV_USER}" "sed -i ‘$ i\SQLNET.ALLOWED_LOGON_VERSION_SERVER = 8' ${TNS_ADMIN}/sqlnet.ora"
    elif [[ ${check_value} -eq "TRUE" ]]; then
        "${DLPX_DB_EXEC_SCRIPT}" -u"${DLPX_PRIV_USER}" "sed -i '$ i\SQLNET.ALLOWED_LOGON_VERSION_SERVER = 10' ${TNS_ADMIN}/sqlnet.ora"
    else
        echo "sec_case_sensitive_logon parameter is not set in the database. So the sqlnet.ora has not been updated."
    fi

    Configure Clone Second Hook for a 19c Multi-Tenant Low Privileged User

    #Set the target UTL_FILE_DIR values in the Oracle 19c database
    #Example UTL_FILE_DIR_PATH=/u01/oracle/VIS/temp/VISPDB,/u01/oracle/VIS/19.3.0/appsutil/outbound/UTL
    
    #UTL_FILE_DIR_PATH=<provide utl_file_dir locations separated by commas>
    SYSTEM_PASSWD=<Password of system DB user>
    DLPX_DB_EXEC_SCRIPT=<Remote BIN location till dlpx_db_exec script>
    DLPX_PRIV_USER=oravis
    APPS_PASSWD=$(cat /var/tmp/${ORACLE_SID}_source_apps_file.txt)
    CONTEXT_NAME=${DELPHIX_PDB_NAME}_$(hostname -s)
    DLPX_HOSTNAME=$(hostname -s)
    DIR_OBJ_PATH="${ORACLE_HOME}/appsutil/outbound/${CONTEXT_NAME}"
    TIMESTAMP=$(date +%d-%m-%Y_%H-%M-%S)
    checkExists() {
    if [[ ! -f $1 ]]; then
    	echo "$1 does not exist." 
    	exit 1
    fi
    }
    checkExists "${ORACLE_HOME}/${CONTEXT_NAME}.env"
    checkExists "${ORACLE_HOME}/appsutil/bin/txkCfgUtlfileDir.pl"
    . ${ORACLE_HOME}/${CONTEXT_NAME}.env
    
    "${DLPX_DB_EXEC_SCRIPT}" -u"${DLPX_PRIV_USER}" ". ${ORACLE_HOME}/${CONTEXT_NAME}.env; perl ${ORACLE_HOME}/appsutil/bin/txkCfgUtlfileDir.pl -contextfile=${ORACLE_HOME}/appsutil/${CONTEXT_NAME}.xml -oraclehome=${ORACLE_HOME} -outdir=${ORACLE_HOME}/appsutil/log -mode=getUtlFileDir <<-EOF
    ${APPS_PASSWD}
    EOF
    "
    
    checkExists "${ORACLE_HOME}/dbs/${DELPHIX_PDB_NAME}_utlfiledir.txt"
    "${DLPX_DB_EXEC_SCRIPT}" -u"${DLPX_PRIV_USER}" "cp ${ORACLE_HOME}/dbs/${DELPHIX_PDB_NAME}_utlfiledir.txt" "${ORACLE_HOME}/dbs/${DELPHIX_PDB_NAME}_utlfiledir.txt${TIMESTAMP}"
    "${DLPX_DB_EXEC_SCRIPT}" -u"${DLPX_PRIV_USER}" "echo ""  > \"${ORACLE_HOME}/dbs/${DELPHIX_PDB_NAME}_utlfiledir.txt\""
    
    if [ -z "$UTL_FILE_DIR_PATH" ]; then
    	"${DLPX_DB_EXEC_SCRIPT}" -u"${DLPX_PRIV_USER}" "mkdir -p ${ORACLE_HOME}/appsutil/outbound/${CONTEXT_NAME}"
    	"${DLPX_DB_EXEC_SCRIPT}" -u"${DLPX_PRIV_USER}" "echo "${ORACLE_HOME}/appsutil/outbound/${CONTEXT_NAME}" > "${ORACLE_HOME}/dbs/${DELPHIX_PDB_NAME}_utlfiledir.txt""
    	"${DLPX_DB_EXEC_SCRIPT}" -u"${DLPX_PRIV_USER}" "mkdir -p ${ORACLE_BASE}/temp/${DELPHIX_PDB_NAME}"
    	"${DLPX_DB_EXEC_SCRIPT}" -u"${DLPX_PRIV_USER}" "echo "${ORACLE_BASE}/temp/${DELPHIX_PDB_NAME}" >> "${ORACLE_HOME}/dbs/${DELPHIX_PDB_NAME}_utlfiledir.txt""
    else
    	"${DLPX_DB_EXEC_SCRIPT}" -u"${DLPX_PRIV_USER}" "echo $UTL_FILE_DIR_PATH | awk -F, '{ for (i = 1; i < NF+1; ++i ) print $i }' > "${ORACLE_HOME}/dbs/${DELPHIX_PDB_NAME}_utlfiledir.txt""
    fi
    
    "${DLPX_DB_EXEC_SCRIPT}" -u"${DLPX_PRIV_USER}" ". ${ORACLE_HOME}/${CONTEXT_NAME}.env; perl ${ORACLE_HOME}/appsutil/bin/txkCfgUtlfileDir.pl -contextfile=${ORACLE_HOME}/appsutil/${CONTEXT_NAME}.xml -oraclehome=${ORACLE_HOME} -outdir=${ORACLE_HOME}/appsutil/log -mode=setUtlFileDir <<-EOF1
    ${APPS_PASSWD}
    ${SYSTEM_PASSWD}
    EOF1
    "
    
    "${DLPX_DB_EXEC_SCRIPT}" -u"${DLPX_PRIV_USER}" ". ${ORACLE_HOME}/${CONTEXT_NAME}.env; perl ${ORACLE_HOME}/appsutil/bin/txkCfgUtlfileDir.pl -contextfile=${ORACLE_HOME}/appsutil/${CONTEXT_NAME}.xml -oraclehome=${ORACLE_HOME} -outdir=${ORACLE_HOME}/appsutil/log -mode=createDirObject <<-EOF2
    ${APPS_PASSWD}
    ${SYSTEM_PASSWD}
    ${DIR_OBJ_PATH}
    EOF2
    "
    
    "${DLPX_DB_EXEC_SCRIPT}" -u"${DLPX_PRIV_USER}" ". ${ORACLE_HOME}/${CONTEXT_NAME}.env; perl ${ORACLE_HOME}/appsutil/bin/txkCfgUtlfileDir.pl -contextfile=${ORACLE_HOME}/appsutil/${CONTEXT_NAME}.xml -oraclehome=${ORACLE_HOME} -outdir=${ORACLE_HOME}/appsutil/log -mode=syncUtlFileDir -skipautoconfig=yes <<-EOF3
    ${APPS_PASSWD}
    EOF3
    "
  12. Configure Clone hook to ensure that the ebs_<PDB_SID> listener services are not disappeared at the stop or start of the VDB, as shown in the script below.

    Configure Clone Hook for a 19c Multi-Tenant High Privileged and Low Privileged Users


    . ${ORACLE_HOME}/${ORACLE_SID}_$(hostname -s).env
    sqlplus "/ as sysdba" <<-EOF
    alter pluggable database ${DELPHIX_PDB_NAME} close;
    alter pluggable database ${DELPHIX_PDB_NAME} open read write services=all;
    alter pluggable database ${DELPHIX_PDB_NAME} save state;
    EOF
  13. Set up a Pre-Snapshot hook Run Bash Shell Command operation to run any pre-clone steps necessary and specific to your EBS database for a high privileged user, as shown in the script below.
     Normally, these steps will include running Oracle's adpreclone tool.

    Pre-Snapshot Hook for a High Privileged User

    #NOTE: Ensure the below environment variables will be set up correctly by the shell. If not, hardcode or generate the values below.
    
    CONTEXT_NAME=${ORACLE_SID}_$(hostname -s)
    SOURCE_APPS_PASSWD=$(cat /var/tmp/${ORACLE_SID}_source_apps_file.txt)
    TARGET_APPS_PASSWD=<new apps password of the target DB node>
      
    timeout=3600
    waittime=0
    . ${ORACLE_HOME}/${CONTEXT_NAME}.env
      
    testAppsPassword() {
        local passwordInQuestion=$1
        ERROR=`sqlplus "apps/${passwordInQuestion}" <<< "exit;"`
      
        grep ORA-01017 <<< ${ERROR} >/dev/null && return 1
        return 0
      
    }
      
    testAppsPassword ${SOURCE_APPS_PASSWD}
    testResult=$?
      
    if [[ ${testResult} == 0 ]]; then
        APPS_PASSWD=${SOURCE_APPS_PASSWD}
    else
        APPS_PASSWD=${TARGET_APPS_PASSWD}
    fi
      
    while [[ -f "${ORACLE_HOME}/.delphix_adpreclone.lck" || "$(ps -Ao args | grep "^${ORACLE_HOME}" | grep -v grep |  grep "adpreclone")" ]] ; do
    if [[ $waittime -gt $timeout  ]]; then
            echo "Another adpreclone process is still running from last 60 mins.Delphix cannot proceed until it is complete. Exiting Now."
            exit 1
        fi
        echo  " Another adpreclone process is running. waiting for the process to complete before starting adpreclone of the database...."
        (( timeout += 10 ))
        sleep 10
    done
    echo "No other adpreclone process is running on database, proceeding ...."
    ${ORACLE_HOME}/perl/bin/perl ${ORACLE_HOME}/appsutil/scripts/${CONTEXT_NAME}/adpreclone.pl database <<-EOF
    ${APPS_PASSWD}
    EOF

    Pre-Snapshot Hook for a 19c Multi-Tenant High Privileged User

    #NOTE: Ensure the below environment variables will be set up correctly by the shell. If not, hardcode or generate the values below.
    CONTEXT_NAME=${DELPHIX_PDB_NAME}_$(hostname -s)
    SOURCE_APPS_PASSWD=$(cat /var/tmp/${ORACLE_SID}_source_apps_file.txt)
    TARGET_APPS_PASSWD=<Target apps schema password>
     
    timeout=3600
    waittime=0
    . ${ORACLE_HOME}/${CONTEXT_NAME}.env
     
    testAppsPassword() {
     local passwordInQuestion=$1
     ERROR=`sqlplus "apps/${passwordInQuestion}@${DELPHIX_PDB_NAME}" <<< "exit;"`
     
     grep ORA-01017 <<< ${ERROR} >/dev/null && return 1
     return 0
     
    }
     
    testAppsPassword ${SOURCE_APPS_PASSWD}
    testResult=$?
     
    if [[ ${testResult} == 0 ]]; then
     APPS_PASSWD=${SOURCE_APPS_PASSWD}
    else
     APPS_PASSWD=${TARGET_APPS_PASSWD}
    fi
     
    while [[ -f "${ORACLE_HOME}/.delphix_adpreclone.lck" || "$(ps -Ao args | grep "^${ORACLE_HOME}" | grep -v grep | grep "adpreclone")" ]] ; do
    if [[ $waittime -gt $timeout ]]; then
     echo "Another adpreclone process is still running from last 60 mins.Delphix cannot proceed until it is complete. Exiting Now."
     exit 1
     fi
     echo " Another adpreclone process is running. waiting for the process to complete before starting adpreclone of the database...."
     (( timeout += 10 ))
     sleep 10
    done
    echo "No other adpreclone process is running on database, proceeding ...."
    ${ORACLE_HOME}/perl/bin/perl ${ORACLE_HOME}/appsutil/scripts/${CONTEXT_NAME}/adpreclone.pl database <<-EOF
    ${APPS_PASSWD}
    EOF
  14. Pre-Snapshot hook Run Bash Shell Command operation to run any pre-clone steps necessary and specific to your EBS database for a low privileged user, as shown in the script below.

    Pre-Snapshot Hook for a Low Privileged User

    # NOTE: Ensure the below environment variables will be set up correctly by the shell. If not, hardcode or generate the values below.
    DLPX_DB_EXEC_SCRIPT=<Remote BIN location for dlpx_db_exec script>
    DLPX_PRIV_USER=oravis
    CONTEXT_NAME=${ORACLE_SID}_$(hostname -s)
    SOURCE_APPS_PASSWD=$(cat /var/tmp/${ORACLE_SID}_source_apps_file.txt)
    TARGET_APPS_PASSWD=<Target apps schema password>
      
    timeout=3600
    waittime=0
     
    testAppsPassword() {
        local passwordInQuestion=$1
       ERROR=$("${DLPX_DB_EXEC_SCRIPT}" -u"${DLPX_PRIV_USER}" ". ${ORACLE_HOME}/${CONTEXT_NAME}.env; sqlplus apps/\"${passwordInQuestion}\" <<< \"exit;\"")
      
        grep ORA-01017 <<< ${ERROR} >/dev/null && return 1
        return 0
    }
     
    testAppsPassword ${SOURCE_APPS_PASSWD}
    testResult=$?
      
    if [[ ${testResult} == 0 ]]; then
        APPS_PASSWD=${SOURCE_APPS_PASSWD}
    else
        APPS_PASSWD=${TARGET_APPS_PASSWD}
    fi
     
    while [[ -f "${ORACLE_HOME}/.delphix_adpreclone.lck" || "$(ps -Ao args | grep "^${ORACLE_HOME}" | grep -v grep |  grep "adpreclone")" ]] ; do
    if [[ $waittime -gt $timeout  ]]; then
            echo "Another adpreclone process is still running from last 60 mins.Delphix cannot proceed until it is complete. Exiting Now."
            exit 1
        fi
        echo  " Another adpreclone process is running. waiting for the process to complete before starting adpreclone of the database...."
        (( timeout += 10 ))
        sleep 10
    done
    echo "No other adpreclone process is running on database, proceeding ...."
    "${DLPX_DB_EXEC_SCRIPT}" -u"${DLPX_PRIV_USER}" ". ${ORACLE_HOME}/${CONTEXT_NAME}.env; ${ORACLE_HOME}/perl/bin/perl ${ORACLE_HOME}/appsutil/scripts/${CONTEXT_NAME}/adpreclone.pl database <<-EOF
    ${APPS_PASSWD}
    EOF
    "

    ${ORACLE_SID}_source_apps_file.txt will be created automatically inside the /var/tmp/ location of the target database host once the DBTechStack provisioning is completed.

    Pre-Snapshot Hook for a 19c Multi-Tenant Low Privileged User

    # NOTE: Ensure the below environment variables will be set up correctly by the shell. If not, hardcode or generate the values below.
    DLPX_DB_EXEC_SCRIPT=<Remote BIN location till dlpx_db_exec script>
    DLPX_PRIV_USER=oravis
    CONTEXT_NAME=${DELPHIX_PDB_NAME}_$(hostname -s)
    SOURCE_APPS_PASSWD=$(cat /var/tmp/${ORACLE_SID}_source_apps_file.txt)
    TARGET_APPS_PASSWD=<target apps schema password>
    timeout=3600
    waittime=0
    . ${ORACLE_HOME}/${CONTEXT_NAME}.env
    testAppsPassword() {
     local passwordInQuestion=$1
     ERROR=$("${DLPX_DB_EXEC_SCRIPT}" -u"${DLPX_PRIV_USER}" ". ${ORACLE_HOME}/${CONTEXT_NAME}.env; sqlplus apps/\"${passwordInQuestion}\"@${DELPHIX_PDB_NAME} <<< \"exit;\"")
     
     grep ORA-01017 <<< ${ERROR} >/dev/null && return 1
     return 0
    }
    testAppsPassword ${SOURCE_APPS_PASSWD}
    testResult=$?
     
    if [[ ${testResult} == 0 ]]; then
     APPS_PASSWD=${SOURCE_APPS_PASSWD}
    else
     APPS_PASSWD=${TARGET_APPS_PASSWD}
    fi
    while [[ -f "${ORACLE_HOME}/.delphix_adpreclone.lck" || "$(ps -Ao args | grep "^${ORACLE_HOME}" | grep -v grep | grep "adpreclone")" ]] ; do
    if [[ $waittime -gt $timeout ]]; then
     echo "Another adpreclone process is still running from last 60 mins.Delphix cannot proceed until it is complete. Exiting Now."
     exit 1
     fi
     echo " Another adpreclone process is running. waiting for the process to complete before starting adpreclone of the database...."
     (( timeout += 10 ))
     sleep 10
    done
    echo "No other adpreclone process is running on database, proceeding ...."
    "${DLPX_DB_EXEC_SCRIPT}" -u"${DLPX_PRIV_USER}" ". ${ORACLE_HOME}/${CONTEXT_NAME}.env; ${ORACLE_HOME}/perl/bin/perl ${ORACLE_HOME}/appsutil/scripts/${CONTEXT_NAME}/adpreclone.pl database <<-EOF
    ${APPS_PASSWD}
    EOF
    "

Provisioning the EBS appsTier

  1. Login to the Delphix Management application using Admin credentials.

  2. Click Manage.
  3. Select Datasets.
  4. Select the appsTier dSource.
  5. Select a dSource snapshot.
    All snapshots will have staged configuration prepared by adpreclone.pl and any hook operations placed on the dSource.

  6. Click Provision.
    The Provision vFiles wizard will open.

  7. Select an Environment. 
    This environment will host the virtual appsTier and be used to execute hook operations specified in a few steps. This environment will also run the WebLogic Admin server (Web Administration service) for the virtual appsTier. 
    If you are provisioning a multi-node appsTier, you will be able to specify additional environments to host the virtual appsTier in a few steps.

  8. Select an Environment User.
    This user should be the applmgr user-outlined in Preparing Target EBS R12.2 Environments for Provisioning.

  9. Enter a Mount Path for the virtual appsTier files.
    If you are provisioning a multi-node appsTier, this mount path will be used across all target environments.

  10. Enter the  EBS-specific parameters for the virtual appsTier. A subset of these parameters are discussed in more detail below.

    1. Privileged OS Account (Optional) field should contain high privileged user when low privileged user is being used for provisioning.
    2. Ensure that the Target Application Hostname and Target DB Server Node values are the short hostnames, not the fully-qualified hostnames.

    3. The Target DB/PDB SID is the new database SID (PDB SID in case of 19c) that is required to configure and manage the virtual appsTier.
    4. The Target APPS Password is the new apps password that is required to configure and manage the virtual appsTier.
      This password is encrypted when stored within the Delphix Engine and is available as an environment variable to the adcfgcloneadstrtal, and adstpall processes.

    5. The SYSTEM Password is required to configure the virtual appsTier with the new apps password. This password is not required if the Target Apps Password is the same as the source.
    6. The Weblogic AdminServer Password is the new WebLogic password required to configure the virtual appsTier. A password change will be performed if this password does not match that of the source EBS instance. This password is encrypted when stored within the Delphix Engine and is available as an environment variable to the adcfgclone, adstrtal, and adstpall processes.

    7. The EBS AppsTier Timeout is required to terminate all the long-running appsTier processes which have exceeded the timeout value when stopping the applications as part of a refresh. This timeout will be calculated in minutes. For example, if set to 30, then we run adstpall at the start of the refresh, and if after 30 minutes the application has not stopped, then the processes will be terminated to allow the refresh to continue.
    8. The EBS AppsTier Provision/Refresh Timeout is required to terminate configure and cloning via adcfgclone process which have exceeded the timeout as part of a provision/refresh. This timeout will be calculated in hours and the default value will be 8 hours. For example, if set to 9, then plugin will detect a timeout after 9 hours instead of getting in a hung state and UI error for the same will be prompted.
    9. The Java Color Scheme is an optional parameter and is used to change the JAVA color for provisioned Oracle EBS JAVA based form interface. Please choose any of the following colors (Swan, Blue, Khaki, Olive, Purple, Red, Teal, Titanium) to set Java Color Scheme for EBS appsTier java-based forms interface.
    10. Enable the Cleanup Before Provision option if you want to permit the Delphix Engine to automatically cleanup stale EBS configuration during a refresh. This option is recommended, but only available if your Oracle Home is patched with Oracle Universal Installer (OUI) version 10.2 or above.

      1. With this option enabled, the Delphix Engine will inspect the target environment's oraInventory prior to refreshing this virtual appsTier. If any Oracle Homes are already registered within the specified Mount Path, the Delphix Engine will detach them from the inventory prior to running adcfgclone. These homes must be detached prior to running post-clone configuration. If they are not detached, adcfgclone will fail, citing conflicting oraInventory entries as an issue. The Delphix Engine will also remove any conflicting INST_TOP directories left on the environment. Non-conflicting INST_TOP directories will not be modified.

      2. Without this option enabled, Oracle Homes or INST_TOP directories that conflict with the specified Mount Path or desired INST_TOP location will be reported in errors instead of automatically cleaned up. For refresh to succeed, you must manually detach conflicting Oracle Homes and manually remove conflicting INST_TOP directories prior to refresh.

    11. Enable the Start Services After Provision option if you want to permit the Delphix Engine to automatically start the services for EBS appsTier after provisioning.
      1. With this option enabled, the Delphix Engine will start all the services of EBS appsTier after provisioning.
      2. Without this option enabled, the Delphix Engine will NOT start the services of EBS appsTier after provisioning. This will allow customers to prevent EBS services from being started at the conclusion of provisioning or refreshing. That way, customers can perform post-clone processing automation using a configure-clone hook without having to stop services first.
    12. Delphix recommends specifying an Instance Home Directory under the Mount Path so that instance-specific EBS files live on Delphix-provided storage.
      For example, if the provided Mount Path is /u01/oracle/VIS, then providing an Instance Home Directory of /u01/oracle/VIS would allow EBS to generate virtual application INST_TOP in /u01/oracle/VIS/fs1/inst/apps/<CONTEXT_NAME > and /u01/oracle/VIS/fs2/inst/apps/<CONTEXT_NAME >.

      1. If you are provisioning a single-node appsTier, this recommendation is OPTIONAL; putting instance-specific EBS files on Delphix-provided storage merely eases the administration of the virtual EBS instance.

      2. If you are provisioning a multi-node appsTier, this recommendation is REQUIRED; the Delphix Engine's automation requires that all nodes in the appsTier have access to instance-specific files via Delphix-provided storage.

    13. If you are provisioning a multi-node appsTier, enter additional appsTier nodes as Additional Nodes.

      1. The Environment User for each node should be the applmgr user-outlined in Preparing Target EBS R12.2 Environments for Provisioning.
      2. Ensure that the Hostname value for each node is the short hostname, not the fully-qualified hostname.  
      3. The Mount Path is not configurable for each node individually. The Mount Path provided for the primary environment will be used for each additional node.
  11. Click Next.

  12. Enter a vFiles Name.

  13. Select a Target Group for the vFiles.
    If necessary, click the Plus icon to add a new group.

  14. Select a Snapshot Policy for the vFiles.
    If necessary, click the Plus icon to create a new policy.

    When Snapshot is running against the dbTechStack, database, or appsTier, the Delphix Engine also executes pre-clone logic to ensure the latest configuration is staged in the captured snapshots. Unfortunately, if multiple Snapshots are running against the same EBS instance concurrently, this pre-clone logic may fail and produce bad snapshots.

    To avoid SnapSync conflicts, spread out your SnapSync policies for an EBS instance by one hour or more.

    Click Next.

  15. Enter any custom hook operations that are needed to help correctly manage the virtual appsTier. 
    The Configure Clone hook will be run after the  adcfgclone.pl  tool has both mounted and configured the appsTier.
    All hook operations run against the environment specified for provision. For a multi-node appsTier, hook operations never run against additional nodes specified.

  16. Add a Run Bash Shell Command operation to the Pre Refresh Clone hook to ensure that adcmctl is executed with "abort" option before refreshing the provisioned appsTier vFiles. This is an optional hook to be used on the sole discretion of the user (high privileged) who intend to terminate concurrent manager services. Currently, this is supported only for appsTier provision on single node environments. Typically, this operation will look similar to the script below:

    STOP_FILE=/var/tmp/<${ORACLE_SID}>_stop_file.txt
    ABORT_SCRIPT=<${INST_TOP}>/admin/scripts/adcmctl.sh
    
    if [[ ! -f ${STOP_FILE} && -f ${ABORT_SCRIPT} ]]; then
    APPL_TOP=/u01/oracle/VIS/apps/apps_st/appl
    INST_TOP=/u01/oracle/VIS/inst/apps/<${CONTEXT_NAME}>
    CONTEXT_NAME=${ORACLE_SID}_$(hostname -s)
    SOURCE_APPS_PASSWD=$(cat /var/tmp/<${ORACLE_SID}>_source_apps_file.txt)
    TARGET_APPS_PASSWD=<apps schema password of target host>
    
    . ${APPL_TOP}/APPS${CONTEXT_NAME}.env
    VISAppsPassword() {
      local passwordInQuestion=$1
      ERROR=`sqlplus "apps/${passwordInQuestion}" <<< "exit;"`
      grep ORA-01017 <<< ${ERROR} >/dev/null && return 1
      return 0
    }
    VISAppsPassword ${SOURCE_APPS_PASSWD}
    VISResult=$?
    if [[ ${VISResult} == 0 ]]; then
      APPS_PASSWD=${SOURCE_APPS_PASSWD}
    else
      APPS_PASSWD=${TARGET_APPS_PASSWD}
    fi
    sh ${ABORT_SCRIPT} abort apps/${APPS_PASSWD}
    fi

    The following assumptions have been made while creating the above hooks. Please modify the variables as per your environment.

    For example: Target System Base Directory is assumed to be “/u01/oracle/VIS”

  17. Click Next.
  18. Click Submit.

    dbTier Must Be Accessible During appsTier Provisioning

    Post-clone configuration will fail if the appsTier cannot connect to the database. Ensure the target dbTier is accessible to the appsTier during the provisioning process. Ensure both the virtual database and database listener are running.

    When provisioning starts, you can review the progress of the job in the Datasets panel, or in the Job History panel of the  Dashboard. When provisioning is complete, the appsTier vFiles will be included in the group you designated and listed in the Datasets panel. If you select the appsTier vFiles in the Datasets panel and click the Configuration tab, you can view information about the virtual files and its Data Management settings.

  19. For tips on monitoring the progress of appsTier provisioning, see Monitoring EBS R12.2 appsTier Provisioning Progress.

Once all three EBS virtual datasets have been provisioned successfully, your virtual EBS instance should be running and accessible.

Related Topics