Create e Drop Pluggable Database

Creare un pluggable database dal SEED.
Il nome del pluggable database non è case sensitive.

Condizioni:
- 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


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/')


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

Easy Connect
SQL> conn pdb1adm/pdb1adm@test.com:1521/pdb1.com

Local Naming
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

Post popolari in questo blog

ORA-12154: TNS: il listener non è attualmente a conoscenza del servizio richiesto nel descrittore di connessione