Canalblog
Editer l'article Suivre ce blog Administration + Créer mon blog
Publicité
Blog d'un DBA sur le SGBD Oracle et SQL
9 novembre 2020

RMAN : identifier si on est connecté au CDB ou à une PDB - RMAN: identify if you are connected to the CDB or to a PDB

 

Introduction
Quand vous êtes dans RMAN connecté à une base multi-tenants, vous vous posez parfois la question : je suis dans le CDB$ROOT ou dans une PDB? Si oui, dans quelle PDB? C'est très important à savoir avant de lancer une commande BACKUP ou RESTORE. Et, subtilité, comment vérifier ces infos à la connexion mais aussi après avoir lancé des commandes qui ont fait disparaître le haut de mon terminal et donc ces infos de connexion?

La question vous semble curieuse? Si je me connecte à RMAN, je dois savoir où je suis puisque je dois utiliser un nom de service! Eh bien non, je peux très bien lancer un programme dont le code est inaccessible et qui va me connecter à RMAN sans que je sache où je suis, d'où la nécessité de cette vérification. En plus on peut très bien utiliser des noms de service pour se connecter qui sont différents du nom de la base et donc ceux-ci ne nous aident en rien.

Bref, pour éviter des bêtises, nous allons voir comment trouver ces infos sous RMAN en utilisant plusieurs moyens : le DBID, le nom de la base, le nom des tablespaces, les chemins absolus du système d'exploitation...

 



Points d'attention
N/A.




Base de tests
Une base Oracle 18c multi-tenants. 




Exemples

============================================================================================
SHOW CON_NAME ne fonctionne pas sous RMAN
============================================================================================
Les commandes SHOW CON_NAME et SHOW CON_ID sont des commandes permettant sous SQL*Plus d'avoir le nom et l'id du container dans lequel nous nous trouvons si nous sommes en Oracle 12, que la base soit en architecture multi-tenants ou non. Malheureusement, impossible sous RMAN d'utiliser ces commandes qui vous disent de suite si vous êtes dans le CDB$ROOT ou ailleurs... il va falloir se débrouiller autrement.

Exemple sous SQL*Plus
     [oracle@vbgeneric ~]$ sqlplus SYS/oracle@orcl12c AS SYSDBA
     SQL> show con_name
     CON_NAME
     ------------------------------
     CDB$ROOT

Si je me mets sous RMAN, je peux lancer des commandes SQL, SQL*Plus ou du système d'exploitation mais pas les commandes SHOW de SQL*Plus... dommage.
Commande SQL
     RMAN> select count(*) from dba_users;
     COUNT(*)
     ----------
     36

Commande SQL*Plus (pas besoin de caractère terminal)
     RMAN> desc dual
     Name Null?      Type
     --------------------- -------
     DUMMY           VARCHAR2(1)

Commande du système d'exploitation.

     RMAN> host "pwd";
     /home/oracle
     host command complete

Mais pas de raccourci SHOW CON_NAME dans RMAN, certainement parce que SHOW est déjà une commande RMAN et que celle-ci prend le pas sur celle de SQL*Plus.
Exemple de SHOW sous RMAN qui fonctionne.
     RMAN> show CONTROLFILE AUTOBACKUP;

     RMAN configuration parameters for database with db_unique_name ORCL12C are:
     CONFIGURE CONTROLFILE AUTOBACKUP ON; # default

SHOW CON_NAME échoue, quelle que soit la syntaxe employée : quotes, guillemets, mot clé sql, pas de signes...
     RMAN> show con_name

     RMAN-00571: ===========================================================
     RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
     RMAN-00571: ===========================================================
     RMAN-00558: error encountered while parsing input commands
     RMAN-01009: syntax error: found "identifier": expecting one of: "all, archivelog, auxiliary, auxname, backup, channel, compression,   controlfile, datafile, db_unique_name, default, device, encryption, exclude, incremental, maxsetsize, retention, snapshot, "
     RMAN-01008: the bad identifier was: con_name
     RMAN-01007: at line 1 column 6 file: standard input

     RMAN> sql "show con_name";

     sql statement: show con_name
     RMAN-00571: ===========================================================
     RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
     RMAN-00571: ===========================================================
     RMAN-03009: failure of sql command on default channel at 11/08/2020 09:39:05
     RMAN-11003: failure during parse/execution of SQL statement: show con_name
     ORA-00900: invalid SQL statement

     RMAN> sql 'show con_name';
     sql statement: show con_name
     RMAN-00571: ===========================================================
     RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
     RMAN-00571: ===========================================================
     RMAN-03009: failure of sql command on default channel at 11/08/2020 09:42:30
     RMAN-11003: failure during parse/execution of SQL statement: show con_name
     ORA-00900: invalid SQL statement

     RMAN> show 'con_name';

     RMAN-00571: ===========================================================
     RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
     RMAN-00571: ===========================================================
     RMAN-00558: error encountered while parsing input commands
     RMAN-01009: syntax error: found "single-quoted-string": expecting one of: "all, archivelog, auxiliary, auxname, backup, channel, compression, controlfile, datafile, db_unique_name, default, device, encryption, exclude, incremental, maxsetsize, retention, snapshot, "
     RMAN-01007: at line 1 column 6 file: standard input

