DBCA - Silent Database Creation unter 19c

07.
September
2021
Veröffentlicht von: Hans Wesnitzer

Sie wollten schon immer mal eine Oracle Datenbank ohne Zuhilfenahme der DBCA GUI erstellen. In diesem Artikel stelle ich Ihnen die Silent Database Creation Methode des DBCA unter 19c vor.

Bisher habe ich Single Instance Datenbanken immer mit Skripten erstellt, die auf den vom DBCA (Database Configuration Assistent) beim letzten Schritt generierbaren SQL-Skripten basierten. Und das finde ich auch weiterhin gut so. Viele benutzen einfach die GUI des DBCA.

Ein Vorteil von Skripten unter Linux ist die Unabhängigkeit von einem vorhandenen X-Server auf Seiten des Client-PCs. Bei unseren Kunden steht so etwas nämlich nicht immer zur Verfügung, also bleibe ich den Skripten treu. Ich persönlich verwende als X-Server immer Xming, ein frei verfügbares Produkt zur Installation unter Windows. Und bei einer Windows Installation spielt das Thema natürlich keine Rolle, da hier das Arbeiten mit grafischen Oberflächen zum Standard gehört.

Als Alternative zu den bisherigen Skripten wollte ich aber nun auch einmal die Erstellung von Datenbanken mittels der DBCA Silent Methode testen.

Was benötigt man dafür?

  • Ein Template, wobei man hierfür die vorhandenen DB-Templates verwenden kann, die unter $ORACLE_HOME/assistants/dbca/templates liegen:
    • New_Database.dbt
    • Data_Warehouse.dbc
    • General_Purpose.dbc
  • Ein Response-File, in dem u. a. die Antworten, die man auch in der GUI angibt, eingetragen werden.
  • Den DBCA, der einem beim Aufruf aber auch noch die Möglichkeit gibt, weitere Parameter dynamisch zu konfigurieren

Da ich keine Seed-Datenbank von Oracle als Vorgabe benutze, sondern eine ganz neue DB erstellen will, verwende ich das Template New_Database.dbt, ohne dass ich daran Änderungen vornehme.

Mein Response-File o19ct.rsp sieht zu Beginn so aus:

gdbName=o19ct
sid=o19ct
databaseConfigType=SINGLE
policyManaged=false
createAsContainerDatabase=false
templateName=/u01/app/oracle/product/19.0.0.0/dbhome_1/assistants/dbca/templates/New_Database.dbt
sysPassword=ChangeMe#99
systemPassword=ChangeMe#99
emConfiguration=NONE
runCVUChecks=false
dvConfiguration=false
olsConfiguration=false
storageType=FS
datafileDestination=/u02/oradata/{DB_UNIQUE_NAME}
recoveryAreaDestination=/u02/app/oracle/fast_recovery_area
recoveryAreaSize=10000
characterSet=AL32UTF8
nationalCharacterSet=AL16UTF16
registerWithDirService=false
variables=ORACLE_BASE_HOME=/u01/app/oracle/product/19.0.0.0/dbhome_1,ORACLE_BASE=/u01/app/oracle,ORACLE_HOME=/u01/app/oracle/product/19.0.0.0/dbhome_1
initParams=sga_target=1300MB,db_block_size=8KB,processes=1000,pga_aggregate_target=500MB,open_cursors=500,audit_trail=db,control_management_pack_access=NONE
sampleSchema=false
databaseType=MULTIPURPOSE
memoryMgmtType=AUTO_SGA
enableArchive=false
dbOptions=JSERVER:false,ORACLE_TEXT:false,IMEDIA:false,CWMLITE:false,SPATIAL:false,OMS:false,APEX:false,DV:false
useOMF=false

Wobei diese Parameter auch mittels Kommandozeilen-Parameter übergeben werden können.


Ich will nun

  • eine einfache non-CDB Single Instance Datenbank
    • databaseConfigType=SINGLE
    • createAsContainerDatabase=false
       
  • mit DB-Dateien in einem normalen Dateisystem
    • storageType=FS
    • datafileDestination=/u02/oradata/{DB_UNIQUE_NAME}
       
  • aber ohne OMF Dateinamen
    • useOMF=false
       
  • und ohne die im Standard mit installierten DB-Komponenten, wie z. B. JAVA Jserver oder Oracle Text
    • dbOptions=JSERVER:false,ORACLE_TEXT:false,IMEDIA:false,CWMLITE:false,SPATIAL:false,OMS:false,APEX:false,DV:false
       
  • mit folgendem Character Set
    • AL32UTF8
       
  • und ohne die kostenpflichtigen Oracle EM Management Packs zu aktivieren
    • initParams=...,control_management_pack_access=NONE

erstellen.


Der dazu notwendige Aufruf lautet (ausgeführt als Benutzer oracle mit gesetzter Oracle Umgebung in der Shell):

dbca -silent -createDatabase -responseFile $PWD/o19ct.rsp


Hier die entsprechende Ausgabe des DBCA-Aufrufs:

