Oracle 12c: Create a Container Database manually

Oracle 12c: Create a Container Database (CDB) manually with CREATE DATABASE script

Note:
Oracle strongly recommends using the Database Configuration Assistant (DBCA) instead of the CREATE DATABASE SQL statement to create a CDB, because using DBCA is a more automated approach, and your CDB is ready to use when DBCA completes.

1. Setup Database environment
Set the ORACLE_SID and ORACLE_HOME environment variable and include the ORACLE_HOME/bin directory to the PATH variable.

export ORACLE_SID=newcdb
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/12.1.0/db_1
export PATH=$ORACLE_HOME/bin:$PATH

 

 

NOTE: You must choose a Database Administrator authentication method
– You must be authenticated and granted appropriate system privileges in order to create a database.
– You can be authenticated as an administrator with the required privileges in the following ways:
a. With a password file (sqlplus sys as sysdba)
Example: orapwd FILE=’/u01/app/oracle/product/12.1.0/db_1/dbs/orapwnewcdb’ ENTRIES=10 FORMAT=12

b. With operating system authentication (sqlplus / as sysdba)
Ensure that you log in to the host computer with a user account that is a member of the appropriate operating system user group (typically the dba user group).

 

2. Create the Initialization Parameter File
cd $ORACLE_HOME/dbs
vi initnewcdb.ora
cat initnewcdb.ora

sga_target=500M
pga_aggregate_target=260M
audit_file_dest="/u01/app/oracle/admin/newcdb/adump"
audit_trail=db
compatible=12.1.0.2.0
control_files=("/u01/app/oracle/oradata/newcdb/control01.ctl","/u01/app/oracle/fast_recovery_area/newcdb/control02.ctl")
db_block_size=8192
db_domain=localdomain
db_name="newcdb"
db_recovery_file_dest="/u01/app/oracle/fast_recovery_area"
db_recovery_file_dest_size=4560m
diagnostic_dest=/u01/app/oracle
dispatchers="(PROTOCOL=TCP) (SERVICE=newcdbXDB)"
enable_pluggable_database=true
open_cursors=300
processes=300
remote_login_passwordfile=EXCLUSIVE
undo_tablespace=UNDOTBS1

 

 

3. Create needed directories
CONTROL FILES:
mkdir -p /u01/app/oracle/oradata/newcdb
mkdir -p /u01/app/oracle/fast_recovery_area/newcdb
DATA FILES:
# mkdir -p /u01/app/oracle/oradata/newcdb
mkdir -p /u01/app/oracle/oradata/newcdb/pdbseed
REDO LOG FILES:
# mkdir -p /u01/app/oracle/oradata/newcdb
mkdir -p /u02/app/oracle/oradata/newcdb
ADUMP:
mkdir -p /u01/app/oracle/admin/newcdb/adump

 

 

4. Create Database script
To create a CDB, the ENABLE_PLUGGABLE_DATABASE initialization parameter must be set to TRUE.
Note: /home/oracle/bin exists in my environment
vi /home/oracle/bin/create_db_newcdb.sql

CREATE DATABASE newcdb
 USER SYS IDENTIFIED BY sys_password
 USER SYSTEM IDENTIFIED BY system_password
 LOGFILE GROUP 1 ('/u01/app/oracle/oradata/newcdb/redo01a.log','/u02/app/oracle/oradata/newcdb/redo01b.log')
 SIZE 100M BLOCKSIZE 512,
 GROUP 2 ('/u01/app/oracle/oradata/newcdb/redo02a.log','/u02/app/oracle/oradata/newcdb/redo02b.log')
 SIZE 100M BLOCKSIZE 512,
 GROUP 3 ('/u01/app/oracle/oradata/newcdb/redo03a.log','/u02/app/oracle/oradata/newcdb/redo03b.log')
 SIZE 100M BLOCKSIZE 512
 MAXLOGHISTORY 1
 MAXLOGFILES 16
 MAXLOGMEMBERS 3
 MAXDATAFILES 1024
 CHARACTER SET AL32UTF8
 NATIONAL CHARACTER SET AL16UTF16
 EXTENT MANAGEMENT LOCAL
 DATAFILE '/u01/app/oracle/oradata/newcdb/system01.dbf'
 SIZE 700M REUSE AUTOEXTEND ON NEXT 10240K MAXSIZE UNLIMITED
 SYSAUX DATAFILE '/u01/app/oracle/oradata/newcdb/sysaux01.dbf'
 SIZE 550M REUSE AUTOEXTEND ON NEXT 10240K MAXSIZE UNLIMITED
 DEFAULT TABLESPACE USERS
 DATAFILE '/u01/app/oracle/oradata/newcdb/users01.dbf'
 SIZE 500M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED
 DEFAULT TEMPORARY TABLESPACE TEMP
 TEMPFILE '/u01/app/oracle/oradata/newcdb/temp01.dbf'
 SIZE 20M REUSE AUTOEXTEND ON NEXT 640K MAXSIZE UNLIMITED
 UNDO TABLESPACE UNDOTBS1
 DATAFILE '/u01/app/oracle/oradata/newcdb/undotbs01.dbf'
 SIZE 200M REUSE AUTOEXTEND ON NEXT 5120K MAXSIZE UNLIMITED
 ENABLE PLUGGABLE DATABASE
 SEED
 FILE_NAME_CONVERT = ('/u01/app/oracle/oradata/newcdb/',
 '/u01/app/oracle/oradata/newcdb/pdbseed/')
 SYSTEM DATAFILES SIZE 125M AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED
 SYSAUX DATAFILES SIZE 100M
