Skip to content
Home » Oracle Database » 如何解決ORA-29760: 未指定 instance_number 參數

如何解決ORA-29760: 未指定 instance_number 參數

ORA-29760

ORA-29760: 未指定 instance_number 參數表示Oracle根據您在參數檔中所提供的instance name,並未找到任何相對應的INSTANCE_NUMBER來啟動資料庫。

對於一個單一實體運行的資料庫,INSTANCE_NUMBER預設為0,所以我們完全不需要在意這個參數,我們只要聚焦在拼寫錯誤的instance name.

在另一方面,INSTANCE_NUMBER通常應用在RAC叢集資料庫中。這也就是我們看到ORA-29760這個錯誤訊息,通常是在我們要開啟RAC資料庫的時候。

讓我們看看有那些情境會產生ORA-29760錯誤。

單一運行實體

在我們修改參數檔之後,我們可以嘗試開啟資料庫服務,但我們得到這個錯誤。

SQL> startup
ORA-29760: instance_number parameter not specified

RAC叢集資料庫

當我們嘗試開啟新建立的RAC空資料庫,我們看到ORA-29760錯誤訊息。

[oracle@primary01 ~]$ srvctl start database -d orclcdb -o nomount
PRCD-1332 : failed to start database ORCLCDB
PRCR-1079 : Failed to start resource ora.orclcdb.db
CRS-5017: The resource action "ora.orclcdb.db start" encountered the following error:
ORA-29760: instance_number parameter not specified
. For details refer to "(:CLSN00107:)" in "/u01/app/grid/diag/crs/primary01/crs/trace/crsd_oraagent_oracle.trc".

CRS-2674: Start of 'ora.orclcdb.db' on 'primary01' failed
CRS-2632: There are no more servers to try to place resource 'ora.orclcdb.db' on that would satisfy its placement policy
CRS-5017: The resource action "ora.orclcdb.db start" encountered the following error:
ORA-29760: instance_number parameter not specified
. For details refer to "(:CLSN00107:)" in "/u01/app/grid/diag/crs/primary02/crs/trace/crsd_oraagent_oracle.trc".

CRS-2674: Start of 'ora.orclcdb.db' on 'primary02' failed

這種錯誤也會出現在RMAN,當你嘗試在RMAN底下開啟RAC資料庫。

合理的解釋

對於有兩個node的RAC資料庫而言,第一個運行的實體通常取得1號的INSTANCE_NUMBER,然後第二個運行的實體取得2號。所以我們在參數檔中可以看到以下片段:

<First_Instance_Name>.instance_number=1
<Second_Instance_Name>.instance_number=2

換句話說,Oracle是根據instance name所分配instance number去啟動實體。如果列在參數檔內的instance name無法對應到Oracle所認知的instance name,那麼Oracle就找不到正確的instance number來啟動實體.

拼錯字的Instance Name

有時候,我們拼錯了$ORACLE_SID或是INSTANCE_NAME的其中一個,而使得名稱上無法對應。

檢查$ORACLE_SID

[oracle@primary01 ~]$ echo $ORACLE_SID
ORCLCDB1

檢查INSTANCE_NAME

文字參數檔PFILE對於檢查INSTANCE_NAME很有用處,所以我們先建立一個。

SQL> create pfile='/home/oracle/pfile' from spfile='+DATA/ORCLCDB/spfile';

File created.

SQL> exit;

然後我們檢視其內容。

[oracle@primary01 ~]$ cat /home/oracle/pfile
...
ORCLCDB2.instance_number=2
ORALCDB1.instance_number=1

如您所見,名稱之間並不吻合,我們拼錯了instance name。所以解決方案是很明顯地,就是修正錯誤的那個名稱。

字母大小寫的差異

檢查RAC資料庫Instance Names

讓我們來看一看留存在RAC資料庫裏面的instance names是什麼樣子。

[oracle@primary01 ~]$ srvctl config database -d orclcdb
...
Database instances: orclcdb1,orclcdb2
Configured nodes: primary01,primary02
...

看起來似乎沒問題,拼寫也都是正確的,特別的是,它們都是小寫的英文字母。

檢查參數檔裡面的Instance Names

文字參數檔PFILE對於檢查INSTANCE_NAME很有用處,所以我們先建立一個。

SQL> create pfile='/home/oracle/pfile' from spfile='+DATA/ORCLCDB/spfile';

File created.

SQL> exit;

我們列出參數檔的內容來做個確認。

[oracle@primary01 ~]$ cat /home/oracle/pfile
...
ORCLCDB2.instance_number=2
ORCLCDB1.instance_number=1

基本上,這兩組都是相同的。當然,也不完全相同,僅有的差異在於字母的大小寫。第一組instance names是小寫,而後面這一組是大寫。

所以解決方案顯而易見,我們要把這兩組做成完全一致,完全大寫或完全小寫。由此看來,這個錯誤跟instance number完全沒關係,所以請別被錯誤訊息所誤導了。

ORA-29760的解決方案

拼錯字的instance name容易解決,只要修正錯誤的一方就好了,讓參數檔中的instance name和ORACLE_SID一致。

所以接下來,我們只要關注字母大小寫的問題,因為解決的步驟有一點繁瑣。

兩個方式可以解決這個問題。

  1. 使用大寫當作一致的標準,或
  2. 使用小寫當作一致的標準.

使用大寫當作一致的標準

如果您不想去修正參數檔,您可以修正留存在叢集資料中的名稱。