$ dbca -silent -createDatabase -responseFile $PWD/o19ct.rsp
Prepare for db operation
10% complete
Registering database with Oracle Restart
14% complete
Creating and starting Oracle instance
17% complete
18% complete
24% complete
Creating database files
25% complete
33% complete
Creating data dictionary views
36% complete
42% complete
43% complete
44% complete
45% complete
51% complete
54% complete
56% complete
62% complete
Completing Database Creation
68% complete
70% complete
71% complete
Executing Post Configuration Actions
100% complete
Database creation complete. For details check the logfiles at:
 /u01/app/oracle/cfgtoollogs/dbca/o19ct.
Database Information:
Global Database Name:o19ct
System Identifier(SID):o19ct
Look at the log file "/u01/app/oracle/cfgtoollogs/dbca/o19ct/o19ct.log" for further details.


Die damit erstellte Datenbank sieht nun folgendermaßen aus:

# DBA_REGISTRY

COMP_NAME                                VERSION         STATUS
---------------------------------------- --------------- -----------
Oracle Database Catalog Views            19.0.0.0.0      VALID
Oracle Database Packages and Types       19.0.0.0.0      VALID
Oracle Real Application Clusters         19.0.0.0.0      OPTION OFF
Oracle XML Database                      19.0.0.0.0      VALID
Oracle Workspace Manager                 19.0.0.0.0      VALID

5 rows selected.

# NLS_DATABASE_PARAMETERS

PARAMETER                                VALUE
---------------------------------------- ----------------------------------------
NLS_NCHAR_CHARACTERSET                   AL16UTF16
NLS_CHARACTERSET                         AL32UTF8

2 rows selected.

# V$PARAMETER (non default values)

NAME                           VALUE
------------------------------ --------------------------------------------------
audit_file_dest                /u01/app/oracle/admin/o19ct/adump
audit_trail                    DB
compatible                     19.0.0
control_management_pack_access NONE
db_block_size                  8192
db_name                        o19ct
db_recovery_file_dest          /u02/app/oracle/fast_recovery_area
db_recovery_file_dest_size     10485760000
diagnostic_dest                /u01/app/oracle
dispatchers                    (PROTOCOL=TCP) (SERVICE=o19ctXDB)
local_listener                 LISTENER_O19CT
nls_language                   AMERICAN
nls_territory                  AMERICA
open_cursors                   500
pga_aggregate_target           524288000
processes                      1000
remote_login_passwordfile      EXCLUSIVE
sga_target                     1375731712
undo_tablespace                UNDOTBS1

# DBA_DATA_FILES
 
TABLESPACE_NAME      FILE_NAME
-------------------- ----------------------------------
SYSAUX               /u02/oradata/O19CT/sysaux01.dbf
SYSTEM               /u02/oradata/O19CT/system01.dbf
UNDOTBS1             /u02/oradata/O19CT/undotbs01.dbf
USERS                /u02/oradata/O19CT/users01.dbf
TEMP                 /u02/oradata/O19CT/temp01.dbf

# V$LOGFILE

GROUP# MEMBER
------ --------------------------------
     1 /u02/oradata/O19CT/redo01.log
     2 /u02/oradata/O19CT/redo02.log
     3 /u02/oradata/O19CT/redo03.log

# V$CONTROLFILE

NAME
---------------------------------------------------------------------------
/u02/oradata/O19CT/controlfile/o1_mf_jm6kvbww_.ctl
/u02/app/oracle/fast_recovery_area/O19CT/controlfile/o1_mf_jm6kvc03_.ctl

# DBA_REGISTRY_SQLPATCH

ACTION STATUS  DESCRIPTION                                           TARGET_VERSION
------ ------- ----------------------------------------------------- -------------
APPLY  SUCCESS OJVM RELEASE UPDATE: 19.12.0.0.210720 (32876380)      19.1.0.0.0
APPLY  SUCCESS Database Release Update : 19.12.0.0.210720 (32904851) 19.12.0.0.0

Sieht doch eigentlich schon ganz gut aus.


Wobei das mit dem nur einer Redolog-Datei pro Redolog-Gruppe noch nicht ideal ist. Aber das lässt sich ja einfach lösen, indem man mittels SQL-Kommandos den Gruppen ein weiteres Mitglied zuweist, oder aber man passt das Response-File etwas an:

initParams=sga_target=1300MB,db_block_size=8192BYTES,processes=1000,pga_aggregate_target=500MB,open_cursors=500,audit_trail=db,control_management_pack_access=NONE,db_create_online_log_dest_1=/u02/oradata,db_create_online_log_dest_2=/u02/oradata


Oder

man ändert den DBCA Aufruf entsprechend:

dbca -silent -createDatabase -responseFile $PWD/o19ct.rsp -initParams db_create_online_log_dest_1=/u02/oradata,db_create_online_log_dest_2=/u02/oradata


Hinweis:
Übergabeparameter überschreiben oder ergänzen die Werte in der Response-Datei, welche wiederum die Werte im Template überschreiben.

