Oracle管理与维护.配置文件的简要分析

Oracle管理与维护.配置文件的简要分析

草木瓜

20080505
 
一、Oracle的一些疑难概念

Oracle配置文件众多,欲理清思路,须要区别如下一些容易混淆的概念。
<db_name,db_domain,sid,instance_name,global_name,service_name,ORACLE_SID>


db_name(创建参数)

 是Oracle数据库(Oracle database)的唯一标识。这个方法对于单机数据库是足够的,但是随着
 分布式数据库(由多个数据库构成的)的发展,各个数据库可能存在重名,这样造成了管理上的混乱。
 于是引入db_domain参数,这样数据库标识由db_name和db_domain两个参数共同决定,避免了
 因为数据库重名而造成的混乱。这类似于互连网上机器名的管理。我们用db_name.db_domain
 表示一个数据库,这个名称称为global_name,扩展了db_name。
 
 select * from v$parameter where name like '%db_name%';
 db_name参数创建数据库后很难更改,须要重建控制文件等。


db_domain(初始化参数)

 定义数据库所在的域,这个域与我们常说的互联网域和服务器域没有什么关系,只是为了更好的
 管理分布式数据库。
 
 select * from v$parameter where name like '%domain%';
 db_domain可以通过alter system进行修改。
 alter system set db_domain = 'liwei.com' scope=spfile;


global_name

 Oracle建议用此方法命令数据库。缺省值为db_name.db_domain。创建数据库后修改参数文件中
 db_domain不会影响global_name的值,可以用alter database rename global_name to <db_name.
 db_domain>进行修改,然后修改相应db_name和db_domain参数。
 
 select * from global_name;
 alter database rename global_name to TEST.LIWEI.COM;


sid(Oracle System Identifier) = instance_name (初始化参数)

 Oracle使用sid(Oracle System Identifier)标识数据库一个实例。sid也是Oracle与外部交互的实例
 标识。dbca创建数据库时,首先须要指定global_name与sid。我们看下面的文件列表:
 [oracle@liwei dbs]$ ll
 total 52
 -rw-rw----    1 oracle   oradba       1544 May  2 02:32 hc_temp.dat
 -rw-rw----    1 oracle   oradba       1544 May  1 12:40 hc_test.dat
 -rw-r-----    1 oracle   oradba      12920 May  3  2001 initdw.ora
 -rw-r-----    1 oracle   oradba       8385 Sep 11  1998 init.ora
 -rw-r--r--    1 oracle   oradba        848 May  2 02:30 inittest.ora
 -rw-rw----    1 oracle   oradba         24 May  1 12:40 lkTEST
 -rw-r-----    1 oracle   oradba       1536 May  1 19:38 orapwtest
 -rw-r-----    1 oracle   oradba       2560 May  2 02:37 spfiletest.ora
 显然Oracle实例相关配置文件都是使用sid进行文件命名。tnsnames.ora里可以使用( CONNECT_DATA =
 (SID = test) )进行连接数据库。sid值即为v$parameter中的instance_name。
 
 select * from v$parameter where name like 'instance%';
 alter system set instance_name='testins' scope=spfile;
 
 注意:修改instance_name后,tnsnames.ora的SID名称也须要与之对应。


service_name(普通参数)

 此参数是Oracle8i之后引入。8i之前,Oracle用sid(Oracle System Identifier)标识数据库一个实例,
 但如果一个数据库对应多个实例(OPS环境),这样就需要配置多个网络服务名,为了统一配置管理,
 引入了service_name参数,该参数对应数据库,而不是实例,缺省值为db_name.db_domain(global_
 name)。一个数据库可对应多个service_name,以便灵活配置。service_name与sid没有什么直接关
 系。在Oracle RAC模式下每台节点机的实例可用sid标记,数据库由service_name标记。
 
 select * from v$parameter where name like '%service_name%';
 alter system set service_names='abcd,liwei' scope=both
 
 注意:此时tnsnames.ora这段内容 ( CONNECT_DATA = (SERVICE_NAME = test.liwei.com) )中
 的SERVICE_NAME可以是db_name.db_domain也可是service_names.db_domain(如abcd.liwei.com
 或liwei.liwei.com)


