oracle网络基础

参考:张晓明 DBA突击、CSDN david dai 、崔华 RAC连接管理

                                    

常见的JDBC连接方式

通过JDBC获得Oracle数据库连接,有三种方式:OCI方式、thin方式和JdbcOdbc桥方式。OCI方式依赖于本地的动态链接库,如果在本地安装了Oracle数据库客户端可以采用该方式;而thin方式为纯java的数据库连接方式;JdbcOdbc桥方式依赖于本地ODBC数据库源的配置,这种方式一般不太被采用。

 

oraclejdbc驱动主要有下面三类:

 

  1JDBC OCI ocioracle call interface的缩写,此驱动类似于传统的ODBC驱动。因为它需要Oracle Call Interface and Net8,所以它需要在运行使用此驱动的JAVA程序的机器上安装客户端软件,其实主要是用到orcale客户端里以dll方式提供的oci和服务器配置。

 

  2JDBC Thin thinfor thin client的意思,这种驱动一般用在运行在WEB浏览器中的JAVA程序。它不是通过OCI or Net8,而是通过Java sockets进行通信,是纯java实现的驱动,因此不需要在使用JDBC Thin的客户端机器上安装orcale客户端软件,所以有很好的移植性,通常用在web开发中。

 

3JDBC KPRB:这种驱动由直接存储在数据库中的JAVA程序使用,如Java Stored ProcedurestriggersDatabase JSP's。因为是在服务器内部使用,他使用默认或当前的会话连接来访数据库,不需要用户名密码等,也不需要数据库url

 

*********************************************************************ORACLE RACTAF仅对使用 OCI连接的客户端和连接池有效,这里的 OCI连接可以是在 OCI连接上的封装,比如 JDBC-OCI driver就支持 TAF,但 JDBC thin driver就不支持 TAF(因为 JDBC thin driver不是基于 OCI的)。

*******************************************************************************

 

 

OCInet8

OSI网络模型

 1.物理层:主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。Hub属于典型的物理层设备

  2.数据链路层:定义了如何让格式化数据以进行传输,以及如何让控制对物理介质的访问。这一层通常还提供错误检测和纠正,以确保数据的可靠传输

  3.网络层:在位于不同地理位置的网络中的两个主机系统之间提供连接和路径选择。Internet的发展使得从世界各站点访问信息的用户数大大增加,而网络层正是管理这种连接的层。

  4.传输层:定义了一些传输数据的协议和端口号(WWW端口80等),如:TCP(传输控制协议,传输效率低,可靠性强,用于传输可靠性要求高,数据量大的数据),UDP(用户数据报协议,与TCP特性恰恰相反,用于传输可靠性要求不高,数据量小的数据,如QQ聊天数据就是通过这种方式传输的)。 主要是将从下层接收的数据进行分段和传输,到达目的地址后再进行重组。常常把这一层数据叫做段。

  5.会话层:通过传输层(端口号:传输端口与接收端口)建立数据传输的通路。主要在你的系统之间发起会话或者接受会话请求(设备之间需要互相认识可以是IP也可以是MAC或者是主机名

  6.表示层:可确保一个系统的应用层所发送的信息可以被另一个系统的应用层读取。例如,PC程序与另一台计算机进行通信,其中一台计算机使用扩展二一十进制交换码(EBCDIC),而另一台则使用美国信息交换标准码(ASCII)来表示相同的字符。如有必要,表示层会通过使用一种通格式来实现多种数据格式之间的转换。

  7.应用层: 是最靠近用户的OSI层。这一层为用户的应用程序(例如电子邮件、文件传输和终端仿真)提供网络服务。

 

 

 

NET8协议

 

Oracle 提供了完整的网络互连服务,这个服务叫做oracle net service,通常也叫做NET8服务

Oracle 自己的网络协议实现了OSI中的上三层,其中oracle客户端的OCIoracle call interface)和服务器端的OPIoracle program interface)组成了会话层。这一层负责在客户端和服务器之间建立一个完整的sql会话,功能包括:

l  解析sql语句,进行语法分析

l  sql语句申请、分配cursor

l  sql语句提供绑定变量

l  从服务器的数据字典中获取记录集的元数据信息

l  执行sql语句

l  返回结果

l  关闭cursor

 

TTCtwo-task common)层对应着表示层,这一层负责客户和服务器之间的字符集和数据类型转换一致

 

下面这几层就是大家熟悉的NET8,之所以叫8,大概是因为oracle并没有把这层归到OSI七层模型中的任何一层,而是作为单独一层提炼出的缘故。这部分由net interfacerouting/naming/authTNS(transparent network substrate)3个组件组成。其中net interface完成主要的数据传输,而两外两层负责透明支持底层协议。Oracle在配置网络时,支持多种底层协议,比如:TCPTCPSPIPE,甚至sockets direct protocolSDP),对于这些协议的支持就是有NET8这一层实现的

 

而配置oracle网络联通能力,实际就是配置NET8这一层。而NET8这一层包括两部分,服务器的监听、客户端的TNS

 

 

监听配置

服务器的监听进程和数据库是两组独立的进程。换句话说,一台物理服务器上可以同时运行多个数据库,但是只需要一个监听进行就足够了,一个监听进程足以为它所在的服务器上的所有数据库提供服务。也就是说,监听进程并不是固定为一个数据库服务

Ø  静态监听

所谓静态配置,就是在配置监听器时,就明确的告诉监听器某个数据库的信息,监听器启动过程中就会加载这一部分信息。这个信息记录再配置文件listener.ora

 

 

Ø  动态监听

除了静态配置,oracle数据库还可以动态的向监听器注册,这是由数据库的PMON进程完成的,要想使用动态注册功能,首先需要在数据库的初始化参数文件中设置两个参数,service_nameinstance_name。如果没有定义service_name参数,数据库会使用db_namedb_domain组成的一个全局数据库名称(global database name)注册到监听器中。Instan_name是实例名称,通常和SID值一样

 

