先看我的系统的一些参数!

SQL> show parameter service_names;
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
service_names                        string      wenchaodb
SQL> show parameter instance_name;
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
instance_name                        string      wenchaodb
SQL> show parameter db_name;
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_name                              string      wenchaod
SQL> show parameter db_unique_name;
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_unique_name                       string      wenchaodb
SQL>
SQL> show parameter db_domain;
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_domain                            string
SQL> SELECT * FROM GLOBAL_NAME;
GLOBAL_NAME
--------------------------------------------------------------------------------
WENCHAOD

---

SQL> select name from v$database;
NAME
---------
WENCHAOD
SQL> select instance_name from v$instance;
INSTANCE_NAME
----------------
wenchaodb
SQL>

----

[oracle@centos-fuwenchao admin]$ more listener.ora
# listener.ora Network Configuration File: /u01/app/oracle/product/11.2.0/db_1/network/admin/listener.ora
# Generated by Oracle configuration tools.
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = centos-fuwenchao)(PORT = 1521))
    )
  )
ADR_BASE_LISTENER = /u01/app/oracle
[oracle@centos-fuwenchao admin]$

----

[oracle@centos-fuwenchao admin]$ more tnsnames.ora
# tnsnames.ora Network Configuration File: /u01/app/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.
WENCHAONETSERVICE =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.13.2.115)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = wenchaoservice)
    )
  )

-----

一个客户端的tnsname

wenchao =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.13.2.115)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = wenchaodb)
    )
  )

疑问:这些名字之间有什么区别和联系呢?为什么db_name为wenchaod而不是wenchaodb呢?


这篇文章中要讲的几个参数:

      DB 相关的:DBID, SID

      PFILE中的参数:DB_NAME,DB_DOMAIN,  INSTANCE_NAME,

                           DB_UNIQUE_NAME,SERVICE_NAMES,

                           GLOBAL_NAME,GLOBAL_NAMES

      Listener.ora中参数:

                           SID_NAME,GLOBAL_DBNAME

      Tnsnames.ora中参数:

                           SERVICE_NAME,SID  


. DB 相关的2个参数

1.1  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

我们可以用命令来修改DBID, 这个官网有说明:

Changing the DBID and DBNAME of a Database

http://download.oracle.com/docs/cd/E11882_01/server.112/e16536/dbnewid.htm#SUTIL1543

修改的步骤如下:

(1)将数据库启动到mount状态

(2)用nid命令修改:nid TARGET=/  DBNAME=tianlesoftware

(3)修改之后,在启动到mount:startup mount

(4)resetlogs 打开数据库:ALTER DATABASE OPEN RESETLOGS;

要注意一点:

修改DBID 之后,之前的备份和归档都将无效。 具体参考官网内容:

