Abordando o erro ORA-00059: maximum number of DB_FILES exceeded
Autor: Eduardo Legatti | Publicado: 2016-11-07T11:06:00-02:00

Olá,


 Por padrão, quando criamos um banco de dados no Oracle, o número máximo de arquivos de dados (datafiles) que o mesmo pode suportar é 100. Essa informação fica armazenada no arquivo de controle (control file). Até o Oracle 8 quando esse limite era atingido o erro "ORA-1118: cannot add any more data files: limit of % exceeded" era emitido informando que não era mais possível adicionar novos datafiles. Para corrigir esse problema o control file deveria ser recriado de forma que o valor MAXDATAFILES fosse incrementado. A partir do Oracle 8i foi eliminado a necessidade de recriação do control file, bastando apenas setar o parâmetro de inicialização DB_FILES (valor padrão é 200) com um novo valor. Neste caso, o control file se expandirá automaticamente para acomodar novos registros dentro de suas seções. Vale a pena salientar que este parâmetro não é dinâmico, ou seja, o banco de dados precisa ser reinicializado após a alteração no mesmo. Caso o valor de DB_FILES seja atingido, o erro "ORA-00059: maximum number of DB_FILES exceeded" será emitido. Para simular o erro ORA-00059, irei recriar o control file setando MAXDATAFILES com um valor menor, bem como o parâmetro DB_FILES. Portanto, segue abaixo uma simulação.

$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.3.0 Production on Mon Nov 7 10:06:11 2016

Copyright (c) 1982, 2011, Oracle.  All rights reserved.

Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production
With the Partitioning option

SQL&gt; alter database backup controlfile to trace as '/tmp/controlfile.sql';

Database altered.

SQL&gt; STARTUP NOMOUNT;
ORACLE instance started.

Total System Global Area  627732480 bytes
Fixed Size                  1346756 bytes
Variable Size             117441340 bytes
Database Buffers          503316480 bytes
Redo Buffers                5627904 bytes
SQL&gt; CREATE CONTROLFILE REUSE DATABASE "BD01" NORESETLOGS  ARCHIVELOG
  2      MAXLOGFILES 16
  3      MAXLOGMEMBERS 3
  4      MAXDATAFILES 5
  5      MAXINSTANCES 8
  6      MAXLOGHISTORY 292
  7  LOGFILE
  8    GROUP 1 '/oradata/BD01/redo01.log'  SIZE 50M BLOCKSIZE 512,
  9    GROUP 2 '/oradata/BD01/redo02.log'  SIZE 50M BLOCKSIZE 512,
 10    GROUP 3 '/oradata/BD01/redo03.log'  SIZE 50M BLOCKSIZE 512
 11  DATAFILE
 12    '/oradata/BD01/system01.dbf',
 13    '/oradata/BD01/sysaux01.dbf',
 14    '/oradata/BD01/undotbs01.dbf',
 15    '/oradata/BD01/users01.dbf'
 16  CHARACTER SET WE8MSWIN1252;

Control file created.

SQL&gt; RECOVER DATABASE;
ORA-00283: recovery session canceled due to errors
ORA-00264: no recovery required

SQL&gt; ALTER DATABASE OPEN;

Database altered.

SQL&gt; ALTER TABLESPACE TEMP ADD TEMPFILE '/oradata/BD01/temp01.dbf' SIZE 20971520  REUSE AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M;

Tablespace altered.



Como demonstrado acima, eu recriei o control file com o valor de MAXDATAFILES igual a 5. Logo abaixo irei setar o valor de DB_FILES para 6.

SQL&gt; show parameter db_files;

NAME                                 TYPE        VALUE
------------------------------------ ----------- -----------------
db_files                             integer     6

 

 Realizando uma consulta na view dinâmica de desempenho V$CONTROLFILE_RECORD_SECTION abaixo é possível notar que a seção DATAFILE comporta no máximo 5 registros e que atualmente existem 4 registros em uso. Este valor bate com o número de datafiles existentes no banco de dados conforme demonstrado pela view DBA_DATA_FILES.

SQL&gt; select type, record_size, records_total, records_used
  2    from v$controlfile_record_section
  3   where type = 'DATAFILE';

TYPE                         RECORD_SIZE RECORDS_TOTAL RECORDS_USED
---------------------------- ----------- ------------- ------------
DATAFILE                             520             5            4

SQL&gt; select count(*) from dba_data_files;

  COUNT(*)
----------
         4



 Agora irei simular a criação de arquivos de dados no banco de dados conforme a seguir.&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 

SQL&gt; create tablespace tbs01 datafile '/oradata/BD01/tbs01.dbf' size 10M;

Tablespace created.

SQL&gt; create tablespace tbs02 datafile '/oradata/BD01/tbs02.dbf' size 10M;

Tablespace created.

SQL&gt; create tablespace tbs03 datafile '/oradata/BD01/tbs03.dbf' size 10M;
create tablespace tbs03 datafile '/oradata/BD01/tbs03.dbf' size 10M
*
ERROR at line 1:
ORA-00059: maximum number of DB_FILES exceeded

 

 É possível perceber que na criação da tablespace TBS03 o erro ORA-00059 foi emitido, ou seja, o control file tentou se expandir para acomodar o novo datafile, mas foi impedido pela limitação do parâmetro DB_FILES que está setado para 6. Para resolver o problema, irei aumentar o valor do mesmo e reinicializar a instância.

SQL&gt; alter system set db_files=200 scope=spfile;

System altered.

SQL&gt; startup force;
ORACLE instance started.

Total System Global Area  627732480 bytes
Fixed Size                  1346756 bytes
Variable Size             117441340 bytes
Database Buffers          503316480 bytes
Redo Buffers                5627904 bytes
Database mounted.
Database opened.



 Após a alteração do parâmetro DB_FILES e reinicialização da instância, irei tentar criar novamente a tablespace TBS03.

SQL&gt; create tablespace tbs03 datafile '/oradata/BD01/tbs03.dbf' size 10M;

Tablespace created.

 

 Pronto. É possível verificar que o control file foi expandido para acomodar mais registros.

SQL&gt; select type, record_size, records_total, records_used
  2    from v$controlfile_record_section
  3   where type = 'DATAFILE';

TYPE                         RECORD_SIZE RECORDS_TOTAL RECORDS_USED
---------------------------- ----------- ------------- ------------
DATAFILE                             520            35            7

 

 Para finalizar, segue abaixo um trecho do arquivo de alerta da instância mostrando que a seção 4 do control file foi expandida para acomodar novos registros.

Mon Nov 7 10:21:51 2016
create tablespace tbs03 datafile '/oradata/BD01/tbs03.dbf' size 10M
Expanded controlfile section 4 from 5 to 35 records
Requested to grow by 30 records; added 1 blocks of records
Completed: create tablespace tbs03 datafile '/oradata/BD01/tbs03.dbf' size 10M