Alter system register; 这个名字强制PMON立即向监听注册

Ø  静态与动态的区别

静态监听注册,通过lsnrctl status查看,状态是unknown,动态注册的状态是ready

静态监听的不够准确,无论数据库是否启动,查看监听状态都会有,动态注册只有是实例启动才会注册

除此之外,在RAC环境中,动态注册还包括每个实例的负载信息,这也是RAC能够实现负载均衡、故障迁移的基础

 

 

Ø  Queuesize参数

如果监听器同时受到大量的连接请求,这是可以使用这个参数增大监听器的队列长度,这个长度缺省是5

 

 

客户端配置

客户端是使用连接符连接服务器,如果使用网络服务名就必须能够解析网络服务名才能连接数据库

Oracle提供4种存储连接符信息的方式

l  Local naming:这种方式就是利用本地的tnsname.ora文件完成翻译过程

l  Easy connect naming:这种方式客户端不需要任何配置文件,只有oracle 10g以后版本才能支持这种方式

l  External naming:在网络中集中记录这些信息

l  Directory naming:在LDAP目录中保存这些信息

 

 

对于采用local naming方式时,需要注意的是,可以使用TNS_ADMIN指定tnsname.ora的位置

Oracle 按照下面的顺序需要tnsname.orasqlnet.ora,最先被找打的就被使用

²  首先是查找TNS_ADMIN参数定义的目录(这个需要注意,对于开发人员很有可能设置此参数)

²  其次,查找一个全局目录,unix系统上,这个目录通常是/var/opt/oracle

²  使用标准目录$ORCLE_HOME/network/admin

 

 

对于easy connect naming方式,10g以上版本才可以,而且需要使用service_name,如果没有service_name,会使用global service name=db_name+db_domian因为db_domain默认为空,所以容易误解用SID也可以,一定要注意这一定

 

 

 

如果觉得连接符还是很麻烦,可以设置操作系统的TWO_TASK,这是使用sql*plus就可以不需要使用连接符了,比如:

 

Export TWO_TASK=testdb

Sqlplus username/password

 

 

数据库命名规则

各种name的介绍

 

Db_name

DB_NAME 数据库名称,也就是数据库的名字标示。这里,数据库里可能有多个实例,比如RAC里的多节点,这多个节点是不同的实例,但是却有相同的名字,他们的 DB_NAME是相同的,但是Instance_name是不同的。DB_NAME会保持在数据文件头里,所以更改DB_NAME不能仅仅修改parameter,还需要用nid来进行更改,并且更改后还需要手工做些工作,使其生效,一般情况下不建议修改。
db_name
是数据库的名字,oracle本身可能是比较有用的,对我们而言没有什么太多的用处,db_name记录在controlfiledatafile_headerredo。在建库时,db_name被限制为最长8个字符。

这种表示对于单个数据库是足够的,但是随着由多个数据库构成的分布式数据库的普及,这种命令数据库的方法给数据库的管理造成一定的负担,因为各个数据库的名字可能一样,造成管理上的混乱。为了解决这种情况,引入了Db_domain参数,这样在数据库的标识是由Db_nameDb_domain两个参数共同决定的,避免了因为数据库重名而造成管理上的混乱。这类似于互连网上的机器名的管理。我们将Db_nameDb_domain两个参数用’.’连接起来,表示一个数据库,并将该数据库的名称称为Global_name,即它扩展了Db_nameDb_name参数只能由字母、数字、’_’’#’’$’组成,而且最多8个字符。

db_name还有一个非常重要的作用就是动态注册监听,不管是否指定了service_name,或者说service_name的值是什么,pmon都会使用db_name动态注册监听的。

DBIDDataBase IDentifier

Oracle 官网对DBID的解释如下:

    An internal, uniquely generated number that differentiates databases.Oracle creates this number automatically when you create the database.

 

    DBID 可以看成是db_name在数据库内部的表示。 DBID是在创建数据库时,用db_name 结合一种算法来创建的。 具体用什么算法,不太清楚。它存在与数据文件和控制文件,用于表示数据文件的归属。 所以这个DBID 是唯一的。  对于不同的数据库,DBID 是不同的,但是db_name 有可能相同。

    用身份证打个比方: 可以有同名的人,但是它的省份证号码肯定是不同的。

 

查看DBID:

SQL> select dbid from v$database;

DBID

----------

1262006473

 

Db_domain

Db_domain定义一个数据库所在的域,该域的命名同互联网的没有任何关系,只是数据库管理员为了更好的管理分布式数据库而根据实际情况决定的。当然为了管理方便,可以将其等于互联网的域。

Global_name

Global_name对一个数据库(Oracle database)的唯一标识,oracle建议用此种方法命令数据库。该值是在创建数据库是决定的,缺省值为Db_name. Db_domain。在以后对参数文件中Db_nameDb_domain参数的任何修改不影响Global_name的值,如果要修改Global_name,只能用ALTER DATABASE RENAME GLOBAL_NAME TO <db_name.db_domain>命令进行修改,然后修改相应参数。

 

db_domain 的作用主要是用在分布式数据库中,分布式事务的各个数据库应该有db_domain
global_name
是由db_name.db_domain构成的,global_name的作用主要也是用在Distributed Database中。配置静态监听注册时,需要输入的全局数据库名(GLOBAL_DBNAME )输入什么都可以,只要保证listerner.ora中的GLOBAL_DBNAMEtnsnames.ora中的SERVICE_NAME保持一致就可以。

DB_UNIQUE_NAME

DB_UNIQUE_NAME10g的参数,在配置dataguard环境时必须为处于dg环境中每个db设置一个唯一值,在没有DB_UNIQUE_NAME参数之前,在同一台机器上搭建dg时必须使用参数LOCK_NAME_SPACEstandby参数文件中,10g有了参数db_unique_nameLOCK_NAME_SPACE已经被废弃。

 

 

 

 

 

ORACLE_SID

