ORA-00059:maximum number of DB_FILES exceed 解決

strivechao發表於2019-05-20

今天發現有個表空間快滿了,想新增兩個資料檔案,結果報錯 ORA-00059:maximum number of DB_FILES exceed

檢視系統的db_files引數為:200,而資料檔案總數也確實為200,報這個錯誤正常。

SQL> show parameter db_files

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

db_files                             integer     200

SQL>

SQL> select count(1) from dba_data_files;

  COUNT(1)

----------

      200

SQL>

使用oerr 工具可以參看到如下資訊:

ORA-00059: maximum number of DB_FILES exceededCause: 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引數值,還必須明確另一個引數的值,那就是存在於控制檔案中的 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;

資料庫已更改。

SQL>

在udump目錄下,找到最新的追蹤檔案,即為新生成的控制檔案的追蹤檔案。

該資料庫的maxdatafiles值為2048,因此我只需修改db_files的引數值就可以解決該問題。

由於是RAC資料庫,因此在修改的時候需要加上 sid='*' 這個引數。修改的順序為(這是我個人實施的順序):

1、在所有節點上分別執行命令:

alter system set db_file=1024 scope=spfile sid='*'; #注意,這裡的sid沒有指明用那個節點的sid,*表示所有節點

注:我當時執行的時候考慮到設定了 sid='*' 這個引數,因此只在一個節點上執行,當重啟另一節點資料庫時候報錯,

具體錯誤資訊忘記儲存,意思就是當前所使用的db_files的值和另一個節點不匹配。因此我又在該節點執行了一次如上的命令,再次重啟資料庫成功。

2、關閉所有節點資料庫。

3、順序重啟所有節點資料庫。

注:這裡要注意,是關閉所有節點後,再依次重啟,不然會造成db_files值和另一節點不匹配的報錯。

至此,問題解決,再新增資料檔案成功。

如下是官方關於db_files這個引數的說明

Property Description

Parameter type Integer

Default value 200

Modifiable No

Range of values Minimum: the largest among the absolute file numbers of the datafiles in the database

Maximum: operating system-dependent

Basic No

Real Application Clusters You must set this parameter for every instance, and multiple instances must have the same value.

DB_FILES specifies the maximum number of database files that can be opened for this database. The maximum valid value is the maximum number of files, subject to operating system constraint, that will ever be specified for the database, including files to be added by ADD DATAFILE statements.

If you increase the value of DB_FILES, then you must shut down and restart all instances accessing the database before the new value can take effect. If you have a primary and standby database, then they should have the same value for this parameter.



DB_FILES 定義了oracle資料中資料檔案的個數,當資料檔案個數超過這個引數設定的值就會報ORA-00059這個錯誤。


 


解決辦法:


show parameter db_files;   --檢視當前設定的值


sqlplus / as sysdba


alter system set db_files=更大的值 scope=spfile;


shutdown immediate;


startup;


 


說明:


這個引數設定的值的大小不會影響效率,只是單純的控制資料檔案的個數


 


RAC生產環境下面修改該引數步驟如下:


(1)先在任意一個節點檢視該引數值


 


SQL> show parameter db_files;


 


NAME      TYPE  VALUE


------------------------------------ ----------- ------------------------------


db_files      integer  200


 


在任意一個節點執行,這裡sid=’*’是指在所有例項上生效


SQL> alter system set db_files=350 scope=spfile sid='*';


 


將所有節點上將監聽全部停了


[grid@RAC1 ~]$ srvctl stop listener


[grid@RAC1 ~]$ srvctl status listener


Listener LISTENER is enabled


Listener LISTENER is not running


 


 


在所有節點上執行Kill LOCAL=NO程式


Kill所有的外部連結


ps –ef|grep LOCAL=NO|grep –v grep|awk '{print $2}'|xargs kill -9


 


(5)在所有節點上執行


SQL> shutdown immediate;


Database closed.


Database dismounted.


ORACLE instance shut down.


 


(6)按照順序將庫啟動,不要在一個庫未啟動完成的時候去啟動另外一個庫,否則會出現下面錯誤


ORA-01105: mount is incompatible with mounts by other instances


ORA-01174: DB_FILES is 350 buts needs to be 320 to be compatible





來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25469263/viewspace-2644927/,如需轉載,請註明出處,否則將追究法律責任。

相關文章