;

 

 

5. Login to the Database

$ sqlplus / as sysdba
SQL*Plus: Release 12.1.0.2.0 Production on Mon Oct 9 13:15:24 2017
Copyright (c) 1982, 2014, Oracle. All rights reserved.
Connected to an idle instance.
SQL>

6. Create a Server Parameter File

SQL> create spfile from pfile='/u01/app/oracle/product/12.1.0/db_1/dbs/initnewcdb.ora';
File created.

7. Start the Instance

SQL> startup nomount;
ORACLE instance started.
Total System Global Area 524288000 bytes
Fixed Size 2926320 bytes
Variable Size 268437776 bytes
Database Buffers 247463936 bytes
Redo Buffers 5459968 bytes
SQL>

 

 

8. Use the CREATE DATABASE statement to create the new CDB.

SQL> set echo on
SQL> set timing on
SQL> @/home/oracle/bin/create_db_newcdb.sql
SQL> CREATE DATABASE newcdb
 2 USER SYS IDENTIFIED BY oracle3
 3 USER SYSTEM IDENTIFIED BY oracle3
 4 LOGFILE GROUP 1 ('/u01/app/oracle/oradata/newcdb/redo01a.log','/u02/app/oracle/oradata/newcdb/redo01b.log')
 5 SIZE 100M BLOCKSIZE 512,
 6 GROUP 2 ('/u01/app/oracle/oradata/newcdb/redo02a.log','/u02/app/oracle/oradata/newcdb/redo02b.log')
 7 SIZE 100M BLOCKSIZE 512,
 8 GROUP 3 ('/u01/app/oracle/oradata/newcdb/redo03a.log','/u02/app/oracle/oradata/newcdb/redo03b.log')
 9 SIZE 100M BLOCKSIZE 512
 10 MAXLOGHISTORY 1
 11 MAXLOGFILES 16
 12 MAXLOGMEMBERS 3
 13 MAXDATAFILES 1024
 14 CHARACTER SET AL32UTF8
 15 NATIONAL CHARACTER SET AL16UTF16
 16 EXTENT MANAGEMENT LOCAL
 17 DATAFILE '/u01/app/oracle/oradata/newcdb/system01.dbf'
 18 SIZE 700M REUSE AUTOEXTEND ON NEXT 10240K MAXSIZE UNLIMITED
 19 SYSAUX DATAFILE '/u01/app/oracle/oradata/newcdb/sysaux01.dbf'
 20 SIZE 550M REUSE AUTOEXTEND ON NEXT 10240K MAXSIZE UNLIMITED
 21 DEFAULT TABLESPACE USERS
 22 DATAFILE '/u01/app/oracle/oradata/newcdb/users01.dbf'
 23 SIZE 500M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED
 24 DEFAULT TEMPORARY TABLESPACE TEMP
 25 TEMPFILE '/u01/app/oracle/oradata/newcdb/temp01.dbf'
 26 SIZE 20M REUSE AUTOEXTEND ON NEXT 640K MAXSIZE UNLIMITED
 27 UNDO TABLESPACE UNDOTBS1
 28 DATAFILE '/u01/app/oracle/oradata/newcdb/undotbs01.dbf'
 29 SIZE 200M REUSE AUTOEXTEND ON NEXT 5120K MAXSIZE UNLIMITED
 30 ENABLE PLUGGABLE DATABASE
 31 SEED
 32 FILE_NAME_CONVERT = ('/u01/app/oracle/oradata/newcdb/',
 33 '/u01/app/oracle/oradata/newcdb/pdbseed/')
 34 SYSTEM DATAFILES SIZE 125M AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED
 35 SYSAUX DATAFILES SIZE 100M
 36 ;
