
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
Création du service
Syntaxe : srvctl add service -db 'db_unique_name' -service 'service_name' -pdb 'Nom Pdb'
oracle@vmtest12c1:/home/oracle/ [TST12C]
Vérifions notre création et l'ensemble des services.
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 ?
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]
oracle@vmtest12c1:/home/oracle/ [TST12C] srvctl status service -db TST12C -verbose
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 status
Services 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> 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]
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.
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.