2013年(56)
分类: Oracle
2013-10-31 09:57:55
在Oracle database中所有对数据的操作都是通过执行SQL来实现的。
SQL语法非常简单,但功能非常强大。
SQL语句是一串字符,例如下面的:
SELECT first_name,last_name FROM employees;
通过SQL语句你可以完成下列任务:
·查询数据
·Insert(插),update(更新)以及delete(删除)表中的行
·Create(创建),replace(替换),alter(更改)以及drop(删除)对象
·控制对数据库以及其中对象的访问(权限控制)
·保证数据库的一致性和完整性
SQL是前面这些任务整合起来的语言。Oracle SQL 是ANSI标准的落实,但Oracle SQL支持很多标准SQL不支持的特性。
PL/SQL and
PL/SQL是OracleSQL的程序化扩展。PL/SQL集成Oracle database中的,可以使用Oracle 数据库的 SQL、功能,和数据类型。可以使用PL/SQL来控制SQL程序流,使用变量,以及些错误处理程序
PL/SQL的一个主要好处就是编的东西可以存在数据库本身。procedure 或function是一个schema object.它包括一堆sql以及其他的PL/SQL结构,它们组合在一起,存储进数据库,然后作为一个东西来运行,用来解决指定的问题,或者相关的一些问题。
而这种数据库本身的程序有一个很重要的好处,就是可以部署你想用它的任何地方。
Oracle 数据库也可以保存由写的programunits .你可以从Java中调用PL/SQL程序,也可以从PL/SQL中调用Java程序。
事务管理(Transaction Management)
Oracle数据库是多用户数据库,数据库必须保证多用户并发工作,且不会造成数据的不一致损坏。
事务(Transaction)
RDBMS必须可以将一组SQL要么全部提交(committed,意思是操作应用到了数据库),或者全部回滚(rolled back,意思是这一组sql全部不生效)。
事务(transaction)是一个逻辑的,原子(意味着不可分割)单元,它包含一个或者多个SQL语句。
下面这是一个需要用到事务的案例,将资金从一个储蓄账户转移到支票账户
这个转移需要分成几个操作:
1、 从储蓄账户里减去
2、 增加到支票账户
3、 记录事务到事务日志
Oracle数据库要保证这三个操作,要么同时成功,要么同时失败,
举个例子:如果一个事务在执行时出现了硬件错误,而导致没有执行完成,则这个事务中的所有语句全部都要回滚(把已经造成的影响消除掉)
事务是将Oracle数据库和文件系统区分开的特性中的一个。如果你执行一个原子操作,它更行了一些文件,因为系统错误导致只更新了一般,则这些文件将不再一致。与之对比,事务会将Oracle数据库 从一个一致性状态变成另一个一致性状态。
事务最基本也是最重要的特性就是"all or nothing(要不就全部搞定,要不就全部搞不定)"
数据并发(Data concurrency)
多用户RDBMS的一个需求就是如何控制并发, 并发指的是多个用户同时访问一个数据。如果没有并发控制,用户修改的数据就是不合适的,会危害数据完整性
举个例子,一个用户更行了一行,而另一个用户又在同一时间更新了他
如果多用户访问同样的数据,则管理并发的方法既是让用户等待(排队)。
无论如何,DBMS的一个目标是减少这种等待时间。所有修改数据的SQL语句必须尽可能减少影响。
毁灭性的互相影响,这个是指不争取的更新或者修改底层数据结构导致的,必须避免
Oracle数据库使用锁(locks)来控制数据的并发。lock是用来防止因为不同事物同事访问同一共享资源而导致的毁灭性影响。Locks帮助保证数据的完整性,同事允许最大并发访问数据。
数据一致性(Data Consistency)
在Oracle数据库中,每个用户看到的数据状态必须是一致的,包括用户自己的事务中的显示修改以及别的用户已经提交事务中的修改。
举个例子:数据库必须预防脏读(dirty reads),这个脏读出现在 当一个事务 看到别的用户未提交的并发修改。
Oracle数据库强制执行 statement-level read consistency(语句级读一致性),它保证了单个查询的数据结果是已经提交的,以及一致的在一个时间点上。依赖于事务隔离级别(transaction isolation level),这个时间点是这个语句开始执行的时间。Flashback Query(闪回查询)特性使的你可以显示的指定要查看的是简单(Oracle的一个特性)
数据库也可以对一个事务中的所有查询提供读一致性,被称为"transaction-level read consistency"(事务级读一致性)。
在这种隔离级别中,一个事务中的所有语句看到的数据都是同一个时间点的,这个时间点就是事务开始的时间!
Oracle数据库体系结构
数据库 是信息管理的一个关键,普通情况下,服务器可靠的管理着大量的数据(多用户环境),用户们能同时并发的访问相同的数据,数据库服务器还能阻止非法访问,以及恢复错误。
数据库(Database)和实例(Instance)
一个Oracle数据库服务(server)由一个database和最少一个database Instance组成(通常被简单的称为Instance)。
由于一个Instance和一个database紧密联系,
所以 术语 OracleDatabase 在大部分时间就是指 Instance + Database(也就是说,如果不强调的话 Oracle database(数据库)就是指一个instance+database,不懂来问)。
严格意义上讲:
·Database(数据库)
一个database就是在硬盘上的一堆文件,用来存放数据。
·Database Instance(实例)
一个Instance就是一堆内存结构,这些内存结构管理着数据库文件,Instance包括一个共享的内存区域 叫做 system global area(SGA),以及一大堆后台进程。
也就是说:Database 就是磁盘上的那一堆文件(数据文件,日志文件,密码文件等等),严格上讲就叫database.而Instance就是内存里的东西,什么sga,后台进程。RAC就是一个database而多个Instance.
图 1-1显示了一个database以及Instance,每个用户连接到Instance的时候,应用都会运行一个client process(客户端进程,sqlplus之类的),每个客户端进程,在服务器端都有一个与之相关的server process. server process 会划分出自己独享的内存,称之为program global area(PGA)
图 1-1 Oracle Instance和Database
一个数据库可以从物理和逻辑两个角度考虑。
物理数据是指能在操作系统层面看见的。举个栗子,比如Linux操作系统的话 可以用ls显示出数据文件 用ps显示出后台进程。
逻辑数据是比如说表。这东西只有数据库认。一个sql语句可以列出Oracle数据库中所有的表。但是操作系统的工具(ls什么的)是不能列出的。
数据库有physical structures(物理结构)和logicalstructures(逻辑结构)两种。
因为这两种结构是分开的,所以对于物理结构的管理 是不会影响逻辑结构的访问的。举个例子:物理数据文件修改名字,并不会将 在这个文件中存放有数据的表的名字也一起修改。
Database storage Structures(数据库存储结构)
RDBMS必须得能够存储数据。这小节简单介绍一下Oracle 数据库的物理结构和逻辑结构
Physical Storage Structures(物理结构)
物理结构是一大堆存着各种数据的文件。当你执行SQL语句CREATEDATABASE,这下面这些文件会创建:
·Data files(数据文件)
每个Oracle数据库都会有一个或多个物理data files,data files包含数据库中的所有数据。数据库逻辑结构中的数据,比如表和索引中的数据,其实就是物理的存储在data file中的。
·Control Files(控制文件)
每个Oracle数据库都有一个控制文件(可以有多个副本),控制文件包含数据库物理结构信息,包括数据库名字,以及数据库文件的名字和位置。
·Online redo log files(redo日志)
每个数据库都拥有两个或者更多的Online redo log files.redo log中含有redo entries(条目)又称之为redo record(记录),这东西记录了数据的任何一次变化
还有很多重要的其他文件,这些文件包括 parameter files(参数文件),diagnostic files(诊断文件,或者叫trace文件,alert文件)。
还有对备份和恢复很重要的离线文件,其中有Backup files(备份文件)以及archived redo log files(归档日志文件,在线日志是循环利用的,在一个在线日志被覆盖以前,可以将其归档起来)
Logical Storage Structures(逻辑结构)
这节讨论逻辑结构,下面这些逻辑结构使得Oracle数据库能更加细致(细粒度)的控制磁盘空间:
·Data blocks(数据块)
这是数据库中最小存储单位,Oracle数据库的数据就是存储在data blocks中的。一个data block对应磁盘上一个指定的大小(2k,4k,8k,16,32k)
·Extents(区)
一个区由一堆连续的块组成,最小的分配单位
·Segments(段)
每个object(例如,表,或索引)就是一个段,由一堆区组成。
·Tablespaces(表空间)
表空间是个容器,里面放着segments,每个表空间最少由一个数据文件构成
表空间其实就是逻辑和物理的交汇处,如果学过Unix的话可以由VG,LV,PV这些理解。一个模式。由数据文件组成表空间,再从表空间上划分段
Database Instance Structures(数据库实例结构)
Oracle database 通过使用内存结构和后台进程来管理和访问database(严格意义上的,一堆文件,还记得吧?)。所有的内存结构都存在主机的内存里。
当应用程序连接Oracle database时,它们连接的其实就的
Instance. 实例 通过与 pga 和server process的交互来服务于应用程序。
Oracle Database Processes(Oracle数据库进程)
进程(process)是操作系统的一种机制,用来完成一连串的操作。一些操作系统使用的术语是 job,task,或者thread(线程),按照"用来完成一连串的操作"这个目的来讲,thread和process的意思是一样的。
Oracle database instance的进程有以下几种类型:
·Client processes(客户端进程,运行在客户端机器上的)
比如sqlplus
·Background processes(后台进程)
这些进程,每种都有自己固定的功能,Oracle后台进程都是异步I/O的 and 监控别的Oracle 数据库进程,调整其并行度。
·Server processes(服务进程)
这种进行负责和Client processes通讯,以及交互,满足Client processes的要求。
Oracle processes 包括server process 以及background processes.在大多数环境中,Oracle Processes以及Client processes运行在不同的电脑上。
Instance Memory Structures(实例内存结构)
Oracle 数据库的内存结构都是为了一些目的而创建出来的。比如用户之间共享数据,每个用户都有自己的私有内存区域
下面就是Instance中的内存结构:
·System Global Area(SGA)
SGA是一堆共享的内存结构,包含了一个实例的数据以及各种控制信息(buffer cache,shared pool之类的)
·Program Global Areas(PGA)
PGA是内存区域,每块区域包含了一个Server进程的数据和控制信息。每个Server process以及background process有它自己的PGA.并且是独占访问的,非共享的。