通常情况下,ORACLE_SID这个环境变量全称"Oracle System Identifier",,用于在一台服务器上,标识不同的实例,默认情况下,实例名就是ORACLE_SID的值(即INSTANCE_NAME=$ORACLE_SID

当然实例名也可以不同于ORACLE_SID这个环境变量,只要在初始化参数文件里显示指定

INSTANCE_NAME参数值不同于ORACLE_SID环境变量的值即可)。在UNIX/Linux平台下,该环境变量

主要作用是同ORACLE_HOME这个环境变量做hash运算,得到一个唯一值,用来标识共享内存段,及SGA。下面,摘录一段TOM大师光辉著作《Expert Oracle Database Architecture 》的原文:

" If youre unfamiliar with the term SID or ORACLE_SID, a full definition is called for. The SID is

a site identifier . It and ORACLE_HOME (where the Oracle software is installed) are hashed together

in UNIX to create a unique key name for attaching an SGA. If your ORACLE_SIDor ORACLE_HOME is

not set correctly, youll get the ORACLE NOT AVAILABLE error, since you cant attach to a shared

memory segment that is identified by this unique key. On Windows, shared memory isnt used in

the same fashion as UNIX , but the SID is still important. You can have more than one database on

the same ORACLE_HOME, so you need a way to uniquely identify each one, along with their

configuration files."

 

 

ORACLE_HOME环境变量是Oracle软件的安装路径,顺带ORACLE_BASE环境变量是Oracle软件安装的基目录。

 

原文链接:http://www.cnblogs.com/david-zhang-index/archive/2012/06/11/2545553.html

 

OracleSID的作用类似于一个开关变量”---引导Oracle在实例启动时如何去默认位置下读取适当的参数文件并加载,以正确启动实例。我们知道实例的启动需要指定pfile/spfile(Oracle9i之前是使用pfile--init文件,从9i开始就默认使用spfile--即服务器端参数文件,两者的不同请参考《Oracle 10g Concept》手册,关键在于修改其中参数后是否会自动持久化)。这两个文件的存放位置为:
A.pfile:
名字为init<ORACLE_SID>.ora B.spfile:名字为spfile<ORACLE_SID>.ora
我们看到init文件和spfile文件都带有ORACLE_SID的标识,这就是SID的作用了:
1】当我们要启动一个实例时,我们首先通过:set ORACLE_SID = XXX或者export ORACLE_SID = XXX的方式告诉Oracle接下来要启动的实例
2】当我们执行startup nomount时,由于已经指定了SID,那么Oracle知道了如何去默认的目录下查找该实例对应的参数文件--就是靠SID去匹配每个init/spfile文件
3】当Oracle找到该文件后(init/spfile),就会读取该文件的内容,将一系列参数用于分配内存空间,构建后台进程等实例的启动过程
4】当这个实例成功启动后,我们又可以重新执行 set ORACLE_SID = XXX export ORACLE_SID = XXX命令再次将开关拨向另一个SID,然后重复以上步骤
从上面的过程我们看到Oracle SID的作用是一个明显的开关变量,它拔向哪一边,那么Oracle就会去找和它对应的参数文件来启动实例。其次SID也起到进程隔离的作用--SID会在实例的一系列后台进程中得到体现,如ora_dbw0_paullinora_dbw0_boblin。通过SID来命名后台进程。
操作系统也必须通过SID来和Oracle实例打交道,操作系统并不知道什么INSTANCE_NAME,只知道ORACLE_SID,在Oracle内部由Oracle自己根据这个SID去识别不同的实例。所以ORACLE_SID更多的是“Oracle和外部操作系统沟通的一个窗口

 

Instance_name

instance_name是实例名,是数据库运行中名称,默认和db_name是一样的

 

相比于ORACLE_SID这样的开关变量INSTANCE_NAME则是一个实实在在的参数。它是在init/pfile文件中配置的(db_name)。用于标识数据库实例的名称,其缺省值就是ORACLE_SIDINSTANCE_NAME就像一个人的名称一样,而SID则是这个人的身份证号码。通过SID我们找到对应的init/spfile文件,而init/spfile文件中又通过instance_name这个参数告诉我们对应的实例叫什么名字。这样就把ORACLE_SID、参数文件、INSTANCE_NAME联系起来了。
造成ORACLE_SID不同,但INSTANCE_NAME相同的原因通常是因为复制了原有的参数文件,但忘记了修改其中的INSTANCE_NAME参数的值。不过在10G之后INSTANCE_NAME这个参数以及从init/spfile中消失了,以免引起混乱。

 

Service_name

Service_name该参数是oracle8i新引进的。在8i以前,我们用SID来表示标识数据库的一个实例,但是在Oracle的并行环境中,一个数据库对应多个实例,这样就需要多个网络服务名,设置繁琐。为了方便并行环境中的设置,引进了Service_name参数,该参数对应一个数据库,而不是一个实例,而且该参数有许多其它的好处。该参数的缺省值为Db_name. Db_domain,即等于Global_name。一个数据库可以对应多个Service_name,以便实现更灵活的配置。该参数与SID没有直接关系,即不必Service name 必须与SID一样。

Net service name

Net service name网络服务名,又可以称为数据库别名(database alias)。是客户端程序访问数据库时所需要,屏蔽了客户端如何连接到服务器端的细节,实现了数据库的位置透明的特性。

 

串联理解

Db_nanme

我们已经知道了ORACLE_SID是一个开关变量INSTANCE_NAME是用来描述实例的。那么DB_NAME则是描述实例挂载的数据库名称,通过这个DB_NAME我们可以知道对应的磁盘上的控制文件、日志文件、数据文件的位置。
DB_NAME
在创建数据库时被指定,默认情况下和ORACLE_SID的名字一样。但和INSTANCE_NAME一样。DB_NAME一旦被确定下来就不能修改了,因为它会同时存储在init/spfie,控制文件,日志文件,数据文件。你只能修改init/spfile文件中DB_NAME参数的值,但是不能手工修改其它文件的值。所以一旦修改后引起几个文件的值不匹配那么数据库的启动就会失败。
A.一个实例可以MOUNT并打开任何数据库(通过init/spfile中配置DB_NAME参数),但是同一时间一个实例只能打开一个数据库。

