Skip to content

Création d'un PDB

PhilippeLeroux edited this page Oct 8, 2018 · 33 revisions

Table of contents


Scripts

Remarque : Pour pouvoir créer un PDB il faut avoir créé un CDB (une base avec container) instructions ici

Ils fonctionnent pour :

  • une base single
  • des bases single en dataguard
  • un RAC (sans dataguard)

Espace disque

Attention à l'espace disque avant de créer un PDB, avec la 12c on peut très vite créer de nouveaux PDB, mais par défaut la taille de la base est petite. L'espace du DG DATA peut donc rapidement être saturé.

  • Pour visualiser l'espace disponible :

     oracle@srvfoo01:FOO1:~> asmcmd lsdg
     State    Type    Rebal  Sector  Block       AU  Total_MB  Free_MB  Req_mir_free_MB  Usable_file_MB  Offline_disks  Voting_files  Name
     MOUNTED  NORMAL  N         512   4096  1048576     18420    17689             6140            5774              0             Y  CRS/
     MOUNTED  EXTERN  N         512   4096  1048576     16368     5260                0            5260              0             N  DATA/
     MOUNTED  EXTERN  N         512   4096  1048576     16368    10483                0           10483              0             N  FRA/
    
  • Pour ajouter des disques voir ici

Ajustement de memory_max_target

S'il y a trop de PDBs, la création du PDB peut échouer.

Pour vérifier si la taille mémoire de la base peut être augmentée :

oracle@srvorion01:ORION:db> ./set_memory_target_to.sh
# OS free memory    : 259.63Mb
# shm total         : 1.20Gb
# shm available     : 687.00Mb
# memory_max_target : 800.00Mb, maximum : 1.14Gb (1,166Mb)

Dans cette exemple memory_max_target peut être augementé.

Pour l'augmenter au maximum, exécuter :

oracle@srvorion01:ORION:db> ./set_memory_target_to.sh -val=max -apply
# OS free memory    : 296.34Mb
# shm total         : 1.20Gb
# shm available     : 687.00Mb
# memory_max_target : 800.00Mb, maximum : 1.14Gb (1,166Mb)

# set memory_max_target to 1.14Gb : increase of 366.60Mb

# =======================================================================================
14h41> sqlplus -s sys/Oracle12 as sysdba

SQL> create pfile='/tmp/p.txt' from spfile;

Fichier cree.

Ecoule : 00 :00 :00.00

SQL> alter system set memory_max_target=1223268762 scope=spfile sid='*';

Systeme modifie.

Ecoule : 00 :00 :00.00
14h41> ~/plescripts/db/bounce_db.sh
[output skipped]

La base est redémarrée.

Création d'un PDB

Pour la création d'un PDB le script plescripts/db/create_pdb.sh automatise toutes les tâches.

oracle@srvfoo01:FOO1:~> cd plescripts/db
oracle@srvfoo01:FOO1:db> ./create_pdb.sh -db=foo -pdb=pdb12

Note : Le Wallet n'est pas utilisé avec la 12cR2 en standalone avec ASM car les bases ne peuvent pas démarrer. Pour les RAC ou une standalone sur FS pas de problèmes.

Pour chaque PDB sont créés :

  • 2 ou 4 services :

    • pdb12_oci : pour les connexions oci.
    • pdb12_java : pour les connexions java.
    • pdb12_stby_oci : pour les connexions oci sur une standby en lecture seule.
    • pdb12_stby_java : pour les connexions java sur une standby en lecture seule.
  • 2 alias TNS en local sur le serveur :

    • pdb12_oci : sers pour les connexions utilisateurs normales.
    • syspdb12 : permet les connexions sys simplifiées par l'utilisation du wallet Oracle.
  • Le compte sys est enregistré dans le wallet Oracle avec l'alias syspdb12

    Pour se connecter sys sur un PDB il suffit donc de taper : $ sqlplus /@syspdb12 as sysdba

    Il est toujours possible d'utiliser : sqlplus sys/Oracle12@pdb02_oci as sysdba

    Dans le cas d'un RAC l'alias syspdb12 n'utilise pas la scan mais le nom du serveur local.

    Le paramètre -wallet=no|yes permet d'utiliser ou pas le Wallet. Pour définir la valeur par défaut de ce paramètre, exporter dans le profile d'Oracle la variable WALLET avec comme valeur yes ou no.

