ORA-00059错误分析以及MAXDATAFILES、DB_FILES参数修改
1. 问题描述
本文的环境为:
OS: AIX 6.1
DB: oracle 10.2.0.5 rac
在扩表空间的容量,增加数据文件时,报了ORA-00059:达到最大的文件数量,错误的描述如下:
alter tablespace p_data_low add datafile '/dev/rora_p_data_31_l' size 25580m
*
ERROR at line 1:
ORA-00059: maximum number of DB_FILES exceeded
[@more@]
2.问题分析
2.1 使用oerr工具,查询一下导致该错误的原因和解决该问题的简单描述,如下:
$ oerr ora 00059
00059, 00000, "maximum number of DB_FILES exceeded"
// *Cause:The value of the DB_FILES initialization parameter was exceeded.
// *Action: Increase the value of the DB_FILES parameter and warm start.
2.2 检查数据库的DB_FILES参数设置,本例为DB_FILES=200 ,如下:
SQL> show parameter db_files
NAMETYPEVALUE
------------------------------------ ----------- ------------------------------
db_filesinteger200
2.3 统计数据库数据文件的数量,可以看到数据库数据文件的数量已经达到了参数DB_FILES设置的200阀值,如下:
SQL> select count(1) from v$datafile;
COUNT(1)
----------
200
ORACLE 通过两个参数来限制数据文件的数量,分别为MAXDATAFILES和DB_FILES.
MAXDATAFILES 是在控制文件创建的时候设置的,并且保存在控制文件中,oracle 10G RAC该参数的缺省设置为1024,
如果要修改这个参数,则需要通过重新建立控制文件来完成,该参数被称为'hard limit';
DB_FILES 是在spfile或者init{SID}.ora文件中设置的,可以被手工修改,重启数据库后就生效,被成为'soft limit';
各个操作系统和数据库版本的MAXDATAFILES最大限制值如下:
V78.0.58.1.69.210.110.2
-------- -------- ------ -------- -------- --------
UNIXPer TS10221022102210221022
Per DB 10226553665536655346533465334
VMSPer TS1022---1022
Per DB 102265536-65334
WINDOWS Per TS10221022
Per DB 10226553665536655346533465334
增加MAXDATAFILES参数,将增加控制文件的大小。所以需要加以限制。
当达到MAXDATAFILES阀值时,只要磁盘空间允许,控制文件将自动扩展.
增加DB_FILES参数,将增加了PGA的开销(增加了每个连接数据库的用户的PGA开销)。
3. 问题解决
3.1 查询控制文件中MAXDATAFILES参数的设定值。
先将控制文件的创建信息导出到dump文件中,在dump文件中可以查找到该参数的设定值。
SQL>alter database backup control file to trace;
SQL>host
$cd $ORACLE_BASE/admin/{ORACLE_SID}/udump
$ls -lt|more
$ ls -lt
total 312
-rw-r-----1 oracleoinstall17404 Jan 18 10:43 jlzdh1_ora_7274760.trc
-rw-r-----1 oracleoinstall858 Jan 18 10:26 jlzdh1_ora_7471420.trc
......
$more ./jlzdh1_ora_7274760.trc
......
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "JLZDH" RESETLOGSNOARCHIVELOG
MAXLOGFILES 192
MAXLOGMEMBERS 3
MAXDATAFILES 1024
MAXINSTANCES 32
MAXLOGHISTORY 292
LOGFILE
GROUP 1 '/dev/rora_redo1_01'SIZE 380M,
GROUP 2 '/dev/rora_redo1_02'SIZE 380M,
GROUP 5 '/dev/rora_redo1_03'SIZE 380M,
GROUP 6 '/dev/rora_redo1_04'SIZE 380M
-- STANDBY LOGFILE
DATAFILE
'/dev/rora_system_01',
'/dev/rora_undotbs1_01',
'/dev/rora_sysaux_01',
'/dev/rora_n_data_01',
......
可看到MAXDATAFILES被设置为1024.
3.2 因为当前的文件数量未达到MAXDATAFILES参数值,所以不需要使用重新建立控制文件来修改该参数。
注:如果需要通过重新建立控制文件来修改MAXDATAFILES参数值,请参看我的博客文章http://djb1008.itpub.net/post/42280/526053
3.3 修改DB_FILES参数(RAC 环境,需要加上SID='*'
SQL>alter systemset db_files=1000 scope=spfile sid='*';
重新启动数据库
SQL>shutdown immediate;
SQL>STARTUP
如果是rac的话,可以使用srvctl命令,停止和启动数据库,如下:
$srvctl stop db -d orcl
$srvctl start db -d orcl
3.4 继续扩充表空间的容量,不再报错,命令执行成功。
SQL>alter tablespace p_data_low add datafile '/dev/rora_p_data_31_l' size 25580m
Tablespace altered.