srvctl remove instance

首先,從資料庫中刪除運行的實體。

[oracle@primary01 ~]$ srvctl remove instance -d orclcdb -i orclcdb1
Remove instance from the database orclcdb? (y/[n]) y
[oracle@primary01 ~]$ srvctl remove instance -d orclcdb -i orclcdb2
Remove instance from the database orclcdb? (y/[n]) y

srvctl add instance

然後使用大寫字母的instance names,新增到資料庫。

[oracle@primary01 ~]$ srvctl add instance -d orclcdb -i ORCLCDB1 -n primary01
[oracle@primary01 ~]$ srvctl add instance -d orclcdb -i ORCLCDB2 -n primary02

srvctl config database

讓我們來確認一下我們新增後的結果。

[oracle@primary01 ~]$ srvctl config database -d orclcdb
Database unique name: ORCLCDB
...
Database instances: ORCLCDB1,ORCLCDB2
Configured nodes: primary01,primary02
...

srvctl start database

看起來沒問題,名稱都是大寫的英文字母,讓我們再次開啟資料庫。

[oracle@primary01 ~]$ srvctl start database -d orclcdb -o nomount
[oracle@primary01 ~]$ srvctl status database -d orclcdb
Instance ORCLCDB1 is running on node primary01
Instance ORCLCDB2 is running on node primary02

請留意,所有的instance names都已經是大寫的。

使用小寫當作一致的標準

我們來看看,我們想要什麼樣的instance names在參數檔中。

   Old   ->   New
--------------------
ORCLCDB1 -> orclcdb1
ORCLCDB2 -> orclcdb2

所以我們修正檔案,將所有的instance names都改為小寫。

[oracle@primary01 ~]$ vi /home/oracle/pfile
orclcdb1.__data_transfer_cache_size=0
orclcdb2.__data_transfer_cache_size=0
orclcdb2.__db_cache_size=1644167168
orclcdb1.__db_cache_size=1577058304
orclcdb1.__inmemory_ext_roarea=0
orclcdb2.__inmemory_ext_roarea=0
orclcdb1.__inmemory_ext_rwarea=0
orclcdb2.__inmemory_ext_rwarea=0
orclcdb1.__java_pool_size=0
orclcdb2.__java_pool_size=0
orclcdb1.__large_pool_size=16777216
orclcdb2.__large_pool_size=16777216
orclcdb1.__oracle_base='/u01/app/oracle'#ORACLE_BASE set from environment
orclcdb2.__oracle_base='/u01/app/oracle'#ORACLE_BASE set from environment
orclcdb1.__pga_aggregate_target=822083584
orclcdb2.__pga_aggregate_target=822083584
orclcdb1.__sga_target=2449473536
orclcdb2.__sga_target=2449473536
orclcdb1.__shared_io_pool_size=117440512
orclcdb2.__shared_io_pool_size=117440512
orclcdb2.__shared_pool_size=654311424
orclcdb1.__shared_pool_size=721420288
orclcdb1.__streams_pool_size=0
orclcdb2.__streams_pool_size=0
orclcdb1.__unified_pga_pool_size=0
orclcdb2.__unified_pga_pool_size=0
*.audit_file_dest='/u01/app/oracle/admin/ORCLCDB/adump'
*.audit_trail='db'
*.cluster_database=true
*.compatible='19.0.0'
*.control_files='+DATA/ORCLCDB/control01.ctl','+DATA/ORCLCDB/control02.ctl'
*.db_block_size=8192
*.db_name='ORCLCDB'
*.db_recovery_file_dest='+DATA'
*.db_recovery_file_dest_size=50g
*.diagnostic_dest='/u01/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=ORCLCDBXDB)'
*.enable_pluggable_database=true
family:dw_helper.instance_mode='read-only'
orclcdb2.instance_number=2
orclcdb1.instance_number=1
*.local_listener='-oraagent-dummy-'
*.log_archive_format='%t_%s_%r.dbf'
*.nls_language='AMERICAN'
*.nls_territory='AMERICA'
*.open_cursors=300
*.pga_aggregate_target=779m
*.processes=1000
*.remote_login_passwordfile='exclusive'
*.sga_target=2336m
orclcdb2.thread=2
orclcdb1.thread=1
orclcdb1.undo_tablespace='UNDOTBS1'
orclcdb2.undo_tablespace='UNDOTBS2'

然後我們建立一個新的SPFILE。

[oracle@primary01 ~]$ export ORACLE_SID=orclcdb1
[oracle@primary01 ~]$ sqlplus / as sysdba
...
SQL> startup nomount pfile='/home/oracle/pfile';
...
SQL> create spfile='+DATA/ORCLCDB/spfile' from pfile='/home/oracle/pfile';

File created.

SQL> shutdown immediate;
...

我們正常地開啟RAC資料庫。

[oracle@primary01 ~]$ srvctl start database -d orclcdb -o nomount
[oracle@primary01 ~]$ srvctl status database -d orclcdb
Instance orclcdb1 is running on node primary01
Instance orclcdb2 is running on node primary02

如您所見,所有的instance names都是小寫了。

結論

兩個方式都可以解決ORA-29760,不過我認為第一種方式比較適合,這是因為傳統上,我們通常使用大寫的名稱來定義instance names。

其次,這個錯誤跟INSTANCE_NUMBER沒什麼關係,全部都是跟INSTANCE_NAME有關。

Leave a Reply

Your email address will not be published. Required fields are marked *