B.一个数据库可以被一个或多个实例所MOUNT并打开(只能是在RAC环境下,普通环境下一个数据库只能同时被一个实例MOUNT并打开)

那么如何知道实例应该挂载到那个数据库并打开呢?就是靠init/spfile中的“control_files”参数来告诉Oracle去那里读取控制文件,而控制文件中又记录了数据文件的位置。所以最终形成一个完整的链条:
ORACLE_SID --> init/spfile
文件 --> instance_namedb_namecontrol_files -->实例名、数据库名、控制文件 --> 数据文件 --> 完成挂载并打开

 ORACLE_SIDINSTANCE_NAMEDB_NAME对应关系

 

我们已经知道ORACLE_SID是用来隔离同一个ORACLE_HOME下不同的实例的。但对于不同的ORACLE_HOME呢?能否有相同名称的SID呢?
实际上这就和文件系统的规则是一样的:在同一个目录下不允许有同名的文件存在,但不同的目录下可以有同名的文件。同样的在同一个ORACLE_HOME下不能有相同的SID存在,而不同的ORACLE_HOME下可以有重名的SID(即便是同一台机,只要ORACLE_HOME不同就可以)
那么对于INSTANCE_NAME呢?默认情况下INSTANCE_NAMEORACLE_SID是相同的,也可以是不同的;而且不同的实例可以具有相同的实例名。这听起来有点混乱是不?其实我们可以用一个简单的生活化例子来解析:
在一个班级Class_1里面,有两个学生,他们的名称都叫张三,但他们的学号肯定不同。在这里张三就是INSTANCE_NAME,而学号就是SID。所以INSTANCE_NAME重复没关系,只要SID不同就可以区分开来。
但是在另外一个班级Class_2里面,也有学号相同的学生,这时候就出现了我们说的SID相同的问题,那么如何区分呢?别忘了我们还有班级这个概念啊!对应于ORACLE就是ORACLE_HOME了。
至于INSTANCE_NAMEDB_NAME的对应关系,这个很好理解了,不同的实例可以挂载到不同的DB,也可以挂载到相同的DB嘛。可以把这理解为多个进程同时对同一份磁盘文件的竞争性访问
A. 相同ORACLE_HOME下,INSTANCE_NAME可以相同,但ORACLE_SID必须唯一。通过ORACLE_SID来区分不同的实例

B. 不同ORACLE_HOME下,ORACLE_SID可以相同,通过ORACLE_HOME来区分不同的SID

C.不同INSTANCE_NAME可以对应不同的DB_NAME,也可以对应相同的DB_NAME。但是如果不是在RAC环境下,只能同时启动实例而不能同时挂载

 

 

Oracle实例启动过程的相关参数文件

 

前面说到Oracle实例启动时,需要指定pfile/spfile参数,对应的就是init文件和spfile文件。那么当这两个文件同时存在时Oracle如何决定读取那个呢?
Oracle 9i为例,由于默认采用了spfile来启动实例,所以查找的顺序是:
spfile<ORACLE_SID>.ora ---> spfile.ora ---> init<ORACLE_SID>.ora

即默认加载和SID对应的参数文件,如果找不到则采用默认的参数文件,再找不到就用旧的init文件,如果还是找不到则实例无法启动。下面我们来看看这些文件的内容(Oracle 10g为例)
A.spfile<ORACLE_SID>.ora:

B.init<ORACLE_SID>.ora

我们看到spfile<ORACLE_SID>.ora文件的内容就是我们创建数据库时在DBCA中填写的参数,而init<ORACLE_SID>.ora文件的内容则指向了该spfile,所以不论如何都是从spfile来启动实例了。

 

 

 

在配置文件中的情况:

init.ora中有db_nameinstance_nameservice_name
db_name是数据库的名称,在db安装时就已经设置了,它决定了数据库安装文件的位置。
instance_name
是实例名,是数据库运行中名称,默认和db_name是一样的
service_name
应该是指数据库网络连接时的名称,在listener配置中会有所考虑的。这个值也是可以随意改动的,并且还可以有多个值。

listener.ora中有SID_NAMEGLOBAL_DBNAME

这里SID_NAME指数据库的运行的实例名,应该是和instance_name一致

而对于GLOBAL_DBNAMElistener配置的对外网络连接名称,我们在配置tnsname.ora时会考虑这个参数。这个参数可以任意的设置。

tnsname.ora中有SERVICE_NAMESID
对于这里的配置主要要给出要连接的数据库的IP及其连接的实例或服务
在监听配置中我们提到了对外网络连接名称,在这里如果用SERVICE_NAME的话,就需要SERVICE_NAME=(GLOBAL_DBNAME或者service_name这里要求oracle已经注册到了监听器中),对于SID=(instance_name
最后一个是ORACLE_SID参数,这个参数是操作系统中用到的,它是描述我们要默认连接的数据库实例,对于一个机器上有多个实例的情况下,要修改后才能通过 conn / as sysdba连接,因为这里用到了默认的实例名。

修改各种name

修改db_unique_name

SQL> show parameter name

 

 

NAME                                        TYPE       VALUE

------------------------------------ ----------- ------------------------------

db_file_name_convert                   string

db_name                                 string     orcl

db_unique_name                            string     orcl

global_names                         boolean FALSE

instance_name                                string     orcl

lock_name_space                 string

log_file_name_convert                  string

service_names                                 string     orcl

 

 

SQL> alter system set db_unique_name=unidb scope=spfile;

 

 

SQL> show parameter name

 

 

NAME                                        TYPE       VALUE

------------------------------------ ----------- ------------------------------

db_file_name_convert                   string

db_name                                 string     orcl

db_unique_name                            string    UNIDB

global_names                         boolean FALSE

instance_name                                string     orcl

lock_name_space                 string

log_file_name_convert                  string

service_names                                 string    UNIDB

 

 

Listener Parameter File   /u01/app/oracle/10.2.0/db_1/network/admin/listener.ora

Listener Log File         /u01/app/oracle/10.2.0/db_1/network/log/listener.log

Listening Endpoints Summary...

  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oracle)(PORT=1521)))

  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC0)))

Services Summary...

Service "PLSExtProc" has 1 instance(s).

  Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...

Service "UNIDB" has 1 instance(s).

  Instance "orcl", status READY, has 1 handler(s) for this service...

Service "UNIDB_XPT" has 1 instance(s).

  Instance "orcl", status READY, has 1 handler(s) for this service...

The command completed successfully

 

 

 

修改service_name

SQL> alter system set service_names=servicename;

System altered.

 

SQL> show parameter name

 

 

NAME                                        TYPE       VALUE

------------------------------------ ----------- ------------------------------

db_file_name_convert                   string

db_name                                 string     orcl

db_unique_name                            string     UNIDB

global_names                         boolean FALSE

instance_name                                string     orcl

lock_name_space                 string

log_file_name_convert                  string

service_names                                 string     SERVICENAME

 

 

 

Listener Parameter File   /u01/app/oracle/10.2.0/db_1/network/admin/listener.ora

Listener Log File         /u01/app/oracle/10.2.0/db_1/network/log/listener.log

Listening Endpoints Summary...

  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oracle)(PORT=1521)))

  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC0)))

Services Summary...

Service "PLSExtProc" has 1 instance(s).

  Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...

Service "SERVICENAME" has 1 instance(s).

  Instance "orcl", status READY, has 1 handler(s) for this service...

Service "UNIDB" has 1 instance(s).

  Instance "orcl", status READY, has 1 handler(s) for this service...

Service "UNIDB_XPT" has 1 instance(s).

  Instance "orcl", status READY, has 1 handler(s) for this service...

Service "orclXDB" has 1 instance(s).

  Instance "orcl", status READY, has 1 handler(s) for this service...

The command completed successfully

 

修改instance_name

 

[oracle@oracle ~]$ cd /u01/app/oracle/10.2.0/db_1/dbs/

[oracle@oracle dbs]$ ll

total 6956

-rw-rw---- 1 oracle oinstall    1544 Oct  1  2011 hc_orcl.dat

-rw-r----- 1 oracle oinstall   12920 May  3  2001 initdw.ora

-rw-r----- 1 oracle oinstall    8385 Sep 11  1998 init.ora

-rw-rw---- 1 oracle oinstall      24 Oct  1  2011 lkORCL

-rw-rw---- 1 oracle oinstall      24 Oct 22 23:22 lkUNIDB

-rw-r----- 1 oracle oinstall    1536 Sep 10 11:56 orapworcl

-rw-r----- 1 oracle oinstall 7061504 Jul  7 18:00 snapcf_orcl.f

-rw-r----- 1 oracle oinstall    3584 Oct 22 23:23 spfileorcl.ora

[oracle@oracle dbs]$ mv spfileorcl.ora spfileinst.ora

 

 

 

[oracle@oracle dbs]$ export ORACLE_SID=inst

[oracle@oracle dbs]$ ps -ef |grep ora_

oracle    4334  3933  0 23:26 pts/1    00:00:00 grep ora_

[oracle@oracle dbs]$ sqlplus / as sysdba

 

 

SQL> startup

SQL> startup

ORACLE instance started.

 

 

Total System Global Area  184549376 bytes

Fixed Size              1218412 bytes

Variable Size                 62916756 bytes

Database Buffers      117440512 bytes

Redo Buffers                 2973696 bytes

Database mounted.

Database opened.

SQL>

SQL>

SQL> show parameter nbame

SQL> show parameter nbame

SQL>

SQL>

SQL> show parameter na,me

SQL> show parameter na,me

SQL>

SQL>

SQL> show parameter name

SQL> show parameter name

 

 

NAME                                        TYPE       VALUE

------------------------------------ ----------- ------------------------------

db_file_name_convert                   string

db_name                                 string     orcl

db_unique_name                            string     UNIDB

global_names                         boolean FALSE

instance_name                                string    inst

lock_name_space                 string

log_file_name_convert                  string

service_names                                 string     SERVICENAME

 

 

 

Listener Parameter File   /u01/app/oracle/10.2.0/db_1/network/admin/listener.ora

Listener Log File         /u01/app/oracle/10.2.0/db_1/network/log/listener.log

Listening Endpoints Summary...

  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oracle)(PORT=1521)))

  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC0)))

Services Summary...

Service "PLSExtProc" has 1 instance(s).

  Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...

Service "SERVICENAME" has 1 instance(s).

  Instance "inst", status READY, has 1 handler(s) for this service...

Service "UNIDB" has 1 instance(s).

  Instance "inst", status READY, has 1 handler(s) for this service...

Service "UNIDB_XPT" has 1 instance(s).

  Instance "inst", status READY, has 1 handler(s) for this service...

Service "orclXDB" has 1 instance(s).

  Instance "inst", status READY, has 1 handler(s) for this service...

The command completed successfully

 

 

 

 

 

 

 

修改db_name dbid

l  方法一

 

修改db_name

修改参数文件,重建控制文件,open database resetlogs

SQL> alter database backup controlfile to trace;

 

 

Database altered.

 

修改initinst.ora里的db_name

 

[oracle@oracle dbs]$ ls

hc_inst.dat  hc_orcl.dat  initdw.ora  initinst.ora  init.ora  lkORCL  lkUNIDB  orapworcl  snapcf_orcl.f  spfileinst.ora

[oracle@oracle dbs]$ vi initinst.ora

[oracle@oracle dbs]$ exit

exit

 

SQL> shutdown immediate

