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)
八、结束
这部分内容经常让人迷忙,需要一定耐心去实践,本文只是做一些简要分析,希望能
达到开闸引流的作用。