Pour lister les connexions enregistrées dans le wallet :

oracle@srvfoo01:FOO1:~> ~/plescripts/db/wallet/list_credentials.sh

Le wallet est utilisé pour le compte sys d'un PDB et pour le compte utilisateur gérant un DBFS (si un DBFS est créé).

Pour effectuer un backup :

oracle@srvfoo01:FOO1:~> cd ~/plescripts/db
oracle@srvfoo01:FOO1:db> ./image_copy_backup.sh

Suppression d'un PDB

Utiliser le script : plescripts/db/drop_pdb.sh

Le script met à jour :

  • tnsnames.ora
  • le wallet Oracle
  • Si un dbfs existe toutes les ressources associées sont supprimées.

BUG 12.2 single database + ASM + Wallet Manager.

Il n'est plus possible de démarrer une base avec sqlplus.

Le CDB tchouri contient un PDB pdb1414, le compte sys de pdb1414 est enregistré dans le Wallet Manager :

oracle@srvtchouri01:TCHOURI:db> ~/db/wallet/list_credentials.sh
# Connect string : syspdb1414, user : sys

Les connexions suivantes fonctionnent correctement :

  • Sur le CDB
     oracle@srvtchouri01:TCHOURI:db> sqlplus sys/Oracle12 as sysdba
    
     SQL*Plus: Release 12.1.0.2.0 Production on Thu Feb 9 12:24:07 2017
    
     Copyright (c) 1982, 2014, Oracle.  All rights reserved.
    
    
     Connected to:
     Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
     With the Partitioning, Automatic Storage Management, OLAP, Advanced Analytics
     and Real Application Testing options
    
     sys@cdb$root>
    
  • Sur pdb1414
     oracle@srvtchouri01:TCHOURI:db> sqlplus /@syspdb1414 as sysdba
    
     SQL*Plus: Release 12.1.0.2.0 Production on Thu Feb 9 12:24:03 2017
    
     Copyright (c) 1982, 2014, Oracle.  All rights reserved.
    
    
     Connected to:
     Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
     With the Partitioning, Automatic Storage Management, OLAP, Advanced Analytics
     and Real Application Testing options
    
     sys@pdb1414>
    

Arrêt de la base tchouri avec sqlplus aucun problème :

sys@cdb$root> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
sys@cdb$root>

Démarrage de la base tchouri avec sqlplus problème :

idle> startup
ORA-01078: failure in processing system parameters
ORA-01565: error in identifying file '+DATA/TCHOURI/spfileTCHOURI.ora'
ORA-17503: ksfdopn:2 Failed to open file +DATA/TCHOURI/spfileTCHOURI.ora
ORA-15056: additional error message
ORA-17503: ksfdopn:2 Failed to open file +DATA/TCHOURI/spfiletchouri.ora
ORA-12578: TNS:wallet open failed
ORA-06512: at line 4
idle>

Par contre le démarrage avec srvctl (12.1.0.2) fonctionne :

oracle@srvtchouri01:TCHOURI:db> srvctl start database -db tchouri

Avec Oracle 12cR2 et le Grid Infra d'installé, il est impossible de démarrer la base avec sqlplus ou srvctl. La seul solution que j'ai trouvé étant :

  • positionner la variable SQLNET.WALLET_OVERRIDE à FALSE
  • démarrer la base.
  • positionner la variable SQLNET.WALLET_OVERRIDE à TRUE

Descriptions des étapes

Les chapitres ci-dessous sont conservés comme aides mémoire, ils permettent de comprendre la logique des scripts ci-dessus.

Création d'un PDB

sys@cdb$root> create pluggable database foo ADMIN USER syspdb identified by Oracle12;

Pluggable database created.

Création des services

Le script create_srv_for_dataguard.sh permet de créer les services sur la base 'primary' et sur la base 'standby'

