Marco Burmeister
private Homepage
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:
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:
Thema | Eigenschaft |
---|---|
Servername | cloud1.zuhause.de |
OS User DB | Datenbank: oracle |
OS User OEM/CC | Datenbank: oracc |
ORACLE_HOME | /oracle/u01/app/oracle/product/19.21.0.0.231121 |
Datenbank Version | 19.21 |
Datenbank-Typ | Non-CDB |
Datenbank Dateibehandlung | kein OMF |
Datenbank Größe | ca. 100 GB |
Datenbank Instanz-Name | CC1 |
Cloud Control Einstiegs-Verzeichnis | /oracle/u01/app/oracc/product |
Cloud Control Instanz Verzeichnis | gc_instance_13500 |
Cloud Control Middleware Verzeichnis | Middleware13500 |
Thema | Eigenschaft |
---|---|
Servername | cloud1.zuhause.de |
OS User DB | Datenbank: oracle |
OS User OEM/CC | Datenbank: oracc |
ORACLE_HOME | /oracle/u01/app/oracle/product/19.21.0.0.231121 |
Datenbank Version | 19.21 |
Datenbank-Typ | CDB |
Datenbank Dateibehandlung | OMF |
Datenbank Größe | ca. 120 GB |
Datenbank Instanz-Name | CC1 |
Pluggable Datenbankname | emrep1 |
Platz zum Zwischenspeichern | Wir 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 Verzeichnis | gc_instance_13500 |
Cloud Control Middleware Verzeichnis | Middleware13500 |
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.
oracc
ausführen emctl stop oms -all
und danach die Datenbank als OS User oracle
stoppenoracle
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
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
sys
.
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;
/
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.
impdp
.
sys
.
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$%';
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);
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
sys
an die Datenbankshutdown immediate
startup mount restrict
drop database
shutdown abort
DBCA
, um die neue Datenbank Instanz anzulegen.oracle
ausgeführt.CC1
und einer PDB emrep1
installiert sein.emrep1
und legen die o.a. Tablespaces mit den genannten Befehlen an.
"MGMT_TABLESPACE", "MGMT_AD4J_TS","MGMT_ECM_DEPOT_TS"
TNSNAMES.ORA
Eintrag vornehmen
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)
)
)
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='*';
sys
an die CDB Datenbank Instanzalter session set container = emrep1;
create directory ccexp as '/BACKUP/expoem';
grant read, write on directory ccexp to system;
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
.. DBMS_METADATA.GET_GRANTED_DDL ..
(siehe oben) - also
die generierte Spool-Datei ausführen, um eventuell fehlende Berechtigungen gegen das sys
-Schema zuzuweisen.
sys
an die Datenbank Instanz an und wechseln in die PDB:
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);
sys
as sysdba an der CDB Instanz an.utlrp
aus:
alter session set container = emrep1;
@?/rdbms/admin/utlrp
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';
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>
emctl stop oms -all
emctl start oms
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)))"
SYSMAN
notwendig.)
emctl config emrep -conn_desc "(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=cloud1.zuhause.de)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=emrep1.world)))"
sys
):
alter session set container = emrep1;
drop directory ccexp;
dbsnmp
im Root-Container muss ggfs. das richtige Passwort gegeben werden. repvfy
prüfen zu lassen.
EMDIAG REPVFY 13c, 12c Kit Download, Install/De-Install and Upgrade (Doc ID 1426973.1)
select comp_id, comp_name, version, status from dba_registry;
select owner, object_name, object_type, status from dba_objects where status != 'VALID';
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!
Marco Burmeister, Copyright © 2024 - 2024
zuletzt geändert: 2024-10-27
URL: https://www.marco-burmeister.de/oracle/de_oracle_cloud_control_multitenant_migration.html
Impressum