Gostaríamos de apresentar a versatilidade que o SQL*Plus tem de gerenciar as tablespaces e datafiles através de scripts. Da mesma forma com o Oracle é relacional para manipular as informações e dados contidos nele, ele também é relacional para dar resposta sobre todos os aspectos referentes à administração de banco de dados. Esse conhecimento é essencial quando não dispomos de ferramenta gráfica como o Entreprise Manager ou PL/SQL Developer. Devemos ter em mente que quando solicitamos uma informação a uma ferramenta gráfica sobre o banco de dados esta seguramente fará uma consulta ao dicionário de dados.

Portanto um bom DBA Oracle, quando quiser conhecer o comportamento e os elementos de um banco de dados Oracle, deverá saber a melhor forma de “coletar” informações. Para isso é necessário um conhecimento profundo do dicionário de dados http://download.oracle.com/docs/cd/B19306_01/server.102/b14220/datadict.htm#i2112 que é um conjunto de tabelas (read-only) e views que provêem informações sobre o banco de dados.

Na prática, o bom DBA deverá saber “disparar” instruções SELECT´s contra o dicionário de dados para conhecer o comportamento e os elementos de um banco de dados. O SQL*Plus nos dá a possibilidade, através de scripts, de combinarmos comandos de ambiente de SQL*Plus e instruções SELECT´s para montarmos consultas poderosas, úteis para a administração de banco de dados. Neste artigo, apresentaremos dois scripts que apresentarão informações sobre as tablepaces e datafiles através do dicionário de dados.

Grosseiramente podemos diferenciar datafiles e tablespaces como organizações físicas e organizações lógicas respectivamente do banco de dados Oracle. Uma tablespace(lógica) tem ao menos um datafiles(físico) associado a ela. Não existe tablespace sem datafiles.

tablespaces.sql

 

A seguinte sequência de comandos formará o primeiro script. A sugestão de nome é tablespaces.sql. Use o editor de texto de preferência, crie um arquivo tablespaces.sql e em seguida cole a sequência de comandos apresentados. O scripts será acionado da seguinte maneira SQL>[caminho]@tablespaces  a partir do prompt do SQL*Plus.

 

COL tablespace_name          FORMAT A20         HEADING "Tablespace"

COL pct_used                 FORMAT 990.00      HEADING "%Used"

COL TS#                      FORMAT 99          HEADING "#"

COL SIZE_MB                  FORMAT 999,990.00  HEADING "Size(Mb)"  

COL USED_MB                  FORMAT 999,990.00  HEADING "Used(Mb)"  

COL FREE_MB                  FORMAT 999,990.00  HEADING "Free (Mb)"  

col ideal_size               FORMAT 999,990.00  HEADING "Ideal|Size"  

 

SET PAGESIZE 100 LINES 130 HEaDING on FEED OFF NULL ''

break on report ON contents SKIP 1

 

SELECT

    a.contents

   ,TS#

   ,a.tablespace_name

   ,b.bytes/(1024*1024) size_mb

   ,(b.bytes - nvl(c.free_bytes,0))/(1024*1024) USED_MB

   ,(nvl(c.free_bytes,0))/(1024*1024) FREE_MB

   ,(((b.bytes-nvl(c.free_bytes,0))/(1024*1024))*100)/(b.bytes/(1024*1024)) pct_used

FROM

    DBA_TABLESPACES A,

    (SELECT tablespace_name, sum(bytes) bytes

       FROM dba_data_files

      group by tablespace_name

     UNION

     SELECT tablespace_name, sum(bytes) bytes

       FROM dba_TEMP_files

      group by tablespace_name) B,

    (SELECT TABLESPACE_NAME,SUM(BYTES) free_bytes

       FROM dba_free_space

      GROUP BY TABLESPACE_NAME

     UNION

     SELECT tablespace_name, sum(bytes_free) free_bytes

       FROM v$temp_space_header

      GROUP BY tablespace_namE) C,

    V$TABLESPACE D

WHERE

    a.tablespace_name = b.tablespace_name

and a.tablespace_name = c.tablespace_name(+)

AND a.tablespace_name = D.NAME

ORDER BY

    a.contents , TS#

/

 

PROMPT

PROMPT. @tablespaces     @datafiles

PROMPT

 

 

O resultado da execução do script será algo parecido com:

 

SQL>@tablespaces

 

CONTENTS    # Tablespace              Size(Mb)    Used(Mb)   Free (Mb)   %Used

--------- --- -------------------- ----------- ----------- ----------- -------

PERMANENT   0 SYSTEM                  1,024.00      548.63      475.38   53.58

            2 SYSAUX                  1,024.00      428.44      595.56   41.84

            4 USERS                   1,000.00      406.31      593.69   40.63

            5 DAT01                  15,000.00   10,179.50    4,820.50   67.86

            6 DAT02                  10,000.00    1,854.06    8,145.94   18.54

            7 DAT03                  30,240.00   18,106.94   12,133.06   59.88

            8 DAT04                   6,000.00      681.81    5,318.19   11.36

            9 DAT05                  10,000.00    6,914.00    3,086.00   69.14

 

TEMPORARY   3 TEMP                    5,120.00    1,703.00    3,417.00   33.26

 

UNDO        1 UNDOTBS1               30,000.00       65.88   29,934.13    0.22

 

*********                          ----------- ----------- -----------

Total Use                           109,408.00   40,888.56   68,519.44

 

. @tablespaces.sql     @datafiles

 

 

As colunas apresentadas informam o seguinte :

 

Colunas

Descrição

Contents

Tipo de tablespace

#

Identificação numérica da tablespace

Tablespace

Nome tablespace

Size(Mb)

Tamanho tablespace

Used(Mb)