Was ändert sich dadurch in der Datenbank:

CONTROL /u02/oradata/O19CT/controlfile/o1_mf_jm74fz6r_.ctl,
        /u02/oradata/O19CT/controlfile/o1_mf_jm74fz8r_.ctl

REDO    1:/u02/oradata/O19CT/onlinelog/o1_mf_1_jm74fzdh_.log
REDO    1:/u02/oradata/O19CT/onlinelog/o1_mf_1_jm74fzjs_.log
REDO    2:/u02/oradata/O19CT/onlinelog/o1_mf_2_jm74g061_.log
REDO    2:/u02/oradata/O19CT/onlinelog/o1_mf_2_jm74g1d6_.log
REDO    3:/u02/oradata/O19CT/onlinelog/o1_mf_3_jm74g2qq_.log
REDO    3:/u02/oradata/O19CT/onlinelog/o1_mf_3_jm74g4c1_.log

Die Control- und Redolog-Dateien werden nun plötzlich mit OMF Dateinamen erstellt, aber man hat zumindest nun pro Redolog-Gruppe je zwei Member. Die Datendateien werden weiterhin unverändert mit non-OMF Namen erstellt.


Wem das nicht gefällt kann natürlich auch das Template direkt ändern. Dazu einfach im Abschnitt RedoLogGroupAttributes eine weiteres Member eintragen:

<member ordinal="0" memberName="redo01a.log" filepath="..."/>
<member ordinal="1" memberName="redo01b.log" filepath="..."/>


Was ändert sich dadurch in der Datenbank:

CONTROL /u02/oradata/O19CT/control01.ctl,
        /u02/app/oracle/fast_recovery_area/O19CT/control02.ctl

REDO    1:/u02/oradata/O19CT/redo01a.log
REDO    1:/u02/oradata/O19CT/redo01b.log
REDO    2:/u02/oradata/O19CT/redo02a.log
REDO    2:/u02/oradata/O19CT/redo02b.log
REDO    3:/u02/oradata/O19CT/redo03a.log
REDO    3:/u02/oradata/O19CT/redo03b.log

Jetzt sieht es fast noch etwas besser aus.


Mittels der DBCA Übergabeparameter kann ich natürlich noch andere in der Response-Datei als Standard definierten Werte überschreiben. Im Folgenden ein paar einfache Beispiele:

a)    Installation von Java JServer in der Datenbank

dbca -silent -createDatabase -responseFile $PWD/o19ct.rsp -dbOptions JSERVER:true

# DBA_REGISTRY
COMP_NAME                                VERSION         STATUS
---------------------------------------- --------------- --------------------
Oracle Database Catalog Views            19.0.0.0.0      VALID
Oracle Database Packages and Types       19.0.0.0.0      VALID
Oracle Real Application Clusters         19.0.0.0.0      OPTION OFF
JServer JAVA Virtual Machine             19.0.0.0.0      VALID
Oracle XDK                               19.0.0.0.0      VALID
Oracle Database Java Packages            19.0.0.0.0      VALID
Oracle XML Database                      19.0.0.0.0      VALID
Oracle Workspace Manager                 19.0.0.0.0      VALID


b)    Datenbank mit Zeichensatz WE8MSWIN1252, anderer Blockgröße und anderen SGA-/PGA-Parametern

dbca -silent -createDatabase -responseFile $PWD/o19ct.rsp -initParams db_block_size=16KB,sga_target=12000MB,pga_aggregate_target=6000MB -characterSet WE8MSWIN1252

# NLS_DATABASE_PARAMETERS
PARAMETER                                VALUE
---------------------------------------- ----------------------------------------
NLS_NCHAR_CHARACTERSET                   AL16UTF16
NLS_CHARACTERSET                         WE8MSWIN1252

# V$PARAMETER

NAME                           VALUE
------------------------------ --------------------------------------------------
db_block_size                  16384
pga_aggregate_target           6291456000
sga_target                     12582912000

 

Fazit

Die Nutzung der DBCA SILENT Methode ist eine sehr einfache und wirklich praktikable Alternative zur Nutzung der vom DBCA generierten SQL-Skripte und wird deshalb auch von mir in Zukunft genutzt werden. Mit einem kleinen Script als Wrapper bietet es mir dann auch noch die Flexibilität, die ich bisher von unseren Create-DB Scripten gewohnt bin.
Aber unabhängig von der Art wie eine Oracle Datenbank erstellt wird, sollten im Anschluss daran immer noch Anpassungen an den Initialisierungsparametern, den Profilen und Accounts sowie an den SQLNET- und/oder Listener-Parametern durchgeführt werden.

Jede Menge Know-how für Sie!

In unserer Know-How Datenbank finden Sie mehr als 300 ausführliche Beiträge zu den Oracle-Themen wie DBA, SQL, PL/SQL, APEX und vielem mehr.
Hier erhalten Sie Antworten auf Ihre Fragen.