Il faut donc se débrouiller autrement :-)

============================================================================================
Identifier si je suis connecté au CDB$ROOT
============================================================================================
Une bonne pratique sous RMAN est de récupérer avant ou après la connexion le nom et le DBID du CDB$ROOT et des PDBs, car, pour certaines opérations, ce DBID est requis. Pour cela on interroge V$DATABASE et DBA_PDBS.
     SQL> select v.name AS "Database Name", v.dbid AS "Database DBID", p.pdb_name AS "PDB Name", p.dbid AS "PDB DBID" from v$database v,      dba_pdbs p order by 1, 4;
     Database  Database DBID   PDB Name   PDB DBID
     --------- ------------- -----------------------
     ORCL12C   768045447       PDB$SEED   1016842785
     ORCL12C   768045447       ORCL       2846920952

Identifier où je suis à la connexion
Je me connecte avec le service orcl12c du CDB$ROOT.

Sur la ligne "connected to target database: ORCL12C (DBID=768045447)" il y a un seul nom de base, ORCL12C, ce qui montre qu'on est dans le CDB$ROOT et le DBID est celui de V$DATABASE donc celui du CDB$ROOT. C'est simple, même pas besoin de connaître le nom de la base et son DBID, il suffit de voir qu'il y a un nom de base et un seul d'affiché.

     [oracle@vbgeneric ~]$ rman target SYS/oracle@orcl12c
     Recovery Manager: Release 12.2.0.1.0 - Production on Fri Nov 6 09:03:03 2020
     Copyright (c) 1982, 2017, Oracle and/or its affiliates. All rights reserved.
     connected to target database: ORCL12C (DBID=768045447)

Identifier où je suis après la connexion
Imaginons maintenant que vous n'ayez plus d'affichés le DBID et le nom de la base lors de la connexion car votre terminal a effacé ces infos suite aux commandes lancées, comment faire? On va utliser REPORT SCHEMA, avec cette commande RMAN liste la structure de la base courante (tablespaces, datafiles...) et, si on voit PDB$SEED dans la colonne Tablespace ou pdbseed comme nom de répertoire, c'est qu'on est dans le CDB$ROOT. Quant au nom de la base CDB$ROOT, c'est le nom du répertoire avant le répertoire pdbseed dans le chemin menant aux fichiers .dbf., donc orcl12c ici.

Attention, ne vous fiez pas à la ligne "Report of database schema for database with db_unique_name ORCL12C" car cette ligne est identique que l'on soit dans le CDB$ROOT ou dans une PDB.
     RMAN> report schema;
     Report of database schema for database with db_unique_name ORCL12C

     List of Permanent Datafiles
     ===========================
     File Size(MB) Tablespace RB segs Datafile Name
     ---- -------- -------------------- ------- ------------------------
     1 800 SYSTEM YES /u01/app/oracle/oradata/orcl12c/system01.dbf
     3 470 SYSAUX NO /u01/app/oracle/oradata/orcl12c/sysaux01.dbf
     5 250 PDB$SEED:SYSTEM NO /u01/app/oracle/oradata/orcl12c/pdbseed/system01.dbf
     6 330 PDB$SEED:SYSAUX NO /u01/app/oracle/oradata/orcl12c/pdbseed/sysaux01.dbf
     7 5 USERS NO /u01/app/oracle/oradata/orcl12c/users01.dbf
     8 100 PDB$SEED:UNDOTBS1 NO /u01/app/oracle/oradata/orcl12c/pdbseed/undotbs01.dbf
     9 340 ORCL:SYSTEM YES /u01/app/oracle/oradata/orcl12c/orcl/system01.dbf
     10 1150 ORCL:SYSAUX NO /u01/app/oracle/oradata/orcl12c/orcl/sysaux01.dbf
     11 460 ORCL:UNDOTBS1 YES /u01/app/oracle/oradata/orcl12c/orcl/undotbs01.dbf
     12 73 ORCL:USERS NO /u01/app/oracle/oradata/orcl12c/orcl/users01.dbf
     13 7 ORCL:APEX_1991375173370654 NO /u01/app/oracle/oradata/orcl12c/orcl/APEX_1991375173370654.dbf
     14 2 ORCL:APEX_1993195660370985 NO /u01/app/oracle/oradata/orcl12c/orcl/APEX_1993195660370985.dbf
     15 50 UNDOTBS2 YES /u01/app/oracle/oradata/orcl12c/undotbs2.dbf

     List of Temporary Files
     =======================
     File Size(MB) Tablespace Maxsize(MB) Tempfile Name
     ---- -------- -------------------- ----------- --------------------
     1 33 TEMP 32767 /u01/app/oracle/oradata/orcl12c/temp01.dbf
     2 64 PDB$SEED:TEMP 32767 /u01/app/oracle/oradata/orcl12c/pdbseed/temp012017-03-02_07-53-20-031-AM.dbf
     3 64 ORCL:TEMP 32767 /u01/app/oracle/oradata/orcl12c/orcl/temp01.dbf

