数据库基本原理
目录
数据库基本原理 ............................................................................................................ 1 概述 ............................................................................................................................... 2 1逻辑结构 .................................................................................................................... 3
1.1存储关系 .......................................................................................................... 4
1.1.1存储结构 ............................................................................................... 4 1.1.2如何存储表数据 ................................................................................... 5 1.2表空间(tablespace) ..................................................................................... 6
1.2.1常用表空间 ........................................................................................... 6 1.2.2表空间和数据文件的关系 .................................................................... 7 1.3段(Segment) ................................................................................................ 8 1.4数据区(Extent) ............................................................................................ 9 1.5数据块(Data Blocks) .................................................................................... 9 2物理结构 .................................................................................................................. 10
2.1数据文件 ........................................................................................................ 11 2.2日志文件 ........................................................................................................ 11 2.3控制文件 ........................................................................................................ 12
2.4参数文件 ........................................................................................................ 13 3实例(instance) ..................................................................................................... 13 4内存 .......................................................................................................................... 14
4.1SGA .................................................................................................................. 14
4.1.1数据库高速缓冲区(Database Buffer Cache) .................................. 15 4.1.2重做日志缓冲区(Redo Log Buffer) ................................................ 15 4.1.3共享池(Shared Pool) ...................................................................... 16 4.1.4大池(Large Pool)............................................................................. 16 4.1.5 JAVA 池(Java Pool) ......................................................................... 16 4.1.6流池(Streams Pool) ........................................................................ 16 4.2 PGA ................................................................................................................. 16
4.2.1、Private SQL Area(私有SQL区域) ................................................ 17 4.2.2 SQL Work Areas(工作区域) ............................................................ 17 4.3 PGA与SGA的区别: ....................................................................................... 17 5 oracle后台进程 ........................................................................................................ 18
5.1 DBWn(数据库写入进程) ................................................................................ 18 5.2 SMON(系统监控、实例监控进程) .......................................................... 18 5.3 PMON(进程清理)...................................................................................... 18 5.4 CKPT(检查点进程) .................................................................................... 19
概述
什么是oracle? 平常所说的 Oracle 或 Oracle 数据库指的是 Oracle 数据库管理系统.。Oracle 数据库管理系统是管理数据库访问的计算机软件,它由Oracle 数据库和 Oracle 实例构成。Oracle系统体系结构由三部分组成:逻辑结构、物理结构和实例。
oracle服务器是一个数据库管理系统,它包括一个oracle实例(动态)和一个oracle数据库(静态)。oracle实例是一个运行的概念(如操作系统的进程),提供了一种访问oracle数据库的方式,始终打开一个,并且只能打开一个oracle数据库,oracle实例有SGA和一些后台服务进程组成,在后台服务进程当中,DBWn(数据库写入进程)、 SMON(系统监控、实例监控进程)、PMON(进程清理)、 CKPT (检查点进程)LGWR (日志写进程)是必备的后台进程。
1逻辑结构
Oracle的逻辑结构是一种层次结构。主要由:表空间、段、区和数据块等概念组成。逻辑结构是面向用户的,用户使用Oracle开发应用程序使用的就是逻辑结构。数据库存储
层次结构及其构成关系,结构对象也从数据块到表空间形成了不同层次的粒度关系。
1.1存储关系
Oracle 数据库逻辑上是由一个或多个表空间组成的,表空间物理上是由一个或多个数据文件组成的;而在逻辑上表空间又是由一个或多个段组成的。在Oracle 数据库中,通过为每种不同的数据对象分配不同的段,来保存数据。例如EMP 表的所有数据会存放在EMP 段中。在Oracle 数据库中,段是由一个或多个区组成的,而区又是由连续存储的数据块所 组成的。块则是数据库的I/O 最小的单位。
1.1.1存储结构
数据库可划分为被称为表空间的逻辑存储单元。每一个表空间可以包含很多的Oracle 逻辑数据块。DB_BLOCK_SIZE 参数指定了逻辑块的大小。逻辑块的大小范围为2 KB 至 32 KB,默认大小为8 KB。特定数目的相邻逻辑块构成了一个区。为特定逻辑结构分配 的一组区构成了一个段。Oracle 数据块是逻辑I/O 的最小单位。
1.1.2如何存储表数据
创建表时,就会创建段来保存表数据。表空间包含一组段。从逻辑上讲,表包含由列值组成的行。行最终将以行片段的形式存储在数据库块中。之所以称为行片段,是因为某些情 况下,不可以在一个位置存储一整行。当插入行由于太长而不适合单个块时,或者由于更 新而导致现有行大小超出了行的当前空间时,就会发生这种情况。
1.2表空间(tablespace)
Oracle 数据库(tablespace)是由若干个表空间构成的。任何数据库对象在存储时都必须存储在某个表空间中。表空间对应于若干个磁盘文件,即表空间是由一个或多个磁盘文件 构成的。表空间相当于操作系统中的文件夹,也是数据库逻辑结构与物理文件之间的一个映 射。每个数据库至少有一个表空间,表空间的大小等于所有从属于它的数据文件大小的总和。
1.2.1常用表空间
(1)系统表空间:存放系统数据,系统表空间在数据库创建时自动创建。表空间名称为SYSTEM。存放数据字典和视图以及数据库结构等重要系统数据信息,在运行时如果 SYSTEM 空间不足,对数据库影响会比较大,虽然在系统运行过程中可以通过命令扩充空间,但还是会影响数据库的性能,因此有必要在创建数据库时适当的把数据文件设置大一些。
(2)TMEP 表空间:临时表空间,安装数据库时创建,可以在运行时通过命令增大临时表空间。临时表空间的重要作用是数据排序。比如当用户执行了诸如 Order by 等命令后,服务器需要对所选取数据进行排序,如果数据很大,内存的排序区可能装不下太大数据,就需要把一些中间的排序结果写在硬盘的临时表空间中。
(3)用户表自定义空间:用户可以通过 CREATE TABLESPACE命令创建表空间。
1.2.2表空间和数据文件的关系
Oracle 数据库由一个或多个称为表空间的逻辑存储单元组成, 表空间作为一个整体存储数据库中的所有数据,并且一个表空间只能属于一个数据库。数据库的大小是该数 据库中所表空间 大小总和。
从物理讲,Oracle 数据库内的每个表空间由一个或多数据文件 组成,并且一个数据文件只能属于一个表空间。表空间大是所有数据文件大小的总和。这些数据文件与Oracle
运行所在的操作系统的文件有一样的物理结构。
数据库的所有数据都存储在数据文件中,数据库的每个表空间都由这些数据文件组 成。例如,最简单的Oracle数据库只有一个表空间和一个数据文件。
1.3段(Segment)
段是由多个数据区构成的,它是为特定的数据库对象(如表段、索引段、回滚段、临时段)分配的一系列数据区。段内包含的数据区可以不连续,并且可以跨越多个文件。使用段的目的是用来保存特定对象。
一个Oracle数据库有4种类型的段:
数据段:数据段也称为表段,它包含数据并且与表和簇相关。当创建一个表时,系统自动创建一个以该表的名字命名的数据段。
索引段:包含了用于提高系统性能的索引。一旦建立索引,系统自动创建一个以该索引的名字命名的索引段。
回滚段:包含了回滚信息,并在数据库恢复期间使用,以便为数据库提供读入一致性和回滚未提交的事务,即用来回滚事务的数据空间。当一个事务开始处理时,系统为之分配回滚段,回滚段可以动态创建和撤销。系统有个默认的回滚段,其管理方式既可以是自动的,也可以是手工的。
临时段:它是Oracle在运行过程中自行创建的段。当一个SQL语句需要临时工作区时,由Oracle建立临时段。一旦语句执行完毕,临时段的区间便退回给系统。
1.4数据区(Extent)
数据区是一组连续的数据块。当一个表、回滚段或临时段创建或需要附加空间时,系统总是为之分配一个新的数据区。一个数据区不能跨越多个文件,因为它包含连续的数据块。使用区的目的是用来保存特定数据类型的数据,也是表中数据增长的基本单位。在Oracle数据库中,区是Oracle数据库中创建对象时的最小分配单元,分配空间就是以数据区为单位的。一个Oracle对象包含至少一个数据区。设置一个表或索引的存储参数包含设置它的数据区大小。
1.5数据块(Data Blocks)
数据块是Oracle最小的存储单位,Oracle数据存放在“块”中。一个块占用一定的磁盘空间。特别注意的是,这里的“块”是Oracle的“数据块”,不是操作系统的“块”。
Oracle每次请求数据的时候,都是以块为单位。也就是说,Oracle每次请求的数据是块的整数倍。如果Oracle请求的数据量不到一块,Oracle也会读取整个块。所以说,“块”是Oracle读写数据的最小单位或者最基本的单位。
块的标准大小由初始化参数DB_BLOCK_SIZE指定。具有标准大小的块称为标准块(Standard Block)。块的大小和标准块的大小不同的块叫非标准块(Nonstandard Block)。
一个数据块的结构如下图所示:
其中,Header表示数据块头,记录了一些控制信息,帮助 Oracle 数据库定位这个块,同时该部分还记录着块与块之间的串联信息。Free Space指的是当前处于空闲状态的空间。Data则表示已经写入数据的空间,数据存放的方式是自底往上。
2物理结构
Oracle物理结构由多种物理文件组成。
2.1数据文件
每一个ORACLE数据库有一个或多个物理的数据文件(data file)。一个数据库的数据文件包含全部数据库数据。逻辑数据库结构(如表、索引)的数据物理地存储在数据库的数据文件中。数据文件有下列特征:
(1)一个数据文件仅与一个数据库联系。
(2)一旦建立,数据文件不能改变大小.
(3)一个表空间(数据库存储的逻辑单位)由一个或多个数据文件组成。
(4)数据文件中的数据在需要时可以读取并存储在ORACLE内存储区中。
2.2日志文件
每一个数据库有两个或多个日志文件(redo log file)的组,每一个日志文件组用于收集数据库日志。日志的主要功能是记录对数据所作的修改,所以对数据库作的全部修改是记录在日志中。在出现故障时,如果不能将修改数据永久地写入数据文件,则可利用日志得到该修改,所以从不会丢失已有操作成果。
日志文件主要是保护数据库以防止故障。为了防止日志文件本身的故障,ORACLE允许镜象日志(mirrored redo log),以致可在不同磁盘上维护两个或多个日志副本。
日志文件中的信息仅在系统故障或介质故障恢复数据库时使用,这些故障阻止将数据库数据写入到数据库的数据文件。然而任何丢失的数据在下一次数据库打开时,ORACLE自动地应用日志文件中的信息来恢复数据库数据文件。
Oralce两种日志文件类型:
联机日志文件 这是Oracle用来循环记录数据库改变的操作系统文件
归档日志文件 这是指为避免联机日志文件重写时丢失重复数据而对联机日志文件所做的备份
2.3控制文件
每一ORACLE数据库有一个控制文件(control file),它记录数据库的物理结构,包含下列信息类型:
(1)数据库名;
(2)数据库数据文件和日志文件的名字和位置;
(3)数据库建立日期。
为了安全起见,允许控制文件被镜像。
每一次ORACLE数据库的实例启动时,它的控制文件用于标识数据库和日志文件,当着手数据库操作时它们必须被打开。当数据库的物理组成更改时,ORACLE自动更改该数据库的控制文件。数据恢复时,也要使用控制文件。
2.4参数文件
除了构成Oracle数据库物理结构的三类主要文件外,Oracle数据库还具有另外一种重要的文件:参数文件。参数文件记录了Oracle数据库的基本参数信息,主要包括数据库名、控制文件所在路径、进程等。
3实例(instance)
数据库实例(也称为服务器Server)就是用来访问一个数据库文件集的一个存储结构及后台进程的集合。它使一个单独的数据库可以被多个实例访问(也就是ORACLE并行服务器– OPS)。
数据库启动时,系统首先在服务器内存中分配系统全局区(SGA),构成了Oracle的内存结构,然后启动若干个常驻内存的操作系统进程,即组成了Oracle的进程结构,内存区域和后台进程合称为一个Oracle实例。
4内存
4.1SGA
系统全局区(system global area,SGA)是一组包含了 Oracle 数据库数据及实例控制信息的共享的内存结构。当多个用户并发地连接到同一个实例后,这些用户将共享此实例SGA 中的数据。因此 SGA 也被称为共享全局区(shared global area)。
SGA 越大系统的性能越好,但 SGA 过大也会起到反作用。一般情况下,SGA 不应超过系统实际内存的 1/2。但从 Oracle 9i 开始支持动态 SGA 特性,即无需关闭实例就可以改变数据高速缓冲区、共享池和大池的大小。数据高速缓冲区、共享池的大小也可以根据工作负载自动调整,但 SGA 的总大小不能超过初始化参数 SGA_MAX_SIZE 的设置。
如下图所示,SGA 包括三个子缓冲区:保留缓冲区、循环缓冲区和非标准大小块缓冲区。SGA 包括以下结构:数据高速缓冲区(Data Buffer Cache)、重做日志缓冲区(Redo Log Buffer)、共享池(Shared Pool)、Java 池(Java Pool)、大池(Large Pool)、 流池(Stream Pool)
4.1.1数据库高速缓冲区(Database Buffer Cache)
在 Oracle 中无论是读取还是修改数据,都是由服务器进程在数据库高速缓冲区中完成的。数据库高速缓冲区的作用就是用来缓存最近从数据库中读出的数据块,并可供其他客户进程共享。用户进程查看数据时,首先检查需要的信息是否在缓冲区内,如果在缓冲区中,就可以直接访问。
4.1.2重做日志缓冲区(Redo Log Buffer)
重做日志缓冲区用来记录对数据缓冲区数据进行的修改,可以循环使用。当用户运行DML(INSERT、UPDATE、DELETE)以及 DDL(CREATE、ALTER、DROP)语句时,会改变数据高速缓存中的相应缓冲区。但是在修改这些缓冲区之前,Oracle 会自动生成重做项,首先要将这些缓冲区的变化记载到“重做日志缓冲区”中。重做日志缓冲区由一条一条的重做项构成,每条重做项记载了修改的时间、被修改的块、修改位置以及新数据。缓冲区被循环使用,当重做日志缓冲区填满时,数据库系统将重做日志缓冲区的内容写入日志文件。在系统发生故障时,可以通过重做项重新执行对数据库的修改,实现对实例的恢复。
4.1.3共享池(Shared Pool)
SGA 的共享池(Shared Pool)内包含了库缓存(Library Cache),数据字典缓冲区(Dictionary Cache),并行执行消息缓冲区(Buffers for parallel execution messages),以及用于系统控制的各种内存结构。
4.1.4大池(Large Pool)
数据库管理员可以配置一个称为大型池(Large Pool)的可选内存区域,供一次性大量的内存分配使用
4.1.5 JAVA 池(Java Pool)
Java池,也是SGA中的一块可选内存区,它也属于SGA中的可变区,用于存储所有会话特定的Java代码和和Java虚拟机中的数据。该内存包括在结束调用时迁移到Java会话空间的Java对象。
4.1.6流池(Streams Pool)
流池,也是可选内存区,属于SGA中的可变区。流池用于存储缓冲队列消息,并为Oracle流捕获进程和应用程序提供内存。流池仅供Oracle流使用。除非专门配置它,否则流池的大小从0开始并根据Oracle流的需要动态增长。
4.2 PGA
PGA即进程全局区域,是一个内存区域,在一个服务器进程或后台进程启动是创建,
包含服务器进程和后台进程的相关数据和控制信息;PGA是特定于进程的非共享的内存区域,一个PGA只能被拥有它的那个进程所访问;PGA不在SGA中分配。PGA被细分为不同的区域,每个区域都有不同的作用,包括Private SQL Area和SQL Work Areas等。
4.2.1、Private SQL Area(私有SQL区域)
一个私有SQL区域包含关于一个已解析的SQL语句和其他特定于会话的信息的处理信息。当服务器进程执行SQL或PL/SQL代码时,进程使用专用SQL区域存储绑定变量值,查询执行状态信息和查询执行工作区域。一个私有SQL区域又被划分为run-time area和persistent area两个子区域。
The run-time area:即运行时区域,该区域包含查询执行状态信息。
The persistent area:即持久化区域,该区域包含绑定变量值。在执行语句时向SQL语句提供绑定变量值。只有当游标关闭时,持久区域才被释放。
4.2.2 SQL Work Areas(工作区域)
工作区域是用于内存密集型操作的PGA内存的私有分配。当启用自动PGA内存管理时,数据库会自动调整工作区域的大小,也可以手动控制和调整工作区域的大小。
4.3 PGA与SGA的区别:
PGA(程序缓存区)与SGA(系统全局区)类似,都是Oracle数据库系统为会话在服务器内存中分配的区域。不过两者的作用不同,共享程度也不同。
SGA系统全局区顾名思义,是对系统内的所有进程都是共享的。当多个用户同时连接到一个例程时,所有的用户进程、服务进程都可以共享使用这个SGA区。为此这个SGA的主要用途就是为不同用户之间的进程与服务进程提供一个交流的平台。除了这个作用,另外有一个重要的作用就是各种数据库的操作主要就是在这个SGA区内完成。
而PGA程序缓冲区则主要是为了某个用户进程所服务的。这个内存区不是共享的,只有这个用户的服务进程本身才能够访问它自己的PGA区。
5 oracle后台进程
5.1 DBWn(数据库写入进程)
负责把buffer cache内的脏数据写入数据文件。
当buffer cache被修改了,就会标成脏数据。DBWn的主要工作是把脏数据写入磁盘以保证buffer cache 是干净的。用户进程会产生脏数据,空余的缓冲区会减少。如果空闲的缓冲区太少,用户进程从磁盘读block进缓冲区的时候就找不到空余的位置了。DBWn管理 buffer cache保证用户进程始终可以找到空闲的位置。
5.2 SMON(系统监控、实例监控进程)
在实例关闭时,会清理临时段,整理空闲空间;实例非正常关闭后,启动实例时,做实例恢复。
5.3 PMON(进程清理)
用户连接数据库,会产生一个会话分配一个服务器进程提供服务,正常情况下,会话退出,释放资源。但是如果异常退出,比如客户端死机,服务器进程不会正常退出,持有的资源还在不断消耗,PMON进程会监控进程,一旦发现后,释放资源,回滚事物:锁、内存等消耗释放。
5.4 CKPT(检查点进程)
ckpt进程的作用,触发全局检查点,通过DBWR将高速缓存中的所有脏块写入数据文件中;由于DBWR的机制,因此lgwr(日志写进程)会先写,然后dbwr后写。
当完全检查点被触发时,也就是ckpt被触发,经常触发会造成,大量集中的IO操作,影响性能。数据一致性关库情况下,为了保存数据,默认触发此进程;如果数据库突然掉电了,内存中的大量脏块数据没了,Oracle数据库启动后会检测,开启实例恢复,实例恢复的起点,就是最近一次的检查点事件;因此Oracle引入了增量检查点的概念,增量检查点,通知DBWR写脏块,将上次检查点至今的脏块,放入高速缓存中的脏队列中,等到DBWR进程自动触发条件写,然后每隔3S,CKPT进程检查脏队列,最近一次的增量检查点记录SCN往前移动,减少实例恢复的前滚时间。
因篇幅问题不能全部显示,请点此查看更多更全内容