Database created.
Elapsed: 00:01:15.92

 

 

— Validate if the database created is a CDB

SQL> SELECT dbid, name, created, log_mode, open_mode, cdb, con_id FROM v$database;
 DBID NAME CREATED LOG_MODE OPEN_MODE CDB CON_ID
---------- --------- --------- ------------ -------------------- --- ----------
 46140884 NEWCDB 10-OCT-17 NOARCHIVELOG READ WRITE YES 0

— Validate if the seed database is created

SQL> SELECT con_id, dbid, name, open_mode, restricted, TO_CHAR(open_time, 'DD-MON-YY HH:MI:SS AM') OPEN_TIME FROM v$containers;
 CON_ID DBID NAME OPEN_MODE RES OPEN_TIME
---------- ---------- -------- ---------- --- ------------------------------
 1 46140884 CDB$ROOT READ WRITE NO 10-OCT-17 10:36:54 AM
 2 3138122242 PDB$SEED READ ONLY NO 10-OCT-17 10:36:54 AM

 

 

— Query CDB/PDB name, tablespace name, datafile location, size, and status

SELECT c.name DB_NAME, a.name TABLESPACE_NAME, b.name DATA_FILE_NAME, b.bytes/1024/1024 SIZE_MB, b.status
 -- c.name DB_NAME, a.con_id, a.ts#, a.name TABLESPACE_NAME, b.name DATA_FILE_NAME, b.file#, b.blocks, b.bytes/1024/1024 SIZE_MB, b.status, b.enabled, b.creation_time
 FROM v$tablespace a, v$datafile b, v$containers c
 WHERE a.con_id = b.con_id
 AND a.con_id = c.con_id
 AND a.ts# = b.ts#
 ORDER BY a.con_id, a.TS#;

 

 

— Check Control files

SQL> show parameter control_files
NAME TYPE VALUE
-------------- -------- ------------------------------
control_files string /u01/app/oracle/oradata/newcdb/control01.ctl, /u01/app/oracle/fast_recovery_area/newcdb/control02.ctl

— Check Redo log files

SQL> SELECT a.group#, a.members, a.bytes/1024/1024 SIZE_MB, a.status, b.member
 FROM v$log a, v$logfile b
 WHERE a.group# = b.group#;
 GROUP# MEMBERS SIZE_MB STATUS MEMBER
---------- ---------- ---------- ---------- ----------------------------------------
 1 2 100 CURRENT /u01/app/oracle/oradata/newcdb/redo01a.log
 1 2 100 CURRENT /u02/app/oracle/oradata/newcdb/redo01b.log
 2 2 100 UNUSED /u01/app/oracle/oradata/newcdb/redo02a.log
 2 2 100 UNUSED /u02/app/oracle/oradata/newcdb/redo02b.log
 3 2 100 UNUSED /u01/app/oracle/oradata/newcdb/redo03a.log
 3 2 100 UNUSED /u02/app/oracle/oradata/newcdb/redo03b.log

 

 

— Check if the NLS parameters are set as per the response file

SQL> SELECT * FROM v$nls_parameters WHERE parameter LIKE '%CHARACTERSET%';
PARAMETER VALUE CON_ID
------------------------- --------------- ------
NLS_CHARACTERSET AL32UTF8 0
NLS_NCHAR_CHARACTERSET AL16UTF16 0

 

 

9. Data Dictionary views

We need to run the Oracle supplied dictionary scripts like catalog.sql, catproc.sql, pupbld.sql to populate the necessary dictionary views when we create a Oracle database manually using CREATE DATABASE statement.

But it’s different for a container database, because we have multiple container databases such as CDB$ROOT and PDB$SEED, we need to run these scripts against each of these containers. To simplify the creation of dictionary views in a CDB, Oracle provides a script called catcdb.sql located under $ORACLE_HOME/rdbms/admin directory.

However, when we run the catcdb.sql script, it creates all the database components like the way DBCA does, it will create database components like Spatial, Oracle Text, XDK, etc, even if we wouldn’t use them. So we would use the catcon.pl located under $ORACLE_HOME/rdbms/admin to run the Oracle supplied scripts (catalog.sql, catproc.sql, etc) against our container databases.