instance_name(初始化参数) = sid

 数据库实例名。相关参数INSTANCE_GROUPS,INSTANCE_NAME,INSTANCE_NUMBER等。
 单实例数据库环境下,实例名通常与服务名相同。在RAC环境下多个实例对应单一数据库服务
 名,每个实例分布于不同的节点机上。并行数据库服务环境下,多个实例对应单一数据库服务
 名,每个实例都存在于一台机器上。
 
 select * from v$parameter where name like 'instance%' ;
 alter system set instance_name='testins' scope=spfile ;
 
 注意:v$parameter里的instance_name与gv$instance中的instance_name是不同的。在OPS/RAC
 模式下select * from gv$instance 可以看到多个实例记录,每个instance_name是不同的。正常情况
 下,修改v$parameter的instance_name不会对gv$instance起作用。gv$instance里面的instance_name,
 可以理解为操作系统知晓的数据库实例。我们在Unix/Linux后台ps -ef可以看到:
 oracle    5312     1  0 02:57 ?        00:00:00 ora_pmon_temp
 oracle    5314     1  0 02:57 ?        00:00:00 ora_psp0_temp
 oracle    5316     1  0 02:57 ?        00:00:00 ora_mman_temp
 oracle    5318     1  0 02:57 ?        00:00:00 ora_dbw0_temp
 oracle    5320     1  0 02:57 ?        00:00:00 ora_lgwr_temp
 oracle    5322     1  0 02:57 ?        00:00:00 ora_ckpt_temp
 oracle    5324     1  0 02:57 ?        00:00:00 ora_smon_temp
 oracle    5326     1  0 02:57 ?        00:00:00 ora_reco_temp
 oracle    5328     1  0 02:57 ?        00:00:00 ora_cjq0_temp
 oracle    5330     1  0 02:57 ?        00:00:00 ora_mmon_temp
 ...
 这个后缀temp便是我们gv$instance里的实例名,与export ORACLE_SID=temp是完全一致的。这也是
 Oracle与操作系统或外部交互的重要途径。一个实例可以mount并打开任何数据库,但是同一时间一个
 实例只能打开一个数据库。一个数据库可以被一个或多个实例mount并打开(在OPS/RAC环境下,一
 个数据库可以被多个实例所打开)。要修改gv$instance的instance名称,可以先创建parameter file
 (create pfile='/oracle/admin/test/pfile/inittest.ora' from spfile;),再关闭原实例,操作系统下执行
 export ORACLE_SID=newins,用新的SID startup pfile='/oracle/admin/test/pfile/inittest.ora'打开即可。
 此时新实例的数据库是不能做远程sysdba,sysoper登录。

ORACLE_SID(操作系统环境变量)

 我们了解,sid可以用来标记数据库实例,ORACLE_SID便是操作系统与数据库实例交互的重要
 标识,export ORACLE_SID=temp表明我们可以操作的数据库实例便是temp。ORACLE_SID环境
 变量对应数据库实例gv$instance中的instance_name。正常情况下sid(v$parameter里的instance_name)
 与gv$instance(v$instance)的instance_name都是一致的。


二、初始化参数文件 parameter file (init<SID>.ora)

 默认路径:$ORACLE_HOME/dbs

 见《Oracle管理与维护.安装创建启动关闭数据库的常见问题(一)》
  七、数据库启动问题
   A.参数文件问题

 或参考Oracle文档

三、服务端参数文件 server parameter file (spfile<SID>.ora)
 
 默认路径:$ORACLE_HOME/dbs
 
 见《Oracle管理与维护.安装创建启动关闭数据库的常见问题(一)》
  七、数据库启动问题
   A.参数文件问题

 或参考Oracle文档