Ramifications of Changing the DBID and DBNAME

      Changing the DBID of a database is a serious procedure. When the DBID of a database is changed, all previous backups and archived logs of the database become unusable. This is similar to creating a database except that the data is already in the datafiles. After you change the DBID, backups and archive logs that were created prior to the change can no longer be used because they still have the original DBID, which does not match the current DBID. You must open the database with the RESETLOGS option, which re-creates the online redo logs and resets their sequence to 1 (see the Oracle Database Administrator's Guide). Consequently, you should make a backup of the whole database immediately after changing the DBID.

      Changing the DBNAME without changing the DBID does not require you to open with the RESETLOGS option, so database backups and archived logs are not invalidated. However, changing the DBNAME does have consequences. 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.

From:

Ramifications of Changing the DBID and DBNAME

http://download.oracle.com/docs/cd/E11882_01/server.112/e16536/dbnewid.htm#SUTIL1541

1.2.  SIDsystem identifier

官网的说明如下:

      The system identifier (SID) is a unique name for an Oracle database instance on a specific host. On UNIX and Linux, Oracle Database uses the SID and Oracle home values to create a key to shared memory. Also, the SID is used by default to locate the parameter file, which is used to locate relevant files such as the database control files.

On most platforms, the ORACLE_SID environment variable sets the SID, whereas the ORACLE_HOME variable sets the Oracle home. When connecting to an instance, clients can specify the SID in an Oracle Net connection or use a net service name. Oracle Database converts a service name into an ORACLE_HOME and ORACLE_SID.

查看SID:

SQL> select instance_name from v$instance;

INSTANCE_NAME

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

orcl

尽管v$instance中字段 instance_name 看起来是实例名,但是实际上存储的是sid。在win下, 不管oracle_home是否相同,sid不能重复。

在unix/linux下只要不同版本的oracle安装在不同的oracle_home下就可以创建相同sid的实例,但是win下不可以,主要是受到windows服务的限制,在服务中不能存在服务名相同的oracle服务,服务名是由如下格式组成的:OracleServiceSID,因为服务名中包括了sid,所以sid如果相同了,服务名就相同了,这是windows所不允许的。因此在win下无法创建相同sid的不同实例。

.  Pfile 中的参数

2.1.  DB_NAME

官网的说明如下:

DB_NAME specifies a database identifier of up to 8 characters. This parameter must be specified and must correspond to the name specified in the CREATE DATABASE statement.

      If you have multiple databases, the value of this parameter should match the Oracle instance identifier of each one to avoid confusion with other databases running on the system. The value of DB_NAME should be the same in both the standby and production initialization parameter files.

      The database name specified in either the STARTUP command or the ALTER DATABASE ... MOUNT statement for each instance of the cluster database must correspond to the DB_NAME initialization parameter setting.

The following characters are valid in a database name: alphanumeric characters, underscore (_), number sign (#), and dollar sign ($). No other characters are valid. Oracle removes double quotation marks before processing the database name. Therefore you cannot use double quotation marks to embed other characters in the name. The database name is case insensitive.

      DB_NAME must be set to a text string of no more than eight characters. During database creation, the name provided for DB_NAME is recorded in the datafiles, redo log files, and control file of the database. If during database instance startup the value of the DB_NAME parameter (in the parameter file) and the database name in the control file are not the same, the database does not start.

From:

http://download.oracle.com/docs/cd/E11882_01/server.112/e17110/initparams062.htm#REFRN10041

DB_NAME 是数据库名,它的长度不能超过8个字节,超过8个会被截断。对于RAC环境,各个节点之间的DB_NAME都是相同的,INSTANCE_NAME 不同。 对于Data Guard环境,DB_NAME相同,DB_UNIQUE_NAME 不同。

      DB_NAME记录在datafile,redo log和control file中。 这个记录方式就是通过DBID。 因为DBID 就是用DB_NAME 加算法来生成的。

还是借用×××的比喻: DB_NAME 就是姓名,DBID就是×××。

所以如果要修改DB_NAME,只能用nid命令来修改DBID,然后修改相关pfile参数。

2.2.  DB_DOMAIN

官网说明如下:

Property

Description

Parameter type

String

Syntax

DB_DOMAIN = domain_name

Default value

There is no default value.

Modifiable

No

Range of values

Any legal string of name components, separated by periods and up to 128 characters long (including the periods). This value cannot be NULL.

Basic

Yes

Oracle RAC

You must set this parameter for every instance, and multiple instances must have the same value.

      In a distributed database system, DB_DOMAIN specifies the logical location of the database within the network structure. You should set this parameter if this database is or ever will be part of a distributed system. The value consists of the extension components of a global database name, consisting of valid identifiers (any alphanumeric ASCII characters), separated by periods. Oracle recommends that you specify DB_DOMAIN as a unique string for all databases in a domain.

      This parameter allows one department to create a database without worrying that it might have the same name as a database created by another department. If one sales department's DB_DOMAIN is JAPAN.ACME.COM, then their SALES database (SALES.JAPAN.ACME.COM) is uniquely distinguished from another database with DB_NAME = SALES but with DB_DOMAIN = US.ACME.COM.

      If you omit the domains from the name of a database link, Oracle expands the name by qualifying the database with the domain of your local database as it currently exists in the data dictionary, and then stores the link name in the data dictionary. The characters valid in a database domain name are: alphanumeric characters, underscore (_), and number sign (#).

2.3.  DB_UNIQUE_NAME

官网说明如下:

Property

Description

Parameter type

String

Syntax

DB_UNIQUE_NAME = database_unique_name

Default value

Database instances: the value of DB_NAME

Automatic Storage Management instances: +ASM

Modifiable

No

Basic

Yes

Oracle RAC

Multiple instances must have the same value.

      DB_UNIQUE_NAME specifies a globally unique name for the database. Databases with the same DB_NAME within the same DB_DOMAIN (for example, copies of a database created for reporting or a physical standby) must have a unique DB_UNIQUE_NAME. Every database's DB_UNIQUE_NAME must be unique within the enterprise.

-- 对于DB_NAME 系统的的数据库必须要有不同的DB_UNIQUE_NAME Data Guard就是这么回事。

The value of DB_UNIQUE_NAME can be up to 30 characters and is case insensitive. The following characters are valid in a database name: alphanumeric characters, underscore (_), number sign (#), and dollar sign ($).

      DB_UNQUIE_NAME的会影响到Service_names,也会影响到动态监听的时候的service_name。 如在Data Guard 环境下,如果采用动态注册,那么注册的Service就是DB_UNIQUE_NAME。 但instance 还是instance_name,即SID.

如:

Service " orcl_st " has 1 instance(s).
Instance "orcl", status BLOCKED, has 1 handler(s) for this service...
Service " orcl_st _XPT" has 1 instance(s).
Instance "orcl", status BLOCKED, has 1 handler(s) for this service...
The command completed successfully

2.4.  INSTANCE_NAME

官网说明如下:

Property

Description

Parameter type

String

Syntax

INSTANCE_NAME = instance_id

Default value

The instance's SID

Note: The SID identifies the instance's shared memory on a host, but may not uniquely distinguish this instance from other instances.

Modifiable

No

Range of values

Any alphanumeric characters and the underscore (_) character

Basic

No

      In a Real Application Clusters environment, multiple instances can be associated with a single database service. Clients can override Oracle's connection load balancing by specifying a particular instance by which to connect to the database. INSTANCE_NAME specifies the unique name of this instance.

      In a single-instance database system, the instance name is usually the same as the database name.

INSTANCE_NAME  的默认值就是SID。 一般跟数据库库名称相同,也可以不相同。

查看:

SQL> show parameter db_name

NAME                   TYPE        VALUE

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

db_name                  string      racdb

SQL> show parameter instance_name

NAME                    TYPE        VALUE

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

instance_name             string      racdb1

INSTANCE_NAME 会影响进程的命名:

[root@racnode1 ~]# ps -ef|grep pmon

grid      7474     1  0 Dec16 ?        00:00:05 asm_pmon_+ASM1

oracle    8077     1  0 Dec16 ?        00:00:07 ora_pmon_racdb1

root     20204 20176  0 00:13 pts/1    00:00:00 grep pmon

initSID.ora orapwSID 文件要与INSTANCE_NAME保持一致:

[oracle@racnode1 ~]$ cd $ORACLE_HOME/dbs

[oracle@racnode1 dbs]$ ls

hc_DBUA0.dat  hc_racdb1.dat  init.ora  initracdb1.ora  orapwracdb1  snapcf_racdb1.f

2.5  SERVICE_NAMES

官网说明如下:

Property

Description

Parameter type

String

Syntax

SERVICE_NAMES =

db_service_name [, db_service_name [ ... ] ]

Default value

DB_UNIQUE_NAME.DB_DOMAIN if defined

Modifiable

ALTER SYSTEM

Range of values

Any ASCII string or comma-separated list of string names

Basic

No

Oracle RAC

Do not set the SERVICE_NAMES parameter for Oracle RAC environments. Instead, define services using Oracle Enterprise Manager and manage those services using Server Control (SRVCTL) utility.

      SERVICE_NAMES specifies one or more names by which clients can connect to the instance. The instance registers its service names with the listener. When a client requests a service, the listener determines which instances offer the requested service and routes the client to the appropriate instance.

You can specify multiple service names in order to distinguish among different uses of the same database. For example:

             SERVICE_NAMES = sales.acme.com, widgetsales.acme.com

      You can also use service names to identify a single service that is available from two different databases through the use of replication.

      If you do not qualify the names in this parameter with a domain, Oracle qualifies them with the value of the DB_DOMAIN parameter. If DB_DOMAIN is not specified, then no domain will be applied to the non-qualified SERVICE_NAMES values.

注意一点,服务名是复数, service_names 可以是多个值。

在Data Guard中, 如果采用动态注册,建议在primary,standby上使用相同的service_names,这样可能便于尽可能的实现透明切换。

如果配置了静态注册的监听在primary,standby上也务必保持在listener中要求输入的服务名相同,尽可能的实现透明切换。

查看service_names

SQL> show parameter service_names

NAME                   TYPE        VALUE

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

service_names            string      orcl


2.6  GLOBAL_NAME

global_name 是由db_name.db_domain构成。

查看Global_name

SQL> SELECT * FROM GLOBAL_NAME;

GLOBAL_NAME

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

RACDB

我们可以修改GLOBAL_NAME. 如:

      ALTER DATABASE RENAME GLOBAL_NAME TO sales.us.example.com;

具体参考:

Changing the Domain in a Global Database Name

http://download.oracle.com/docs/cd/E11882_01/server.112/e17120/ds_admin001.htm#ADMIN12147

2.8  GLOBAL_NAMES

官网说明:

Property

Description

Parameter type

Boolean

Default value

false

Modifiable

ALTER SESSION, ALTER SYSTEM

Range of values

true | false

Basic

No

      GLOBAL_NAMES specifies whether a database link is required to have the same name as the database to which it connects.

      If the value of GLOBAL_NAMES is false, then no check is performed. If you use or plan to use distributed processing, then Oracle recommends that you set this parameter to true to ensure the use of consistent naming conventions for databases and links in a networked environment.

      Global_names是一个布尔值,global_names的作用是创建db link时是否强制使用远程数据库的global_name,如果global_names=true,则db link name必须要求是remote database的global_name,否则创建之后db link 不能连同,缺省值是false。多用于分布式系统。

SQL> show parameter global_names

NAME                  TYPE        VALUE

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

global_names             boolean     FALSE

.  Listener.ora 文件中的参数

先看一个listener.ora 文件:

[oracle@dg2 admin]$ cat listener.ora

SID_LIST_LISTENER =

 (SID_LIST =

   (SID_DESC =

     (SID_NAME = PLSExtProc)

     (ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)

     (PROGRAM = extproc)

   )

   (SID_DESC =

(SID_NAME = orcl)

     (ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)

(GLOBAL_DBNAME = orcl)

   )

)

3.1 SID_NAME

      SID_NAME指数据库的运行的实例名,和instance_name保持一致。

3.2 GLOBAL_DBNAME

配置静态监听注册时,需要输入SID和GLOBAL_NAME。 我上面贴出来的内容,就是静态监听配置的内容。 SID 已经说过,和Instance_name 保持一致就可以了。

      GLOBAL_DBNAME 是listener配置的对外网络连接名称,我们可以写成任意值。 在客户端配置监听的tnsnames.ora 文件中的service_name 与这个GLOBAL_DBNAME 保持一致就可以了。因为客户端访问数据库是通过监听来实现的。

如果采用动态注册的话,PMON进程会根据初始化参数initSID.ora中的instance_name,service_names两个参数将实例和服务动态注册到listener中,这时自动注册的对外网络连接名称就是initSID.ora文件中service_names.

因为service_names可以有多个值,如果有多个值,就会注册多个。 但是他们对应都是同一个instance_name。 这样,我们在客户端配置tnsnames.ora 时,在service_name 写其中任意一个都可以正常连上数据库。

. Tnsnames.ora 文件

先看一个tnsnames.ora 文件:

ORCL_PD =

 (DESCRIPTION =

   (ADDRESS_LIST =

     (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.2)(PORT = 1521))

   )

   (CONNECT_DATA =

(SERVICE_NAME = orcl)

   )

 )

4.1  SERVICE_NAME

如果服务器采监听采用了静态注册,那么这个参数就等于Listener.ora 文件中的GLOBAL_DBNAME的值。

如果是动态注册,那么这个值就是initSID.ora 文件中service_names中的值。

4.2  SID

在tnsnames.ora文件中还可以使用SID。 如果使用该参数,只需要把该参数指定为instance_name就可以了。