Marco Burmeister

  private Homepage



Oracle - Cloud Control / Enterprise Manager - Migration Multitenant der Repository Datenbank

Cloud Control bzw. auch unter dem Namen Enterprise Manager bekannt, ist ein Produkt von Oracle, um u.a. die Oracle Datenbanken zentral zu verwalten. Da mit Oracle 23 nun alle Datenbanken als Container-Datenbank (CDB) mit enthaltenen Pluggable Datenbanken (PDBs) angelegt werden müssen, stellt sich auch die Frage, was ich mit bestehenden Installationen vom Cloud Control selbst machen kann.
Auch hier müssen wir die die darunterliegende Repository-Datenbank in eine CDB mit PDB wandeln.
Alternativ könnte auch das vorhandene Cloud Control gelöscht und neu als CDB mit PDB installiert werden.
In diesem Dokument soll es darum gehen, wie ich eine bestehende Installation zu einer Multitenant Datenbank migrieren kann.
Komischerweise gibt es von Oracle hierzu keine fertige Dokumentation.

Hinweis:
Für die Richtigkeit der Daten übernehme ich keine Gewähr!

Die Seite ist in die folgenden Bereiche eingeteilt:




top Ausgangslage

Zunächst möchte ich beschreiben, wie die Umgebung aussieht / aussehen könnte, für die diese Anleitung die Migration beschreiben soll.
In dem Beispiel verbleibe ich auf dem gleichen Server und ersetze meine alte Repository-Datenbank Installation (Non-CDB) mit einer neuen Datenbank Instanz, die aus einer CDB mit einer PDB für das Cloud Control besteht.
Diese Anleitung kann aber auch verwendet werden, wenn der Server dabei gewechselt werden soll. Dann kann mancher Step zum Thema Backup entfallen.
Ausgangslage:

ThemaEigenschaft
Servernamecloud1.zuhause.de
OS User DBDatenbank: oracle
OS User OEM/CCDatenbank: oracc
ORACLE_HOME/oracle/u01/app/oracle/product/19.21.0.0.231121
Datenbank Version19.21
Datenbank-TypNon-CDB
Datenbank Dateibehandlungkein OMF
Datenbank Größeca. 100 GB
Datenbank Instanz-NameCC1
Cloud Control Einstiegs-Verzeichnis/oracle/u01/app/oracc/product
Cloud Control Instanz Verzeichnisgc_instance_13500
Cloud Control Middleware VerzeichnisMiddleware13500
Zielkonfiguration:
ThemaEigenschaft
Servernamecloud1.zuhause.de
OS User DBDatenbank: oracle
OS User OEM/CCDatenbank: oracc
ORACLE_HOME/oracle/u01/app/oracle/product/19.21.0.0.231121
Datenbank Version19.21
Datenbank-TypCDB
Datenbank DateibehandlungOMF
Datenbank Größeca. 120 GB
Datenbank Instanz-NameCC1
Pluggable Datenbanknameemrep1
Platz zum ZwischenspeichernWir brauchen für den Export der Original-Datenbank Plattenplatz und auch Platz für eine Sicherheitskopie vom Cloud Control selbst.
Die Befehle werden in der hier beschriebenen Dokumentation beschrieben.
Alternativ kann es eine Überlegung Wert sein, ob via Snapshot Technologie ein Backup vom Alt-System gemacht werden kann.

In diesem Beispiel haben wir unterhalb von /BACKUP genug Platz für unsere ganzen Backup-Dateien.
Die OS User oracle und oracc erhalten Zugriff auf dieses Verzeichnis.
Das muss aber im Vorwege getestet werden, ob in dem konkreten System genug Platz vorhanden ist, bevor mit der Migration gestartet wird!
Cloud Control Einstiegs-Verzeichnis/oracle/u01/app/oracc/product
Cloud Control Instanz Verzeichnisgc_instance_13500
Cloud Control Middleware VerzeichnisMiddleware13500

top Multitenant Migration

Vorbereitung:
Wir müssen zunächst Scripte erstellen, um die CDB aufbauen zu können. Ich habe hierzu das Tool DBCA verwendet und mir Scripte generieren lassen. Die Anlage der Datenbank führe ich erst durch, wenn die alte Datenbank gelöscht wurde.