# running catalog.sql script against CDB containers
$ORACLE_HOME/perl/bin/perl $ORACLE_HOME/rdbms/admin/catcon.pl -u sys -d $ORACLE_HOME/rdbms/admin -b catalog_output -e -l /home/oracle catalog.sql

# running catproc.sql script against CDB containers
$ORACLE_HOME/perl/bin/perl $ORACLE_HOME/rdbms/admin/catcon.pl -u sys -d $ORACLE_HOME/rdbms/admin -b catproc_output -e -l /home/oracle catproc.sql

# running pupbld.sql script against CDB containers
$ORACLE_HOME/perl/bin/perl $ORACLE_HOME/rdbms/admin/catcon.pl -u system -d $ORACLE_HOME/sqlplus/admin -b pupbld_output -e -l /home/oracle pupbld.sql

NOTE: We used sys, sys, and system account here

 

 

— Query the status of database components

col comp_name for a40
col version for a15
col status for a10
SELECT name, comp_name, version, status FROM v$database, dba_registry;
NAME COMP_NAME VERSION STATUS
--------- ---------------------------------------- --------------- ----------
newcdb Oracle XML Database 12.1.0.2.0 VALID
newcdb Oracle Database Catalog Views 12.1.0.2.0 INVALID
newcdb Oracle Database Packages and Types 12.1.0.2.0 INVALID

 

 

— Recompile all the INVALID objects

@?/rdbms/admin/utlrp.sql

 

 

— Query the status of database components again

col comp_name for a40
col version for a15
col status for a10
SELECT name, comp_name, version, status FROM v$database, dba_registry;
NAME COMP_NAME VERSION STATUS
--------- ---------------------------------------- --------------- ----------
newcdb Oracle XML Database 12.1.0.2.0 VALID
newcdb Oracle Database Catalog Views 12.1.0.2.0 VALID
newcdb Oracle Database Packages and Types 12.1.0.2.0 VALID

 

 

10. Create a PDB

-- Creating PDB mypdb_01 using seed database (PDB$SEED)
CREATE PLUGGABLE DATABASE newpdb1 ADMIN USER pdbadmin IDENTIFIED BY oracle
FILE_NAME_CONVERT=('/u01/app/oracle/oradata/newcdb/pdbseed/','/u01/app/oracle/oradata/newcdb/newpdb1/');
Pluggable database created.

— Open the PDB for READ-WRITE

ALTER PLUGGABLE DATABASE newpdb1 OPEN;
Pluggable database altered.

— Validate the PDB

SELECT name, open_mode, restricted FROM v$pdbs;
NAME OPEN_MODE RES
------------------------------ ---------- ---
PDB$SEED READ ONLY NO
PDB1 READ WRITE NO

 

 

— Validate list of datafiles from each of the containers

-- Query CDB/PDB name, con_id, tablespace name, datafile location, size, and status
SELECT c.name DB_NAME, b.name DATA_FILE_NAME
 -- a.con_id, a.ts#, a.name TABLESPACE_NAME, b.name DATA_FILE_NAME, b.file#, b.blocks, b.bytes/1024/1024 SIZE_MB, b.status, b.enabled, b.creation_time
 FROM v$tablespace a, v$datafile b, v$containers c
 WHERE a.con_id = b.con_id
 AND a.con_id = c.con_id
 AND a.ts# = b.ts#
 ORDER BY a.con_id, a.TS#;

DB_NAME DATA_FILE_NAME
---------- --------------------------------------------------
CDB$ROOT /u01/app/oracle/oradata/newcdb/system01.dbf
CDB$ROOT /u01/app/oracle/oradata/newcdb/sysaux01.dbf
CDB$ROOT /u01/app/oracle/oradata/newcdb/undotbs01.dbf
CDB$ROOT /u01/app/oracle/oradata/newcdb/users01.dbf
PDB$SEED /u01/app/oracle/oradata/newcdb/pdbseed/system01.dbf
PDB$SEED /u01/app/oracle/oradata/newcdb/pdbseed/sysaux01.dbf
PDB$SEED /u01/app/oracle/oradata/newcdb/pdbseed/users01.dbf
PDB1 /u01/app/oracle/oradata/newcdb/pdb1/system01.dbf
PDB1 /u01/app/oracle/oradata/newcdb/pdb1/sysaux01.dbf
PDB1 /u01/app/oracle/oradata/newcdb/pdb1/users01.dbf

NOTE: Because we created the CDB manually, if we did not create an entry for it on /etc/oratab, we wouldn’t see its entry on DBCA (let’s say you wanted to delete it).

This is my personal notes and I hope you learned something from it!

Like Loading…

Measure

Measure