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号。 所以我们在参数档中可以看到以下片段:
<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一致。
所以接下来,我们只要关注字母大小写的问题,因为解决的步骤有一点繁琐。
两个方式可以解决这个问题。
使用大写当作一致的标准
如果您不想去修正参数档,您可以修正留存在丛集资料中的名称。
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在参数档中。
--------------------
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有关。