Espaço utilizado da tablespace

Free(MB)

Espaço disponível

%Used

Porcentagem de utilização

 

As totalizações são úteis para que tenhamos uma noção de tamanho, espaço utilizado e espaço disponível de todo o banco de dados.

 

datafiles.sql

 

A seguinte sequência de comandos formará o segundo script. A sugestão de nome é datafiles.sql. Use o editor de texto de preferência, crie um arquivo datafiles.sql e em seguida cole a sequência de comandos apresentados. O scripts será acionado da seguinte maneira SQL>[caminho]@datafiles  a partir do prompt do SQL*Plus.

COL TS#             FORMAT 99     

col FILE_ID         format 99      HEADING "DF#"

col file_name       format a60                            truncated      

COL BYTES           format 99,990   heading "Size|(Mb)"

col autoextensible  format a4      heading "Auto|Ext?"

col INCREMENT_BY    FORMAT 999,990 heading "Next|(Kb)"

COL MAXBYTES        FORMAT 99,990  heading "MaxSize|(Mb)"

 

set line 1000 PAGES 40 feed off

 

break ON TYPE_FILE on TS#

 

select

    TS#,

    FILE_ID ,

    f.file_name,

    f.BYTES,

    f.autoextensible,

    (f.INCREMENT_BY * (SELECT VALUE FROM V$PARAMETER WHERE NAME='db_block_size')) /1024 INCREMENT_BY,

    f.MAXBYTES

from

    v$tablespace v$ts,

    (

     select

         dt.TABLESPACE_NAME        ,

         dt.file_name,

         round(dt.BYTES/(1024*1024),2) BYTES,

         dt.autoextensible,

         round(dt.MAXBYTES/(1024*1024),2) MAXBYTES

         ,dt.FILE_ID

         ,'PERM' TYPE_FILE

         ,dt.INCREMENT_BY

         ,dt$.STATUS,

         dt$.ENABLED

     from

         dba_data_files dt,

         v$datafile dt$

     where dt.file_name = dt$.NAME

     union

     select

         tf.TABLESPACE_NAME,

         tf.FILE_NAME,

         round(tf.BYTES/(1024*1024),2) BYTES,

         tf.AUTOEXTENSIBLE,

         round(tf.MAXBYTES/(1024*1024),2) MAXBYTES

         ,tf.FILE_ID

         ,'TEMP' TYPE_FILE

         ,tf.INCREMENT_BY

         ,tf$.STATUS

         ,tf$.ENABLED

     from

         dba_TEMP_files tf

         ,v$tempfile tf$

     where tf.file_name = tf$.NAME

    )f

where

    f.tablespace_name(+) = v$ts.NAME

order by

    DECODE(f.TYPE_FILE,

               'PERM',1,

               'TEMP',2),

    v$ts.TS#,

    f.FILE_ID 

 

/

 

prompt

prompt.    @datafiles   @tablespaces

prompt

 

 

 

O resultado da execução do script será algo parecido com:

 

SQL> @datafiles

 

                                                       Size Auto     Next MaxSize

  # DF# FILE_NAME                                      (Mb) Ext?     (Kb)    (Mb)

--- --- ------------------------------------------- ------- ---- -------- -------

  0   1 /oracle/oradata/salmao/system01.dbf           1,024 YES    10,240  32,768

  1   2 /oracle/oradata/salmao/undotbs01.dbf         10,000 YES     5,120  32,768

     10 /oracle/datafiles/salmao/undotbs01_01.dbf    20,000 NO          0       0

  2   3 /oracle/oradata/salmao/sysaux01.dbf           1,024 YES    10,240  32,768

  4   4 /oracle/oradata/salmao/users01.dbf            1,000 YES     1,280  32,768

  5   5 /oracle/oradata/salmao/tbs_dat01.dbf         15,000 NO          0       0

  6   6 /oracle/oradata/salmao/tbs_dat02.dbf         10,000 NO          0       0

  7   7 /oracle/datafiles/salmao/tbs_dat03.dbf       20,000 NO          0       0

     11 /oracle/oradata/salmao/tbs_dat03_01.dbf      10,240 NO          0       0

  8   8 /oracle/oradata/salmao/tbs_dat04.dbf          6,000 NO          0       0

  9   9 /oracle/oradata/salmao/tbs_dat05.dbf         10,000 YES         8   1,024

  3   1 /oracle/oradata/salmao/temp01.dbf             5,120 YES       640  32,768

 

.    @datafiles   @tablespaces

 

As colunas apresentadas informam o seguinte :

 

Colunas

Descrição

#

Identificação numérica da tablespace formada pelo(s) datafile(s)

DF#

Identificação numérica do datafile

Size(Mb)

Tamanho do datafile

Auto Ext?

Indica se o datafile é auto-incrementável ou não

Next(MB)

Qual tamanho do incremento o datafile receberá quando necessário

MaxSize(MB)

Tamanho máximo permitido para o datafile

 

Observações:

 

·         Os datafiles sem auto-incremento tem os valores next e maxsize zerados

·         Os datafiles com a propriedade maxsize ilimitados apresentam o valor 32,768

·         No exemplo percebemos que os datafiles de identificação 2 e 10 formam o tablespace de identificação 1(undotbs1)

·         No exemplo percebemos que os datafiles de identificação 7 e 11 formam o tablespace de identificação 7(dat03)

 

Espero que essas informações lhes sejam úteis quando precisarem obter informações de tablespace e datafile na ausência de ferramentas gráficas. Lembramos que todas as informações sobre o comportamento e os aspectos físicos do banco de dados Oracle podem ser obtidos através de consultas no dicionário de dados, basta pesquisar e aprender a usá-la!

 

Até o próximo artigo!