server 端设置是重点, client 端设置简单.
另外, 在 server 端, 看来动态和静态都要设置一下: 万一动态出了问题呢, 也可以使用静态作为一个连接方案
下边的重要文件位置:
listener.ora 与 tnsnames.ora 都是在 $ORACLE_HOME 下的 /network/admin/ 目录下
database services
service Name (一个抽象, 客户端只要知道这个名字就可以了, 知道这个名字就可以得到oracle数据库的服务, 而不用知道具体instance)
Connect Desciptor
Listener
global_names = db_name.db_doman
通信: 是 client 端的一个进程和 server 端的一个进程来建立连接, 所以server端要先开启一个进程等待着客户端的请求连接.
Service Resgistration : (把service信息注册到listener, listener 只负责监听, 他不做处理, 所以当client请求来了以后, listener 监听到了, 并把该内容交给其他进程处理 service handlers)
Service Handlers :(client请求的处理者, listener只是先等着连接, 连上后, 它要把工作交给service handle)
service registration : During service registration, the PMON process provides the listener with information about the following (可见, 这个注册是 pmon 完成的, 并且 pmon 是在每次instance启动时注册的, 如果instance 启动时, 也就是 pmon 想要注册时, 如果listener没有启动, pmon会周期性 每60秒就尝试注册一次, 如果想要立刻注册(在listener启动以后), 可以使用命令 alter system register.)
注册的内容为:
1. 先启动 listener.
2. 然后启动 instance (注册相关内容在listener中, service registration 就是看门老大爷, 政府已经上班了, 有人来请求事情, 可以告诉政府相关人员来处理了)
(注册的内容并不用过分担心, 到是启动listener 比较重要, 注册只要设置好参数就可以了)
(注意: 动态注册的内容因为只跟参数有关, 所有有没有listener.ora文件都无所谓)
三个重要文件:
这里说一下: sqlnet.ora 这个文件. 这个文件里有个参数 DIRECTORY_PATH 是用来 controls how Oracle Net Services resolves net service names into connect descriptors. Multiple methods can be represented as a comma-separated list enclosed by parenttheses. Net services attempts to resolve servcie names using each method listed working from left to right. (用来解析服务连接的查询文件的位置,从左到右)
1. ip
2. port
3. service name (一个抽象, 客户端不用知道具体的instance等细节)
listener 类似看门老大爷, 他只是传话的, 不是干活的, 所以当他得到消息后, 会传递出去.
当一个从client的请求到来时, listener 做如下:
无论哪一种方式, the session is transparent to the user, it can be detected only by turning on tracing and analyzing the resulting trace file.
redirects connection 与 redirects session 不同. redirects session 不单单只是用在 shared server模式.
两种办法:
Static service configuration : 静态配置(oracle 8i或以前使用, 需要 listener.ora 文件来配置)
Dynamic service registration : 动态注册(不需要 listener.ora, 依靠pmon来注册, 9i以后可以使用)
: 当 instance 启动时, pmon 会读取参数文件找到相关的注册内容, 然后pmon 会进行注册.(低效)
参数文件中要包括: service_names, instance_name 这两个参数, 本身动态注册, 不需要配置任何文件, 只需要设置好这两个参数就可以了, 当然, 如果你想下边一样配置一样listener.ora 也可以.
By default, PMON registers with a local listener on the server with the following settings:
PMON can register with a non default listener if :
LOCAL_LISTENER=listener_alias
所以可以通过修改, local_listener 参数来修改动态注册的内容
lstener_alias must be resolved to the listener protocol address through a naming method such as tnsnames.ora An examploe entry in the tnsnames.ora follows :
listener_name=
( DESCRIPTION =
( ADDRESS=(PROTOCOL=tcp) (HOST=sales-server)(PROT_1421))) -- 默认的是1521
oracle 总是先进行动态注册的尝试, 在使用静态注册之前
首先, oracle 需要将服务注册到 listener 中, 只有这样, 当listener监听到客户端的请求后, listener才知道将请求分配给谁.
注册就是将数据库作为一个服务注册到监听程序。客户端不需要知道数据库名和实例名,只需要知道该数据库对外提供的服务名就可以申请连接到数据库。这个服务名可能与实例名一样,也有可能不一样。
在数据库服务器启动过程中,数据库服务器会向监听程序注册相应的服务(无论何时启动一个数据库,默认地都有两条信息注册到监听器中:数据库服务器对应的实例和服务。)
动态注册:
动态注册是在instance启动的时候PMON进程根据init.ora中的instance_name,service_names两个参数将实例和服务动态注册到listener中
注册到监听器中的服务值从init.ora文件中的参数service_names取得。如果该参数没有设定值,数据库将拼接init.ora文件中的 db_name和db_domain的值来注册自己。如果选择提供service_names值,您可以使用完全限定的名称(比如 orcl.oracle.com)或缩写的名称(比如orcl)。如果选择缩写的名称并设置了db_domain参数,注册到监听器中的服务将是 service_name值和db_domain值的拼接.例如下面的设置将导致服务orcl.oracle.com被注册到监听器中:
db_domain=oracle.com
service_names=orcl ;
采取动态注册方法时,listener.ora中的内容如下:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /u01/oracle)
(PROGRAM = extproc)
)
)
以上内容,除了 ORACLE_HOME = /u01/oracle 每个数据库设置的不一样之外, 其余的全部一样
动态注册默认只注册到默认的监听器上(名称是LISTENER、端口是1521、协议是TCP),因为pmon只会动态注册port等于1521的监听,否则pmon不能动态注册listener,如果需要向非默认监听注册,则需要配置local_listener参数!
将监听的信息添加到tnsnames.ora 文件中。 注意,是tnsnames.ora 文件, 因为pmon在动态注册监听时要从tnsnames.ora中读取相关信息。
LISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = DaveDai)(PORT = 1522))
)
然后以sys用戶运行:
SQL> alter system set local_listener=listener;
SQL> alter system register;
或者:
SQL> alter system set LOCAL_LISTENER='(ADDRESS = (PROTOCOL = TCP)(HOST = DaveDai)(PORT = 1522))';
SQL> alter system register;
系统已更改
When the Oracle software is installed, the listener.ora file is created for the starter dtabase with the default setting:
The listener.ora file is used to configure the listener for static service registration. The listener.ora must reside on the machine or node on whice the listener is to reside. 例如:
利用 net manager 这个工具可以配置 listener.ora 这个文件
静态注册就是实例启动时读取listener.ora文件的配置,将实例和服务注册到监听程序。无论何时启动一个数据库,默认地都有两条信息注册到监听器中:数据库服务器对应的实例和服务。
静态注册时,listener.ora中的GLOBAL_DBNAME向外提供服务名,listener.ora中的SID_NAME提供注册的实例名。
采取静态注册方法时,listener.ora中的内容如下:
静态监听:
oracle实例运行后,监听程序启动时,根据listener.ora的配置注册相应的服务。
其中global_dbname对应的是oracle对外的服务名,即初始化参数里的service_names
而sid_name对应的是oralce实例的名称,即初始化参数里的instance_name
既然有动态监听为什么还要静态监听呢?原因如下:
1.监听器不是最早启动,oracle实例先启动
2.监听器重启
3.oracle实例没有open
命令行工具, 用来管理 Listener Control.
Unix & Linux: 如果是windows, 使用 lsnrctl command
lsnrctl <command name>
When the lsnrctl command is issued, the command will work against the default listener “listener”unless the SET LISTENER command is executed. Another way to control different listeners is to use the listener name as a command modifier:
lsnrctl start listener02
lsnrctl stop listener02
services : 提供有关 services the listener 的信息.
set :例如: lsnrctl set listener listener02, set trc_level admin
show : 用来显示目前listener parameter. show connect_timeout
Any manual changes to the listener.ora file must be made when the listener is shutdown. 如果没有提供listener 的名字, 那么就是默认的 LISTENER .
查询某服务是静态注册还是动态注册
lsnrclt status 中的service内容, 如果显示 unknown 并且同时 client端可以连接到数据库, 则表明, 这个listener是静态注册的.
实例状态为UNKNOWN值时表明此服务是静态注册的设置。这时监听器用来表明它不知道关于该实例的任何信息,只有当客户发出连接请求时,它才检查该实例是否存在。
动态注册的数据库通过状态信息中的状态READY或状态BLOCKED(对于一个备用数据库)来指明。不管关闭何时数据库,动态注册的数据库都会动态地从 监听器注销,而与之相关的信息将从状态列表中消失。这样,不管数据库是在运行还是已经关闭,监听器总是知道它的状态。该信息将被用于连接请求的回退(fallback)和负载平衡。
使用dbca配置后会有两个文件,tnsnames.ora, sqlnet.ora 都是自动生成的.
有很多配置方式, 这里指确认 local naming method, 其他的都过时了, 或者用不上
要连接服务器,要提供一些信息,例如你去一个单位,看到看门老大爷,老大爷问你,你找谁,至少你要知道你找哪个部门的谁?
另外, 这种方式主要依靠 tnsnames.ora 这个文件, 不推荐手动修改这个文件, 使用 Oracle Net Configuration Assistant. 这个工具比较好
这个工具的用法 命令 netca
选择如图: naming Methods configuration
这一步, 左边选 oracle Names, 右边选 local, 另外, 你选择以后, 相关的内容会写入 sqlnet.ora 这个文件.
这个 service name 不是随便输入的, 这是 database service name.
Host name : Enter the fully qualified name of the machine on which the database you want to connect to the communicate with resides. (也可以输入ip地址)
Port Number : Enter the number of the port on which the Oracle Net listener monitors connection requests to the server(host). default is 1521.
Testing the connection
另外, 使用 tnsping 也可以进行测试. (当然要在先设置好 tnsnames.ora 文件以后)
Enter a name for the net service name next.(个人感觉这个好像就是tnsnames.ora文件中那个title的名字), 默认的会使用 database service name, 你也可以起一个更有意义的名字.
保存, 这部完成以后, 内容会保存在 $ORACLE_HOME/network/admin 这个文件夹内, 当然是tnsnames.ora
1. 首先检查是否网络故障, 利用 ping 等, 确认tcp/ip连接情况
2. 在client 通过tnsping server 名, 如果能ping通, 证明client端设置没有问题, 毕竟client端设置网络简单, 所以一般不是client端问题.
3. 确认服务器端, 根据错误提示, 或者直接去确认listener, 因为一般很可能是listener 问题.