标签:
一、前言
笔者对于Oracle数据库的理解,很长时间停留在“镜花水月”的状态,你说不懂吧,又会用,一较真起来吧,对一些基本概念又说不出一个道道来~如果想要在编码的路上走得更远,这个必定也是绕不过的坎,所以笔者决定花点时间,整理清楚一下Oracle中常常提及的概念~
首先,笔者先声明一下这篇文章会解释的概念包括哪些:数据库(database)、数据库实例(DB instance)、数据库名(DB_NAME)、数据库域名、全局数据库名、数据库服务名(SERVICE_NAME)、表空间(tablespace)、方案(schema)、段(segment)、区(extent)、块(block)、SID。
二、正文
2.1 数据库(database)
通常情况下我们称的“数据库”,并不仅指物理的数据集合,它包含是一系列物理文件的集合(数据文件,控制文件,联机日志,参数文件等)以及数据库管理系统,即数据 库是物理数据、内存、操作系统进程的组合体。
2.2 数据库实例(DB instance)
实例是访问Oracle数据库所需的一部分计算机内存和辅助处理后台进程,是由进程和这些进程所使用的内存(SGA)所构成一个集合。其实就是用来访问和使用数据库的一个 进程,它只存在于内存中。就像Java中new出来的实例对象一样。
2.3 数据库名(DB_NAME)
数据库名就是一个数据库的标识,就像人的身份证号一样。他用参数DB_NAME表示,如果一台机器上装了多全数据库,那么每一个数据库都有一个数据库名。在数据库安 装或创建完成之后,参数DB_NAME被写入参数文件init.ora.xxxxxxx之中。格式如下:
DB_NAME=ctoporcl
在创建数据库时就应考虑好数据库名,并且在创建完数据库之后,数据库名不宜修改,即使要修改也会很麻烦。因为,数据库名还被写入控制文件中,控制文件是以二进制 型式存储的,用户无法修改控制文件的内容。假设用户修改了参数文件中的数据库名,即修改DB_NAME的值。但是在Oracle启动时,由于参数文件中的DB_NAME与控制文 件中的数据库名不一致,导致数据库启动失败,将返回ORA-01103错误。
数据库名是在安装数据库、创建新的数据库、创建数据库控制文件、修改数据结构、备份与恢复数据库时都需要使用到的。有很多Oracle安装文件目录是与数据库名相关 的,如:
win:d:\oracle\product\10.1.0\oradata\DB_NAME\... Unix: /home/app/oracle/product/10.1.0/oradata/DB_NAME/... pfile: win: d:\oracle\product\10.1.0\admin\DB_NAME\pfile\ini.ora Unix: /home/app/oracle/product/10.1.0/admin/DB_NAME/pfile/init$ORACLE_SID.ora 跟踪文件目录: win:/home/app/oracle/product/10.1.0/admin/DB_NAME/bdump/...
另外,在创建数据时,create database命令中的数据库名也要与参数文件中DB_NAME参数的值一致,否则将产生错误。同样,修改数据库结构的语句alterdatabase, 当然也要指出要修改的数据库的名称。如果控制文件损坏或丢失,数据库将不能加载,这时要重新创建控制文件,方法是以nomount方式启动实例,然后以create controlfile 命令创建控制文件,当然这个命令中也是指指DB_NAME。还有在备份或恢复数据库时,都需要用到数据库名。总之,数据库名很重要,要准确理解它的作用。
查询当前数据库名:
1)select name from v$database; 2)showparameter db 3)查看参数文件(init.ora.xxxxx)
修改数据库名:
前面建议,应在创建数据库时就确定好数据库名,数据库名不应作修改,因为修改数据库名是一件比较复杂的事情。那么现在就来说明一下,如何在已创建数据之后, 修改数据库名。步骤如下:
1)关闭数据库。
2)修改数据库参数文件中的DB_NAME参数的值为新的数据库名。
3)以NOMOUNT方式启动实例,修建控制文件(有关创建控制文件的命令语法,请参考oracle文档)
2.4 数据库域名
在分布式数据库系统中,不同版本的数据库服务器之间,不论运行的操作系统是unix或是windows,各服务器之间都可以通过数据库链路进行远程复制,数据库域名主要用 于oracle分布式环境中的复制。
在oracle的分布式系统的同一环境内,如果两个数据库的数据库名不相同,两个数据库之间就可以建立数据库链路,进行数据库的远程实时传输;
如果两个数据库的数据库名相同,则这两个数据库之间就不能进行数据复制。
如果要在两个数据库名相同的数据库之间复制数据,就需要增加域,而且两个数据库分别具有不同的子域,如果违背这些条件,则两个数据库之间就不能复制数据。
什么时候使用域:
1)在oracle分布式环境中,两个数据库之间要通过数据库链路进行数据的远程传输
2)在同一网络环境下,两个数据库的数据库名相同
查询数据库的域名:
1)selectvalue from v$parameter where name = ‘db_domain‘; 2)showparameter domain 3)在参数文件中查询。
2.5 全局数据库名
全局数据库名=数据库名+数据库域名
2.6 数据库服务名(SERVICE_NAME)
Oracle9i版本开始,引入了一个新的参数,即数据库服务名。参数名是SERVICE_NAME。如果数据库有域名,则数据库服务名就是全局数据库名;否则,数据库服务名与 数据库名相同。如果数据库中没有定义域名,则数据库服务名与数据库名相同。
查询数据库服务名:
1)selectvalue from v$parameter where name = ‘service_name‘; 2)showparameter service_name 3)在参数文件中查询。
2.7 表空间(tablespace)
Oracle数据库是通过表空间来存储物理表的,一个数据库实例可以有N个表空间,一个表空间下可以有N张表。有了数据库,就可以创建表空间。表空间(tablespace)是数 据库的逻辑划分,每个数据库至少有一个表空间(称作SYSTEM表空间)。为了便于管理和提高运行效率,可以使用一些附加表空间来划分用户和应用程序。例如:USER表空 间供一般用户使用,RBS表空间供回滚段使用。一个表空间只能属于一个数据库。
2.8 方案(schema)
方案(schema)又叫模式,是比表空间小一级的逻辑概念,它也是一个逻辑容器。多个用户可能共用一个表空间,那如何区分开每一个用户?那么在表空间中对每个用户 都有一个对应的方案(schema),用于保存单个用户的信息。
更专业一点的解释(schema 的定义):
A schema is a collection of database objects (used by a user.). Schema objects are the logical structures that directly refer to the database’s data. A user is a name defined in the database that can connect to and access objects. Schemas and users help database administrators manage database security.
从定义中我们可以看出schema为数据库对象的集合,为了区分各个集合,我们需要给这个集合起个名字,这些名字就是我们在企业管理器的方案下看到的许多类似用户名 的节点,这些类似用户名的节点其实就是一个schema,schema里面包含了各种对象如tables, views, sequences, stored procedures, synonyms, indexes, clusters, and database links。
一个用户一般对应一个schema,该用户的schema名等于用户名,并作为该用户缺省schema。这也就是我们在企业管理器方案下看到schema名都为数据库用户名的原 因。Oracle数据库中不能新创建一个schema,要想创建一个schema,只能通过创建一个用户的方法解决(Oracle中虽然有create schema语句,但是它并不是用来创建一个 schema的),在创建一个用户的同时为这个用户创建一个与用户名同名的schem并作为该用户的缺省shcema。即schema的个数同user的个数相同,而且schema名字同user 名字一一 对应并且相同,所以我们可以称schema为user的别名,虽然这样说并不准确,但是更容易理解一些。
一个用户有一个缺省的schema,其schema名就等于用户名,当然一个用户还可以使用其他的schema。如果我们访问一个表时,没有指明该表属于哪一个schema中的, 系统就会自动给我们在表上加上缺省的sheman名。比如我们在访问数据库时,访问scott用户下的emp表,通过select * from emp; 其实,这sql语句的完整写法为select * from scott.emp。在数据库中一个对象的完整名称为schema.object,而不是user.object。类似如果我们在创建对象时不指定该对象的schema,在该对象的schema为用户 的缺省schema。这就像一个用户有一个缺省的表空间,但是该用户还可以使用其他的表空间,如果我们在创建对象时不指定表空间,则对象存储在缺省表空间中,要想让对象 存储在其他表空间中,我们需要在创建对象时指定该对象的表空间。
2.9 段(segment)
段是oracle数据库中的分配单位,对象如表、索引等都是以段为单位进行分配。当创建一个表时将创建一个表段,创建一个索引时就创建一个索引段。每一个消耗存储空间 的对象最终被存储到一个单一的段中。有回滚段、临时段、聚簇段、索引段等。
2.10 区(extent)
区又叫盘区,是数据文件中一个连续的分配空间,它比块要大,由块组成。有些对象分配空间时可能至少需要两个盘区,比如回滚段,而这两个盘区不一定要求相连。区的 大小从一个块到2GB不等。
2.11 块(block)
块是数据存储的物理单位,也是数据文件中最基础的单位,数据直接存储在块上。是oracle空间分配的最小单位。oracle中的块大小常见的有三种,2KB、4KB、8KB。块 的大小在数据库创建时就已经固定下来,数据库中每个块的大小都是相同的,而且所有的块都有相同的格式,由“块头+表目录+行目录+空闲空间+数据空间”组成。块头包含 着块类型(比如是表块、还是索引块)的信息、磁盘上块的位置等信息。表目录(table directory),如果有的话,包含着此块中存储各行的表的信息(如果一个块中存有多个 表中的数据)。行目录(row directory)包含着数据行的描述信息,它是一个指针数组,指示了每一行在数据块中的物理位置。块头、表目录、行目录统称为块开销(block overhead),是oracle用来统计、管理块本身的。剩下的两部分很简单,已经存有数据的就是数据空间,暂时没存的就是空闲空间。
2.12 SID
SID就是instance_name
三、后话
下面对上面几个容易混淆的概念再做一些说明,希望对各位有所帮助~
3.1 SID和SERVICE_NAME的区别
可以简单的这样理解:一个公司比喻成一台服务器,数据库是这个公司中的一个部门。
1)SID:一个数据库可以有多个实例(如RAC),SID是用来标识这个数据库内部每个实例的名字,就好像一个部门里,每个人都有一个自己的名字。
2)SERVICE_NAME:是这个数据库对外宣称的名字,外面的人要想连接我这个数据库,你就在客户端的连接串里写上service_name。它就像一个部门的名字,这 个部 门的名称在看门大爷(listener)那里有登记,看门大爷一看你是要找SERVICE_NAME这个部门,就告诉你我们公司确实有这个部门,于是你就找到了,连 接就建立了。
用一句话来说就是:SID是对内的,是实例级别的一个名字,用来内部之间称呼用。SERVICE_name是对外的,是数据库级别的一个名字,用来告诉外面的人,我数据库 叫"SERVICE_NAME"。你可以通过service_name参数指定这个名字是什么,可以有多个名字,名字随便起,叫狗蛋,翠花都没关系。如果你不指定,默认的是Db_name. Db_domain,也就是global_name。
数据库里,还有ORACLE_SID,是告诉OS系统,我这个实例叫做什么。这些易混淆的名字,你要记住,他们不是指数据库,就是指实例,就这两个东西,别无其它。他们 具体用哪个名字,是要看对谁而言,是什么场合。是对数据库,还是对操作系统,还是对外部链接。就像你对父母而言,你有小名叫幺儿;对同学而言,你有外号叫灯泡;对办 事机构,你有正规的名字叫王小明。但归根到底,是一回事。分清楚这点,就不容易混了。
3.2 ORACLE实例和数据库之间的关系
1)临时性和永久性
2)实例可以在没有数据文件的情况下单独启动 startup nomount , 通常没什么意义
3)一个实例在其生存期内只能装载(alter database mount)和打开(alter database open)一个数据库
(文章内容如果有写错或者理解错误的还望指出,非常感谢~QQ:1163142850~)
标签:
原文地址:http://www.cnblogs.com/xdouby/p/5801159.html