!
!
!
!
!
!
!
!

DBA - l'espace libre offline

 

Régulièrement la question suivante m’est posée : si un fichier est offline, pourquoi Oracle tente de l’utiliser et m’envoie le message :

ORA-00376: file 18 cannot be read at this time

ORA-01110: data file 18: 'L:\DB\IDBA\DATA\P3\FPETIT_TBS2.DAT'

ORA-06512: at line 3

Figure 1 Fichiers offline

Pour y répondre,  analysons la manière dont Oracle gère son espace libre et occupé. Principalement, Oracle analyse les tables UET$ (used extent table)  qui contient la liste des extents occupés ainsi que leurs occupants et FET$ (free extent table)  qui contient la liste des extents libres.

Quand il a besoin d’un extent supplémentaire, Oracle le cherchera dans FET$. S’il le trouve, il l’utilisera. Notez que immédiatement après qu’un fichier ait été mis offline, la liste de ses extents possibles reste répertorié dans FET$, d’ou le message précédent (uniquement une fois). Oracle enlèvera les références aux fichiers offline après la première transaction (échouée, bien sur) qui aura besoin d’extents.

Création du tablespace

SQL> create tablespace petit_tbs datafile

  2        'l:\db\idba\data\p3\fpetit_tbs1.dat' size 64K reuse

  3        default storage (pctincrease 0)

  4        ;

Tablespace created.

SQL> create table petite_table (c1 char(200),c2 char(3))

  2       storage (initial 16k next 16k)

  3       tablespace petit_tbs;

Table created.

SQL> alter tablespace petit_tbs add datafile 'l:\db\idba\data\p3\fpetit_tbs2.dat' size 32k reuse;

Tablespace altered.

SQL> alter tablespace petit_tbs add datafile 'l:\db\idba\data\p3\fpetit_tbs3.dat' size 32k reuse;

Tablespace altered.

SQL>   select ts.name tablespace, vf.name fichier, sum(length) contigus

  2    from fet$ fet, ts$ ts, v$datafile vf

  3    where fet.ts#=ts.ts#

  4       and vf.file# = fet.file#

  5       and ts.name = 'PETIT_TBS'

  6    group by ts.name, vf.name

  7    ;

                                               Blocs                           

                                               libres                           

TABLESPACE FICHIER                             contigus                        

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

PETIT_TBS  L:\DB\IDBA\DATA\P3\FPETIT_TBS1.DAT         5                        

PETIT_TBS  L:\DB\IDBA\DATA\P3\FPETIT_TBS2.DAT         3                        

PETIT_TBS  L:\DB\IDBA\DATA\P3\FPETIT_TBS3.DAT         3                        

 

Figure 2 Création et analyse des trois fichiers qui constituent un tablespace.

Nous remarquons l’existence de trois groups de blocs disponibles dans les trois fichiers. Mettons le deuxième fichier offline

Mise offline du fichier

SQL> alter database datafile 'l:\db\idba\data\p3\fpetit_tbs2.dat' offline;

Database altered.

SQL>   select ts.name tablespace, vf.name fichier, sum(length) contigus

  2    from fet$ fet, ts$ ts, v$datafile vf

  3    where fet.ts#=ts.ts#

  4       and vf.file# = fet.file#

  5       and ts.name = 'PETIT_TBS'

  6    group by ts.name, vf.name

  7    ;

                                               Blocs                           

                                               libres                          

TABLESPACE FICHIER                             contigus                        

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

PETIT_TBS  L:\DB\IDBA\DATA\P3\FPETIT_TBS1.DAT         5                        

PETIT_TBS  L:\DB\IDBA\DATA\P3\FPETIT_TBS2.DAT         3                        

PETIT_TBS  L:\DB\IDBA\DATA\P3\FPETIT_TBS3.DAT         3                        

Figure 3 Mise offline d’un fichier et la surprise

Nous remarquons que après la mise offline Oracle croit toujours qu’il y ait de l’espace disponible dedans.

Remplissage du tablespace

SQL> BEGIN

  2   For I in 1 ..254 LOOP

  3       Insert into petite_table values (RPAD(CHR(I),199,CHR(I)),to_char(i));

  4       Commit;

  5   END LOOP;

  6  END;

  7  /

BEGIN

*

ERROR at line 1:

ORA-00376: file 18 cannot be read at this time

ORA-01110: data file 18: 'L:\DB\IDBA\DATA\P3\FPETIT_TBS2.DAT'

ORA-06512: at line 3

SQL>   select ts.name tablespace, vf.name fichier, sum(length) contigus

  2    from fet$ fet, ts$ ts, v$datafile vf

  3    where fet.ts#=ts.ts#

  4       and vf.file# = fet.file#

  5       and ts.name = 'PETIT_TBS'

  6    group by ts.name, vf.name

  7    ;

                                               Blocs                           

                                               libres                          

TABLESPACE FICHIER                             contigus                        

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

PETIT_TBS  L:\DB\IDBA\DATA\P3\FPETIT_TBS1.DAT         5                        

PETIT_TBS  L:\DB\IDBA\DATA\P3\FPETIT_TBS3.DAT         3                        

 

Figure 4 Après un échec, Oracle a enlevé la référence aux blocs du fichier offline

 

 

 


Copyright © 1998-2002 Radu Caulea, TAFORA MAJ 20/04/2006 !
Commentaires et suggestions radu[CHEZ]tafora.fr