Ce script doit être exécuté sur le serveur ayant le rôle 'primary'

oracle@srvleft01:LEFT:db> ./create_srv_for_dataguard.sh -db=left -pdbName=foo \
> -standby=right -standby_host=srvright01

12h45> /home/oracle/plescripts/db/create_srv_for_single_db.sh -db=left -pdbName=FOO -role=primary -start=yes

# ==============================================================================================
# create service pdbFOO_oci on pluggable FOO (db = left).

12h45> srvctl                               \
            add service -service pdbFOO_oci \
               -pdb FOO -db left            \
               -role           primary      \
               -policy         automatic    \
               -failovertype   select       \
               -failovermethod basic        \
               -failoverretry  20           \
               -failoverdelay  3            \
               -clbgoal        long         \
               -rlbgoal        throughput

12h45> srvctl start service -service pdbFOO_oci -db left

12h45> ~/plescripts/db/add_tns_alias.sh -service_name=pdbFOO_oci -host_name=srvleft01

12h45> /home/oracle/plescripts/db/delete_tns_alias.sh -tnsalias=PDBFOO_OCI

# Alias PDBFOO_OCI not found.

# Append new alias : PDBFOO_OCI

# $TNS_ADMIN/tnsnames.ora updated.

# ==============================================================================================
# create service pdbFOO_java on pluggable FOO (db = left)

12h45> srvctl                                \
            add service -service pdbFOO_java \
               -pdb FOO -db left             \
               -role             primary     \
               -policy           automatic   \
               -failovertype     SELECT      \
               -failovermethod   basic       \
               -failoverretry    30          \
               -failoverdelay    1

12h45> srvctl start service -service pdbFOO_java -db left


12h45> /home/oracle/plescripts/db/create_srv_for_single_db.sh -db=left -pdbName=FOO -role=physical_standby -start=yes

# ==============================================================================================
# create service pdbFOO_stby_oci on pluggable FOO (db = left).

12h45> srvctl                                    \
            add service -service pdbFOO_stby_oci \
               -pdb FOO -db left                 \
               -role           physical_standby  \
               -policy         automatic         \
               -failovertype   select            \
               -failovermethod basic             \
               -failoverretry  20                \
               -failoverdelay  3                 \
               -clbgoal        long              \
               -rlbgoal        throughput

12h45> srvctl start service -service pdbFOO_stby_oci -db left

12h46> ~/plescripts/db/add_tns_alias.sh -service_name=pdbFOO_stby_oci -host_name=srvleft01

12h46> /home/oracle/plescripts/db/delete_tns_alias.sh -tnsalias=PDBFOO_STBY_OCI

# Alias PDBFOO_STBY_OCI not found.

# Append new alias : PDBFOO_STBY_OCI

# $TNS_ADMIN/tnsnames.ora updated.

# ==============================================================================================
# create service pdbFOO_stby_java on pluggable FOO (db = left)

12h46> srvctl                                      \
            add service -service pdbFOO_stby_java  \
               -pdb FOO -db left                   \
               -role             physical_standby  \
               -policy           automatic         \
               -failovertype     SELECT            \
               -failovermethod   basic             \
               -failoverretry    30                \
               -failoverdelay    1

12h46> srvctl start service -service pdbFOO_stby_java -db left


# Arrêt des services stby (oui ils doivent être démarrés)
12h46> srvctl stop service -db left -service pdbFOO_stby_oci

12h46> srvctl stop service -db left -service pdbFOO_stby_java

12h46> ssh -t srvright01 ". .bash_profile; ~/plescripts/db/create_srv_for_single_db.sh -db=right -pdbName=FOO -role=primary -start=no"

# ==============================================================================================
# create service pdbFOO_oci on pluggable FOO (db = right).

12h46> srvctl                               \
            add service -service pdbFOO_oci \
               -pdb FOO -db right           \
               -role           primary      \
               -policy         automatic    \
               -failovertype   select       \
               -failovermethod basic        \
               -failoverretry  20           \
               -failoverdelay  3            \
               -clbgoal        long         \
               -rlbgoal        throughput