四、配置参数文件 Profile Parameters (sqlnet.ora)

 The sqlnet.ora file enables you to:

 Specify the client domain to append to unqualified names
 Prioritize naming methods
 Enable logging and tracing features
 Route connections through specific processes
 Configure parameters for external naming
 Configure Oracle Advanced Security
 Use protocol-specific parameters to restrict access to the database

 权威内容请参考<Oracle Database Net Services Reference Guide 10g Release 1 (10.1)>
 5 Profile Parameters (sqlnet.ora) 一节内容。

 我理解为“解析配置参数文件”,配置项涉及安全,数据库认证方式,解析方式等。注意sqlnet.ora
对本机作为服务端和本机作为客户端都启作用,对于服务端修改sqlnet.ora需要重启listener。下面对
常用方法进行举例说明:

 NAMES.DIRECTORY_PATH
  缺省值为NAMES.DIRECTORY_PATH=(tnsnames, onames, hostname)。
  tnsnames表示采用tnsnames.ora文件来解析
  onames表示Oracle使用自己的名称服务器(Oracle Name Server)来解析
  hostname表示通过主机名来解析
  即通过sqlplus system/sys@aaa连接数据库时,首先分析tnsnames.ora寻找aaa,再
  查询Oracle Name Server,最后寻找主机名。目前Oracle建议使用轻量目录访问协议LDAP
  来取代ONAMES。
  
  示例:
  [oracle@liwei admin]$ cat sqlnet.ora
  NAMES.DIRECTORY_PATH=(tnsnames)
  
  [oracle@liwei oracle]$ sqlplus system/sys@liwei
  
  SQL*Plus: Release 10.2.0.1.0 - Production on Fri May 2 09:29:28 2008
  
  Copyright (c) 1982, 2005, Oracle.  All rights reserved.
  
  ERROR:
  ORA-12154: TNS:could not resolve the connect identifier specified
  
 SQLNET.AUTHENTICATION_SERVICES
  见《Oracle管理与维护.数据库登录的身证验证》二、Oracle登录认证方式
 
 
 TCP.EXCLUDED_NODES
  允许连接的客户端IP(主机名)列表
 TCP.INVITED_NODES
  不允许连接的客户端(主机名)IP列表
 TCP.VALIDNODE_CHECKING
  是否开启IP地址检测(缺省值为no,开启为yes)
  
  注意:上述三项内容修改后,需要重启监听,而重启监听后会有段时间提示如下内容。
  C:/Documents and Settings/Administrator>sqlplus system/sys@unixdb
  
  SQL*Plus: Release 9.2.0.1.0 - Production on Tue May 6 20:09:11 2008
  
  Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.
  
  ERROR:
  ORA-12505: TNS:listener could not resolve SID given in connect descriptor
  等监听完全启动成功,即可。
  
  示例:
  [oracle@liwei admin]$ cat sqlnet.ora
  TCP.VALIDNODE_CHECKING=yes
  TCP.EXCLUDED_NODES=(192.168.105.169)
  
  C:/Documents and Settings/Administrator>sqlplus system/sys@unixdb
 
  SQL*Plus: Release 9.2.0.1.0 - Production on Tue May 6 19:53:44 2008
  
  Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.
  
  ERROR:
  ORA-12547: TNS:lost contact

