Skip to content

ORA-00130 and ORA-00119

更换了服务器的IP与主机名后启动Oracle服务报错:

1
2
3
4
5
6
7
8
9
10
SQL*Plus: Release 11.2.0.2.0 Production on Wed Nov 14 13:51:39 2012
Copyright (c) 1982, 2010, Oracle.  All rights reserved.
SQL> conn / as sysdba
Connected to an idle instance.
SQL> startup
ORA-00119: invalid specification for system parameter LOCAL_LISTENER
ORA-00130: invalid listener address '(ADDRESS=(PROTOCOL=TCP)(HOST=oracledbtest20)(PORT=1521))'
SQL>

解决方法如下:
1. 修改LOCAL_LISTENER参数
1.1 创建pfile

1
2
3
4
5
6
SQL> conn / as sysdba
Connected to an idle instance.
SQL> create pfile from spfile;
File created.
SQL> quit
Disconnected

1.2 修改pfile内容(如没有相关内容则添加至文件末尾)

1
*.local_listener='(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=Your IP)))'

1.3 使用pfile启动Oracle服务

1
2
3
4
5
6
7
SQL> conn / as sysdba
Connected to an idle instance.
SQL> startup pfile='$ORACLE_HOME/dbs/init$ORACLE_SID.ora';
ORACLE instance started.
……
Database mounted.
Database opened.

1.4 根据pfile建立新的spfile

1
2
3
SQL> create spfile from pfile;
File created.
SQL> quit

2. 重启

1
2
3
4
5
6
7
8
9
10
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
……
Database mounted.
Database opened.
SQL>

 

SQLNET.AUTHENTICATION_SERVICES的作用

SQLNET.AUTHENTICATION_SERVICES

Purpose

Use the parameter SQLNET.AUTHENTICATION_SERVICES to enable one or more authentication services. If authentication has been installed, it is recommended that this parameter be set to either none or to one of the authentication methods.

Default
None

Values
Authentication Methods Available with Oracle Net Services:

* none for no authentication methods. A valid username and password can be used to access the database.
* all for all authentication methods
* nts for Windows NT native authentication

Windows NT native authentication

An authentication method that enables a client single login access to a Windows NT server and a database running on the server.

An authentication method that enables a client single login access to a Windows NT server and a database running on the server.

从oracle的解释可以知道,SQLNET.AUTHENTICATION_SERVICES=(NTS)是WINDOWS系统专用的,对linux/UNIX是不适用的。个人猜测NTS应该指NT Server.

测试:设置SQLNET.AUTHENTICATION_SERVICES=(ALL) 时

C:Documents and SettingsAdministrator>sqlplus /nolog

SQL*Plus: Release 10.1.0.2.0 – Production on 星期四 7月 23 15:33:18 2009

Copyright (c) 1984, 2004, Oracle. All rights reserved.

SQL> connect / as sysdba;
ERROR:
ORA-12641: 验证服务无法初始化

一个简单的总结:
1、在windows下,SQLNET.AUTHENTICATION_SERVICES必须设置为NTS或者ALL(10.2版本好像可以,未测试,10.1 版本设置为ALL无法通过OS认证,显示ORA-12641: 验证服务无法初始化)才能使用OS认证;不设置或者设置为其他任何值(包括NONE)都不能使用OS认证。

2、在linux下,在SQLNET.AUTHENTICATION_SERVICES的值设置为ALL,或者不设置的情况下,OS验证才能成功;设置为其他任何值都不能使用OS认证。

oracle中的监听:静态注册和动态注册详解

关于监听的操作

注册(register)就是将数据库作为一个服务注册到监听(listener).客户端不需要知道数据库名字和实例
名字,只需要知道数据库对外提供的服务名(service_name)就可以申请连接到数据库.这个服务名字可以设
置成和实例名字一样,也可以根据业务需求设计。在数据库启动过程。oracle会向监听程序注册相应的服务
,任意的一个数据库都会有两条信息注册到监听器中:oracle对应的instance_name和service_name。

客户端是通过监听程序连接到数据库服务器的,监听中记录着相应的oracle service,而客户端只需要在tn
snames中提供正确的服务名就可以建立和数据库服务器的连接。

一:静态注册监听:
如果采用的是静态注册监听,那么实例启动时候读取listener.ora文件的配置,讲实例和服务注册到监听,
如下面的listener就是静态注册。这里global_name提供对外的服务名,sid_name提供实例名。而在tnsnam
es中配置的service_name正是对应的global_name的名字。

SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /oracle/product/10.2/db_1)
(PROGRAM = extproc)
)
(SID_DESC =
(GLOBAL_NAME= luda)
(ORACLE_HOME = /oracle/product/10.2/db_1)
(SID_NAME = LUDA)
)
)

LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.10.224)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
)
)
tnsname.ora配置文件:
LUDA =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.10.224)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = luda)
)
)

tnsname的serviece_name和对应的global_name要对应,大小写要却分,host用IP代替,看个人习惯。
instance_name只有唯一的一个名称,而service_name可以有多个用于tnsnames.ora客户端连接,连接字符串
(TNS中的LUDA就是一个字符串)也可以随意取名对于客户端来说,它不用关心数据库的名字、实例名到底是
什么,它只需要知道数据库对外提供的服务名就行了,这个名字可能和实例名一样,也可能不一样。

———————————————
动态注册监听:
* 删掉listener配置文件,则为默认的动态配置

动态注册就是实例启动的时候PMON进程根据init.ora中的instance_name,service_names两个参数将实例和服
务动态注册到listener中。在没有配置listener文件的时候,在init.ora文件中指定了instance_name,servi
ce_names两个参数的值。注册到监听器中的实例从init.ora文件中的instance_name参数获得(这里pfile和s
pfile就不作解释了),如果没有设置instance_name,那么将从初始化参数文件中取db_name的值。可以通过
show parameter或者试图v$parameter查找这两个参数的值。注册到监听中的服务值从初始化参数文件的serv
ice_name获取。如果该参数没有设置,数据库将拼接init.ora中的db_name和db_domain的值来注册。如果设置
了service_names的值,可以根据业务需求等设置名称,比如ora1.taobao.com或者缩写ora1.如果是缩写,并
且设置了db_domain,那么注册到listener的服务名将是service_name。db_main,比如:
db_main=luda.com
service_name=ora1

那么注册到监听的服务名则是:
ora1.luda.com

动态注册时候,listener.ora的内容为:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /oracle/product/10.2/db_1)
(PROGRAM = extproc)
)
)

* service_names参数中可以设定多个服务值,服务名之间用逗号隔开,这对于共享服务器的配置是很有用的。
* 动态注册默认的端口为1521,监听名为listener,协议为TCP,需要向非默认监听注册,则需要配置local_listener
参数
格式为
ALTER SYSTEM SET LOCAL_LISTENER=’ (ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.10.224)(PORT = 1522))

—————————————————————————————————–

如果在动态注册下没有显示设置service_names和instance_name的值,那么仅当数据库在监听器运行之后启动时候,
动态注册才会法师;这种情况下,如果监听故障或者重启那么动态注册信息将丢失。所以在数据库启动之前先开启
监听,避免监听重启等 在service_names和instance_name没有设置情况下,造成动态注册信息丢失,在init.ora中
设置service_names and instance_name是个好办法,这样监听可以快速的注册动态信息。

静态注册的监听实例状态为unknow,只有客户端请求连接到实例时候才会去检查实例是否存在。
动态注册的监听实例为ready或者blocked状态,不管数据库何时关闭和启动这时候的监听都能时时动态刷新正确的
数据库 信息,不管数据库是什么状态,监听都能知道。