OEM-Jobs von einem Host auf ein anderen Host verschieben mit emcli

5. April 2021 Aus Von Markus Flechtner

Ein Datenbank soll von einem Server auf einen anderen umziehen. Kein Problem. Allerdings gibt es für die Datenbank viele Host-Jobs im Enterprise Manager, die auf Shell-Skripten beruhen. Wie kann man diese Jobs einfach auf den neuen Server schieben?

 

Bei dieser Aufgabe hilft das Tools “emcli” (Enterprise Manager Command Line Interface), mit dem man – wie der Name schon sagt – viele OEM-Aktivitäten über die Kommandozeile erledigen kann.

Wenn emcli noch nicht installiert ist, dann hilft die Oracle-Dokumentation bei der Installation: https://docs.oracle.com/en/enterprise-manager/cloud-control/enterprise-manager-cloud-control/13.4/emcli/downloading-and-deploying-em-cli.html#GUID-17E6AC75-81A6-4FF8-B1C7-5682BFEC7B67

 

Schritt 1: Umgebung für den OMS setzen

Das tool emcli liegt im Middleware-Home des OMS, daher muss man erstmal die Umgebung (Pfade etc.) für dieses Home setzen.

oracle@kaki:~/ [oms13c] echo $ORACLE_HOME
/u00/app/oracle/product/oem13cr4/middleware

oracle@kaki:~/ [oms13c] which emcli
/u00/app/oracle/product/oem13cr4/middleware/bin/emcli

 

Schritt 2: Anmelden des emcli am OEM-Repository

Damit man mit emcli arbeiten kann, muss man sich am OEM-Repository anmelden und anschließend das emcli “synchronisieren”:

oracle@kaki:~/ [oms13c] emcli login -username=sysman
Enter password :

Login successful

oracle@kaki:~/ [oms13c] emcli sync
Synchronized successfully

 

Schritt 3: Liste der geplanten Jobs für einen Server anzeigen lassen

oracle@kaki:~/ [oms13c] emcli get_jobs -target="kaki.markusdba.local:host" -status_ids="1;"

Name     Type       Job ID                            Execution ID                      Scheduled            Completed  TZ Offset      Status     Status ID  Owner   Target Type  Target Name

TESTJOB  OSCommand  BF2D432F121E1E8DE0530801A8C049F6  BF2D432F12241E8DE0530801A8C049F6  2021-04-05 00:45:00  none       Europe/Berlin  Scheduled  1          SYSMAN  host         kaki.markusdba.local

Mit ‘-status_ids=”1;”‘ werden nur die geplanten Jobs auf dem Server angezeigt.

Im Folgenden sind die Jobnamen  wichtig.

 

Schritt 4: Job-Definitionen auslesen

Für jeden der in Schritt 3 angezeigten Jobs, die auf den neuen Server übernommen werden sollen, müssen die Job-Eigenschaften ausgelesen und in eine Datei geschrieben werden:

oracle@kaki:~/ [oms13c] emcli describe_job -name="TESTJOB" -owner="SYSMAN" >/home/oracle/testjob.txt

Das Ergebnis sieht dann so aus:

oracle@kaki:~/ [oms13c] cat /home/oracle/testjob.txt

# Current status of the job is ACTIVE.

name=TESTJOB
type=OSCommand
owner=SYSMAN
target_list=kaki.markusdba.local:host

#Number of targets : 1
# Credential Usage: defaultHostCred
# Description:

cred.defaultHostCred.<all_targets>:host=NAMED:SYSMAN:NC_HOST_ORACLE

# Description: (Optional) The complete command line, including parameters.

variable.default_shell_command=/home/oracle/oemjob.sh
schedule.frequency=REPEAT_BY_HOURS
schedule.startTime=2021-04-04 23:45:00
schedule.interval=1
schedule.timezone.region=Europe/Berlin

 

Schritt 5: Anpassen der Job-Definitionen

In die Job-Definitionen aus Schritt 4 müssen name und target_list angepasst werden.

In der Target-List muss der neue Server eingetragen werden.

Der Name des Jobs muss geändert werden, damit nicht beim Anlegen des neuen Jobs die Fehlermeldung (“Job XX already exists”) kommt. Wenn man den Namen nicht ändern möchte kann man den vorhandenen Job auch beenden und löschen:

oracle@kaki:~/ [oms13c] emcli stop_job -name="TESTJOB"
Job "TESTJOB" stopped successfully

oracle@kaki:~/ [oms13c] emcli delete_job -name="TESTJOB"
Job "TESTJOB" deleted successfully

Ergebnis (geänderte Job-Definition):

oracle@kaki:~/ [oms13c] cat /home/oracle/testjob.txt

# Current status of the job is ACTIVE.

name=TESTJOB2
type=OSCommand
owner=SYSMAN
target_list=kiwi.markusdba.local:host

#Number of targets : 1
# Credential Usage: defaultHostCred
# Description:

cred.defaultHostCred.<all_targets>:host=NAMED:SYSMAN:NC_HOST_ORACLE

# Description: (Optional) The complete command line, including parameters.

variable.default_shell_command=/home/oracle/oemjob.sh
schedule.frequency=REPEAT_BY_HOURS
schedule.startTime=2021-04-04 23:45:00
schedule.interval=1
schedule.timezone.region=Europe/Berlin

 

Schritt 6: neue Jobs anlegen

Durch Einlesen der geänderten Job-Definitionen werden die neuen Jobs angelegt:

oracle@kaki:~/ [oms13c] emcli create_job -input_file="property_file:/home/oracle/testjob.txt"
Creation of job "TESTJOB2" was successful.

 

Schritt 7: Kontrolle (Anzeige der geplanten Jobs auf dem neuen Server)

oracle@kaki:~/ [oms13c] emcli get_jobs -target="kiwi.markusdba.local:host" -status_ids="1;"

Name       Type       Job ID                            Execution ID                      Scheduled            Completed  TZ Offset      Status     Status ID  Owner   Target Type  Target Name
TESTJOB2  OSCommand  BF2D432F29431FC5E0530801A8C03FDB  BF2D432F29491FC5E0530801A8C03FDB  2021-04-05 00:45:00  none       Europe/Berlin  Scheduled  1          SYSMAN  host         kiwi.markusdba.local

 

Das Ganze kann man natürlich auch verskripten:

#!/bin/bash

# move_oem_jobs.sh
#
# move OEM jobs from one host to another
#
# Markus Flechtner / 18-APR-2021
#
# Note
# this is a simple script with no parameter checks and no error handling
# it worked fine in my lab, but please do not forget to test it in your environment
# before running it in a production enviromment

# Parameters
#1 = Source Host
#2 = Target Host
#3 = Directory for Job Definitions

export SRC_HOST=$1
export TRG_HOST=$2
export TRG_DIR=$3
mkdir -p ${TRG_DIR}


echo Login to OMS - Please enter the Password for SYSMAN
emcli login -username=sysman

echo Synchronizing
emcli sync

# moving all jobs
for JOB_NAME in `emcli get_jobs -target="${SRC_HOST}:host" -status_ids="1;" |grep -v "Execution ID" | awk '{print $1}'`; do
echo Jobname: ${JOB_NAME}
rm ${TRG_DIR}/${JOB_NAME}_*.txt

echo .. extracting Job-Definition to ${TRG_DIR}/${JOB_NAME}_old.txt
emcli describe_job -name="${JOB_NAME}" >${TRG_DIR}/${JOB_NAME}_old.txt
echo .. changing Host Name in Job Definition
echo .... new definition file is ${TRG_DIR}/${JOB_NAME}_new.txt
cat ${TRG_DIR}/${JOB_NAME}_old.txt | sed s/${SRC_HOST}/${TRG_HOST}/g >${TRG_DIR}/${JOB_NAME}_new.txt
echo .. stopping old job
emcli stop_job -name="${JOB_NAME}"
echo .. deleting old job
emcli delete_job -name="${JOB_NAME}"
echo .. creating new job
emcli create_job -input_file="property_file:${TRG_DIR}/${JOB_NAME}_new.txt"
echo .. checking job list
emcli get_job -name="${JOB_NAME}"
done

emcli logout

 

Weitere Informationen:

MOS-Notes:

  • EM 12c, 13c: How to Change Host Name in Enterprise Manager Jobs? (Doc ID 2444583.1)
  • EM 13c: How To Export And Import Target Related Jobs Saved in Job Library from one EM to another EM (Doc ID 2403936.1)
  • How to Move Jobs Between Two Different Enterprise Manager Cloud Control Systems (Doc ID 1637462.1)

 

Amazon-Partner-Link: