Oracle基本概念

1. 数据库和实例

    什么是数据库,其实很简单,数据库就是存储数据的一种媒介。比如常用的文件就是一种,在Oracle10g中,数据的存储有好几种。第一种是文件形 式,也就是在你的磁盘中创建一批文件,然后在这些文件中存储信息。第二种就是磁盘阵列形式,这个是什么意思呢,这个就是说明数据库不是存放为某个文件,而 是把一个或者多个磁盘格式化成Oracle的一种格式了,等于整个磁盘就是存放Oracle数据库的,不能作为别的用途。这样的优点是存储性能高,因为不再借助别的文件格式了,而是把整个磁盘都成为Oracle最适应的文件系统格式。当然还可能有别的形式,比如网络什么的。不过我们最常用的还是文件格式 的,在文件格式中,数据库指的就是那些数据文件,控制文件以及REDO文件等等一系列文件。

    而什么是Instance呢,Instance其实就是指的操作系统中一系列的进程以及为这些进程所分配的内存块。在Oracle中,我们可以新建一个 Oracle的Instance,这个时候虽然有了进程还有SGA等一系列的内存快,但是这个时候并没有把数据库文件读取进来。所以只是一个实例,以后你可以通过命令手动或者自动地把数据库文件加载进我们的数据库Instance中,这个时候的数据库才可以让我们真正的开始访问操作。

    所以说,数据库的应用如果想实现,数据库和数据库Instance是缺一不可的,如果只有数据库的那些文件,那么,只能代表数据在这个文件中,但是我们无法直接进行操作。而如果只有数据库Instance,那么我们虽然可以进行操作,但是也不知道操作哪些数据,操作生成的数据也无法保存等等。所以,当一个 Oracle Instance真正Load了一个Oracle Database了以后,数据库才可以被我们使用。

    在这里要注意一点的是,Oracle的实例在启动以后,只能load一次数据库,如果想把数据库与Instance断开,然后再重新挂在一个数据库 Instance,那么就需要你首先把数据库Instance进程结束,然后重新建立这个instance的一个进程,再load另外一个数据库。否则肯 定要抛除ORA-16169错误,说数据库已经被打开。因为一个数据库Instance在其生存期中最多只能load和打开一个instance.

数据库服务器 = 数据库 + 实例

数据库 = 重做文件 + 控制文件 + 数据文件 + 临时文件

ORACLE实例 = 进程 + 进程所使用的内存(SGA)

ORACLE实例和数据库之间的关系
1. 临时性和永久性
2. 实例可以在没有数据文件的情况下单独启动 startup nomount , 通常没什么意义
3. 一个实例在其生存期内只能装载(alter database mount)和打开(alter database open)一个数据库
4. 一个数据库可被许多实例同时装载和打开(即RAC),RAC环境中实例的作用能够得到充分的体现
 
2. db_name instance_name ORACLE_SID

db_name用于区分一个数据库的内部标识,在安装数据库、创建新数据库、创建控制文件、修改数据库结构、利用RMAN备份时都需要使用数据库名。

存在于(但不仅限于)以下地方:

(1) 以二进制方式存储在控制文件中。

(2) Pfile/spfile中:db_name

(3) 数据库物理结构文件目录中

D:oracleoradatadb_name*.*

D:oracleadmindb_name*.*

查询方法:select name from v$database;
 

instance_name用于和操作系统进行联系。在操作系统中要取得与数据库之间的交互必须使用实例名。例如,要和某一个数据库服务器连接,则必须知道其数据库实例名,知道数据库名是没用的。在安装/创建数据库后,实例名允许修改的。

存在于(但不仅限于)以下地方:

(1) Windows nt/2000注册表中(oracle_sid)

(2) pfile/spfile中:instance_name

(3) 数据库参数文件名中:init.ora

查询方法:select instance_name from v$instance;

与数据库名的关系:一般是一一对应的,RAC中除外。
 
从名称上来说,instance_name=oracle_sid。对于数据库实例名的描述,有时使用instance_name,有时使用oracle_sid,这两个都是数据库实例名。但instance_name是oracle数据库参数,而oracle_sid是操作系统环境变量。

Oracle_sid用于和操作系统交互。也就是说,在操作系统中要想得到实例名,必须使用oracle_sid。例如同一服务器上创建了多个数据库,则就有多个对应的实例,可以通过在操作系统中设置oracle_sid指定要登录的数据库:

$oracle_sid=orcl

$export oracle_sid

C:>set oracle_sid=orcl

存在于(但不仅限于)以下地方:

(1) Windows nt/2000注册表中(oracle_sid)

(2) 数据库参数文件名中:init.ora

实例名除用于和操作系统联系外,还用于网络连接,即与客户端或其他服务器之间的连接。配置网络连接,就是配置网络连接串。

3. sid、service name、net service name

SID唯一地标识一个Oracle实例,而ORACLE_SID启动该实例,启动之后我们得到一个Oracle实例,这个实例有一个名字:INSTANCE_NAMESID==>>ORACLE_SID==>>INSTANCE_NAME这三者是一致的,是完全相同的。同时这个实例向外提供服务,所以又有一个SERVICE_NAME。

而SID_NAME出现在lisnter.ora文件中:

 1 SID_LIST_LISTENER =
 2   (SID_LIST =
 3     (SID_DESC =
 4       (SID_NAME = PL***tProc)
 5       (ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
 6       (PROGRAM = extproc)
 7     )
 8     (SID_DESC =
 9       (SID_NAME = jiagulun)
10       (ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
11       (GLOBAL_DBNAME = jiagulun)
12     )
13   )
14 
15 LISTENER =
16   (DESCRIPTION_LIST =
17     (DESCRIPTION =
18       (ADDRESS = (PROTOCOL = TCP)(HOST = redhat4)(PORT = 1521))
19       (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
20     )
21   )

listener.ora中的SID_NAME的值必须与SID的值一致。通过listener.ora中的SID_NAME和GLOBAL_DBNAME两 个参数以及客户端的tnsnames.ora中的SERVICE_NAME,这三个参数一起作用,可以实现ORACLE客户端与服务端的隔离。

 1 //tnsnames.ora
 2 
 3 JIAGULUN =
 4   (DESCRIPTION =
 5     (ADDRESS_LIST =
 6       (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.100)(PORT = 1521))
 7     )
 8     (CONNECT_DATA =
 9       (SERVICE_NAME = jiagulun)
10     )
11   )
12 
13 EXTPROC_CONNECTION_DATA =
14   (DESCRIPTION =
15     (ADDRESS_LIST =
16       (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
17     )
18     (CONNECT_DATA =
19       (SID = PL***tProc)
20       (PRESENTATION = RO)
21     )
22   )
客户端根据tnsname.ora中的SERVICE_NAME和地址(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.100)(PORT = 1521)),到这个地址去访问监听器。然后监听器根据文件lisnter.ora文件中的GLOBAL_NAME来判断是否有一个 GLOBAL_DBNAME 和 SERVICE_NAME 相等。 如果相等,则建立客户端到SID标识的服务端实例的连接。(有一个例外:tnsnames.ora中可以用参数SID来取代SERVICE_NAME,这 时比较的是tnsnames.ora中的SID和lisnter.ora中的SID_NAME,但是从oracle9i开始不推荐使用SID。因为SID 无法隔离客户端和服务端)
 tnsnames.ora中的地址(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.100)(PORT = 1521))是监听器监听的地址。监听器进程一直在这个地址上监听,等待客户端的连接。
总结一下
1)客户端和服务端的隔离是通过lisnter.ora中的GLOBAL_DBNAME来实现的,GLOBAL_DBNAME是一个连接客户端和服务端的桥梁:
a>client端tnsnames.ora中的SERVICE_NAME和server端lisnter.ora中的GLOBAL_DBNAME相等;
b>server端的lisnter.ora中的SID_NAME与系统的SID相等;
2)SID==>>SID_NAME==>>ORACLE_SID==>>INSTANCE_NAME 四者是一致的,相等的;
3)可以在lisnter.ora中配置多个不同的GLOBAL_NAME来供不同的客户端SERVICE_NAME来对应,从而实现不同的客户端使用不同的SERVICE_NAME来访问同一个SID实例使用,配置如下:
 1 //lisnter.ora
 2 
 3     (SID_DESC =
 4       (SID_NAME = jiagulun)
 5       (ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
 6       (GLOBAL_DBNAME = jiagulun)
 7     )
 8     (SID_DESC =
 9       (SID_NAME = jiagulun)
10       (ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
11       (GLOBAL_DBNAME = jgl)
12     )
13 
14 
15 //tnsnames.ora
16 
17 JIAGULUN =
18   (DESCRIPTION =
19     (ADDRESS_LIST =
20       (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.100)(PORT = 1521))
21     )
22     (CONNECT_DATA =
23       (SERVICE_NAME = jiagulun)
24     )
25   )
26 
27 JGL =
28   (DESCRIPTION =
29      (ADDRESS_LIST =
30         (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.100)(PORT = 1521))
31      )
32      (CONNECT_DATA =
33         (SERVICE_NAME = jgl)
34      )
35   )
 
原文地址:https://www.cnblogs.com/xianglongsdu/p/4802659.html