OEM-Jobs von einem Host auf ein anderen Host verschieben mit emcli
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:
- oracle-base.com: EMCLI : Manage Jobs using Enterprise Manager Command Line Interface (Cloud Control): https://oracle-base.com/articles/misc/emcli-manage-jobs
- OEM Command Line Interface: https://docs.oracle.com/en/enterprise-manager/cloud-control/enterprise-ma
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: