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> alter database backup controlfile to trace as '/tmp/controlfile.sql';
Database altered.
SQL> 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> 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> RECOVER DATABASE;
ORA-00283: recovery session canceled due to errors
ORA-00264: no recovery required
SQL> ALTER DATABASE OPEN;
Database altered.
SQL> 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> 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> 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> 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.
SQL> create tablespace tbs01 datafile '/oradata/BD01/tbs01.dbf' size 10M;
Tablespace created.
SQL> create tablespace tbs02 datafile '/oradata/BD01/tbs02.dbf' size 10M;
Tablespace created.
SQL> 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> alter system set db_files=200 scope=spfile;
System altered.
SQL> 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> 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> 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
Nenhum comentário:
Postar um comentário