五、本地命名参数文件 Local Naming Parameters (tnsnames.ora)

 配置工具:netca
 默认路径:$ORACLE_HOME/network/admin
 
 这个文件最为常用,配置网络服务名
 
 示例:
 UNIXDB =
   (DESCRIPTION =
     (ADDRESS_LIST =
       (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.105.173)(PORT = 1521))
     )
     (CONNECT_DATA =
       (sid = samsung)
     )
   ) 
  
  不在赘述。

 注意:
 
 tnsnames.ora默认会有如下内容
 EXTPROC_CONNECTION_DATA =
   (DESCRIPTION =
     (ADDRESS_LIST =
       (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
     )
     (CONNECT_DATA =
       (SID = PLSExtProc)
       (PRESENTATION = RO)
     )
   ) 
    这个主要用于调用外部过程。如使用全文检索时就需要设置EXTPROC_CONNECTION_DATA
    (extproc_connection_data is a special service name that is used for external procedures )
    相应地,listener.ora也有类似内容。
   

六、监听参数文件 Listener Parameters (listener.ora)

 配置工具:netca  或  netmgr
 默认路径:$ORACLE_HOME/network/admin
 
 首先说明一下不须要监听进程的登录方式:
  a.sqlplus / as sysdba          典型的操作系统认证方式
  b.sqlplus system/manager   连接本机数据库
 
 需要监听进程的登录方式:
   sqlplus sys/sys@unixdb      通过网络连接,需要listener进程处于可用状态。
    至于unixdb的解析过程,可参考NAMES.DIRECTORY_PATH设置。
   
    listener.ora 文件有两部分:
   
     第一部分,定义LISTENER进程为哪个实例提供服务,如下
  
      SID_LIST_LISTENER =
       (SID_LIST =
         (SID_DESC =
           (SID_NAME = PLSExtProc)
           (ORACLE_HOME = /oracle/db)
           (PROGRAM = extproc)
         )
       )

  这部分内容与其实EXTPROC_CONNECTION_DATA相对应。

     第二部分,定义LISTENER监听方式
  
   LISTENER =
     (DESCRIPTION_LIST =
       (DESCRIPTION =
         (ADDRESS = (PROTOCOL = TCP)(HOST = liwei)(PORT = 1521))
         (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
       )
     )

  具体参数可以查看Oracle文档<<Oracle Database Net Services Reference Guide >
  不在赘述。

七、连接数据库的解析方法

 上面只是做内容铺垫,这节才是本文的最终意图,将介绍sqlplus连接数据库的不同解析
方法。

 A.NAMES.DIRECTORY_PATH=(tnsnames)  sqlnet.ora设置
 
 <测试环境>
 SQL*Plus: Release 9.2.0.1.0 - Production
 Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production 
 
 SID = test
 GLOBAL_DBNAME=test
 服务端 192.168.105.173 liwei
 
  这个方法最为常用,通过tnsnames.ora来解析连接数据库。具体配置示例:
  
  客户端 tnsnames.ora
  
  UNIXDB =
    (DESCRIPTION =
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.105.173)(PORT = 1521))
      )
      (CONNECT_DATA =
        (sid = test)  #也可用service_name
      )
    ) 
   
  服务端 listener.ora
  (SID_LIST_LISTENER一节内容不要丢,否则会影响客户端解析速度,提示
  ORA-12505: TNS:listener could not resolve SID given in connect descripto,用
  lsnrctl status可以查看到The listener supports no services,不过经测试发现加上
  SID_LIST_LISTENER,重启监听发现还会有解析延迟并提示
  ORA-01034: ORACLE not available
  ORA-27101: shared memory realm does not exist
  Linux Error: 2: No such file or directory
  大该几十秒后正常,这个原因其实是sid与db_name名称不一致造成的。特别提醒!
  )
  
  SID_LIST_LISTENER =
    (SID_LIST =
      (SID_DESC =
        (GLOBAL_DBNAME=test)
        (SID_NAME = test)
        (ORACLE_HOME = /oracle/db)
      )
    )
  
  LISTENER =
  (DESCRIPTION_LIST =
      (DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCP)(HOST = liwei)(PORT = 1521))
      )
  )

  测试示例:
  
  C:/Documents and Settings/Administrator>sqlplus system/sys@unixdb
  
  SQL*Plus: Release 9.2.0.1.0 - Production on Wed May 7 14:13:04 2008
  
  Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.
  
  
  Connected to:
  Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
  With the Partitioning, OLAP and Data Mining options
  
  SQL>  

 B.NAMES.DIRECTORY_PATH=(hostname)  sqlnet.ora设置

 <测试环境>
 SQL*Plus: Release 9.2.0.1.0 - Production
 Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production 
 
 SID = tmdtmd
 GLOBAL_DBNAME = test
 SERVICE_NAMES = aaa,liwei
 服务端 192.168.105.173 liwei
 
  通过数据库服务名进行解析,不需要配置tnsnames.ora。
  
  服务端 listener.ora   
  
  SID_LIST_LISTENER =
    (SID_LIST =
      (SID_DESC =
        (GLOBAL_DBNAME = test)
        (SID_NAME = tmdtmd)
        (ORACLE_HOME = /oracle/db)
      )
    )
  
  LISTENER =
  (DESCRIPTION_LIST =
      (DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCP)(HOST = liwei)(PORT = 1521))
      )
  )

  
  客户端
  windows :  C:/WINDOWS/system32/drivers/etc 修改 hosts 文件
  unix/linux:   /etc 修改 hosts 文件
  添加
  192.168.105.173  liwei.liwei.com 或  192.168.105.173  aaa.liwei.com
  
  测试示例:
  
  C:/Documents and Settings/Administrator>sqlplus system/sys@aaa.liwei.com
  
  SQL*Plus: Release 9.2.0.1.0 - Production on Wed May 7 14:11:59 2008
  
  Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.
  
  
  Connected to:
  Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
  With the Partitioning, OLAP and Data Mining options
  
  SQL>
  
  注意:@aaa.liwei.com必须要配置为数据库的服务名,而不是主机名,可以
  通过tnsping aaa.liwei.com查看详细内容。
  C:/Documents and Settings/Administrator>tnsping aaa.liwei.com
  
  TNS Ping Utility for 32-bit Windows: Version 9.2.0.1.0 - Production on 07-MAY-20
  08 14:15:08
  
  Copyright (c) 1997 Oracle Corporation.  All rights reserved.
  
  Used parameter files:
  e:/oracle/ora92/network/admin/sqlnet.ora
  
  Used HOSTNAME adapter to resolve the alias
  Attempting to contact (DESCRIPTION=(CONNECT_DATA=(SID=*)(SERVICE_NAME=aaa.liwei.
  com))(ADDRESS=(PROTOCOL=TCP)(HOST=aaa.liwei.com)(PORT=1521)))
  OK (20 msec)  
  
  查看最后面的内容便明白为何要配置为SERVICE_NAME。
  sid与db_name名称如果不一致,用这种方式连接数据库,也还会有延迟并提示错误信息。
  ERROR:ORA-12514: TNS:listener could not resolve SERVICE_NAME given in connect descriptor
  
 C.NAMES.DIRECTORY_PATH=(ezconnect)  sqlnet.ora设置  
 
  ezconnect是Oracle10g新推出的功能,对于客户端不需要任何配置,只需要安装Oracle.Net Services 10g
       和支持TCP/IP协议。
      
  <测试环境>
  SQL*Plus: Release 10.2.0.1.0 - Production
  Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production 
  
  SID = tmdtmd
  GLOBAL_DBNAME = test
  SERVICE_NAMES = aaa,liwei
  服务端 192.168.105.173 liwei     
  
  [oracle@liwei admin]$ sqlplus system/sys@192.168.105.173/aaa.liwei.com
  [oracle@liwei admin]$ sqlplus system/sys@192.168.105.173/liwei.liwei.com
  [oracle@liwei admin]$ sqlplus system/sys@liwei/liwei.liwei.com
  [oracle@liwei admin]$ sqlplus system/sys@liwei:1521/aaa.liwei.com
  
  均可连接。tnsping测试显示如下:
  [oracle@liwei admin]$ tnsping 192.168.105.173/liwei.liwei.com
  
  TNS Ping Utility for Linux: Version 10.2.0.1.0 - Production on 02-MAY-2008 20:29:48
  
  Copyright (c) 1997, 2005, Oracle.  All rights reserved.
  
  Used parameter files:
  /oracle/db/network/admin/sqlnet.ora
  
  Used EZCONNECT adapter to resolve the alias
  Attempting to contact (DESCRIPTION=(CONNECT_DATA=(SERVICE_NAME=liwei.liwei.com))(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.105.173)(PORT=1521)))
  OK (10 msec)  
  
  
八、结束

 这部分内容经常让人迷忙,需要一定耐心去实践,本文只是做一些简要分析,希望能
达到开闸引流的作用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值