Accéder aux "tables" X$

Mais quelle idée ? Quel intérêt ?

Les « tables » X$ contiennent les informations relatives à l’instance de base de données, à la session. Leur accès est réservé au compte SYS et pour cause : ces « tables » n’en sont en fait pas, il s’agit de structures mémoires consultables directement, elles ne sont donc pas stockées sur disque et initialisées à chaque démarrage de la base de données.
Comment accède-t-on à leur données ? Généralement au travers des vues dynamiques V_$ ou de leurs synonymes en V$ qui répondent à la pluspart des demandes que peut avoir un DBA. cependant, lors d’un audit par exemple on peut avoir besoin d’accéder aux paramètre cachés de l’instance ou de n’avoir accès qu’à une partie des données fournies par une vue et dès lors préférer les accès directs aux structures X$ plutôt qu’aux vues dynamiques.

Facile me direz-vous : il suffit de se connecter SYS et de faire directement le select …Bande de vilains, il vaut mieux éviter la connexion sys quand elle n’est pas absolument nécessaire, le compte a une capacité de nuisance bien trop importante. Bon alors se connecter SYS et donner le droit de select sur les structures … Impossible, la structure mémoire n’est pas à proprement parler un objet de la base et on ne peut pas « granter select » dessus » :

SQL> grant select on x$ksppsv to scott
  2  /
grant select on x$ksppsv to scott
                *
ERREUR α la ligne 1 :
ORA-02030: une sΘlection n'est autorisΘe que depuis des tables fixes/vues

Reste la solution de créer des vues plus réduites que les V_$… sur ces tables

Le script

Le script suivant, à lancer par SYS (obligatoirement) permet de créer automatiquement toutes ces vues (il en circule plusieurs version sur le net, j’ai repris celui de Steve Adams):

set termout off
clear breaks
clear columns
clear computes
set feed off verify off pages 0 echo off
spool create_xviews.sql
prompt set echo on termout on feed on
select 'create or replace view SYS.V_X$'||substr(name, 3)||
       ' as select * from '||name||';'
from sys.v_$fixed_table
where name like 'X$%';
spool off
@create_xviews.sql
set termout off feed off
host rm -f create_xviews.sql
host del create_xviews.sql

Exemple d’utilisation

Ne reste ensuite qu’à interroger ces vues : Par exemple

set lines 155 pages 1000
col name for a28
col value for a30
col description for a25
col INSTANCE for 99 heading "I#"
SELECT INSTANCE
     , NAME
     , VALUE
--   , DECODE (isdefault, 'TRUE', 'Y', 'N') AS "Default"
--   , DECODE (isem, 'TRUE', 'Y', 'N') AS sesmod
--   , DECODE (isym, 'IMMEDIATE', 'I','DEFERRED', 'D','FALSE', 'N') AS sysmod
--   , DECODE (imod, 'MODIFIED', 'U','SYS_MODIFIED', 'S','N') AS modified
--   , DECODE (iadj, 'TRUE', 'Y', 'N') AS adjusted
--   , description
FROM ( SELECT x.inst_id AS INSTANCE
            , x.indx + 1
            , ksppinm AS NAME
            , ksppity
            , ksppstvl AS VALUE
            , ksppstdf AS isdefault
            , DECODE (BITAND (ksppiflg / 256, 1),1, 'TRUE','FALSE') AS isem
            , DECODE (BITAND (ksppiflg / 65536, 3),1, 'IMMEDIATE',2, 'DEFERRED','FALSE') AS isym
            , DECODE (BITAND (ksppstvf, 7), 1, 'MODIFIED','FALSE') AS imod
            , DECODE (BITAND (ksppstvf, 2), 2, 'TRUE', 'FALSE') AS iadj
            , ksppdesc AS description
      FROM sys.v_x$ksppi x
         , sys.v_x$ksppsv y
      WHERE x.indx = y.indx
        AND ksppstdf != 'TRUE')
ORDER BY NAME;

Qui pourra donner le résultat suivant :

 I# NAME                         VALUE
--- ---------------------------- ------------------------------
  1 audit_file_dest              D:APPADMSRVORACLEADMINORC
                                 LADUMP
  1 audit_trail                  NONE
  1 compatible                   11.2.0.0.0
  1 control_files                D:APPADMSRVORACLEDATAORCL
                                 CONTROL01.CTL, D:APPADMSRV
                                 ORACLEFAST_RECOVERY_AREAORCL
                                 CONTROL02.CTL
  1 db_block_size                8192
  1 __db_cache_size              255852544
  1 db_domain
  1 db_name                      orcl
  1 db_recovery_file_dest        D:appadmsrvoraclefast_reco
                                 very_area
  1 db_recovery_file_dest_size   4322230272
  1 diagnostic_dest              D:APPADMSRVORACLE
  1 dispatchers                  (PROTOCOL=TCP) (SERVICE=orclXD
                                 B)
  1 __java_pool_size             12582912
  1 __large_pool_size            4194304
  1 memory_target                1065353216
  1 open_cursors                 300
  1 __oracle_base                D:appadmsrvoracle
  1 __pga_aggregate_target       369098752
  1 processes                    150
  1 remote_login_passwordfile    EXCLUSIVE
  1 __sga_target                 696254464
  1 __shared_io_pool_size        0
  1 __shared_pool_size           406847488
  1 __streams_pool_size          4194304
  1 undo_tablespace              UNDOTBS1
  1 _4031_sga_dump_interval      3000
26 ligne(s) sΘlectionnΘe(s).
SQL> show user
USER est "SCOTT"

On notera qu’on a ici la présence des paramètres cachés de configuration de la mémoire qui n’apparaitrons pas dans un classique show parameter ou dans un select sur v$parameter