Dans ce blog post, nous allons nous intéresser à la gestion des PDBs (Pluggable Database) dans Oracle 12c. Plus exactement, nous allons nous pencher sur l’arrêt et le démarrage automatiques des PDBs en utilisant le Server Control (srvctl) du Grid Infrastructure de la 12c.

Le contexte

Au préalable, il faut avoir installé Grid Infrastructure et créé une CDB (Container Database) avec une PDB. Nous allons utiliser le processus d’Oracle Restart pour gérer l’arrêt et le démarrage de notre PDB.

Pour cela, il nous faut:

  • Un conteneur : TST12C
  • Une PDB : PDB1
  • Un Grid  Infrastructure : +ASM

Regardons le contenu de nos services côté Grid Infrastructure après installation:
oracle@vmtest12c1:/home/oracle/ [+ASM] crsctl stat res -t

--------------------------------------------------------------------------------
Name           Target  State        Server                   State details
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.DATA.dg
               ONLINE  ONLINE       vmtest12c1               STABLE
ora.FRA.dg
               ONLINE  ONLINE       vmtest12c1               STABLE
ora.LISTENER.lsnr
               ONLINE  ONLINE       vmtest12c1               STABLE
ora.asm
               ONLINE  ONLINE       vmtest12c1               Started,STABLE
ora.ons
               OFFLINE OFFLINE      vmtest12c1               STABLE
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.cssd
      1        ONLINE  ONLINE       vmtest12c1               STABLE
ora.diskmon
      1        OFFLINE OFFLINE                               STABLE
ora.evmd
      1        ONLINE  ONLINE       vmtest12c1               STABLE
ora.tst12c.db
      1        ONLINE  ONLINE       vmtest12c1               Open,STABLE
--------------------------------------------------------------------------------

Nous disposons :

  • De deux diskgroups ASM (DATA et FRA)
  • D’un listener LISTENER.lsnr
  • D’une base de données tst12c.db

Point de vérification:

Avant de commencer, vérifions l’état de notre Pluggable par un SELECT:

SQL> select name, open_mode from v$pdbs;
 
NAME                              OPEN_MODE
------------------------------    ----------
PDB$SEED                           READ ONLY
PDB1                               MOUNTED

Cette pluggable PDB1 est bien présente en mode MOUNTED, état normal pour une PDB non démarée.

Passons aux choses sérieuses. Comme nous voulons gérer nos PDBs avec SRVCTL, il nous faut créer un service et une entrée dans le TNSNAMES.ora.

Les commandes de SRVCTL d’Oracle s’enrichissent avec cette nouvelle version 12c. Vous pouvez les consulter à la page suivante :

http://docs.oracle.com/cd/E16655_01/server.121/e17636/restart.htm#ADMIN5013

Vérifions les ervices avant de commencer sur notre Grid Infrastructure. Actuellement il n’y a aucun service sur notre base de données:
oracle@vmtest12c1:/home/oracle/ [TST12C] srvctl status service -db TST12C -verbose
Database TST12C does not have services

Création du service

Syntaxe : srvctl add service -db ‘db_unique_name’ -service ‘service_name’ -pdb ‘Nom Pdb’

oracle@vmtest12c1:/home/oracle/ [TST12C] srvctl add service -db TST12C -service -Mon_SRV -pdb pdb1

oracle@vmtest12c1:/home/oracle/ [TST12C]

Vérifions notre création et l’ensemble des services.

oracle@vmtest12c1:/home/oracle/ [TST12C] srvctl status service -db TST12C -verboseService Mon_SRV is running

oracle@vmtest12c1:/home/oracle/[+ASM] crsctl stat res -t

--------------------------------------------------------------------------------
 Name           Target  State        Server                   State details
 --------------------------------------------------------------------------------
 Local Resources
 --------------------------------------------------------------------------------
 ora.DATA.dg
 ONLINE  ONLINE       vmtest12c1               STABLE
 ora.FRA.dg
 ONLINE  ONLINE       vmtest12c1               STABLE
 ora.LISTENER.lsnr
 ONLINE  ONLINE       vmtest12c1               STABLE
 ora.asm
 ONLINE  ONLINE       vmtest12c1               Started,STABLE
 ora.ons
 OFFLINE OFFLINE      vmtest12c1               STABLE
 --------------------------------------------------------------------------------
 Cluster Resources
 --------------------------------------------------------------------------------
 ora.cssd
 1        ONLINE  ONLINE       vmtest12c1               STABLE
 ora.diskmon
 1        OFFLINE OFFLINE                               STABLE
 ora.evmd
 1        ONLINE  ONLINE       vmtest12c1               STABLE
 ora.tst12c.db
 1        ONLINE  ONLINE       vmtest12c1               Open,STABLE
 ora.tst12c.mon_srv.svc
 1        OFFLINE OFFLINE      vmtest12c1               STABLE
 --------------------------------------------------------------------------------

Nous avons bien à notre disposition le service ora.tst12c.mon_srv.svc, vous remarquerez que celui-ci est OFFLINE.