12h46> ~/plescripts/db/add_tns_alias.sh -service_name=pdbFOO_oci -host_name=srvright01

12h46> /home/oracle/plescripts/db/delete_tns_alias.sh -tnsalias=PDBFOO_OCI

# Alias PDBFOO_OCI not found.

# Append new alias : PDBFOO_OCI

# $TNS_ADMIN/tnsnames.ora updated.

# ==============================================================================================
# create service pdbFOO_java on pluggable FOO (db = right)

12h46> srvctl                                \
            add service -service pdbFOO_java \
               -pdb FOO -db right            \
               -role             primary     \
               -policy           automatic   \
               -failovertype     SELECT      \
               -failovermethod   basic       \
               -failoverretry    30          \
               -failoverdelay    1

Connection to srvright01 closed.

12h46> ssh -t srvright01 ". .bash_profile; ~/plescripts/db/create_srv_for_single_db.sh -db=right -pdbName=FOO -role=physical_standby -start=yes"

# ==============================================================================================
# create service pdbFOO_stby_oci on pluggable FOO (db = right).

12h46> srvctl                                    \
            add service -service pdbFOO_stby_oci \
               -pdb FOO -db right                \
               -role           physical_standby  \
               -policy         automatic         \
               -failovertype   select            \
               -failovermethod basic             \
               -failoverretry  20                \
               -failoverdelay  3                 \
               -clbgoal        long              \
               -rlbgoal        throughput

12h46> srvctl start service -service pdbFOO_stby_oci -db right

12h46> ~/plescripts/db/add_tns_alias.sh -service_name=pdbFOO_stby_oci -host_name=srvright01

12h46> /home/oracle/plescripts/db/delete_tns_alias.sh -tnsalias=PDBFOO_STBY_OCI

# Alias PDBFOO_STBY_OCI not found.

# Append new alias : PDBFOO_STBY_OCI

# $TNS_ADMIN/tnsnames.ora updated.

# ==============================================================================================
# create service pdbFOO_stby_java on pluggable FOO (db = right)

12h46> srvctl                                      \
            add service -service pdbFOO_stby_java  \
               -pdb FOO -db right                  \
               -role             physical_standby  \
               -policy           automatic         \
               -failovertype     SELECT            \
               -failovermethod   basic             \
               -failoverretry    30                \
               -failoverdelay    1

12h46> srvctl start service -service pdbFOO_stby_java -db right

Connection to srvright01 closed.

oracle@srvleft01:LEFT:db>

Standby problème 'temporary file'

Il est nécessaire de créer le 'temporary file' pour la PDB foo sur la base standby, voir l'alertlog de la standby :

ALTER PLUGGABLE DATABASE FOO OPEN  /* svc agent *//* {0:0:928} */
Mon Oct 24 12:46:12 2016
Database Characterset for FOO is AL32UTF8
*********************************************************************
WARNING: The following temporary tablespaces in container(FOO)
         contain no files.
         This condition can occur when a backup controlfile has
         been restored.  It may be necessary to add files to these
         tablespaces.  That can be done using the SQL statement:

         ALTER TABLESPACE <tablespace_name> ADD TEMPFILE

         Alternatively, if these temporary tablespaces are no longer
         needed, then they can be dropped.
           Empty temporary tablespace: TEMP
*********************************************************************

Depuis le serveur 'standby' se connecter sur la PDB foo :

oracle@srvright01:RIGHT:~> sqlplus sys/Oracle12@pdbfoo_stby_oci as sysdba

SQL*Plus: Release 12.1.0.2.0 Production on Mon Oct 24 12:57:08 2016

Copyright (c) 1982, 2014, Oracle.  All rights reserved.


Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Advanced Analytics
and Real Application Testing options

SQL> ALTER TABLESPACE TEMP ADD TEMPFILE;

Tablespace altered.

SQL>

Fonctionne car la base est en 'read only'.

Suppression des services

Le script drop_all_services_for_pdb.sh permet de supprimer tous les services associés à un pdb.

Ce script doit être exécuté sur tous les serveurs du cluster dataguard.

Clone this wiki locally