1、database和instance的区别
2、oracle中众多的name
初学oracle的人,想必很容易混淆这两个概念,其实在网络上搜索一下,有很多解释,较生动的是记事本的例子。这里给出我的一个简单理解:
一个表空间只能属于一个数据库
每个数据库最少有一个控制文件(建议3个,分别放在不同的磁盘上)
每个数据库最少有一个表空间(SYSTEM表空间)
建立SYSTEM表空间的目的是尽量将目的相同的表存放在一起,以提高使用效率,只应存放数据字典
每个数据库最少有两个联机日志组,每组最少一个联机日志文件
一个数据文件只能属于一个表空间
一个数据文件一旦被加入到一个表空间中,就不能再从这个表空间中移走,也不能再加入到其他表空间中
建立新的表空间需要建立新的数据文件
COMMIT后,数据不一定立即写盘(数据文件)
一个事务即使不被提交,也会被写入到重做日志中。
oracle server可以同时启动多个数据库
一套操作系统上可以安装多个版本的ORACLE数据库系统(UNIX可以,NT不可以)
一套ORACLE数据库系统中可以有多个ORACLE数据库及其相对应的实例
每个数据库最少有一个控制文件(建议3个,分别放在不同的磁盘上)
每个数据库最少有一个表空间(SYSTEM表空间)
建立SYSTEM表空间的目的是尽量将目的相同的表存放在一起,以提高使用效率,只应存放数据字典
每个数据库最少有两个联机日志组,每组最少一个联机日志文件
一个数据文件只能属于一个表空间
一个数据文件一旦被加入到一个表空间中,就不能再从这个表空间中移走,也不能再加入到其他表空间中
建立新的表空间需要建立新的数据文件
COMMIT后,数据不一定立即写盘(数据文件)
一个事务即使不被提交,也会被写入到重做日志中。
oracle server可以同时启动多个数据库
一套操作系统上可以安装多个版本的ORACLE数据库系统(UNIX可以,NT不可以)
一套ORACLE数据库系统中可以有多个ORACLE数据库及其相对应的实例
database:数据库,一组相关的物理文件,比如数据文件、日志文件和控制文件等等,是物理上实实在在存在的,即使关闭数据库仍然存在。
instance:实例。内存和一些进程,比如SGA、后台进程(windows系统是线程),当关闭数据库后实例消失。
两者是相辅相成的,经常在一起使用。我们以常见的数据库启动和关闭举例如下:
1、启动,先启动实例,在mount数据库,直至open数据库
2、关闭,先close数据库,在nomount数据库,直至关闭实例
实例服务:以windows为例,就是一个windows服务,比如OracleService,它对应着一个进程,可以说这个服务是最基础的,如果这个服务没有启动,何谈启动实例和数据库;另外可以启动多个实例服务,但是不能启动多个实例(可以在一种特殊方式下实现)
备注:关于启动和关闭具体细节详见eygle所著作品《DBA入门、进阶与诊断案例》
举个例子,实例好比一座通往数据库的桥梁,而数据库就是一个岛屿。出入岛屿的交通流量都必须通过桥,如果桥关闭了,岛屿虽然仍然存在,但我们却无法出入岛屿。对应到oracle术语来说,如果实例正在运行,那么数据就可以出入数据库。同时,数据库的物流状态也改变。如果实例挂起,虽然数据库仍然确实存在,用户却无法对他进行访问。此时的数据库是静态的,其数据不会改变。当实例重新服务时,数据库中的数据则随时做好准备,即可以对它进行访问。---《oracle精髓》
---------------------------
oracle中众多的name
1、db_name数据库名
是区分数据的内部标识(即是给Oracle数据库内部使用的),因为其在数据库多处保存,并且控制文件中保存是二进制的,所以很难改变其名字,但是是可以修改的。在pfile中有db_name参数就是它。
作用:内部标记,在数据库安装、创建、创建控制文件、修改数据库结构、使用数据库备份与恢复时都使用数据库名(注意此时不是sid)
DB_NAME必须是一个不超过8个字符的文本串.在数据库创建过程中,db_name被记录在数据文件,日志文件和控制文件中。如果数据库实例启动过程中参数文件中的db_name和控制文件中的数据库名称不一致,则数据库不能启动。
2、instance_name实例名
用于和操作系统间联系,一个数据库可以有多个实例(并行服务)。要和一个数据库服务器相连,必须知道其实例名,光知道数据库名是没用的。在pfile中有instance_name参数,其实一般设置与数据库名称是相同的(不相同是自找麻烦),比较容易改变该参数
3、ORALCE_SID
同样是指数据库实例名,但ORACLE_SID是操作系统的环境变量设置,用于和操作系统交互,其取值必须与INSTANCE_NAME相同,而INSTANCE_NAME可在参数文件中查到,ORALCE_SID则不在此参数文件中
4、db_domain数据库域名
类似网络域名的概念,(所以一个数据库名db_name在不同的域里可以相同)在安装时确定(全局数据库名中填写),定义规则也相似于网络定义。参数文件中db_domain,如果没有该项则全局数据库名和数据库名相同,该数据库没有使用域名,域名可以修改
5、SERVICE_NAMES数据库服务名
定义为=全局数据库名,参数文件中service_names
6、全局数据库名
全局数据库名:= db_name+db_domain
7、Net service name:网络服务名
又可以称为数据库别名(database alias),是客户端程序访问数据库时所需要,屏蔽了客户端如何连接到服务器端的细节,实现了数据库的位置透明的特性。
小结:
一个实例可以mount并打开任何数据库,但是同一时间一个实例只能打开一个数据库。
一个数据库可以被一个或多个实例所mount并打开(在OPS/RAC环境下,一个数据库可以被多个实例所打开)。
另外的一个区别是,db_name通常限制在8个字符之内;instance_name最多应该支持21个字符。通常我们都是设置db_name和instance_name一致。需要注意的是如果db_name设置过长,则会被Oracle截断为8个字符,而instance_name仍然会保留在21个字符之内,如果你的环境变量设置的instance_name=db_name,则启动时就会出现问题,你需要重建pfile/spfile并且修改环境变量才能启动实例,加载数据库。