Création de l’Alias du TNSNAMES.ora

Afin que l’on puisse accéder à notre PDB, nous allons l’intégrer dans le TNSNAMES.ora une nouvelle entrée comme suit.

PDB1 =
 (DESCRIPTION =
 (ADDRESS_LIST =
 (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
 )
 (CONNECT_DATA =
 (SERVICE_NAME = Mon_srv)
 )
 )

Comme pour une instance, il suffit d’utiliser le Service_name du service créé précédement et de lui donner un alias. Ce service nous permettra de nous connecter à cette PDB (connect sys@SRV_PDB1 as sysdba)

Vérifions côté LISTENER si nous voyons notre service.

oracle@vmtest12c1:/home/oracle/ [+ASM] lsnrctl statusServices Summary…
Service “+ASM” has 1 instance(s).
Instance “+ASM”, status READY, has 1 handler(s) for this service…
Service “Mon_SRV” has 1 instance(s).
Instance “TST12C”, status READY, has 1 handler(s) for this service…
Service “TST12C” has 1 instance(s).
Instance “TST12C”, status READY, has 1 handler(s) for this service…
Service “TST12CXDB” has 1 instance(s).
Instance “TST12C”, status READY, has 1 handler(s) for this service…
The command completed successfully

Aucune trace du service.
Essayons de nous connecter à notre PDB avec connect sys@SRV_PDB1 as sysdba.
Que se passe t-il ?

SQL> connect sys@SRV_PDB1 as sysdbaEnter password:ERROR:ORA-12154:TNS:could not resolve the connect identifier specified

Warning: You are no longer connected to ORACLE.
Aucune connexion. Ceci est tout à fait normal puisque notre service ora.tst12c.mon_srv.srv et notre PDB ne sont toujours pas démarrés.

Démarrons le service :

oracle@vmtest12c1:/home/oracle/ [TST12C] srvctl start service -db TST12C -service "Mon_SRV" -verbose
oracle@vmtest12c1:/home/oracle/ [TST12C]
oracle@vmtest12c1:/home/oracle/ [TST12C] srvctl status service -db TST12C -verbose
Service Mon_SRV is running

Procédons aux vérifications de nos ressources cluster (HAS), Listener et connexion à notre PDB:

oracle@vmtest12c1:/home/oracle/[+ASM] crsctl stat res -t
--------------------------------------------------------------------------------
 Name           Target  State        Server                   State details
 --------------------------------------------------------------------------------
 Local Resources
 --------------------------------------------------------------------------------
 ora.DATA.dg
 ONLINE  ONLINE       vmtest12c1               STABLE
 ora.FRA.dg
 ONLINE  ONLINE       vmtest12c1               STABLE
 ora.LISTENER.lsnr
 ONLINE  ONLINE       vmtest12c1               STABLE
 ora.asm
 ONLINE  ONLINE       vmtest12c1               Started,STABLE
 ora.ons
 OFFLINE OFFLINE      vmtest12c1               STABLE
 --------------------------------------------------------------------------------
 Cluster Resources
 --------------------------------------------------------------------------------
 ora.cssd
 1        ONLINE  ONLINE       vmtest12c1               STABLE
 ora.diskmon
 1        OFFLINE OFFLINE                               STABLE
 ora.evmd
 1        ONLINE  ONLINE       vmtest12c1               STABLE
 ora.tst12c.db
 1        ONLINE  ONLINE       vmtest12c1               Open,STABLE
 ora.tst12c.mon_srv.svc
 1        ONLINE ONLINE        vmtest12c1               STABLE
 --------------------------------------------------------------------------------

Notre service ora.tst12c.mon_srv.srv est bien ONLINE et STABLE, par-contre il nous affiche pas l’état “Open” de la PDB comme pour la base de données.

oracle@vmtest12c1:/home/oracle/ [+ASM] lsnrctl statusServices Summary…
Service “+ASM” has 1 instance(s).
Instance “+ASM”, status READY, has 1 handler(s) for this service…
Service “Mon_SRV” has 1 instance(s).
Instance “TST12C”, status READY, has 1 handler(s) for this service…
Service “TST12C” has 1 instance(s).
Instance “TST12C”, status READY, has 1 handler(s) for this service…
Service “TST12CXDB” has 1 instance(s).
Instance “TST12C”, status READY, has 1 handler(s) for this service…
Service “pdb1” has 1 instance(s).
Instance “TST12C”, status READY, has 1 handler(s) for this service…
The command completed successfully

Nous avons bien le service “Mon_SRV” instancié.

SQL> connect sys@SRV_PDB1 as sysdbaEnter password:Connected.
SQL> select name,open_mode, con_id from v$pdbs;
NAME                              OPEN_MODE        CON_ID
 ---------------------------       -------------   ---------
 PDB$SEED                      READ ONLY          2
 PDB1                              READ WRITE         3

 

La PDB est bien démarré et nous pouvons intérroger la base de données

SQL> select property_name, property_value from database_properties
 2  where property_name like 'DEFAULT_%TABLE%';
PROPERTY_NAME                  PROPERTY_VALUE
 ------------------------------  --------------
 DEFAULT_TEMP_TABLESPACE                  TEMP
 DEFAULT_PERMANENT_TABLESPACE            USERS

Arrêtons le service :

oracle@vmtest12c1:/home/oracle/ [TST12C] srvctl stop service -db TST12C -service “Mon_SRV” -force -verbose
oracle@vmtest12c1:/home/oracle/ [TST12C]

Notre service  “Mon_SRV s’est arrêté sans message.

Vérifions les services.

--------------------------------------------------------------------------------
 Name           Target  State        Server                   State details
 --------------------------------------------------------------------------------
 Local Resources
 --------------------------------------------------------------------------------
 ora.DATA.dg
 ONLINE  ONLINE       vmtest12c1               STABLE
 ora.FRA.dg
 ONLINE  ONLINE       vmtest12c1               STABLE
 ora.LISTENER.lsnr
 ONLINE  ONLINE       vmtest12c1               STABLE
 ora.asm
 ONLINE  ONLINE       vmtest12c1               Started,STABLE
 ora.ons
 OFFLINE OFFLINE      vmtest12c1               STABLE
 --------------------------------------------------------------------------------
 Cluster Resources
 --------------------------------------------------------------------------------
 ora.cssd
 1        ONLINE  ONLINE       vmtest12c1               STABLE
 ora.diskmon
 1        OFFLINE OFFLINE                               STABLE
 ora.evmd
 1        ONLINE  ONLINE       vmtest12c1               STABLE
 ora.tst12c.db
 1        ONLINE  ONLINE       vmtest12c1               Open,STABLE
 ora.tst12c.mon_srv.svc
 1        OFFLINE OFFLINE      vmtest12c1               STABLE
 --------------------------------------------------------------------------------

Le service ora.tst12c.mon_srv.svc est bien arrêté.

Vérifions maintenant coté PDB.

SQL> select name,open_mode, con_id from v$pdbs;
NAME                           OPEN_MODE      CON_ID
 ----------------------------   -----------     ------
 PDB$SEED                       READ ONLY            2
 PDB1                           READ WRITE           3

Il y a certainement un problème. Relançons l’arrêt de la PDB pour vérifier. A priori l’arrêt de notre PDB ne fonctionne pas avec SRVCTL, pour confimer testons encore une fois l’arret.

oracle@vmtest12c1:/home/oracle/ [TST12C] srvctl stop service -db TST12C -service “Mon_SRV” -force -verbosePRCR-1005 : Resource ora.tst12c.mon_srv.svc is already stopped

SRVCTL nous informe bien qu’il est déjà arrêté, c’est exact mais ou en est l’état de notre PDB.

SQL> select name,open_mode, con_id from v$pdbs;
NAME                        OPEN_MODE    CON_ID
 --------------------------- ----------   ------
 PDB$SEED                    READ ONLY          2
 PDB1                        READ WRITE        3


Décevant ! Notre PDB est toujours READ/WRITE.

Nous allons tenter d’arrêter cette PDB avec SQLPLUS.

Connected to:Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 – 64bit ProductionWith the Partitioning, Automatic Storage Management, OLAP, Advanced Analyticsand Real Application Testing optionsSQL> alter pluggable database pdb1 close;Pluggable database altered.SQL> alter pluggable database pdb1 close;Pluggable database altered.

SQL> select name, open_mode, con_id from v$pdbs;
NAME                       OPEN_MODE      CON_ID
 ------------------------   ----------     ------
 PDB$SEED                   READ ONLY           2
 PDB1                       MOUNTED             3
SQL> connect sys@SRV_PDB1 as sysdbaEnter password:ERROR:ORA-12514: TNS:listener does not currently know of service requested in connect descriptor

 

Magnifique ! Opération réalisée avec succès mais sans SRVCTL.
Pour résumer la commande SRVCTL Start fonctionne à contrario de la commande SVRCTL Stop.
Si vous ne souhaitez pas utiliser Server Control pour gérer vos PDBs, il est possible d’utiliser des Triggers.

Voici un exemple :

CREATE TRIGGER Start_Pdb
 after startup on database
 begin
 execute immediate 'alter pluggable database all open';
 -- alter pluggable database pdb 'Nom Pdb' open
 end Start_Pdb;
 /


Conclusion

La technologie Grid Infrastucture qui embarque ASM et Oracle Restart améliore la disponibilité de la base de données.

Oracle Restart intégre les composants pour démarrer et arréter les PDBs, il est juste dommageable que l’arrêt de nos PDBs ne fonctionne pas.

Si vous ne disposez pas de Grid Infrastructure, la gestion (Démarrage / Arrêt) de vos PDBs se fera par triggers comme évoqué dans ce blog. Neanmoins, dbi services est en train de développer une solution simple et efficace pour la gestion de vos PDBs basée sur l’outil DMK (Database Management Kit) qui facilitera votre quotidien avec les PDBs.


Thumbnail [60x60]
by