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 *