============================================================================================
Identifier si je suis connecté à une PDB
============================================================================================
Identifier où je suis à la connexion
Je me connecte avec le service orcl qui est celui d'une PDB.

On peut vérifier si le DBID listé est dans V$DATABASE (pur le CDB$ROOT) ou dans DBA_PDBS (pour une PDB). On peut aussi voir si oracle affiche deux noms de base à la conenxion, celui du CDB$ROOT et celui d'une PDB sous la forme CDB$ROOT:PDB; d
ans la ligne "connected to target database: ORCL12C:ORCL (DBID=2846920952)" on voit deux noms de base accolés, ORCL12C:ORCL, cela signifie que je suis dans la PDB de nom ORCL du CDB$ROOT de nom ORCL12C.
     [oracle@vbgeneric ~]$ rman target SYS/oracle@orcl
     Recovery Manager: Release 12.2.0.1.0 - Production on Fri Nov 6 09:07:22 2020
     Copyright (c) 1982, 2017, Oracle and/or its affiliates. All rights reserved.
     connected to target database: ORCL12C:ORCL (DBID=2846920952)

Identifier où je suis après la connexion

Si à nouveau mes commandes ont rendu invisibles les infos à la conenxion, on utilise alors la commande REPORT SCHEMA. Si on est dans une PDB, Oracle affiche les infos de seulement la PDB et donc il n'y a pas le mot clé PDB$SEED: préfixant le nom des tablespaces, idem dans le nom des répertoires, pdbseed est absent; en outre le fichier system01.dbf se trouve dans un sous-répertoire du répertoire du CDB$ROOT identifié ci-dessus : orcl dans notre cas.

Attention au piège, la ligne "Report of database schema for database with db_unique_name" est idendique que l'on soit dans le CDB$ROOT ou dans une PDB; le nom affiché est toujours celui du CDB$ROOT.
     RMAN> report schema;
     Report of database schema for database with db_unique_name ORCL12C

     List of Permanent Datafiles

     ===========================
     File Size(MB) Tablespace RB segs Datafile Name
     ---- -------- -------------------- ------- ------------------------
     9 340 SYSTEM NO /u01/app/oracle/oradata/orcl12c/orcl/system01.dbf
     10 1150 SYSAUX NO /u01/app/oracle/oradata/orcl12c/orcl/sysaux01.dbf
     11 460 UNDOTBS1 NO /u01/app/oracle/oradata/orcl12c/orcl/undotbs01.dbf
     12 73 USERS NO /u01/app/oracle/oradata/orcl12c/orcl/users01.dbf
     13 7 APEX_1991375173370654 NO /u01/app/oracle/oradata/orcl12c/orcl/APEX_1991375173370654.dbf
     14 2 APEX_1993195660370985 NO /u01/app/oracle/oradata/orcl12c/orcl/APEX_1993195660370985.dbf

     List of Temporary Files

     =======================
     File Size(MB) Tablespace Maxsize(MB) Tempfile Name
     ---- -------- -------------------- ----------- --------------------
     3 64 TEMP 32767 /u01/app/oracle/oradata/orcl12c/orcl/temp01.dbf

A partir de ces infos, on récupère le nom de la PDB qui est le nom du dernier répertoire dans le chemin menant aux fichiers .dbf : orcl ici. 
Et on fait un SELECT dans DBA_PDBS pour récupérer le DBID en filtrant sur le nom de la PDB qu'on vient d'identifier.
     SQL> select pdb_name, dbid from dba_pdbs where pdb_name = 'ORCL' order by 1;
     PDB_NAME DBID
     ----------------------------
     ORCL 2846920952

Si je suis connecté à une PDB et que je veux des infos sur le CDB$ROOT, je fais un SELECT dans V$DATABASE.

     SQL> select name, dbid from v$database;
     NAME DBID
     --------- ----------
     ORCL12C 768045447

 

Publicité
Publicité
Commentaires
Blog d'un DBA sur le SGBD Oracle et SQL
Publicité
Archives
Blog d'un DBA sur le SGBD Oracle et SQL
  • Blog d'un administrateur de bases de données Oracle sur le SGBD Oracle et sur les langages SQL et PL/SQL. Mon objectif est de vous faire découvrir des subtilités de ce logiciel, des astuces, voir même des surprises :-)
  • Accueil du blog
  • Créer un blog avec CanalBlog
Visiteurs
Depuis la création 339 403
Publicité