![]() |
|||||||||||||||||||||||||||||||||||||||||||||
|
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
|
||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||