一、数据库名 

什么是数据库名? 
数据库名就是一个数据库的标识,就像人的身份证号一样。他用参数DB_NAME表示,如果一台机器上装了多全数据库,那么每一个数据库都有一个数据库名。在数据库安装或创建完成之后,参数DB_NAME被写入参数文件之中。格式如下: 
DB_NAME=myorcl ... 
在创建数据库时就应考虑好数据库名,并且在创建完数据库之后,数据库名不宜修改,即使要修改也会很麻烦。因为,数据库名还被写入控制文件中,控制文件是以二进制型式存储的,用户无法修改控制文件的内容。假设用户修改了参数文件中的数据库名,即修改DB_NAME的值。但是在Oracle启动时,由于参数文件中的DB_NAME与控制文件中的数据库名不一致,导致数据库启动失败,将返回ORA-01103错误。 
  
数据库名的作用 
数据库名是在安装数据库、创建新的数据库、创建数据库控制文件、修改数据结构、备份与恢复数据库时都需要使用到的。 
有很多Oracle安装文件目录是与数据库名相关的,如: winnt: d:\oracle\product\10.1.0\oradata\DB_NAME\... Unix: /home/app/oracle/product/10.1.0/oradata/DB_NAME/... pfile: 
winnt: d:\oracle\product\10.1.0\admin\DB_NAME\pfile\ini.ora Unix: 
/home/app/oracle/product/10.1.0/admin/DB_NAME/pfile/init$ORACLE_SID.ora

跟踪文件目录:

winnt: /home/app/oracle/product/10.1.0/admin/DB_NAME/bdump/... 另外,在创建数据时,careate database命令中的数据库名也要与参数文件中DB_NAME参数的值一致,否则将产生错误。 
同样,修改数据库结构的语句alter database,当然也要指出要修改的数据库的名称。 
如果控制文件损坏或丢失,数据库将不能加载,这时要重新创建控制文件,方法是以nomount方式启动实例,然后以create controlfile命令创建控制文件,当然这个命令中也是指指DB_NAME。 
还有在备份或恢复数据库时,都需要用到数据库名。 总之,数据库名很重要,要准确理解它的作用。   
查询当前数据名 
方法一:select name from v$database;

方法二:show parameter db 方法三:查看参数文件。   
修改数据库名 
前面建议:应在创建数据库时就确定好数据库名,数据库名不应作修改,因为修改数据库名是一件比较复杂的事情。那么现在就来说明一下,如何在已创建数据之后,修改数据库名。步骤如下: 
1.关闭数据库。 
2.修改数据库参数文件中的DB_NAME参数的值为新的数据库名。 
3.以NOMOUNT方式启动实例,修建控制文件(有关创建控制文件的命令语法,请参考oracle文档) 
  
二、数据库实例名

什么是数据库实例名?

数据库实例名是用于和操作系统进行联系的标识,就是说数据库和操作系统之间的交互用的是数据库实例名。实例名也被写入参数文件中,该参数为instance_name,在winnt平台中,实例名同时也被写入注册表。 
数据库名和实例名可以相同也可以不同。 
在一般情况下,数据库名和实例名是一对一的关系,但如果在oracle并行服务器架构(即oracle实时应用集群)中,数据库名和实例名是一对多的关系。
  
查询当前数据库实例名 
方法一:select instance_name from v$instance;

方法二:show parameter instance

方法三:在参数文件中查询。   
数据库实例名与ORACLE_SID 
虽然两者都表是oracle实例,但两者是有区别的。instance_name是oracle数据库参数。而ORACLE_SID是操作系统的环境变量。ORACLD_SID用于与操作系统交互,也就是说,从操作系统的角度访问实例名,必须通过ORACLE_SID。在winnt不台,ORACLE_SID还需存在于注册表中。 
且ORACLE_SID必须与instance_name的值一致,否则,你将会收到一个错误,在unix平台,是“ORACLE not available”,在winnt平台,是“TNS:协议适配器错误”。 
  
数据库实例名与网络连接 
数据库实例名除了与操作系统交互外,还用于网络连接的oracle服务器标识。当你配置oracle主机连接串的时候,就需要指定实例名。当然8i以后版本的网络组件要求使用的是服务名SERVICE_NAME。这个概念接下来说明。

三、数据库域名 

什么是数据库域名?