ORA-01507: database not mounted

 

 

ORACLE instance shut down.

SQL> !pwd

/u01/app/oracle/10.2.0/db_1/dbs

 

SQL> !

[oracle@oracle dbs]$ ls

hc_inst.dat  hc_orcl.dat  initdw.ora  initinst.ora  init.ora  lkORCL  lkUNIDB  orapworcl  snapcf_orcl.f  spfileinst.ora

[oracle@oracle dbs]$ mv spfileinst.ora spfileinst.ora.bak

[oracle@oracle dbs]$ ls

hc_inst.dat  hc_orcl.dat  initdw.ora  initinst.ora  init.ora  lkORCL  lkUNIDB  orapworcl  snapcf_orcl.f  spfileinst.ora.bak

 

 

SQL> STARTUP NOMOUNT

 

CREATE CONTROLFILE REUSEset DATABASE "dbname" RESETLOGS FORCE LOGGING ARCHIVELOG

  2 

  2      MAXLOGFILES 16

  2 

 

    MAXLOGFILES 16

  3 

  3      MAXLOGMEMBERS 3

  3 

 

    MAXLOGMEMBERS 3

  4 

  4      MAXDATAFILES 100

  4 

 

    MAXDATAFILES 100

  5 

  5      MAXINSTANCES 8

  5 

 

    MAXINSTANCES 8

  6 

  6      MAXLOGHISTORY 292

  6 

L

    MAXLOGHISTORY 292

  7 

  7  LOGFILE

  7 

 

LOGFILE

  8 

  8    GROUP 1 '/u01/app/oracle/oradata/orcl/redo01.log'  SIZE 50M,

  8 

 

  GROUP 1 '/u01/app/oracle/oradata/orcl/redo01.log'  SIZE 50M,

  9 

  9    GROUP 2 '/u01/app/oracle/oradata/orcl/redo02.log'  SIZE 50M,

  9 

 

  GROUP 2 '/u01/app/oracle/oradata/orcl/redo02.log'  SIZE 50M,

 10 

 10    GROUP 3 '/u01/app/oracle/oradata/orcl/redo03.log'  SIZE 50M

 10 

-

  GROUP 3 '/u01/app/oracle/oradata/orcl/redo03.log'  SIZE 50M

 11 

 11  -- STANDBY LOGFILE

 11 

D

-- STANDBY LOGFILE

 12 

 12  DATAFILE

 12 

 

DATAFILE

 13 

 13    '/u01/app/oracle/oradata/orcl/system01.dbf',

 13 

 

  '/u01/app/oracle/oradata/orcl/system01.dbf',

 14 

 14    '/u01/app/oracle/oradata/orcl/undotbs01.dbf',

 14 

 

  '/u01/app/oracle/oradata/orcl/undotbs01.dbf',

 15 

 15    '/u01/app/oracle/oradata/orcl/sysaux01.dbf',

 15 

 

  '/u01/app/oracle/oradata/orcl/sysaux01.dbf',

 16 

 16    '/u01/app/oracle/oradata/orcl/users01.dbf',

 16 

 

  '/u01/app/oracle/oradata/orcl/users01.dbf',

 17 

 17    '/u01/app/oracle/oradata/orcl/tools01.dbf'

 17 

C

  '/u01/app/oracle/oradata/orcl/tools01.dbf'

 18 

 18  CHARACTER SET AL32UTF8

 18 

;

 

 

SQL> alter database open resetlogs;

 

 

 

 

 

Database altered.

 

 

SQL>

SQL>

SQL> show parameter name

SQL> show parameter name

 

 

NAME                                        TYPE       VALUE

------------------------------------ ----------- ------------------------------

db_file_name_convert                   string

db_name                                 string    dbname

db_unique_name                            string     UNIDB

global_names                         boolean FALSE

instance_name                                string     inst

lock_name_space                 string

log_file_name_convert                  string

service_names                                 string     SERVICENAME

SQL>

SQL>

SQL> create spfile from pfile;

 

 

 

 

 

[oracle@oracle orcl]$ pwd

/u01/app/oracle/admin/orcl

[oracle@oracle orcl]$ ls

adump  bdump  cdump  dpdump  pfile  udump

[oracle@oracle orcl]$

 

 

 

l  方法

-- 我们可以使用NID命令只修改DBNAME,或者只修改DBID,或者2个都修改。

 

他们的区别如下:

 1. If you change the DBID you must open the database with the RESETLOGS option, which re-creates the online redo logs and resets their sequence to 1.

