ORA-00059:maximum number of DB_FILES exceed
SQL> show parameter db_files
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_files integer 200
SQL> select count(1) from dba_data_files;
COUNT(1)
----------
200
-- 错误原因是因为数据文件数量已经达到db_files这个参数的值,如果想增加数据文件的数量,必须修改db_files参数值,然后重启数据库
-- 而修改db_files参数值,还必须明确另一个参数的值,那就是存在于控制文件中的 maxdatafiles。
-- db_files和maxdatafiles的关系与区别
-- 区别:
存在位置不同
db_files存在于spfile文件或pfile文件中。
maxdatafiles存在于控制文件中,该值可以在创建数据库时指定。
-- 关系
当db_files<maxdatafiles时,那么只需要修改db_files的值,并重启数据库即可解决ORA-00059。
当db_files=maxdatafiles时,则需要重新创建控制文件,并修改db_files值,重启数据库来解决该问题。
-- 查看控制文件中的maxdatafiles值可以通过创建控制文件的追踪文件来查看
SQL> alter database backup controlfile to trace;
-- 在udump目录下,找到最新的追踪文件,即为新生成的控制文件的追踪文件。
-- 查看 maxdatafiles 的值,如果大于 db_files 的参数值就可以直接修改 db_file 值即可。
-- 查看当前会话跟踪文件
SELECT P.TRACEFILE
FROM V$PROCESS P, V$SESSION S
WHERE P.ADDR = s."PADDR"
AND s."SID" = SYS_CONTEXT('userenv', 'sid');
-- RAC 修改参数如下
alter system set db_files=512 scope=spfile sid='*';
alter system set db_files=512 scope=spfile sid='zyxxdb01';
alter system set db_files=512 scope=spfile sid='zyxxdb02';
alter system set db_files=512 scope=spfile sid='*';
-- 注: 这里的sid没有指明用那个节点的sid,*表示所有节点
-- 注: 我当时执行的时候考虑到设置了 sid='*' 这个参数,因此只在一个节点上执行,当重启另一节点数据库时候报错,
-- 关闭所有节点数据库,顺序重启所有节点数据库再添加数据文件成功。