标签:
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)
db_name用于区分一个数据库的内部标识,在安装数据库、创建新数据库、创建控制文件、修改数据库结构、利用RMAN备份时都需要使用数据库名。
存在于(但不仅限于)以下地方:
(1) 以二进制方式存储在控制文件中。
(2) Pfile/spfile中:db_name
(3) 数据库物理结构文件目录中
D:\oracle\oradata\db_name\*.*
D:\oracle\admin\db_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中除外。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_NAME。SID==>>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 )
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 )
标签:
原文地址:http://www.cnblogs.com/xianglongsdu/p/4802659.html