Ferner müssen wir für die folgenden Datenbank Benutzer die Passworte kennen: sys,system,sysman,dbsnmp und müssen für die neue PDB einen Admin-Benutzer und ein Passwort festlegen.

Alte Datenbank vorbereiten:
In der alten Datenbanken muss vor der Migration noch ein wenig Berechtigungen vergeben werden:
--Datapump Export Fails with ORA-1950: "no privileges on tablespace" (Doc ID 1633698.1)
alter user SYSMAN quota unlimited on sysaux;
-- Fehlermeldung ORA-39181 bei SYSMAN Tabellen (einige)
grant EXEMPT ACCESS POLICY to system;

Ferner müssen wir uns ein Script generieren, welches die Tablespaces für die CDB Datenbank anlegen kann. Ich wollte in diesem Beispiel von NON-OMF zu OMF wechseln, weshalb wir hier die Befehle vor dem Import in der neuen CDB anwenden müssen. Damit alle Daten hineinpassen, müssen wir das aus dem Alt-System generieren und ablegen - noch nicht ausführen !
Beispiel:
CREATE SMALLFILE TABLESPACE "MGMT_TABLESPACE" DATAFILE SIZE 5500M AUTOEXTEND ON NEXT 500M MAXSIZE 32000M LOGGING EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;
alter tablespace "MGMT_TABLESPACE" ADD DATAFILE SIZE 5500M AUTOEXTEND ON NEXT 500M MAXSIZE 32000M;
alter tablespace "MGMT_TABLESPACE" ADD DATAFILE SIZE 5500M AUTOEXTEND ON NEXT 500M MAXSIZE 32000M;
alter tablespace "MGMT_TABLESPACE" ADD DATAFILE SIZE 5500M AUTOEXTEND ON NEXT 500M MAXSIZE 32000M;

CREATE SMALLFILE TABLESPACE "MGMT_AD4J_TS" DATAFILE SIZE 2048M AUTOEXTEND ON NEXT 51200K MAXSIZE 32767M LOGGING EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;

CREATE SMALLFILE TABLESPACE "MGMT_ECM_DEPOT_TS" DATAFILE SIZE 8720M AUTOEXTEND ON NEXT 20480K MAXSIZE 32767M LOGGING EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;

alter tablespace "SYSAUX" ADD DATAFILE SIZE 1500M AUTOEXTEND ON NEXT 500M MAXSIZE 32767M;


Datenbank Migration:
Die eigentliche Migration wollen wir nun beginnen.
Die Beschreibung erfolgt nun als Liste, da die Dinge nacheinander durchzuführen sind.

  1. Datenbank Backup durchführen
  2. Nun stoppen wir Cloud Control und danach die Datenbank.
    Als OS user oracc ausführen emctl stop oms -all und danach die Datenbank als OS User oracle stoppen
  3. Sicherung Einstellungen Oracle
    Ausführung als als OS User oracle
    mkdir /BACKUP/expoem_sicherung
    chown oracle:dba /BACKUP/expoem_sicherung

    tar -cvf /BACKUP/expoem_sicherung/dbs.tar $ORACLE_HOME/dbs
    tar -cvf /BACKUP/expoem_sicherung/network_admin.tar $ORACLE_HOME/network/admin
    tar -cvf /BACKUP/expoem_sicherung/oratab.tar /etc/oratab
  4. Datenbank Export ausführen
    Hierzu die Datenbank nochmals starten und danach als OS User oracle ausführen
    ( mit dem Passwort des Users ersetzen) :
    mkdir /BACKUP/dbexport
    chown oracle:dba /BACKUP/dbexport

    sqlplus / as sysdba
    drop directory ccexp ;
    create directory ccexp as '/BACKUP/dbexport';
    grant read, write on directory ccexp to system;
    exit;
    expdp system/<Passwort> full=Y directory=ccexp parallel=4 LOGTIME=ALL METRICS=Y dumpfile=oem_%U.dmp logfile=expdpoem.log
  5. Datenbank Berechtigungen auslesen
    Wir holen die Befehle für die Berechtigungen der Cloud Control Datenbank User auf Objekte des Datenbank-Users sys.
    Folgenden Befehl ausführen:
    
    set linesize 1000 pages 0 long 100000
    set serveroutput on
    BEGIN
      FOR ddluser IN (
        SELECT username FROM dba_users order by 1
        )
      LOOP
        DBMS_OUTPUT.put_line ( '--'||ddluser.username);
        DBMS_OUTPUT.put_line ( 'set long 100000 longchunksize 100000 pagesize 0 linesize 1000 feedback off verify off trimspool on');
        DBMS_OUTPUT.put_line ( 'SELECT DBMS_METADATA.GET_GRANTED_DDL(''ROLE_GRANT'', '''||ddluser.username||''') FROM dual;');
        DBMS_OUTPUT.put_line ( 'SELECT DBMS_METADATA.GET_GRANTED_DDL(''SYSTEM_GRANT'', '''||ddluser.username||''') FROM dual;');
        DBMS_OUTPUT.put_line ( 'SELECT DBMS_METADATA.GET_GRANTED_DDL(''OBJECT_GRANT'', '''||ddluser.username||''') FROM dual;');
       END LOOP;
    END;
    /
    				

    Dieser Befehl generiert zunächst nur Befehle für das Auslesen der Berechtigungen der Datenbank User.
    Beispiel für einen bestehenden Datenbank Benutzer:
    SELECT DBMS_METADATA.GET_GRANTED_DDL(''ROLE_GRANT'', 'SYSMAN') FROM dual;
    SELECT DBMS_METADATA.GET_GRANTED_DDL(''SYSTEM_GRANT'', 'SYSMAN') FROM dual;
    SELECT DBMS_METADATA.GET_GRANTED_DDL(''OBJECT_GRANT'', 'SYSMAN') FROM dual;
    Diese Befehle müssen dann ausgeführt und in einer Spool-Datei gesichert werden. Diese erzeugen die GRANT-Befehle, die wir später zur Sicherheit einspielen.

    Ausgeführt wird die Spool-/SQL-Datei dann nach der Ausführung von impdp.

    Zu beachten ist, dass die generierten Befehle kein korrektes Befehls-Ende Zeichen haben können und deshalb am Ende der Zeile ein Semikolon zu ergänzen ist, da sonst die Ausführung nicht erfolgreich sein wird.
  6. Datenbank Queue Startbefehle auslesen
    Wir holen die Befehle für das Starten der Queues der Cloud Control Datenbank als Datenbank User sys.
    Folgenden Befehl ausführen:
    set pages 100
    set heading off
    select 'exec dbms_aqadm.start_queue('''||owner||'.'||name||''',true,true);' from dba_queues where owner='SYSMAN' and name not like 'AQ$%';

    Beispiel-Ausgabe:
    exec dbms_aqadm.start_queue('SYSMAN.EM_PC_TP',true,true);
    exec dbms_aqadm.start_queue('SYSMAN.MGMT_TASK_Q',true,true);
    exec dbms_aqadm.start_queue('SYSMAN.MGMT_NOTIFY_Q',true,true);
    exec dbms_aqadm.start_queue('SYSMAN.EM_CNTR_QUEUE',true,true);
    exec dbms_aqadm.start_queue('SYSMAN.EM_SYSTEM_EVENT_Q',true,true);
    exec dbms_aqadm.start_queue('SYSMAN.MGMT_HOST_PING_Q',true,true);
    exec dbms_aqadm.start_queue('SYSMAN.EM_LOADERJOB_QUEUE',true,true);
    exec dbms_aqadm.start_queue('SYSMAN.MGMT_ADMINMSG_BUS',true,true);
    exec dbms_aqadm.start_queue('SYSMAN.EM_EVENT_BUS',true,true);
    exec dbms_aqadm.start_queue('SYSMAN.EM_NOTIFY_Q',true,true);
    exec dbms_aqadm.start_queue('SYSMAN.EM_GROUP_EVENT_Q',true,true);
    exec dbms_aqadm.start_queue('SYSMAN.EM_JOB_STATUS_UPD_Q',true,true);
    exec dbms_aqadm.start_queue('SYSMAN.MGMT_NOTIFY_INPUT_Q',true,true);
    exec dbms_aqadm.start_queue('SYSMAN.MGMT_LOADER_Q',true,true);

    Diese Ausgabe aufbewahren und nach der eigentlichen Migration der Datenbank ausführen. Ich werde unten darauf hinweisen.
  7. Nun sichern wir das Cloud Control selbst - idealerweise als OS User oracc
    cd /oracle/u01/app/oracc/product
    mkdir /BACKUP/cloudcontrol
    tar -cvzf /BACKUP/cloudcontrol/cloudcontrol_before_cdb_instance.tar.gz gc_instance_13500
    tar -cvzf /BACKUP/cloudcontrol/cloudcontrol_before_cdb_middleware.tar.gz Middleware13500
  8. Nun löschen wir die alte Datenbank
    1. Anmeldug als DB User sys an die Datenbank
    2. Stopppen der Datenbank
      shutdown immediate
    3. Datenbank im restricted Mode wieder starten:
      startup mount restrict
    4. Datenbank löschen
      drop database
    5. Sitzung beenden
      shutdown abort
  9. Anlage neue CDB Instanz.
    Wir nutzen nun unserer vorbereiteten Scripte aus dem DBCA, um die neue Datenbank Instanz anzulegen.
    Diese Scripte werden als OS User oracle ausgeführt.

    Diese müssen erfolgreich durchlaufen, bevor wir fortfahren können!
    Am Ende muss eine lauffähige CDB-Instanz mit dem Namen CC1 und einer PDB emrep1 installiert sein.
  10. Anlage Tablespaces für Cloud Control
    Nun wechseln wir in die PDB emrep1 und legen die o.a. Tablespaces mit den genannten Befehlen an.
    Tablespaces: "MGMT_TABLESPACE", "MGMT_AD4J_TS","MGMT_ECM_DEPOT_TS"
  11. TNSNAMES.ORA Eintrag vornehmen
    Wir melden uns als OS User oracle an und öffnen die tnsnames.ora (alternative Methoden analog pflegen)
    
    emrep1 =
      (DESCRIPTION = 
        (ADDRESS = (PROTOCOL = TCP)(HOST = cloud1.zuhause.de)(PORT = 1521))
          (CONNECT_DATA =
             (SERVER = DEDICATED)
             (SERVICE_NAME = emrep1.world)
          )
      )
    				
  12. Nach der Anlage der CDB sollten wir auch die Parameter so setzen, wie sie in den Oracle Anleitungen stehen: alter system set optimizer_adaptive_plans=FALSE scope=both;
    alter system reset "_optimizer_nlj_hj_adaptive_join" scope=both sid='*';
    alter system reset "_optimizer_strans_adaptive_pruning" scope=both sid='*';
    alter system reset "_px_adaptive_dist_method" scope=both sid='*';
    alter system reset "_sql_plan_directive_mgmt_control" scope=both sid='*';
    alter system reset "_optimizer_dsdir_usage_control" scope=both sid='*';
    alter system reset "_optimizer_use_feedback" scope=both sid='*';
    alter system reset "_optimizer_gather_feedback" scope=both sid='*';
    alter system reset "_optimizer_performance_feedback" scope=both sid='*';
  13. Import der Datenbank in die CDB starten
    1. Anmeldung als DB User sys an die CDB Datenbank Instanz
    2. Wir wechseln in die PDB
      alter session set container = emrep1;
    3. Nun legen wir uns ein Directory an
      create directory ccexp as '/BACKUP/expoem';
      grant read, write on directory ccexp to system;
    4. Nun führen wir den Import durch ( mit dem Passwort des Users ersetzen):
      impdp system/<Passwort>@emrep1 full=Y directory=ccexp LOGTIME=ALL METRICS=Y parallel=4 exclude=statistics dumpfile=oem_%U.dmp logfile=impdpoem.log
  14. Berechtigungen nachpflegen
    An dieser Stelle müssen wir die Ausgabe der Befehle .. DBMS_METADATA.GET_GRANTED_DDL .. (siehe oben) - also die generierte Spool-Datei ausführen, um eventuell fehlende Berechtigungen gegen das sys-Schema zuzuweisen.
  15. Datenbank Queues starten
    An dieser Stelle führen wir die Befehle zum Starten der Datenbank Queues aus.
    Hierzu melden wir uns als Datenbank User sys an die Datenbank Instanz an und wechseln in die PDB:
    Befehle:
    alter session set container = emrep1;
    exec dbms_aqadm.start_queue('SYSMAN.EM_PC_TP',true,true);
    exec dbms_aqadm.start_queue('SYSMAN.MGMT_TASK_Q',true,true);
    exec dbms_aqadm.start_queue('SYSMAN.MGMT_NOTIFY_Q',true,true);
    exec dbms_aqadm.start_queue('SYSMAN.EM_CNTR_QUEUE',true,true);
    exec dbms_aqadm.start_queue('SYSMAN.EM_SYSTEM_EVENT_Q',true,true);
    exec dbms_aqadm.start_queue('SYSMAN.MGMT_HOST_PING_Q',true,true);
    exec dbms_aqadm.start_queue('SYSMAN.EM_LOADERJOB_QUEUE',true,true);
    exec dbms_aqadm.start_queue('SYSMAN.MGMT_ADMINMSG_BUS',true,true);
    exec dbms_aqadm.start_queue('SYSMAN.EM_EVENT_BUS',true,true);
    exec dbms_aqadm.start_queue('SYSMAN.EM_NOTIFY_Q',true,true);
    exec dbms_aqadm.start_queue('SYSMAN.EM_GROUP_EVENT_Q',true,true);
    exec dbms_aqadm.start_queue('SYSMAN.EM_JOB_STATUS_UPD_Q',true,true);
    exec dbms_aqadm.start_queue('SYSMAN.MGMT_NOTIFY_INPUT_Q',true,true);
    exec dbms_aqadm.start_queue('SYSMAN.MGMT_LOADER_Q',true,true);
  16. Nun lassen wir alle Objekte generieren
    Wir melden uns als User sys as sysdba an der CDB Instanz an.
    Dann wechseln wir in die PDB und führen utlrp aus:
    alter session set container = emrep1;
    @?/rdbms/admin/utlrp
  17. Im nächsten Scritt prüfen wir, ob alle Objekte und Komponenten fehlerfrei sind.
    Dazu melden wir uns als höher privilegierter Datenbank Benutzer an die PDB emrep1 an und führen die folgenden Befehle aus:
    select comp_id, comp_name, version, status from dba_registry;
    select owner, object_name, object_type, status from dba_objects where status != 'VALID';


Cloud Control Umstellung:
Nachdem die Datenbank nun erfolgreich migriert wurde, müssen wir für das Cloud Control noch einige Dinge anpassen.
Das sind im Kern nun drei Haupt-Schritte:
  1. Cloud Control wird vorher nicht gestartet
  2. Nun aktualisieren wir den Connect-String der OMS Einstellung (wir brauchen das Passwort vom DB User sysman für den Befehl). Dabei wird auch implizit der AdminServer gestartet.
    emctl config oms -store_repos_details -repos_conndesc "(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=cloud1.zuhause.de)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=emrep1.world)))" -repos_user SYSMAN -repos_pwd <PW sysman>
  3. Nun müssen wir das Cloud Control durchstarten
    emctl stop oms -all
    emctl start oms
  4. Der nächste Schritt ist die Anpassung des Management Targets im Agenten.
    (Diesen Schritt habe ich nicht ausführen können / müssen)
    Befehl:
    emctl config repos -host oem1.ham.dlh.de -oh /oracle/u01/app/oracle/product/19.21.0.0.231121 -conn_desc "(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=cloud1.zuhause.de)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=emrep1.world)))"
  5. Der nächste Schritt passt die Management Konfiguration für das OMS / Repository Target an. (Passwort vom DB User SYSMAN notwendig.)
    Befehl:
    emctl config emrep -conn_desc "(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=cloud1.zuhause.de)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=emrep1.world)))"
  6. Nun starten wir den gesamten Stack durch. Also Cloud Control und Datenbank in der richtigen Reihenfolge neu starten.


Ergebnis:
Wir haben nun eine Cloud Control Installation, die als Repository Datenbank eine CDB Instanz mit einer eigenen PDB hat.


Nacharbeiten:
Nach der erfolgreichen Migration, muss dann u.a. folgendes geprüft werden, um sicherzugehen, dass alles wie gewünscht funktioniert:


top Links zum Thema


Hinweis:
Für die Richtigkeit der Daten übernehme ich keine Gewähr!
Für den Inhalt von Internet-Seiten, auf die von dieser Seite verwiesen wird, übernehme ich keine Verantwortung!