-- 修改DBID,必须要用resetlogs打开数据库。这个在之前的DBID 的介绍里说过,因为DBID存在与数据文件,redo log 和控制文件。所以如果修改了DBID,则必须要使用resetlogs打开。

 

 2. If you change the DBNAME without changing the DBID then this does not require you to open with the RESETLOGS option, so database backups and archived logs are not invalidated. You must change the DB_NAME initialization parameter after a database name change to reflect the new name. Also, you may have to re-create the Oracle password file. If you restore an old backup of the control file (before the name change, then you should use the initialization parameter file and password file from before the database name change.

 

关于NID 修改DBIDDBNAME的具体3种用法,参考之前的那片文章。

 

在这里还有一点要注意,就是orapwSID initSID.ora 是和INSTANCE_NAME对应的,如果这个参数修改了,那么这2个文件也需要修改并与INSTANCE_NAME对应。修改这个参数也很简单,就是在init 文件里指定一个名称即可,如:*.INSTANCE_NAME=orcl

 

 

. 修改DBID, DBNAME步骤

 在这里,只演示一下修改DBID DBNAME的操作。并不修改INSTANE_NAME.

 

步骤如下:

1. Backup of the database.

2. Shutdown IMMEDIATE of the database

3. STARTUP MOUNT

4. Open one session and run NID with sysdba privileges

 % nid TARGET=SYS/password@test_db DBNAME=test_db2

 - the value of DBNAME is the new dbname of the database

5. After DBNEWID successfully changes the DBID,Shutdown IMMEDIATE of the database

6. Set the DB_NAME initialization parameter in the initialization parameter file to the new database name.

7. Create a new password file.

8. Startup of the database with open resetlogs

 

 

在修改之前,先看一下数据库的参数:

SQL&gt; select name,dbid,db_unique_name from v$database;

NAME DBID DB_UNIQUE_NAME

--------- ---------- ------------------------------

ORCL 1264931370 orcl

SQL&gt; select instance_name from v$instance;

INSTANCE_NAME

----------------

orcl

 

 

2.1 shutdown database

SQL&gt; shutdown immediate

Database closed.

Database dismounted.

ORACLE instance shut down.

 

2.2 Startup mount

SQL&gt; startup mount;

ORACLE instance started.

 

Total System Global Area 360710144 bytes

Fixed Size 1219424 bytes

Variable Size 109053088 bytes

Database Buffers 247463936 bytes

Redo Buffers 2973696 bytes

Database mounted.

 

2.3 Run NID command

[oracle@singledb bdump]$ nid

DBNEWID: Release 10.2.0.1.0 - Production on Mon Dec 20 14:26:13 2010

Copyright (c) 1982, 2005, Oracle. All rights reserved.

 

Keyword Description (Default)

----------------------------------------------------

TARGET Username/Password (NONE)

DBNAME New database name (NONE)

LOGFILE Output Log (NONE)

REVERT Revert failed change NO

SETNAME Set a new database name only NO

APPEND Append to output log NO

HELP Displays these messages NO

 

[oracle@singledb bdump]$ nid target=/ dbname=dave

DBNEWID: Release 10.2.0.1.0 - Production on Mon Dec 20 14:27:13 2010

Copyright (c) 1982, 2005, Oracle. All rights reserved.

Connected to database ORCL (DBID=1264931370)

Connected to server version 10.2.0

Control Files in database:

 /u01/app/oracle/oradata/orcl/control01.ctl

 /u01/app/oracle/oradata/orcl/control02.ctl

 /u01/app/oracle/oradata/orcl/control03.ctl

 

Change database ID and database name ORCL to DAVE? (Y/[N]) =&gt; Y --手工输入

 

Proceeding with operation

Changing database ID from 1264931370 to 801102850

Changing database name from ORCL to DAVE

 Control File /u01/app/oracle/oradata/orcl/control01.ctl - modified

 Control File /u01/app/oracle/oradata/orcl/control02.ctl - modified

 Control File /u01/app/oracle/oradata/orcl/control03.ctl - modified

 Datafile /u01/app/oracle/oradata/orcl/system.256.736598559 - dbid changed, wrote new name

 Datafile /u01/app/oracle/oradata/orcl/undotbs1.258.736598599 - dbid changed, wrote new name

 Datafile /u01/app/oracle/oradata/orcl/sysaux.257.736598563 - dbid changed, wrote new name

 Datafile /u01/app/oracle/oradata/orcl/users.259.736598641 - dbid changed, wrote new name

 Datafile /u01/app/oracle/oradata/orcl/temp.263.736599505 - dbid changed, wrote new name

 Datafile /u01/app/oracle/oradata/orcl/temp01.dbf - dbid changed, wrote new name

 Control File /u01/app/oracle/oradata/orcl/control01.ctl - dbid changed, wrote new name

 Control File /u01/app/oracle/oradata/orcl/control02.ctl - dbid changed, wrote new name

 Control File /u01/app/oracle/oradata/orcl/control03.ctl - dbid changed, wrote new name

 Instance shut down

 

Database name changed to DAVE.

Modify parameter file and generate a new password file before restarting.

Database ID for database DAVE changed to 801102850.

All previous backups and archived redo logs for this database are unusable.

Database is not aware of previous backups and archived logs in Recovery Area.

Database has been shutdown, open database with RESETLOGS option.

Succesfully changed database name and ID.

DBNEWID - Completed succesfully.

 

[oracle@singledb bdump]$

 

 

2.4 修改PFILE里的DB_NAME参数

[oracle@singledb dbs]$ cat initorcl.ora

...

*.db_name='dave'

...

 

2.5 pfile启动数据库,并用resetlogs打开

SQL&gt; startup mount pfile='/u01/app/oracle/product/10.2.0/db_1/dbs/initorcl.ora';

ORACLE instance started.

Total System Global Area 360710144 bytes

Fixed Size 1219424 bytes

Variable Size 109053088 bytes

Database Buffers 247463936 bytes

Redo Buffers 2973696 bytes

Database mounted.

SQL&gt; alter database open resetlogs;

Database altered.

 

2.7 查看修改之后的信息

SQL&gt; select name,dbid,db_unique_name from v$database;

NAME DBID DB_UNIQUE_NAME

--------- ---------- ------------------------------

DAVE 801102850 dave

 

SQL&gt; select instance_name from v$instance;

INSTANCE_NAME

----------------

orcl

 

 

修改db_name后默认的db_unique_name  service_name都改变了,和db_name一样

 

 

Local listenerremote listener

监听关系

ORACLE的PMON进程把listener.ora设定静态的实例信息注册到监听器中,在节点的listener.ora设定静态的实例信息不是必须的。

在9I中提供了实例的自动注册功能,就是在实例启动后,PMON进程会自动把实例的相关信息注册到监听器中,以便客户端请求连接时,通过实例已注册的监听连接到实例。为了确保服务注册功能正常工作,我们一般还是会设置 listener.ora文件。

 

在RAC环境中,服务器端负载均衡会衡量各节点的CPU使用率和活动连接数,当一个新的连接通过任一监听请求时,这个监听会把这个新的连接发送到CPU使用率最低的节点的实例上,如果使用了共享连接,(使用调度进程),这个连接会被监听发送到连接数最少的调度进程。

 

在RAC环境里ORACLE的PMON进程使用local_listener和remote_listener这两个参数来注册实例的信息到集群中各节点的监听器

 

local_listener参数是用于PMON进程把实例信息注册到本地监听,这个参数不是必需的,如果初始化参数文件中没有这个参数,当一个节点的实例启动后,PMON进程会尝试把实例以默认使用1521端口注册到本地监听,只有在实例使用非1521端口时,我们才需要使用这个参数.

 

remote_listener参数是用于PMON进程把本地实例注册到集群中的其它监听上,通过使用这个参数,RAC中各节点的监听可以把连接到本地监听上的连接发送到CPU使用率最低的节点的实例上.从而实现服务器端的负载均衡.

 

 

过程描述:
       
当客户端发出连接请求给serverlistener的时候,通过local_listener注册的服务接收这个连接请求,然后由master instance来决定这个连接请求应该由哪个目标instance发出server process响应这个连接请求。如果启用负载均衡,那么主节点会选择cpu负载最小的那个instance,此时
     
如果master分配的目标instancelocal listener machine,那么直接通过local server listener,开启后台的server process,处理发出conn的客户端,建立连接,处理会话;
     
如果master分配的目标instance不是local listener machine,那么会通过remote_listener这个参数,把连接请求转移到remote machine上的listener,然后由remote service listener发出一个server process返回客户端,建立连接,处理会话
.
     
conn建立连接以后,listener就没有用了,不会再用到了,如果这个时候,已经连接的那个instance down了,会重新由新分配的master instance通过remote_listener切换到可用instance,此时客户不会发现连接中断。conn select操作是不会中断的。

 

 

 

  这里要注意的是:动态注册默认只注册到默认的监听器上(名称是LISTENER、端口是1521、协议是TCP),因为pmon只会动态注册port等于1521的监听,否则pmon不能动态注册listener,如果需要向非默认监听注册,则需要配置local_listener参数。

 

 

       因此我们看到了LOCAL_LISTENER的作用。 监听的端口默认是1521,但是很多情况下,处于安装考虑,不会使用1521端口,因为在这种情况下使用动态注册就需要配置LOCAL_LISTENER参数。

 

 

 

       将监听的信息添加到tnsnames.ora 文件中。因为pmon在动态注册监听时要从tnsnames.ora中读取相关信息。

 

 

 

LISTENER _RACDB1 =

 

  (ADDRESS_LIST =

 

    (ADDRESS = (PROTOCOL = TCP)(HOST = rac1)(PORT =1522))

 

  )

 

 

数据库负载来源

 

 

从系统的负载情况是由MMON进程通知PMON-通知监听或是ONSAQ

 

manageability monitor         MMONAWR主要的进程。
    作用:

1收集AWR必须的统计数据,把统计数据写入磁盘。10g中保存在SYSAUX表空间中。
          2,生成server-generated报警。


          每一个小时把shard pool中的统计信息写入磁盘,或shard pool占用超过5%

RAC 连接案例

http://blog.csdn.net/inthirties/article/details/5252004

RAC环境下,客户端连接总是感觉不稳定,时不时就给你来个
ORA-12545:
因目标主机或对象不存在,连接失败


相信很多有RAC方面应用的朋友都遇见过这个问题了。


解决的方法就指定
local_listener

如下:

在第一个节点指定其local_listener为自己本机

例如

SQL> alter system set local_listener='(ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.10.30)(PORT = 1521))' sid='inthrac1';

System altered.

在第二个节点一样指定自己的
ip
SQL> alter system set local_listener='(ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.10.31)(PORT = 1521))' sid='inthrac2';

注意这里的ip均为节点对应的
vip

现在再来访问就OK叻,不会出现上面的问题叻。


Oracle的文档里local_listener的解释如下

LOCAL_LISTENER specifies a network name that resolves to an address or address list of Oracle Net local listeners (that is, listeners that are running on the same machine as this instance). The address or address list is specified in the TNSNAMES.ORA file or other address repository as configured for your system.

不过并没有对这个问题又一个很清晰的回复。


现在客户端不再出现这样的问题,但是有面临了一个新的问题。


当进行了如上的设置以后,发现现在虽然可以连接顺利了,但是做了好多的此的连接测试,均发现都仅仅只是连接到其中的一个实例去了。按照介绍的LB开启的话,应该RAC系统在客户端的request过来以后,会根据CPU的状况,决策一个占用小的实例来处理的。怎么这里都不是我们希望的结果哟,特地在一个节点上进行了一些操作使其CPU上去了,再来连接,发现还是到这个节点上叻。


自己试着把上面的local_listener修改了一下,

SQL> alter system set local_listener='LISTENER_INTHRAC' sid='*';

tnsname.ora
里的LISTENER_INTHRAC的配置如下,这里就是上面Oracle里提到的,
address_list(address list is specified in the TNSNAMES.ORA)
LISTENERS_INTHRAC =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = inth-vip01)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = inth-vip02)(PORT = 1521))
)

然后再测试,就OK叻。现在RAC会选择其中CPU小的节点来进行process的处理叻。

 

 

 

 

 

 

 

 

 

 

连接测试脚本

 

 

 

Ø  连接时间测试

 

#!/bin/sh

date1=`date`

        count=0

        while [ $count -lt 80 ]

        do

                count=$[ $count + 1 ]

                sqlplus -s system/oracle_123 @testdb.sql &

                #sleep 1

        done

date2=`date`

echo "$date1"

echo "$date2"

 

[oracle@stdb ~]$ cat testdb.sql

set feedback off

begin

dbms_lock.sleep(30);

end;

/

Ø  复制均衡测试

 

#!/bin/sh

date1=`date`

        count=0

        while [ $count -lt 80 ]

        do

                count=$[ $count + 1 ]

                sqlplus -s system/oracle_123 @testdb.sql &

                #sleep 1

         wait

        done

date2=`date`

echo "$date1"

echo "$date2"

 

[oracle@stdb ~]$ cat testdb.sql

col " Instance_name" for a20

        select instance_name from v$instance

        /

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值