数据库结构和空间管理概览
一个oracle数据库是作为一个单元的数据的集合。数据库的目的是存储和取出相关的
信息。一个数据库服务器是解决信息管理问题的关键。总的来说,一个服务器在多用
户环境可靠的管理大量的数据以致于多个用户可以同时访问相同的数据。这些都要以
高性能完成。一个数据库服务器同时还阻止未授权的访问,并且提供高效的容错和恢
复方案。
数据库有逻辑结构和物理结构。因为物理结构和逻辑结构是分开的,所有数据的物理
存储管理可以不影响对逻辑存储结构的访问。
逻辑数据库结构
一个oracle数据库的逻辑结构包括 schema对象,data blocks,extents,
segments和tablespaces.
Schemas和schema对象
一个schema是数据库对象的集合。一个schema由一个数据库用户所拥有,并
且和这个用户有同样的名称。Schema对象是能够直接引用数据库数据的逻辑结构。
Schema对象包括象表,视图,索引这样的结构(在一个表空间和一个schema之间没有
任何关系。在同一个schema的对象可以在不同的表空间,一个表空间可以拥有不同的
schema的对象)
一些最常用的chema对象定义在以下部分
表
表是在oracle数据库中最基本的数据存储单元。数据库表持有所有用户可访问的数据
。每个表有列和行。oracle存储一个数据库的表的每一行包含的数据,这个表最多可
以包括256列,(以一个row或更多的row pieces的形式)。一个表有一个employee数
据库,例如,可以有一列叫employee号,在这个列的每一行的是一个employee的号码
。
视图
视图是在一个或多个表或其他视图上的定制的数据库的表现。一个视图可以被认为是
存储的查询。视图实际上并没有数据,然而,他们可以从他们所基的表上取数据库,
这个表称为视图的基表。
象表一样,视图可以查询,更新,插入,删除,但是有一些限制。所有的视图上的操
作实际上影响这个视图的基表。
视图通过限制对预定义的表的行和列的访问提供额外级别的安全控制。它同时也隐形
了数据的复杂性和存储复杂的查询。
索引
索引是和表相关的可选的结构。索引可以用来提高取数据的性能。就象一本手册的索
引可以帮助你快速的定位特定的信息一样,一个oracle的索引也提供对表数据的访问
路径。
当处理一个请求的时候,oracle可以使用一些或者所有可用的索引来高效的定位所要
请求的行。当应用程序经常访问一定记录范围(或一条特定的记录)的表的时候,索
引非常的有用(例如,所有的收入高于1000美元的employee)。
索引可以创建在一个表的一列或多列上。索引创建之后,自动的由oracle来维护。对
于表数据的改变(例如添加更新或删除记录)会自动的关联到所有相关的索引,这次
对于用户来说是完全透明的。
你也可以对一个索引进行分区。
Clusters
Clusters是一个或多个表的分组,这些表物理的存储在一起,因为他们共享相同的列
,而且他们也经常同时使用。因为相关的行是物理存储在一起的,所以,磁盘访问时
间可以节省。
向索引一样,cluster也不影响应用程序的设计。一个表是不是cluster的对用户和应
用程序是透明的。数据存储在一个cluster的表和非cluster的表里面,用sql来访问是
相同的。
数据块,extents和段
逻辑存储结构包括数据块,extents和断,使的oracle对磁盘空间使用有一个 fine-grained的控制。
oracle数据块
一个最fine level的粒度,oracle 数据库的数据是存储在数据块中。一个数据块对应一定的物理数据库磁盘空间指定的字节。标准的块的大学是由初始化参数 db_block_size决定的。另外,你可以指定最多五个其他大小的block。一个数据库使用,分配数据库空间就是使用块。
extents
逻辑数据库空间的下一个级别就是extent。一个extent是指定数目的连续的数据块,从一个单一的分配中,用来存储特定类型的信息。
段
在extent上的逻辑数据库存储就是段了。一个段是分配给一定逻辑结构的extent的集合。下表描述了不同类型的段:
------------------
段 描述
数据段 | 每个非cluster的表有一个数据段,所有的表都存储在
|数据段的extent中。对于分区表,每个分区有一个数据段
| 每个cluster有一个数据段,在cluster中每一个表的数
|据存在cluster的数据段中
------------------
索引段 |每个索引有一个索引段存储它所有的数据
|对于分区的索引,每个分区有一个索引段
------------------
临时段 |临时段是当一个sql语句为了完成执行需要临时的工作区
|的时候创建的,当一个语句完成执行,这个临时段的 |extent返回给系统为了将来的使用
------------------
回滚段 |如果你运行在自动重做管理模式,那么数据库服务器使用 |表空间管理undo space
|oracle公司推荐您使用 自动重做管理方式
|然而,如果你运行在手工重做管理模式,那么需要由dba |创建一个或多个回滚段为了临时的存储重做信息
|在数据库恢复的过程中,需要用到回滚段的信息:
|× 产生完整性读数据库信息
|×回滚没有提交的事务
------------------
oracle会动态的分配空间,当一个存在的段的extent变满的时候,换句话说,当一个
段的extent满了,oracle会为这个段分配另一个extent。因为extengs在需要的时候分
配,所有一个段的extents可能是连续的也可能是不连续的。
表空间
一个数据库被分成逻辑的存储单元,这就是表空间,包含有相关的逻辑结构。例如表
空间通常可以把所有的应用程序对象组合在一起,为了简化管理的操作。
数据库,表空间和数据文件
它们的关系:
每个数据库逻辑的分成一个或多个表空间
一个或多个数据库文件是为每个表空间显示的创建的为了物理的存储一个表
空间的所有的逻辑结构的数据。
一个表空间的数据库文件的总大小就是这个表空间的总存储能力
一个数据库的总存储能力就是数据库的表空间的组合起来的存储能力
联机和脱机表空间
一个表空间可以联机(可访问)或脱机(不可访问)。
一个表空间一般是联机的,这样用户可以访问这个表空间的信息。然后,有时候表空间需要脱机,这样使的数据库的一部分不可用,这个时候,仍然可以对数据库的其他部分进行正常的访问。这样可以使得许多管理认为更容易来执行。
物理数据库结构
下面的部分节省一个oracle数据库的物理结构,包括数据文件,重做日志文件和控制文件
数据文件
每个oracle数据库有一个或多个物理数据文件。数据文件包括所有的数据库数据。逻辑数据的结构的数据,例如表和索引,都是物理的存储在为这个数据库分配的数据文件中。
数据文件的特性有:
×一个数据文件只能跟一个数据库相关联
×数据文件可以有一定的特性可以让它们自动的扩展当数据库用完成了空间的时候
×一个或多个数据库文件组成的数据库存储的逻辑单元叫表空间,前面已经讨论过了。
数据在数据文件中被读,在需要的时候,在正常的数据库操作,同时存放在oracle的内存缓冲区中。例如,假设一个用户希望访问一个数据库的一个表的某些数据,如果请求的信息没有在这个数据库的内存缓冲区中,按摩它就会从相应的数据文件中读,并且存放在内存中。
修改过的或新的数据不一定要马上写到数据文件中。为了减少磁盘访问的次数从而提高性能,数据被先放在pool中,然后全部写到相应的数据文件中,这个是由dbwn后台进程完成的。
redo log 文件
每个oracle数据库都有一套两个或更多的redo log文件。这套redo log文件就是这个数据库的redo log。一个redo log由rodo entries组成(也叫 redo 记录)
redo log的主要功能就是记录对数据的所有改变的记录。如果一个失败阻止了修改的数据永久的写到数据文件中,那么这个改变能从redo log中获取,这样工作就永不丢失。
为了保护关于redo log自身的错误,oracle容许多工log,这样两个或多个redo的copy能够在不同的磁盘上。
redo log的信息知识用来恢复数据库,当一个系统或媒介错误发生的时候,这阻止了数据库的数据写到数据文件中。例如,如果一个未预料的电源终止了数据库的操作,那么在内存中的数据就不能写到数据文件中,这样数据就丢失了。然后,丢失的数据可以在数据库打开的时候恢复回来,在电源恢复的时候。通过对数据库数据文件applying在最近使用的redo log文件上的信息,oracle能恢复到电源失败那个时刻的数据。
在恢复操作中应用redo log的过程称为前滚。
控制文件
每个oracle数据库都有一个控制文件,一个控制文件包含记录,这些记录确定了数据库的物理结构,它有下面的信息:
数据库名称
数据文件和redo log文件的名称和位置
数据库创建的时间戳
向redo log一样,oracle也让控制文件多工为了保护它。
控制文件的使用
每次oracle 数据库的实例启动的时候,它的控制文件就确定数据库和redo log文件,为了oracle的操作能继续,它们必须被打开。如果一个数据库的物理组成被修改了(例如,新的数据文件或redo log文件创建了),那么这个控制文件会自动的被oracle更新,来反映这些变化。一个控制文件也用于数据库的恢复。
数据工具
有三个工具可以用来移动一个oracle数据库子集从一个数据库到另外一个数据库,它们是export,import和sql loader
export工具
export工具在oracle数据库之间转移数据对象,即使它们位于不同的硬件和软件平台上。export能从oracle数据库中抽取对象定义和表的数据,并且把它们存储在oracle的二进制格式的dump文件中,通常位于磁盘或磁带上。
这样的文件可以通过ftp或copy或物理的传送到不同的站点。它们可以用import工具来传送到数据库中,这些数据库不用通过网络联机,就向是备份一样。
当你运行export的时候,它抽取对象,例如表,以及它们相关的对象,然后写到export dump文件中。
import工具
import工具把通过export工具取出的数据从一个数据库插入到另外一个数据库中。export 的dump文件只能被import工具读出来。import 读出export从一个oracle数据库取出的对象的定义和表的数据,
export和import工具能方便高级复制的某些方便,例如offline instantiation.
sql loader 工具
exp dump文件只能被oracle 的imp工具读。如果你需要读ascii固定格式的文件或delimited文件,你可以使用sql loader工具,sql loader可以从外表中装载数据到一个数据库。sql loader在同一个load 会话中,接受各种格式的输入数据,执行过滤,把数据装到不同的oracle数据库的表里面。
数据字典概览
每个oracle数据库都有数据字典。一个oracle数据字典是一套表和视图,它们是对数据的只读参考。例如,一个数据字典存储关于数据库逻辑和物理结构的信息。一个数据字典也存储下面的信息:
oracle数据的合法用户
关于为数据库的表定义的完整性约束的信息
为一个schema对象分配的空间数量以及它使用了多少。
一个数据字典当数据库创建的时候创建的。为了准确的反映数据库每个时候的状态,数据字典被oracle自动的更新,当做了相应的操作的时候,例如,当数据库的结构改变的时候。这个数据库依赖数据自动来记录,确认和指导继续的工作。例如,在数据库操作的时候,oracle读数据字典来确定schema对象是否存在以及这个用户能否访问他们。
数据访问概览
这个部分解释了oracle是怎样遵守业内的可接受的标准使用数据访问语言,以及oracle是这样控制数据完整性和数据的一致性。这个部分包含下面的主题:
sql 概览
对象概览
pl、sql概览
java概览
事务概览
数据完整性概览
sql plus概览
sql概览
sql是一种语言,用来定义和操作数据库。sql 数据库是关系形数据库,表示数据是通过一套简单的关系存储的。
sql语句
所有的关于oracle数据库信息的操作都是通过sql 语句来执行的。一个sql语句是一串sql文本。一个语句必须相当于完成的sql语句,就向:
select last_name,department_id from employees;
只有一个完成的sql语句才可以成功的运行。一个句子的一部分,例如下面的,会报错,提示需要更多的文本。
select last_name;
一个sql语句可以被认为是简单但是很强大的计算机程序或指令。sql语句分为以下几类:
ddl语句
dml语句
事务控制语句
会话控制语句
系统控制语句
embedded sql语句
ddl语句
这些语句是创建,修改,维护和删除schema对象。ddl语句也包含容许用户能不能给其他的用户授权访问数据库以及数据的特定的对象。
dml语句
dml语句操作数据。例如查询,插入,更新和删除一个表的行都是dml操作。最常用的sql语句就是select语句,它从数据库中取数据。锁定一个表或视图,
检查一个sql语句的执行计划也是dml操作。
事务控制语句
这个语句管理dml语句做的改变,它
使得用户可以把这些变化组成一个逻辑的事务,例如commit,rollback和savapoint。
会话控制语句
这个语句让用户控制当年会话的属性,包括enable和disable角色和改变语言设置,这两个会话控制语句是alter session 和set role;
系统控制语句
这个语句控制oracle服务器实例的属性。唯一的系统控制语句是alter system.它使用户改变设置,例如共享服务器的最小数目,杀掉一个会话,或执行其他的操作。
embedded sql语句
这个语句陷入到ddl,dml和其他的事务控制语句中,在一个过程化语言的程序,例如使用oracle的预编译器。例如open,close,fetch和execute.
对象概览
oracle对象技术是oracle关系技术的抽象层。新的对象类型可以从内置的数据库类型中创建或者其他的已经创建的对象类型,对象引用和即使类型中创建。用户定义类型的metadata存储在对sql,plsql,java和其他已经发布的接口是可用。
一个对象类型不同于本地的sql 数据类型,因为它是用户定义的,它指定基本的,永久的数据(属性)和关系行为(方法)。对象类型是真实世界实体的抽象反映。例如订单。
对象类型和面向对象 的关系特性,例如可变长的数组和nested的表,提供高级别的对数据的组织和访问方式。在对象曾下面,数据是存储在列和表里面,但是你可以向真实世界的实体(例如客户和订单)哪里对数据进行加工,这样使得数据更有意义。当你查询数据库的时候,不用考虑列和表,只是简单的select 一个客户。
在内部,关于对象的语句仍然是级别的关于关系形表和列的语句,你可以继续操作关系形数据类型,把数据存储到关系形的表中。但是你有可以使用面向对象特性的advantage.你可以使用面向对象的特性当继续操作你的关系形数据的时候,你可以完全不用面向对象的方法。例如,你可以定义一些对象数据列席把它存储到关系形表的列中。你也可以根据对象模型,对存在的关系形数据创建对象实体来代表和访问数据。或者你也可以存储对象数据到对象表里面,每一行都是一个对象。
对象的advantage
总的来说,面向对象的模型更 c++和java的类 机制很相似。向类一样,对象可以使复杂的,真实世界的商务实体和逻辑更简单,而且可以重用这些对象,这样使得开发快速,高效的数据库应用程序变为可能。通过本地支持数据库的对象类型,oracle使得应用程序开发人员直接的访问他们的应用程序使用的数据结构。在客户端的对象和包含数据的关系形数据库的列和表之间不需要映射层。对象的抽象和对象行为的封装同样也使得应用程序更容易理解和维护。
PL/SQL 概览
plsql是oracle的对sql的过程化语言的扩展。plsql把简单和弹性的sql通过过程化的函数的sql语句(例如 if,then ,while, 和loop)联合在一起。
当设计一个数据库应用程序的时候,考虑使用存储的plsql的下来优势
plsql代码可以存储在数据库中。应用程序和数据库之间的网络流量减少了,这样应用程序和系统性能提高了。即使当plsql不存储在数据库中,应用程序可以把plsql的快发送到数据库中,而不是把单独的sql语句,这样也减少了网络流量。
数据访问可以通过存储的plsql的代码控制。这种情况下,pl sql的用户可以访问应用程序开发人员访问的数据,除非被授权另外的访问方法
plsql快可以通过应用程序发送到数据,在不加大过量的网络流量的情况下运行复杂的操作。
下面的部分介绍plsql程序单元是怎么在数据库中定义和存储的。
plsql 程序单元
程序单元是存储过程,函数,包,触发器和匿名事务。
过程和函数
过程和函数是sql和plsql语句的集合,组成一个单元来解决特定的问题,或者完成一套相关的任务。他们在数据库中以被编译的形式创建和存储,而且可以被用户或数据库应用程序执行
过程和函数是相同的,函数通常返回单值给用户,过程没有。
包
包把相关的过程,函数,变量和其他的结构封装在一起作为数据库中的一个单元。他们提供更多的功能(例如,global包边贸可以被声明,却可以在包里面的任何一个过程中引用)。他们也提高性能(例如,所有的包的对象都被解析,编译和装到内存)
数据库触发器
数据库触发器是plsql,java或c过程,当一个表或视图被修改或当一些用户操作或数据库系统操作凡是的时候能隐式的执行。数据库触发器可以为了管理数据的时候用各种方法来使用。例如,你可以自动化数据的产生,审计数据的修改,加强复杂的完整性约束,定制复杂的安全性授权。
autonomous 块
你可以在一个plsql快中调用autonomous事务。当一个autonomous pl sql快进入的时候,
这个调用者的事务文本就挂起来了。这个操作保证sql在这个block中执行的操作更这个调用的事务文本的状态没有依赖或影响。
java概览
java是一种面向对象的应用级别的程序。java有许多关键的特性使得它开发理想的服务器应用程序,这些特性是:
简单性--java是一种比其他的许多服务器应用程序更简单的语言,因为它的对象模型的完整的加强。大了,标准的类库,给了java开发人员各种平台上强大的开发工具。
可移植性--java几乎是在各个平台上都是可移植的。可以使用java写平台相关的代码,但是写能在不同的机器上无缝的移动的程序是很简单的。oracle服务器应用程序,也趋向于避免没有什么平台移植性的问题,它是不直接支持图形用户界面。
自动存储管理==java虚拟机自动的在程序运行的时候,执行内存分配和回收的工作。java程序员不必要显示的分配和释放内存。想法,他们依靠jva来执行这些bookkeeping操作,当他们创建对象的时候分配内存,当不需要使用对象的时候释放内存,后者又叫垃圾回收。
强类型--在你使用java变量之前,你必须声明这个对象的类。java的强类型使得在java和plsql应用程序直接语言内的调用中提供一种合理的安全的解决方案,而且也把同一个应用程序的sql调用集成到java中。
无指针--尽管java保留了很多c的特性和语法,但是它不支持直接的指针和指针的操作。你传递所有的参数,包括primitive类型,都是通过引用(对象的身份是保留的),而不是传值。java不提供c那样的低级的直接的对指针的访问,这样就减少了内存的破坏。
异常处理--java的异常是对象。java需要开发人员通过特定类的方法声明哪个异常可以抛处理
安全--java的字节码设计和jvm的内置机制保证了java二进制代码不会被tampered with。oracle 9i也是按照在安全管理器的实例上,这样,当结合oracle数据库安全的时候,决定谁可以调用java方法
对于关系行数据库的连接标准--jdba和sqlj使得java代码可以访问和操作在关系数据库上的数据。oracle提供了驱动,这样可以使得产商无关的,可移植的java代码访问关系数据库。
xml概览
xml,可扩展标价语言,是在web上的确定和描述数据的标准方式。它是人可以读的,机器可理解的,描述分层数据的通用的语法,在应用程序,数据库,电子商务,java,web开发,查询等等都是可用的。
oracle服务器包括oracle xml db,这是一套内置的高性能的xml存储和retrieval技术。xml db完全吸收了w3c xml数据模型到oracle服务器中,并且对导航和查询xml提供了新的标准访问方法。你可以同时得到关系行数据库技术和xml技术的好处。xml数据库的关键特性包括下面:
本地数据类型 --xml类型 -存储和操作xml。多个存储选项(clob,decomposed的对象关系)都对xml类型可用,dba可以选这一个存储来满足fidelity to original,简单查询,简单重新产生,等等的需要。使用xml类型,你可以执行sql操作,例如查询和对xml对象的olap函数和xml操作,例如xpath查找和xsl的转型,对sql 数据库,你可以建立在xml类型上一个常规的sql索引或oracle text索引,为了更好的性能和更广的应用程序。
本地xml产生提供了内置的sql操作符和相应的plsql包来返回xml格式的sql查询的结果。
一个xml资料库提供folding,访问控制,ftp和webdav协议的支持和版本控制。这使得应用程序操作xml数据的时候retain一个文件抽象
xml数据库的补充是oracle xml开发包,又叫xdk。xdk是一套经常使用的blocks和工具为开发使用。xdk包含级别的读,操作,传输和看xml文档的块。为了提供更多范围的发布,xdk对java,javabeans,c,c++,plsql是可用的。oracle xdk包括xml解析器,一个xslt处理器,xml schema处理器,xml类产生器,xml transviewer javabeans,xml sql工具和xsql servlet。
高级队列是oracle数据库的信息对象功能。通过这样的功能,信息队列操作可用向对oracle数据库sql操作那样的执行。信息队列功能可用使得应用程序和oracle数据库的用户使用队列来进行异步通信。高级队列提供enqueue,dequeue,propagation和guaranteed 信息的传递,和异常处理用在万一信息不可传递。信息队列使用xml类型为xml信息的payloads有好处。
事务概览
事务是一个单用户运行的包括一条或多条sql语句的逻辑工作单元。按照ansi iso sql标准,这个oracle是兼容的,一个事务从这个用户的第一个可执行的sql语句开始。一个事务当这个用户显示的提交或回滚的时候结束。
考虑一个银行数据库,当一个银行客户把钱从一个储蓄账户给一个支票账户的时候,这个事务就由三个独立的部分构成:减少储蓄账户,增加支票账户,在事务journal中加上这样的事务记录。
oracle必须保证所有的三个sql语句都能执行,为了账户的平衡。当有事情阻止其中的一个语句运行的时候,这个事务的其他语句就必须取消。这被称为回滚。如果在做任何更新的时候有一个错误产生,那么没有一个更新产生。
图 略。
提交和回滚事务
构成事务的sql语句的改变可以提交或回滚。在一个事务提交或者回滚后,下一个事务从接下来是sql语句开始了。
提交 一个事务,这个事务的所有的sql语句执行的结果所产生永久的改变。这个事务中sql语句的改变对其他会话的事务,只有在事务提交的时候 ,是可见的。
回滚一个事务,取消这个事务的sql语句执行的所有的改变。在一个事务回滚之后,受影响的数据是没有被改变的,就象这个事务没有运行一样。
保存点
保存点把一个有许多sql语句的长的事务分成更小的部分。有了保存点,你可以在一个长是事务中,arbitarily来标价你的工作在任何一点。这样可以给你将来回滚的选项,在这个事务中,你可以从当前点回滚到已经声明的保存点。例如,你可以在一个长的复杂的一系列的更新中使用保存点,这样如果你有错误,你不必要resubmit每个语句。
使用事务的数据一致性
事务可以让用户来保证对数据的一致性,尽管一个事务的sql语句是逻辑组成在一起。一个事务应该包含所有需要的部分为了一个逻辑的工作单元,不能多也不能少。所有引用的表的数据应该在事务开始和结束的时候一致。事务应该包含仅仅是由这写sql语句对这些数据所做的一致性的改变。
例如,又用到银行的例子。两个账户之间的资金的转移应该包括增加一个账户和减少另外一个脏话,然后记录这个事务的操作。所有的行为要么失败要么成功,credit不一个在没有debit的时候提交。其他不相关的操作,例如新的deposit对一个账户,不一个包含在这个资金转移的事务中,这个语句一个在其他的事务中。
数据完整性概览
数据必须遵守相应的商务规则,就向dba和应用程序开发人员所定义的。例如,假设一个商务规则是,在inventory表里面不能有sale_discount列的数值型的记录大于9。如果插入或更新语句试图去违法这个完整性规则,那么oracle必须回滚这个非法的语句,然后给这个应用程序返回一个错误。oracle提供完整性约束和数据库触发器来管理数据完整性规则。
完整性约束
完整性约束是一个声明了的方法来定义一个表的一个列的商务规则。一个完整性约束是关于表的数据的要么是真的要么遵守下面规则的语句:
如果一个完整性约束为一个表创建的时候,已经有存在的数据不满足这个约束,那么这个约束不能enforced。
在一个约束已经定义之后,如果dml操作的任何结果都违法这个完整性约束,那么这个语句被回滚,产生一个错误。
完整性约束定义在表上,做为表的定义的一部分存储在数据字典里。这样所有的数据库应用程序遵守同样的规则。当一个规则改变的时候,它仅仅需要在数据库级别改变一次,而且对每个应用程序不需要多少时间。
oracle支持下面的完整性约束:
not null, 不容许表的列中有空值
unique key ,不容许一列或多列上有重复值
primary key, 不容许一列或多列上有重复值和空值
foreign key,在一列和多列上的每一个值都必须匹配相关表的unique或primary key的每一个值。fk完整性约束也定义了引用完整性行为用来描述oracle在引用数据改变的时候应该对依赖的数据做什么操作。
check , 不容易不满足这个约束的逻辑表达式的值。
keys
键 被用来定义完整性约束的几种类型的定义。一个key是列或多个类包含在对某种类型的完整性约束的定义中。key描述了不同的表之间和关系形数据库之间的列之间的关系。一个key的单独的值叫做key值。key有下面几种类型:
pk: 这个列或多个列包括在这个表的pk 约束的定义中。一个pk的值是唯一的区分表的行。一个表只能有一个pk可以定义。
unique key:这个列或多个列定义在unique约束中
foreign key:这个列或多个列定义在引用完整性约束的定义中
referenecd key:这个唯一key或primary key在同一个或不同的表被一个外key所引用。
sql plus 概览
sqlplus 是进入和运行特别的数据库语句工具。它让你可以运行sql语句或plsql块,还可以执行更多的任务。通过sqlplus,你能:
输入,编辑,存,取和运行sql语句和plsql块。
对查询结果进行格式化,计算,存储,打印和创建web输出。
对访问的任一个表列出列的定义,在sql数据库间copy数据
发送信息或者从一个end user接受响应。
执行数据库管理。
内存结构和进程概览
内存结构和进程概览
一个oracle服务器使用内存结构和进程来管理和访问数据库。所有的内存结构存在于组成这个数据库系统的计算机的内存中。进程是工作在这些计算机的内存中的作业。
本部分讨论的体系化的特性使的oracle服务器支持:
×多用户能同时访问同一个数据库
×并发的多用户,多应用程序的数据库系统的高性能
图略
oracle实例
一个oracle服务器包含一个oracle数据库和一个oracle服务器实例。每次数据库启动的时候,sga被分配,oracle后台进程启动。后台进程和内存缓冲区被称为一个oarcle实例。
RAC:多实例系统
有些硬件体系结构(例如,共享磁盘系统)使的多个计算机共享访问数据,软件或周边(peripheral)设备。rac通过这样的结构运行多个实例来共享一个单一的物理数据库来获得很多优势。在很多应用程序中,rac使得用户在多台计算机上访问单一的数据库来提高性能。
RAC是内在就具有很高的可用性系统。 Cluster是典型的RAC环境,能够提供连续的计划和非计划的outages的服务。
一个oracle服务器使用内存结构和进程来管理和访问数据库。所有的内存结构都存在组成这个数据库系统的计算机中的主内存中。进程是工作在这些计算机的内存中的作业。
内存结构
oracle创建和使用内存结构来完成许多作业。例如,内存存储要运行的程序代码和在用户间共享的数据。和oracle相关的有两种基本的oracle内存结构:sga和pga,下面的部分将详细介绍。
SGA
SGA是包含一个oracle实例的数据和控制信息的共享内存区。oracle当一个实例启动的时候分配sga,当一个实例关闭的时候回收它的空间。每个实例都有它自己的sga。
当前连接到一个oracle服务器的用户共享sga的数据。为了更好的性能,整个sga应该尽可能的大(当然要时候真正的内存),这可以尽可能多的存储数据和最小化磁盘的i/o。
存储在sga的内存分为几种不同的内存结构,包括数据库缓冲区,redo log 缓冲区和共享池。
sga中的数据库缓冲区
数据库缓冲区存储最近使用的数据块。一个实例的数据库缓冲区是这个数据库的缓冲区。这个缓冲区包含修改的和没有修改的数据。因为最近(包含经常的,最频繁的)使用的数据的保存在内存中,所有不必要什么磁盘的i/o,所有性能提高了。
sga中的redo log缓冲区
redo log缓冲区存储redo entries,对数据库所做改变的日志。redo entries村庄在redo log缓冲区中,要写到联机redo log中,可以用来在必要的时候进行数据库恢复。redo log的大小是固定的。
sga中的共享池
共享池包含共享内存结构,例如共享sql区。共享sql区在处理每个唯一的提交到oracle数据库的sql语言的时候是必须的。共享sql区包含例如相应的语句的解析树和执行计划的信息。多个执行同一个语句的应用程序使用同一个共享sql区,留下更多的共享内存给其他的用户使用。
sga中的large pool
大池是为oracle的备份和恢复操作,io服务器进程,shared服务器会话的内存和oracle xa(当事务跟多个数据库交换的时候使用)提供的大内存分配的可选区。
语句的handle或游标
一个游标是跟特定语句关联的内存结构的句柄(或指针)(oci,把这些叫做语句的句柄)。尽管很多oracle用户都系列oracle工具的自动游标处理,程序接口提供给应用程序设计人员对游标进行更多的控制。
例如,在预编译应用程序的开发中,一个游标是对一个程序可用的有名字的资源,而且能够被专门用来解析在这个应用程序中的sql语句。应用程序开发人员可以对一个程序进行编码,这样可以控制sql语句短语的执行从来提高应用程序的性能。
PGA
pga是包含一个服务器进程的数据和控制信息的内存缓冲区。当一个服务器进程启动的时候,pga被oracle创建。pga的信息依赖于oracle的配置。
进程体系结构
进程是一个“控制的线程”,或是一个能运行一系列步骤的操作系统的机制。有些操作系统用 作业或任务这样的术语。一个进程总的来说,有它自己的的私有内存,并且在这个私有内存中运行。
oracle服务器总的来说有两种类型的进程:用户进程和oracle进程。
用户(客户端)进程
创建和维护用户进程用来运行一个应用程序(例如proc 、c++程序)的软件代码或oracle工具(例如oracle企业管理器)。用户进程也通过程序接口来关联服务器进程间的通信,下面的部分会讲解。
oracle进程
oracle进程被其他的进程调用,代表其他的进程执行一定的功能。oracle进程的不同类型和他们相应的功能在下面讲解。
服务器进程
oracle为了处理连接用户进程的请求创建服务器进程。一个服务器进程更用户进程进行通信,和oracle进行交互,执行相应用户进程的请求。例如,如果一个用户查询不在数据库缓冲区的数据,那么相应的服务器进程就会把相应的数据块从数据文件中读到sga中。
oracle根据不同的用户进程来配置每个服务器进程。在专有服务器配置中,一个服务器进程处理单个用户进程的请求。在共享服务器配置中,让许多用户进程共享少数几个服务器进程,最小化服务器进程的个数和最大化系统资源的可用性。
在一些系统中,用户进程和服务器进程是分离的,有些系统中,他们是联合成一个单一的进程。如果一个系统使用共享服务器,或用户进程和服务器进程在不同的计算机上运行,那么用户进程和服务器进程一定是分离的。c/s结构的系统把用户进程和服务器进程分开,并且在不同的计算机上运行。
后台进程
oracle为每个实例创建一系列的后台进程。
oracle为每个实例创建一系列的后台进程。后台进程巩固了可以处理为每个用户进程
运行的oracle程序的功能。他们异步执行io和监控其他的oracle进程,为更好的性能
和可靠性提供更多的并行机制。
每个oracle实例可以使用多个后台进程,他们分别是
dbwn,lgwr,chpt,smon,pmon,arcn,reco,jnnn,dnnn,lms,和qmnn.
dbwn
dbw把修改的数据块从数据库缓冲区写到数据文件中。尽管在很多系统上一个dw进程(
dbw0)就已经足够了,但是你可以为一个修改数据特别多的系统配置更多的进程来提
供写的性能(dbw1到dbw9和dbwa到dbwj)。初始化参数db_writer_processes确定dbwn
进程的个数。
因为oracle使用提前写日志(write-ahead logging).dbwn不必在事务提交的时候写数
据块。相反,dbwn被设计为高效的执行批写。在许多的情况xia ,dbwn仅仅当需要读更
多的数据到sga中,这个时候没有了什么可用的数据库缓冲区,才写的。最不常用的数
据先写到数据文件中。dbwn也为了其他的功能,例如checkpointing来执行写操作。
lgwr
lgwr把redo log entries写到磁盘中。redo log entries在sga的redo log缓冲区中产
生,lgwr把redo log entries顺序的写到联机redo log中。如果数据库有多个redo
log,那么lgwr把redo log entries写到这组联机redo log文件中。
ckpt
在特定的时刻,所有的sga中修改数据库缓冲都被dbwn写到数据文件中。这个事件叫做
一个checkpoint。checkpoint进程用来在checkpoint的时候对dbwn发信号,同时更新
所有的数据文件和控制文件来标示最近的一次checkpoint。
smon
smon当实例崩溃在启动的时候执行恢复。在rac,一个实例的smon进程能够为其他的崩溃的实例进行实例恢复。smon也能清楚不在使用的临时段,恢复由于文件读或脱机错误而中止的事务。这些事务最终当表空间或文件联机的时候被smon恢复。smon也能在字典管理的表空间中整合extents,这样可以得到连续的空间,更易于分配。
pmon
pmon当用户进程失败的时候进行进程的恢复。pmon负责清除缓冲区,释放进程使用的资源。pmon也检查分发器和服务器进程,并且在他们失败的时候重新启动他们。
arcn
arcn在log 切换发生之后,把联机redo log文件写到归档的存储中。尽管单一的arcn进程对大多数系统已经足够了,你可以通过动态初始化参数设置log_archive_max_processes来设置最多10个arcn进程。如果当前数目的arcn的工作负荷太重,那么lgwr会自动的启动另外的arcn进程,最高10个。arcn当数据库运行在归档模式,并且是自动归档的时候才会起作用。
reco
reco被用来在分布试数据库中,解决分布式事务,由于网络或系统失败。在一定的时间间隔,本地的reco试图连接到远程的数据库,自动的完成提交或者回滚任一个pending的分布试事务的本地部分。
jnnn
作业队列进程,用来在批处理中。作业队列进程是动态管理的。这样,能使作业队列客
户端在需要的时候使用更多的作业队列进程。当他们是空闲的时候,这些进程使用的
资源就会释放。
dnnn
分发器是可选的后台进程,只有当使用了共享服务器配置的时候才有。对每个使用的
通信协议,至少有一个分发进程被创建(d000,,dnnn)。每个分发器负责把连接的
用户进程的请求路由到可用的共享服务器进程上,并且把响应返回给相应的用户进程
。
LMS
锁管理器服务进程用在RAC的实例间的锁。
QMNn
队列监控器是用来监控oracle 高级队列的队列信息的可选的后台进程。你最多可以配
置10个队列监控进程。
程序接口机制
程序接口,是一种用户进程和服务器进程通信的机制。它在任何客户端工具或应用程
序(例如oracle forms)和oracle软件之间,作为标准通信的一种方法。它有下面的
功能:
×通过格式化数据请求,传递错误,trapping和返回错误来作为一种通信机制
×执行数据的转换和翻译,尤其是在不同类型的计算机或在外部用户程序数据类型之
间。
通信软件和oracle net服务
如果用户和服务器进程在一个网络的不同的计算机上,或者用户进程通过分发进程连
接到共享服务进程上,那么用户进程和服务器进程使用oracle net 服务进行通讯。分
发器是在共享服务器配置下的一个可选的后台进程。
oracle net服务是一种oracle的机制,为了更由网络使用的通信协议进行更好的接口
,这样可以简化分布式处理和分布式数据库。通信协定定义了在网络中传输和接受的
数据的方式。在网络环境中,oracle数据库服务器跟客户工作站和使用oracle net服
务软件的其他oracle数据库进行通信。
oracle net服务支持大多数网络协议的通信,范围从pc lan到大型主机计算机系统。
使用oracle net服务器,应用程序开发人员不需要关心数据库应用程序支持的网络通
信。如果使用了新的协议,dba只有做很小的改动,应用程序不需要修改就可以继续运
行。
oracle是怎么工作的一个例子
下面的例子描写了oracle执行的最基本的操作。这个表明了当用户和相关的服务器进
程在不同的机器上(通过网络连接)的oracle配置。
1.一个实例在运行oracle的计算机启动了(通常也机或数据库服务器)
2.一个运行应用程序的计算机(本地或客户工作站)在用户进程里面运行这个应用程
序。客户应用程序试图通过相应的oracle net服务驱动来建立到服务器的连接。
3.服务器运行相应的oracle net 服务驱动。这个服务器发现了从应用程序发过来的连
接请求,并且代表这个用户进程创建了专有服务器进程。
4.用户运行sql语句,并且提交一个市委。例如用户改变了表的一个行的名字。
5.服务器进程接受到这个语句,并且在共享池里面检查,看是不是有共享sql区包含相
同的sql语句。如果发现了共享sql区,那么服务器进程就看用户是否对请求的数据有
没有访问权限,并且已经存在的共享sql区用来处理这个语句。如果没有,那么为这个
语句分配新的共享sql区,这样它就可以被解析和处理。
6.服务器进程从数据文件(表)或已经存在sga中取出需要的数据值。
7。服务器进程在sga修改数据。dbwn进程把修改过的数据永久的写到磁盘上(当这样
做是有效的时候)。
8。如果事务成功了,那么服务器进程通过网络向这个应用程序发送一条消息。如果没
有成功,那么就发送一条错误信息。
9.在整个过程中,其他的后台进程运行,看是不是有需要干预的条件。另外,数据服
务器管理其他用户的事务,并且在请求相同数据的时候阻止竞争。
应用程序体系结构概览
对于数据库有两种通用的方式:c/s和多层。计算环境中,internet计算机便的越来越
流行,许多数据库管理系统都迁移到多层环境中。
c/s体系结构
多处理为一套相关的作业使用不止一个处理器。分布式处理通过容许不同的处理器集
中在相关任务的子集来艰辛单一处理器的负荷,这样就从整体上提高了这个系统的性
能和能力。
oracle数据库系统能通过使用它的c/s体系结构来简单的实现分布式处理的优势。在这
样的体系结构中,数据库系统分成两个部分:前端或客户端和后端或服务器端。
客户端
客户端是前端数据库应用程序,由用户通过键盘,显示器,点击设备例如鼠标访问的。客户端不负责数据访问。它请求,处理和表现由服务器管理的数据。客户端工作站可以为它的作业做优化,例如,它不需要太大的磁盘空间,它可以从图形能力中获益。
通常客户端运行在不是数据库服务器的另外一台计算机上,通常是PC。许多客户端能同时对一个服务器进行访问。
服务器端
服务器端运行oracle软件,处理并发和贡献数据访问的请求。服务器接受和处理由客户端应用程序发起的sql和plsql语句。管理服务器的计算机可以优化,例如,给它很大的磁盘和很快的处理器。
多层体系结构:应用程序服务器
多曾体系结构有下面的组件:
×启动操作的客户端或初始处理 (initiator process)
×一个多多个应用程序执行这个操作的不同部分。应用程序服务器提供对数据的访问,执行其中的一些查询处理,这样可以减少数据库服务器的部分负荷。它可以作为在客户端和多个数据库服务器间的接口,包括提供额外级别的安全。
×数据库服务器存储在这个操作中使用的大部分数据。
这样的体系结构使得使用一个应用程序服务器可以:
×确认客户端的信用,例如一个web浏览器
×连接到oracle数据库服务器
×代表客户端进行请求的操作
客户端的身份由每层的连接来维护。
分步式数据库概览
分布式数据库是通过一起使用多个数据库服务器管理的数据库网络。他们通常不是被看做单一的逻辑数据库。分布式数据库上的所有的数据库上的数据可以被同时访问和修改。分布式数据库的主要好处就是,物理分开的数据库可以逻辑的连接起来,并且在一个网络上潜在的对所有的用户进行访问。
在分布式数据库中管理一个数据库的计算机叫做节点。对于用户直接连接的数据库叫做本地数据库。这个用户访问的其他的数据库叫做远程数据库。当本地数据库访问远程数据库的信息的时候,本地数据库是远程服务器的客户端,这是c/s体系结构的一个例子。
数据库连接描述了一个数据库访问另外一个数据库的路径。数据库连接当一个引用加上全局对象名称的时候被显示的引用。
当一个分布式数据库要能通过网络访问大量的数据的时候,它必须隐藏数据的位置,和通过网络的复杂性访问。分布式数据库管理系统也保留关系每个本地数据库的优势,就象他们不是分布式一样。
location transparency
location transparency发生在,当一个数据的物理位置对于数据库系统的应用程序和用户是透明的时候。一些数据库特性,例如视图,过程和同意词,能提供位置透明。
例如,视图连接几个数据库的表的数据,这样就提供了位置透明,因为用户的视图不需要知道数据库是从那里来的。
站点自治
站点自治的意思是分布式数据的每个数据库,都是分开管理和独立的,对于其他的数据库,就象每个数据库都是没有网络的数据库。尽管每个数据库能跟其他的数据库一起工作,他们的有区分的,独立的系统,能被单独的对待。
分布式数据操作
oracle分布式数据库体系结构支持所有的dml操作,包括查询,插入,更新和删除远程表的数据库。要访问远程数据,你要在远程对象加上远程对象名。对访问远程数据不需要进行编码或复杂的语法。
例如,查询sales远程数据库的employee表,这样来引用:
select * from employee@sales;
two-phase提交
oracle在分布式数据库中,象非分布式数据库环境一样的保证数据完整性。oracle使用事务模式和 tow-phase提交机制来提供保证。
在非分布式系统中,事务应该仔细的规划,包括sql语句的逻辑集,作为整体,要么成功,要么失败。oracle的two-phase提交机制保证了不管什么类型的系统或网络故障发生,分布式事务要么提交在所有的节点,要么回滚,保证了在全局的分布式数据库中的数据完整性。
高级复制概览
复制是copy和维护数据库对象,例如表的处理,在组成分布式数据库系统的多个数据
库之间。一个站点的变化,可以在本地捕获和存储,在转发和应用到每个远程节点之
前。oracle的复制完全集成了oracle服务器的特性,它不是一个分开的服务器。
复制使用分布式数据库技术在多个站点之间共享数据,但是复制数据库和分布式数据
库是不一样的。在分布式的数据库中,数据在许多位置上是可用的。但是特定的表只
是存在于一个位置。例如,employee表只能存在包含db2,db3数据库的分布式数据库系
统的db1数据库中。复制的意思的,相同的数据在多个位置是可用的,例如,employes
表可以在db1,db2,db3上。
表的复制
分布式数据库系统经常逻辑的复制被本地用户经常访问的远程表。通过有多个节点的
经常访问的数据,分布式数据库不必重复的在网络中发送信息,这样最大化了数据库
应用程序的性能。
数据能用物化视图来进行复制。
多层物化视图
oracle支持分层的和可更新的物化视图。多层复制提供设计一个分布式应用程序的更
多的灵活性。使用多曾物化视图,应用程序可以管理多层的数据子集,不在层直接不
需要直接的连接。
一个可更新的物化视图,可以让您插入,更新删除物化视图的积累,并且把这个变化
发布到目标主表。同步的和异步的复制都支持。
下图(略)是一个多层体系结构的范例,图表是个反向树结构,改变可以从向上或向
下沿着连接到master的最外端的物化视图的节点发生。
冲突解析
在oracle9i中,冲突解析是定义在最高层,master站点上,并且在必要的时候推入到
可更新的物化视图的站点。这样就使得有多层物化视图成为可能。存在系统定义的冲
突解析方法是支持的。
另外,用户可以写自己的冲突解析routines.用户定义的冲突解析方式是一个plsql函
数,返回真或假。真表示这个访问成功的为一个列组解析了所有有冲突的修改。
streams概览
oracle streams能够在数据流中共享数据和事件,不管在一个数据库还是从一个数据
库要另外一个数据库中。流把指定的信息送到指定的目的地。oracle streams提供必
要建立分布式企业和应用程序,数据仓库,高可用性解决方案的能力。你可以同时使
用oracle streams的所有的能力。如果你需要改变,你可以实施 streams的新的能力
,而不牺牲已经存在的能力。
使用oracle streams,你可以控制哪些信息放到流里面,流怎么从一个数据库留到另
外一个数据库,流进入每个数据库的时候哪些事件发生,以及流怎么终止。 通过配置
留的指定的能力,你可以发布特定的需求。基于你的配置,流可以自动捕捉和管理数
据库中的事件,包括,但不局限于,dms改变和ddl改变。你也可以报用户定义的事件
加入到一个流中。那么,streams就可以自动的把信息传播到其他的数据库或应用程序
。另外,基于您的设置,streams可以在目标数据库应用一个事件。
你可以使用流来:
×捕捉数据库的变化
你可以配置后台捕捉进程来捕捉对表,schema或整个数据库的变化。捕捉进
程从redo log中捕捉变化,然后把每个捕捉的变化格式化成以个逻辑的改变积累。这
个在redo log中产生变化的数据库就是源数据库。
× 把事件排入一个队列。在strems队列中可以有两种类型的事件,lcr和用户信息
捕捉进程把lcr事件排到一个你指定的队列中。这个队列可以在同个数据库或
和其他数据库共享lcr事件
你也可以用用户应用程序显示的把用户事件排入一个队列。这些显示的队列
事件可以是lcr或用户信息。
×把事件从一个队列发布到另外一个。这些队列可以是一个数据库或不同的数据库间
。
×把事件从一个队列中去除。
后台应用进程可以把事件从一个队列中取出。你月可以使用用户应用程序显示的去
除以个事件。
×在数据库中应用事件
你可以配置一个应用进程来在队列中应用所有的事件或仅仅在你指定的事件
。你也可以配置一个应用进程去调研你自己的plsql子程序来处理事件。
lcr事件被应用或其他类型的事件被处理的数据库被称为目的数据库,在一些
配置中,源数据库和目的数据库可以是一个数据库。
streams的其他能力有下列:
×捕捉lcr中的标签
×directed 的网络
×自动冲突检测和解析
×传送
×共享heterogeneous信息
高级队列概览
高级队列概览
oracle高级队列提供了为分布式应用程序使用信息异步通信的体系结构。oracle高级队列为了deferred retrival把信息存储到队列中,由oracle服务器处理。这样不用额外的软件例如事务处理监控器或面向信息的中间件就可以提供可靠的和高效的队列系统。
信息在客户端和服务器直接传递,就像不同服务器之间的进程
as well as between processes on different servers.有效的 信息系统实施基于内容的路由,订阅和查询。
信息系统可以分成两类:
同步通信
异步通信
同步通信
同步通信基于 请求/回复 paradigm --用于向另外一个程序发送,等待,直到收到回复的程序。
这个通信的模型(也叫在线或连接)适合那些需要得到回复才能继续处理工作的程序。传统的c/s体系结构就是基于这样的模型的。这种模型的主要缺点就是,被请求的程序必须是可用的,并且要为调用的应用程序运行。
异步通信
在未连接或deferred模式中,程序是异步通信的,把请求放到队列中,然后继续进行他们的作业。
例如,一个应用程序需要查询数据的入口,或者在到了特定条件下才执行一个操作。
接受的程序从对象中取出请求,并且执行它。这样的模型适合那些把请求放到队列(他们不会因为等待回复而阻塞)能继续执行的应用程序。
对于在网络,机器或应用程序错误中要正确的deferred的执行,请求必须永远的存储,并且就处理一次。这通过结合永久队列和事务保护来实现。
Heterogeneous(异构) 服务概览
Heterogeneous服务用来访问非oracle的数据库系统。术语“非oracle数据库系统”指的是:
通过用c写的pl/sql过程访问的任何系统(也就是通过外部过程)
通过sql访问的任何系统(也就是通过oracle 透明网关和 通用连接性)
通过过程化访问的系统(也就是通过过程的网关)
异构服务使得用户做下面的操作成为可能:
使用oracle的sql语句去取存储在非oracle系统的数据
使用oracle过程来调用非oracle系统,服务或应用程序接口,在一个oracle分布式环境中。
异构服务通常用下面两种方式实现:
×oracle透明网关和异构服务的联合起来访问特点的,产商提供的,非oracle系统,这就是oracle透明网关设计的目的。例如,你可以使用oracle透明网关来为solaris的sybase数据库访问运行在solaris平台的sybase数据库。
×异构服务的连接性用来通过odba或ole db接口访问非oracle的数据库。
数据并发性和完整性概览
这个部分接受了oracle使用的软件机制用来满足下面的信息管理系统中的重要需求:
数据必须以完整的方式来读和修改
多用户系统的数据并发必须最大化
在许多用户的数据库系统中,最大生产力的高性能
并发性
在多用户数据库管理系统中主要关心的就是如何控制并发性,也就是能被许多用户同
时访问相同的数据。没有相应的并发控制,数据就可能会被不正确的更新或修改,威
胁到数据完整性。
如果许多人访问相同的数据,管理数据并发性的一种方法是让每个用户轮流等待。数
据库管理系统的目的是减少这样的等待,这样对每个用户来说,等待要么是不存在,
要么是可以忽略。 所有的dml语句异构尽可能的没有什么影响的进行,同时必须组织
在并发事务间的破坏性的干预。破坏性的干预就是可能错误的更新数据库,或错误的
更改基本的数据结构的任何干预。都不能牺牲性能和数据完整性。
oracle能解决由于各种类型的锁和多个版本的完整性模型的问题。这些问题本部分下
面都会讨论。这些特性都是基于事务的概念。保证事务的并发性和完整性是应用程序
设计人员的工作。
读完整性
oracle支持的读完整性,做下面的工作:
×保证语句看到的数据集合是完整的,在某个时间点,并且在语句执行的过程中是不
会改变的
×保证数据库数据的读者不用等待同以数据的别的读者或作者数据
×保证数据库数据的作者不用等待同一数据的读者
×保证作者仅仅等待如果其他的做者要更新并发事务的同一行。
考虑oracle实现读完整性的最简单的方法就是想像每个用户操作数据库的私有的copy
,这样就有完整性模型的多个版本。
读完整性,undo记录和事务
为了管理多版本的完整性模型,oracle必须当一个表被查询(读)或者被同时更新(
写)的适合创建数据的完整性的结合。当发生一个更新的时候,原来的数据被这个更
新改变,并且被记录在数据库的undo记录中。尽管这个更新遗留在一个未提交事务的
部分,任何用户后来查询这个修改的数据看的是原来的值。oracle使用sga中当前的信
息,以及在undo记录中的信息为这个查询来构建这个表的数据的完整性的视图。
只有当事务提交的时候,事务才会永远的改变。在用户事务提交之后的发出的语句只
能看到这个提交的事务做的改变。
注意,事务是oracle提供读完整性的一个战略。提交(或未提交的)sql语句的单元是
:
阐述了代表代表读者产生完整性视图的起点
控制当修改的数据能被数据库的其他事务来进行读或更新。
只读事务
默认的,oracle保障语句基本的读完整性。由单一查询返回的语句集在一个时间点是完整的。然而,在某些情况下,你也许需要事务级别的完整性。这在单一的事务中需要运行多个查询的能力,所有的必须在单一时间点是读完整性的,这样事务中的查询,不会受到干预提交事务的影响。
如果你想对多个表运行许多查询,而且你也不做任何更新,那么你应该使用只读事务。指定你的事务是只读的,你就可以对任何表想做多少查询都行,因为在同一时间点每个查询的结果集都是完整的。
锁机制
oracle也使用锁来控制对数据的并发访问。锁是一种机制,用来在用户之间访问oracle数据的时候组织破坏性的操作。
锁也用来保证完整性和一致性。一致性指的是,一个用户看到的或改变的数据是没有变化的,直到用户完成了操作。完整性的意思是,数据库的数据和结构是按照正确的顺序来进行改变。
自动锁
自动锁不需要用户就可以自动的执行。在有必要的sql语句中会有隐示的锁发生,看是请求什么样的行为。
oracle的锁管理器自己的把表的数据锁到行级。通过行级锁,同一数据的竞争得到最小化。
oracle的锁管理器维护几种不同类型的锁,这依赖于建立锁的操作的类型.两种普通的锁是独占锁和共享锁.一个资源(例如表或行)只能有一个独占锁,然而,一个资源上可以有很多共享锁.独占锁和共享锁都可以容许对锁定的资源进行查询,但是禁止对资源的其它活动(例如更新或删除)
手工锁
在一些情况下,用户也许需要不考虑默认的锁.oracle无论是在行级别还是表级别(对行的第一次查询,这样就会容许接下来的语句进行update操作),容许手工的,不管自动锁的特性,
沉寂数据库(quiesce database)
数据库管理员,偶尔需要进行一些同当前的非数据库管理员隔离的操作.也就是说,隔离并发的非数据库管理员的失误,查询,或plsql语句.实现这样的隔离,一种方法是关闭数据库,然后以限制模式启动它.沉寂数据库的特性,提供了隔离的另外一种方式,把系统放置到沉寂的状态,不影响用户.
数据库管理用使用sql语句来沉寂数据库.当系统处于沉寂的状态,数据库管理员可以安全的进行一定的操作,这样的执行跟并发的非dba用户是隔离的
数据库安全概览
oracle包含有控制数据库是怎样被访问和使用的安全特性.例如,安全机制:
阻止非授权的数据库访问
阻止非授权的对schema对象的访问
审计用户操作
跟每个数据库用户相关联的是同名的schema.默认的,每个数据库用户创建,并且可以访问它相应的schema中所有的对象.
数据库安全可以分为两类: 系统安全和数据安全.
系统安全包括控制访问和系统级别的数据库使用的机制.例如,系统安全包括:
合法的 用户/口令 联合
对于用户schema对象的可用的磁盘空间的大小
用户的资源限制
系统安全机制检查一个用户是否授权连接到数据库,不管数据库审计是否active,以及用户能执行哪些系统操作.
数据安全包括控制访问和使用数据库的在schema对象级别的机制.例如,数据安全包括:
哪个用户访问了特定的schema对象,特定的类型的操作是对每个用户在这个对象上都是容许的.例如(用户scott可以执行select和insert语句但不可以对employees表执行delete语句)
数据加密阻止非授权的用户绕过oracle来访问数据.
安全机制
oracle服务器提供自由的访问控制,这是一种基于权限的限制访问方式.为了让用户访问schema对象,必须对这个用户赋相应的权限.相应的授权的用户可以给其它用户任意授权,所有,这种类型的安全就叫自由的.
oracle使用几种不同 的工具管理安全
数据库用户和schemas
权限
角色
存储设置和配额
属性和资源限制
图1-5(略)表明了不同oracle工具的关系,下面部分提供了用户,权限和角色的概览
数据库用户和schema
每个oracle用户都有一列的用户名.为了访问一个数据库,用户必须使用数据库应用程序,然后用合法的数据库用户名进行联系.每个用户为了阻止非授权的使