发布新日志

  • ORA-12514&GLOBAL_DBNAME & SERVICE_NAME

    2010-12-28 17:39:46

    ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务
    上面的话很容易误解,让人认为数据库服务名(SERVICE NAME)有问题,其实他指的是tnsnames.ora中配置的别名ALIAS所对应的SERVICE_NAME,与在LISTENER中的注册的一堆服务名找不到(也可能一个也没有,比如只配置了动态监听)。

    GLOBAL_DBNAME 是指listener.ora文件中注册静态监听时的服务名。
    另在PARAMETER(spfile)中也可用SERVICE_NAME参数指定注册动态监听时的服务名。

    而tnsnames.ora中的服务名SERVICE_NAME的可选值为静态和动态注册的服务名(SERVICE_NAME),也即listener.ora中的GLOBAL_DBNAME和PARAMETER中的SERVICE_NAME,可以是任意支持的字符,但两者必须与保持一致。而sqlplus中的链接字符串,并不是SERVICE_NAME,而是一个SERVICE_NAME的ALIAS(在tnsname.ora中配置) 。

    静态监听的目的,除了简化配置外,还可以提供在数据库未启动前仍能连接的功能。
    一般(默认)情况下GLOBAL_DBNAME,SERVICE_NAME,ALIAS 及其他的DB_NAME,DB_UNIQUE_NAME,SID_NAME均一样,导致了“傻傻分不清楚”。

    附简单的listener.ora(部分):
        (SID_DESC =
          (GLOBAL_DBNAME = qa)                    ####listener中的service_name
          (ORACLE_HOME = /u01/app/oracle/product/10.2.0)
          (SID_NAME = qa )                               ####listener中的sid_name
    tnsnames.ora(部分):
    QA =                                      ####上面说的别名ALIAS,可以任意填写哦,连接数据库时用的就是它了
      (DESCRIPTION =
        (ADDRESS_LIST =
          (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.101)(PORT = 1521))
        )
        (CONNECT_DATA =
          (SERVICE_NAME = qa)                ####可以任意填写哦,前提是与上面listener中的GLOBAL_DBNAME
        )                                                    #### 或参数文件中的SERVICE_NAME一致
      )


    以上仅作备忘。另:本篇文章仅讨论通过SERVICE_NAME连接数据库的方法
Open Toolbar