ORA-00059 maximum number of DB_FILES exceeded

2018-11-28

ERROR at line 1:
ORA-00059: maximum number of DB_FILES exceeded

1、创建表空间时错误

CREATE TABLESPACE VIEWER_INVITE_DATA_TS datafile '/data6/oracle/viewer_invite_data_ts_201812_1.dbf' SIZE 512M AUTOEXTEND ON NEXT 256M MAXSIZE UNLIMITED BLOCKSIZE 8K
*

2、show parameter db_files

db_files                             integer     200

alter system set db_files=800 scope=spfile;(pfile/both)

增加数量需要重启
conn /as sysdba
create pfile from spfile;

shutdown immediate

startup

由此可看出db_files值为200,如果数据库中数据文件数达到或超过200,就需要更改该参数了。

现有datafiles数量:

select count(file_name) from dba_data_files;

select count(1) from dba_data_files;

3、更改db_files有两种情况:

  • 如果控制文件中定义的maxdatafiles以及系统允许打开的文件数值大于200,则可以通过alter方式来修改db_files的值
  • 如果控制文件中maxdatafiles值等于200,则需要重建控制文件来修改maxdatafiles值。

4、察看MAXDATAFILES 方法

SQL>alter database backup controlfile to trace;

到$ORACLE_BASE/admin/db_name/udump下面查找最新生成的trc文件

$grep –i MAXDATAFILES boss_ora_4310.trc

MAXDATAFILES 200

系统允许打开文件数可用ulimit –a察看

$ulimit –a

open files                     (-n) 1024

5、oracle 9i 控制文件 maxdatafiles 会自动扩展 ,自动扩展的值不能超过db_files,所以我们在规划数据库时,db_files的值一定要设置比较大。

当使用CREATE DATABASE命令或CREATE CONTROFILE命令,MAXDATAFILES参数决定了控制文件中关于数据文件的大小尺寸——对控制文件的大小也有影响。但是,如果添加一个数据文件时,其编号已经超出了MAXDATAFILES的设定值,但是小于或等于DB_FILES的设定值,控制文件会自动扩展以满足容纳更多的数据文件信息。

有人测试过,得出如下结论: 如果 db_files 足够,每当超过控制文件中的 maxdatafiles,maxdatafiles会翻倍增加(动态增加)。有兴趣可以自己测试一下。

假设,db_files = 600 ,通过trace查看控制文件中的 maxdatafiles =500 ,当数据文件增加到 501个的时候,maxdatafiles 会自动扩展到 500 *2= 1000 ,  我们增加文件数到 601的时候, 系统会因为 db_files=600而报错 ORA-00059: 超过 DB_FILES 的最大值。 我们需要增加 db_files 参数值,不能动态更改,需要重新启动数据库生效。 比如增加到 db_files = 4096, 那么当数据文件增加到 1001 时, 控制文件中的 maxdatafiles 会自动翻倍,增加到 1000 * 2 = 2000,  以此类推, 文件增加到 2001 时,没有超过db_file 4096 , 不会报错,但是控制文件中的 maxdatafiles 会翻倍,增加到 2000*2=4000 个 。

 

6、修改控制文件MAXDATAFILES 200

alter database backup controlfile to trace;

在$ORACLE_BASE/admin/db_name/udump(或者$ORACLE_BASE/diag/rdbms/talk99db/talk99db/trace)目录下新生成的trc文件oracle/admin/boss/udump/boss_ora_4310.trc

根据上述文件创建控制文件生成脚本recreate_control.sql

control_files                        string
/u02/oracle/oradata/talk99db/control01.ctl,
/u02/oracle/fast_recovery_area/talk99db/control02.ctl

SQL>shutdown

mv /u02/oracle/oradata/talk99db/control01.ctl /u02/oracle/oradata/talk99db/control01.ctl.bak

mv /u02/oracle/fast_recovery_area/talk99db/control02.ctl  /u02/oracle/fast_recovery_area/talk99db/control02.ctl.bak

创建新的控制文件

$sqlplus /nolog

SQL>conn / as sysdba

SQL>@~/recreate_control.sql

ORACLE instance started.

RECOVER DATABASE USING BACKUP CONTROLFILE

resetlogs方式启动数据库

SQL> ALTER DATABASE OPEN RESETLOGS;

Database altered

恢复临时表空间

 

SQL> ALTER TABLESPACE TEMP ADD TEMPFILE '/oracle/oradata/boss/temp01.dbf'

2       SIZE 20971520 REUSE AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M;

分类:数据库 | 标签: |

相关日志

评论被关闭!