在分布工数据库系统中,不同版本的数据库服务器之间,不论运行的操作系统是unix或是windows,各服务器之间都可以通过数据库链路进行远程复制,数据库域名主要用于oracle分布式环境中的复制。举例说明如: 
全国交通运政系统的分布式数据库,其中: 福建节点:fj.jtyz 福建厦门节点:xm.fj.jtyz 江西:jx.jtyz 江西上饶:sr.jx.jtyz 这就是数据库域名。 
数据库域名在存在于参数文件中,他的参数是db_domain.   
查询数据库域名 
方法一:select value from v$parameter where name = 'db_domain';

方法二:show parameter domain 方法三:在参数文件中查询。   
全局数据库名 
全局数据库名=数据库名+数据库域名,如前述福建节点的全局数据库名是:oradb.fj.jtyz 
  
四、数据库服务名 

什么是数据库服务名? 
从oracle9i版本开始,引入了一个新的参数,即数据库服务名。参数名是SERVICE_NAME。

如果数据库有域名,则数据库服务名就是全局数据库名;否则,数据库服务名与数据库名相同。

 查询数据库服务名 
方法一:select value from v$parameter where name = 'service_name'; 方法二:show parameter service_name 方法三:在参数文件中查询。   
数据库服务名与网络连接 
从oracle8i开如的oracle网络组件,数据库与客户端的连接主机串使用数据库服务名。之前用的是ORACLE_SID,即数据库实例名

  • 总结:
    1 .三个配置文件都是放在$ORACLE_HOME\network\admin目录下。
    2 .sqlnet.ora确定解析方式
    3 .listener.ora上设SID_NAME,通常用于JDBC访问,对应的错误码为12505
    4 .tnsnames.ora上设SERVICE_NAME,通常用于linux sqlplus客户端,对应的错误码为12514
  • sqlnet.ora

作用类似于linux或者其他unix的 nsswitch.conf文件,通过这个文件来决定怎么样找一个连接中出现的连接字符串(connect descriptor)
 
  假如sqlnet.ora 是下面这个样子

NAMES.DIRECTORY_PATH= (TNSNAMES,HOSTNAME)
当客户端输入sqlplus sys/oracle@orcl时, 就会首先在 tnsnames.ora文件中找orcl的记录.如果没有相应的记录则尝试把orcl当作一个主机名
括号中还有其他选项,如LDAP等,但HOSTNAME,LDAP通常并不常用,通常只设TNSNAME即可.

 

  • tnsnames.ora

1. 提供tnsname到主机名或者ip的对应

ORCL =
 (DESCRIPTION =
     (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))        #对应的SOCKET信息
      (CONNECT_DATA =                   
           (SERVER = DEDICATED)               #使用专用服务器模式去连接
            (SERVICE_NAME = orcl)           #这里填入对应 service_name,
                                            可以通过"SQLPLUS>show parameter service_name;"查看
  )       
  
SALES =
 (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.188.219)(PORT = 1521))
    (CONNECT_DATA =
       (SERVER = DEDICATED)
       (SERVICE_NAME = sales)
     )
 )

2. 配tnsname.ora里面的service_name,可以用下面命令查看:

SQL> show parameter service_name;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
service_names                        string      orcl

3. tnsnames.ora是为oracle客户端访问数据库而设的,不是为了远程客户端连接oracle 服务器而设的

删除tnsnames.ora
[oracle@oracle admin]$ rm tnsnames.ora
重启oracle
本地客户端无法访问数据库了
[oracle@oracle ~]$ sqlplus scott/scott@orcl

SQL*Plus: Release 10.2.0.1.0 - Production on Tue Feb 16 17:32:41 2010

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

ERROR:
ORA-12154: TNS:could not resolve the connect identifier specified

在远端(另一台机器)
通过sqlplus方式连接oracle数据库,没问题
通过jdbc连接orcle数据库,没问题 

listener.ora
listener进程接受远程对数据库的接入请求
Listener.ora

    #SID_LIST_LISTENER 定义, 定义LISTENER进程监听SID
  SID_LIST_LISTENER =
  (SID_LIST =                            #可以监听多个SID,都存在一个SID表中

  (SID_DESC =
        (GLOBAL_DBNAME = boway)         # GLOBAL_DBNAME不是必需的除非使用HOSTNAME做数据库连接
        (ORACLE_HOME = E:\oracle\product\10.1.0\Db_2)
        (SID_NAME = orcl)
    )
  )
  
  #监听器定义,一台数据库可以有不止一个监听器
  LISTENER =
    (DESCRIPTION =
         (ADDRESS = (PROTOCOL = TCP)(HOST = boway)(PORT = 1521))
     )

JDBC连接请求的URL 要对应Listener.ora 

 jdbc:oracle:thin:@192.168.3.98:1521:orcl

解锁账户

ALTER USER username ACCOUNT UNLOCK;

05-02 08:29