Oracle 相关概念详解

时间:2023-03-09 17:27:01
Oracle 相关概念详解

一、前言

  笔者对于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参数的值一致,否则将产生错误。同样,修改数据库结构的语句alter database,当然也要指出要修改的数据库的名称。如果控制文件损坏或丢失,数据库将不能加载,这时要重新创建控制文件,方法是以nomount方式启动实例,然后以create controlfile命令创建控制文件,当然这个命令中也是指指DB_NAME。还有在备份或恢复数据库时,都需要用到数据库名。总之,数据库名很重要,要准确理解它的作用。

   查询当前数据库名:

  1)select name from v$database;
 2)show parameter db
 3)查看参数文件(init.ora.xxxxx)
    修改数据库名:

  前面建议,应在创建数据库时就确定好数据库名,数据库名不应作修改,因为修改数据库名是一件比较复杂的事情。那么现在就来说明一下,如何在已创建数据之后,修改数据库名。步骤如下:
  1)关闭数据库。
  2)修改数据库参数文件中的DB_NAME参数的值为新的数据库名。
  3)以NOMOUNT方式启动实例,修建控制文件(有关创建控制文件的命令语法,请参考oracle文档)

  2.4 数据库域名

   在分布式数据库系统中,不同版本的数据库服务器之间,不论运行的操作系统是unix或是windows,各服务器之间都可以通过数据库链路进行远程复制,数据库域名主要用于oracle分布式环境中的复制。

在oracle的分布式系统的同一环境内,如果两个数据库的数据库名不相同,两个数据库之间就可以建立数据库链路,进行数据库的远程实时传输;
      如果两个数据库的数据库名相同,则这两个数据库之间就不能进行数据复制。
      如果要在两个数据库名相同的数据库之间复制数据,就需要增加域,而且两个数据库分别具有不同的子域,如果违背这些条件,则两个数据库之间就不能复制数据。
      什么时候使用域:
      1)在oracle分布式环境中,两个数据库之间要通过数据库链路进行数据的远程传输
      2)在同一网络环境下,两个数据库的数据库名相同

  查询数据库的域名:

  1)select value from v$parameter where name = 'db_domain';
 2)show parameter domain
 3)在参数文件中查询。

  2.5 全局数据库名

  全局数据库名=数据库名+数据库域名

2.6 数据库服务名(SERVICE_NAME)

  Oracle9i版本开始,引入了一个新的参数,即数据库服务名。参数名是SERVICE_NAME。如果数据库有域名,则数据库服务名就是全局数据库名;否则,数据库服务名与数据库名相同。如果数据库中没有定义域名,则数据库服务名与数据库名相同。

查询数据库服务名:

 1)select value from v$parameter where name = 'service_name';
2)show parameter 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)一个数据库

    4)一个数据库可被许多实例同时装载和打开(即RAC),RAC环境中实例的作用能够得到充分的体现!
四、参考和引用链接
  http://blog.sina.com.cn/s/blog_a5a24bcb01010npc.html
  http://blog.itpub.net/6906/viewspace-21647/
  http://blog.****.net/elvis_dataguru/article/details/8984961
  http://blog.****.net/nrlovestudy/article/details/49684571
  http://www.2cto.com/database/201305/213418.html
  http://blog.****.net/z69183787/article/details/25706269
  http://www.zhetao.com/content240
  http://blog.****.net/elvis_dataguru/article/details/8984961
  http://www.cnblogs.com/gsk99/archive/2011/04/14/2016216.html
  http://langgufu.iteye.com/blog/1469055

(文章内容如果有写错或者理解错误的还望指出,非常感谢~QQ:1163142850~)