暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

ORA-00059报错及DB_FILES参数分析

原创 Z·A·Q 2022-11-14
1350

MOS 参考文章

MAXDATAFILES and DB_FILES Parameters (文档 ID 119507.1)

ORA-00059报错描述

  • 数据库版本:11gR2双节点RAC
  • 添加数据文件时,出现 ORA-00059 报错,显示DB_FILES参数已达到最大
ORA-00059: 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.
  • 通过增加DB_FILES参数的值,重启数据库实例解决该报错

DB_FILES参数分析

DB_FILES 参数介绍

  • 1)DB_FILES 指定可以为数据库打开的数据库文件的最大数量,受操作系统限制,包括由 ADD DATAFILE 语句添加的文件
SQL> show parameter db_files

NAME                     TYPE    VALUE
------------------------ ------- ----------
db_files                 integer     200

DB_FILES 值为 200,如果数据库中数据文件数达到或超过200,就需要更改该参数
  • 2)更改 DB_FILES 参数的方式:如果系统允许打开的文件数值大于 200,则可以通过 alter 方式来修改 DB_FILES 的值;因此,需要查看系统允许打开的文件数
[oracle@rac1 ~]$ ulimit -a

open files                      (-n) 65536
  • 3)对于 oracle 8i 及以上版本,当数据文件的个数超过了控制文件maxdatafiles参数的限制时,maxdatafiles参数值会自动的增加,自动增加的最大值就是DB_FILES参数的值

db_files参数测试一

  • 数据库版本:11gR2双节点RAC
  • 1)当前测试环境,数据库DB_FILES参数是30
SQL> show parameter db_files

NAME                     TYPE       VALUE
----------------------- ----------- ------------------------------
db_files                 integer     30
  • 备份控制文件,去相应trace文件查看MAXDATAFILES的值,当前值为20
 SQL> alter database backup controlfile to trace; 
 SQL> show parameter user_dump_dest
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE  "ORCL"   RESETLOGS  NOARCHIVELOG
     MAXLOGFILES 16
     MAXLOGMEMBERS 3
     MAXDATAFILES 20
     MAXINSTANCES 8
     MAXLOGHISTORY 292
  • 2)查看数据文件的数量
SQL> select count(*) from dba_data_files;

  COUNT(*)
----------
    10
  • 3)向USERS表空间持续添加数据文件,当数据文件数量超过20时,可以发现控制文件中的 MAXDATAFILES 自动增加
SQL> alter tablespace users add datafile '+DATA' size 10M AUTOEXTEND OFF;

Tablespace altered.

SQL> select count(*) from dba_data_files;

  COUNT(*)
----------
    21
  • 4)数据库alert日志中会有记录
Expanded controlfile section 4 from 20 to 50 records
Requested to grow by 30 records;added 1 blocks of records
  • 5)再次添加数据文件,数据文件总数达到 30 以后,再添加就会报错ORA-00059
SQL> select count(*) from dba_data_files;

  COUNT(*)
----------
    30

SQL> alter tablespace users add datafile '+DATA' size 10M AUTOEXTEND OFF;
alter tablespace users add datafile '+DATA' size 10M AUTOEXTEND OFF
*
ERROR at line 1:
ORA-00059: maximum number of DB_FILES exceeded
  • 6)增加 DB_FILES 的值
SQL> alter system set DB_FILES=200 sid='*' scope=spfile;

System altered.
  • 7)db_files参数在两节点需要保持一致,修改参数后,需要同时重启两节点实例,使该参数生效
[oracle@rac1 dbs]$ srvctl stop database -d rac
[oracle@rac1 dbs]$ srvctl start database -d rac
  • 8)此时,可以继续添加数据文件
SQL> alter tablespace users add datafile '+DATA' size 10M AUTOEXTEND OFF;

Tablespace altered.

SQL> select count(*) from dba_data_files;

  COUNT(*)
----------
    31

db_files参数测试二

  • 如果 DB_FILES 参数大于操作系统的限制,再启动数据库时就会报错
  • 1)修改 DB_FILES 参数为 70000
SQL> alter system set db_files=70000 sid='*' scope=spfile;

System altered.
  • 2)重启数据库实例,会出现报错
[oracle@rac1 ~]$ srvctl stop database -d rac
 
[oracle@rac1 dbs]$ srvctl start database -d rac
PRCR-1079 : Failed to start resource ora.rac.db
CRS-5017: The resource action "ora.rac.db start" encountered the following error: 
ORA-01078: failure in processing system parameters
ORA-01131: DB_FILES system parameter value 70000 exceeds limit of 65534
. For details refer to "(:CLSN00107:)" in "/u01/app/11.2.0/grid/log/rac2/agent/crsd/oraagent_oracle/oraagent_oracle.log".

CRS-5017: The resource action "ora.rac.db start" encountered the following error: 
ORA-01078: failure in processing system parameters
ORA-01131: DB_FILES system parameter value 70000 exceeds limit of 65534
. For details refer to "(:CLSN00107:)" in "/u01/app/11.2.0/grid/log/rac1/agent/crsd/oraagent_oracle/oraagent_oracle.log".

CRS-2674: Start of 'ora.rac.db' on 'rac1' failed
CRS-2674: Start of 'ora.rac.db' on 'rac2' failed
CRS-2632: There are no more servers to try to place resource 'ora.rac.db' on that would satisfy its placement policy
  • 3)解决报错

1、手动创建 PFILE,然后修改PFILE文件中参数 DB_FILES的值为 200

SQL> create pfile='/home/oracle/rac.init' from spfile='+DATA/rac/spfilerac.ora';

注意:在 RAC 中创建 PFILE 时要指定位置;在 $ORACLE_HOME/dbs 下面有一个 init.ora 文件,记录了 SPFILE 的存放位置,不指定的话会将该文件覆盖

[oracle@rac1 dbs]$ cat initrac1.ora 
SPFILE='+DATA/rac/spfilerac.ora'

2、使用 PFILE 启动数据库,然后重新生成 SPFILE

SQL> startup pfile='/home/oracle/rac.init'

SQL> show parameter spfile

NAME                     TYPE    VALUE
------------------------------------ ----------- ------------------------------
spfile                   string

SQL> create spfile='+DATA/rac/spfilerac.ora' from pfile='/home/oracle/rac.init';

3、重启所有的数据库实例

[oracle@rac1 ~]$ srvctl stop database -d rac
[oracle@rac1 ~]$ srvctl start database -d rac

4、查看 SPFILE 和 DB_FILES 参数的信息

SQL> show parameter spfile

NAME                     TYPE        VALUE
----------------------- ----------- ------------------------------
spfile                   string      +DATA/rac/spfilerac.ora
SQL> show parameter db_files

NAME                     TYPE       VALUE
----------------------- ----------- ------------------------------
db_files                 integer     200
最后修改时间:2022-11-14 15:21:00
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论