Create e Drop Pluggable Database
Creare un pluggable database dal SEED.
Il nome del pluggable database non è case sensitive.
Condizioni:
SQL> CREATE PLUGGABLE DATABASE pdb1
ADMIN USER pdb1adm IDENTIFIED BY pdb1adm
ROLES = (dba)
DEFAULT TABLESPACE users
DATAFILE '/u01/app/oracle/oradata/ORCL/pdb1/users01.dbf' SIZE 250M AUTOEXTEND ON
FILE_NAME_CONVERT = ('/u01/app/oracle/oradata/ORCL/pdbseed/',
'/u01/app/oracle/oradata/ORCL/pdb1/')
Verifiche:
Easy Connect
Local Naming
**************************************************************
- Accedere al conatiner root come amministratore o avere il privilegio "create pluggable database".
- Il CDB deve essere in stato READ e WRITE.
- Usare il comando "create pluggable database"
- Come best practice creare un utente che abbia il ruolo DBA all'interno del nuovo pdb
La procedura prevede che vengano effettuate copie dei datafile del Seed in una nuova directory e creati i tablespace Sysaux, System, Undo e Temp e gli schema e gli utenti di deafult.
Accediamo come root container e assicuriamoci che sia in stato Read Write
SQL> show con_name
CON_NAME
------------------------------
CDB$ROOT
SQL> column name format a15
SQL> select con_id,name,open_mode from v$containers;
CON_ID NAME OPEN_MODE
---------- --------------- ----------------------------
1 CDB$ROOT READ WRITE
2 PDB$SEED READ ONLY
3 ORCLPDB READ WRITE
Accediamo al pdb SEED e controlliamo il numero di tablespace, datafile e user.
SQL> alter session set container=PDB$SEED;
SQL> select * from v$tablespace;
TS# NAME INC BIG FLA ENC CON_ID
---------- --------------- --- -------------------- --- --- ----------
0 SYSTEM YES NO YES 2
1 SYSAUX YES NO YES 2
2 UNDOTBS1 YES NO YES 2
3 TEMP NO NO YES 2
SQL> select con_id,file#, name from V$DATAFILE;
CON_ID FILE# NAME
---------- --------------------- ----------------------------------------------------------------------
2 5 /u01/app/oracle/oradata/ORCL/pdbseed/system01.dbf
2 6 /u01/app/oracle/oradata/ORCL/pdbseed /sysaux01.dbf
2 8 /u01/app/oracle/oradata/ORCL/pdbseed/undotbs01.dbf
SQL> select count(*) from dba_users;
COUNT(*)
----------
35
SQL> select count(*) from cdb_users
COUNT(*)
----------
35
SQL> alter session set container=cdb$root;
Creare una nuova directory contenete i file del nuovo pdb, da linea di comando sotto
/u01/app/oracle/oradata/ORCL
[oracle@test ORCL]$ mkdir pdb1
ADMIN USER pdb1adm IDENTIFIED BY pdb1adm
ROLES = (dba)
DEFAULT TABLESPACE users
DATAFILE '/u01/app/oracle/oradata/ORCL/pdb1/users01.dbf' SIZE 250M AUTOEXTEND ON
FILE_NAME_CONVERT = ('/u01/app/oracle/oradata/ORCL/pdbseed/',
'/u01/app/oracle/oradata/ORCL/pdb1/')
La clausola USER_TABLESPACE specifica queli tablespace devono essere disponibili nel nuov PDB.
Verifiche:
SQL> column name format a15
SQL> select con_id, name, open_mode from v$containers;
CON_ID NAME OPEN_MODE
---------- -----------------------------------------
1 CDB$ROOT READ WRITE
2 PDB$SEED READ ONLY
3 ORCLPDB READ WRITE
5 PDB1 MOUNTED
SQL> alter session set container=pdb1;
SQL> alter pluggable database pdb1 open;
SQL> select * from v$tablespace;
TS# NAME INC BIG FLA ENC CON_ID
---------- --------------- --- --- --- ------------------ ----------
0 SYSTEM YES NO YES 5
1 SYSAUX YES NO YES 5
2 UNDOTBS1 YES NO YES 5
3 TEMP NO NO YES 5
5 USERS YES NO YES 5
Abbiamo il tablespace USERS in più rispetto a pdbseed.
SQL> select con_id,file#, name from V$DATAFILE;
CON_ID FILE# NAME
---------- ---------- ------------------------------------------------------------------
5 13 /u01/app/oracle/oradata/ORCL/pdb1/system01.dbf
5 14 /u01/app/oracle/oradata/ORCL/pdb1/sysaux01.dbf
5 15 /u01/app/oracle/oradata/ORCL/pdb1/undotbs01.dbf
5 16 /u01/app/oracle/oradata/ORCL/pdb1/users01.dbf
SQL> select count(*) from dba_users;
COUNT(*)
----------
36
Vediamo ora come collegarci al nuovo PDB1.
SQL> show con_name;
CON_NAME
------------------------------
CDB$ROOT
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------------------------------
2 PDB$SEED READ ONLY NO
3 ORCLPDB READ WRITE NO
5 PDB1 READ WRITE NO
SQL> select con_id, open_mode from v$containers;
CON_ID OPEN_MODE
---------- --------------------
1 READ WRITE
2 READ ONLY
3 READ WRITE
5 READ WRITE
SQL> conn pdb1adm/pdb1adm@test.com:1521/pdb1.com
Il listener deve vedere la nuova istanza
[oracle@test ~]$ lsnrctl status
...............................................
Service "pdb1.com" has 1 instance(s).
SQL> conn pdb1adm/pdb1adm@pdb1
ERROR:
ORA-12154: TNS:could not resolve the connect identifier specified
L'errore è causata dalla mancata configurare del tnsnames.ora sul client e su server.
Aggiungere nel tnsnames.ora
PDB1=
(DESCRIPTION=
(ADDRESS=
(PROTOCOL=TCP)
(HOST=test.com)
(PORT=1521)
)
(CONNECT_DATA=
(SERVER=dedicated)
(SERVICE_NAME=pdb1.com)
)
)
A questo se si riprova a connettersi, funziona!
SQL> conn pdb1adm/pdb1adm@pdb1.com
*************************************************************************
Un'altra tecnica è creare un PDB utilizzando DBCA.
Accedere al server direttamente con l'utenza oracle, senza passare per root e poi con il comando "su - oracle".
[oracle@test ~]$ dbca &
Usare "&" per lavorare in backgorund così se cade la connessione al server, la sessione è ancora via e si può continuare ad utilizzare il tool grafico.
Si apre la schermata seguente e scegliere "Manage Pluggable database"
Non popolare i campi User name e Password.
Click next.
Click next.
Click Finish.
Risulta creata la nuova directory che contiene i datafile system sysaux, undo, temp e users.
[oracle@test ORCL]$ ls -lrt
total 2571620
drwxr-x--- 2 oracle oinstall 111 Sep 1 12:11 pdbseed
drwxr-x--- 2 oracle oinstall 104 Sep 1 12:19 orclpdb
drwxr-xr-x 2 oracle oinstall 130 Sep 2 15:36 pdb1
drwxr-x--- 2 oracle oinstall 130 Sep 3 09:48 pdb2
[oracle@test pdb2]$ ls -lrt
total 742488
-rw-r----- 1 oracle oinstall 5251072 Sep 3 09:48 users01.dbf
-rw-r----- 1 oracle oinstall 104865792 Sep 3 09:48 undotbs01.dbf
-rw-r----- 1 oracle oinstall 367009792 Sep 3 09:48 sysaux01.dbf
-rw-r----- 1 oracle oinstall 283123712 Sep 3 09:48 system01.dbf
-rw-r----- 1 oracle oinstall 65019904 Sep 3 09:48 temp012020-09-01_12-11-42-10
Il nuovo pdb risulta up e running:
SQL> conn /as sysdba
SQL> column name format a20
SQL> select name, open_mode from v$containers;
NAME OPEN_MODE
-------------------- ----------
CDB$ROOT READ WRITE
PDB$SEED READ ONLY
ORCLPDB READ WRITE
PDB2 READ WRITE
PDB1 READ WRITE
Anche il listner lo ha registrato:
[oracle@test ~]$ lsnrctl status
...............................................
Service "pdb2.com" has 1 instance(s)
Aggiungere il tnsname entry all'interno del tnsnames.ora per ultizzare il metodo di connesione "Local Naming".
L'utente amministratore del pdb creato automaticamente da DBCA non possiede privilegi di sistemi
SQL> show con_name
CON_NAME
------------------------------
CDB$ROOT
SQL> select * from cdb_sys_privs where grantee='PDB2ADM'
no rows selected
SQL> select * from CDB_ROLE_PRIVS where grantee='PDB2ADM';
GRANTED_ROLE
----------------------------------
PDB_DBA
Il tool in automatico assegna il ruolo PDB_DBA.
Per individuare i privilegi di sitema associati a questo ruolo accediamo al pdb.
SQL> alter session set container=pdb2;
SQL> select * from ROLE_SYS_PRIVS where role='PDB_DBA' ;
PRIVILEGE
---------------------------------------- ---
SET CONTAINER
CREATE PLUGGABLE DATABASE
CREATE SESSION
SQL> select * from dba_role_privs where upper (grantee) like upper('%PDB_DBA%')
GRANTEE GRANTED_ROLE
-----------------------------------------
PDB_DBA CONNECT
Questo dice che il ruolo PDB_DBA ha ricevuto il ruolo Connect.
I privilegi di sistema associati al ruolo Connect sono i seguenti:
SQL> select * from role_sys_privs where role='CONNECT';
ROLE PRIVILEGE
--------------------------------------------------------
CONNECT SET CONTAINER
CONNECT CREATE SESSION
[oracle@test admin]$ sqlplus pdb2adm/pdb2adm@pdb10
.....
SQL> show user
USER is "PDB2ADM"
SQL> select * from session_privs;
PRIVILEGE
----------------------------------------
SET CONTAINER
CREATE PLUGGABLE DATABASE
CREATE SESSION
BEST PRACTICE
Questi privilegi non sono sufficienti per un dba infatti non è possibile creare neanche una tabella
SQL> create table appo (x number);
create table appo (x number)
*
ERROR at line 1:
ORA-01031: insufficient privileges
Assegnare all'utente amministratore del pluggable database il ruolo di dba.
SQL> alter session set container=PDB2;
SQL>grant CREATE SESSION, DBA TO pdb2adm;
Procediamo con la cancellazione di un pdb da linea di comando.
Collegarsi come sysdba al root container.
SQL> show con_name
CON_NAME
------------------------------
CDB$ROOT
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- -------------------------
2 PDB$SEED READ ONLY NO
3 ORCLPDB READ WRITE NO
4 PDB2 READ WRITE NO
5 PDB1 READ WRITE NO
SQL> alter pluggable database pdb2 close;
Pluggable database altered.
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ---------------------------------
2 PDB$SEED READ ONLY NO
3 ORCLPDB READ WRITE NO
4 PDB2 MOUNTED
5 PDB1 READ WRITE NO
SQL> drop pluggable database pdb2 including datafiles;
Pluggable database dropped.
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ---------------------------
2 PDB$SEED READ ONLY NO
3 ORCLPDB READ WRITE NO
5 PDB1 READ WRITE NO
Infine cancellare la directory pdb2
[oracle@test ORCL]$ rm -r pdb2
**************************************************************
Procediamo con la cancellazione di un pdb usando DBCA
[oracle@test pdb1]$ dbca
Seleziona il pdb da cancellare.
Click su FInish
La directory pdb1 non contiene più file ma occorre cancellarla.
[oracle@test ORCL]$ rm -r pdb1