Oracle存储结构
下面这张图是Oracle数据库系统结构
这张图中上面描述的Oracle的内存结构,下面是存储结构的过程。在内存结构中有包括了进程结构,进程结构又包括用户进程和Oracle服务器的服务进程,其次在内部结构中有实例,实例包括了系统全局区(SGA) 和 后台进程。在存储结构又包括了各种数据库文件以及文件的组织方式。这个图的工作机制是:进程结构中有用户进程和服务器进程,用户进程首先向Oracle服务器提交一个数据请求,这个请求进入到服务器进程中,服务器进程向实例中去寻找在系统全局区然后寻找用户所请求的数据,如果在系统全局区中可以找到用户需要的数据,服务器就会在这里把数据进行处理,处理完成之后再把结果反馈给用户进程。如果在系统全局区找不到用户所请求的数据,实例会调动后台进程,后台进程开始依据用户所需数据向存储结构中找,首先找到目标数据位于哪些文件,可能包括数据文件,控制文件,重做日志文件等等。后台进程需要了解各种数据库文件的物理存储方式和逻辑存储方式。下面就是Oracle存储结构中的物理存储结构和逻辑存储结构。
Oracle物理存储结构
Oracle物理存储结构中主要包括数据文件、控制文件、重做日志文件、归档重做日志文件、初始化参数文件、跟踪文件和警告文件
数据文件
- 数据文件是能够保存数据库数据的操作系统文件,是数据库中所有数据的实际存储空间,所有数据文件大小的和构成了数据库的大小。一个数据文件仅与一个数据库有联系。
- 根据数据信息类型不同,数据文件分为永久性数据文件 和 临时数据文件 两种。
- 用户表中的数据最终要存储在数据文件中,但是用户无法直接指定存储在哪一个数据文件中(与sqlserver不同,sqlserver可以自己指定)。
- 可通过数据字典视图dba_data_files 或者 V$datafile 查看数据文件信息。
如图所示,通过dba_data_files查看数据文件的信息包括物理名称和存储位置等以及数据文件存在在哪个表空间中
更多数据文件相关知识
控制文件
- 控制文件是记录数据库结构信息的重要的二进制文件,由Oracle系统进行读写操作,DBA不能直接操作控制文件。
- 数据库启动时,根据初始化参数文件中的CONTROL_FILES参数找到控制文件中的信息,进行数据库数据文件和重做日志文件的加载,最后打开数据库。
- 一个数据库至少需要一个控制文件,如果控制文件损坏将导致数据库无法启动。
- 通过数据字典视图V$controlfile查看控制文件信息,下面图中显示了两个基本的控制文件信息。
重做日志文件
- 重做日志文件是以重做记录的形式记录、保存用户对数据库所进行的变更操作,是数据库中最重要的物理文件。
- 利用重做日志文件可以进行事务的重做(REDO)或回退(UNDO),是数据库实例恢复的基础。
为什么说重做日志文件是最重要的物理文件,比数据文件还重要?如果用户对数据库中的数据进行修改提交之后,数据文件中保存的是修改之后的数据,而对于重做日志文件,他就会保存变更前的数据也会记录变更之后的数据,这样重做日志文件中的信息量比数据文件更加丰富。同时一旦数据库发生故障,需要进行数据库的恢复,重做日式文件就发挥了很大作用,可以将数据库尽量恢复到故障之前的状态。数据文件没法做到,它只存储数据,并不能验证数据的正确性。从这个角度来说重做日志文件比数据文件还重要。 - 可通过数据字典视图V$logfile查看重做日志文件信息
归档重做日志文件
- 归档重做日志文件是历史联机重做日志文件的集合,是联机重做日志文件被覆盖前备份的副本。重做日志文件空间有限,不能保存全部记录,因此可以将很久之前保存的日志文件进行备份归档。
- 如果数据库工作在归档模式,数据库归档进程会自动将写满的重做日志文件在覆盖之前复制到指定的位置。归档重做日志文件是数据库出现介质故障后实现数据库完全恢复的必要条件。
更多重做日志文件信息
初始化参数文件
- 初始化参数文件是数据库启动过程所必需的文件,记录了数据库显式参数的设置。
- 数据库启动的第一步就是根据初始化参数文件中的设置,创建并启动实例,即分配内存空间、启动后台进程。
跟踪文件
- 跟踪文件是数据库中重要的诊断文件
- 跟踪文件中包含数据库系统运行过程中所发生的重大事件的有关信息,可以为数据库运行故障的解决提供重要信息。
警告文件
- 警告文件也是数据库中重要的诊断文件,记录数据库在启动、关闭、运行期间后台进程的活动情况。有时在编写sql语句或运行存储过程中会出现一定错误收到警告信息,这些警告信息是警告文件在数据库运行时候根据后台进程提出来的警告。
- 在数据库出现故障时,应首先查看该文件,但文件中的信息与任何错误状态没有必然联系。
Oracle逻辑存储结构
前面介绍了Oracle各种物理存储结构,那么这些物理文件是怎么组织的呢?
Oracle逻辑存储结构分为四个部分:数据块、区、段、表空间。一个数据库可以由多个表空间,多个段组成表空间,段下面是区,区由数据块组成。
数据块
- 数据块是最小的I/O单元。即数据块是读取数据库数据的最基本单位,如果请求的数据量不足一个块,Oracle也会读取整个数据块
- 一个数据块包含一个或多个OS BLOCK(操作系统块)
- 在数据库创建时设置,不可更改
- DB_BLOCK_SIZE参数是设置标准块大小。具有标准块大小的数据块称为标准块,块大小与标准块大小不同的块叫非标准块
- 查看标准块大小:
show parameter db_block_size
数据块结构如图:
Header:头部信息区,由数据块头部,表目录,行目录组成。数据块头部存放的是数据块的基本信息,比如物理地址,块所属的段的类型等等;表目录中存放表的信息;行目录存放行的地址等。
Free space:空闲区,用来放置待存储的数据
Data:行空间,是存储数据的空间
数据块的管理
- 对块的管理主要是对块中可用存储空间的管理,确定保留多少空闲空间,避免产生行链接、行迁移而影响数据的查询效率。
- 当向表格中插入数据时,如果行的长度大于块的大小,行的信息无法存放在一个块中,就需要使用多个块存放行信息,这称为行链接。
- 当表格数据被更新时,如果更新后的数据长度大于块长度,Oracle会将整行的数据从原数据块迁移到新的数据块中,只在原数据块中留下一个指针指向新数据块,这称为行迁移。
- 对块的管理分为自动和手动两种。
- 如果建立表空间时使用本地管理方式,并且将段的管理方式设置为AUTO,则采用自动方式管理块。否则,DBA可以采用手动管理方式,通过为段设置
PCTFREE
和PCTUSED
两个参数来控制数据块中空闲空间的使用。
PCTFREE:PCTFREE参数指定块中必须保留的最小空闲空间比例。当数据块的自由空间百分率低于PCTFREE时,此数据块被标志为USED,此时在数据块中只可以进行更新操作,而不可以进行插入操作。该参数默认为10。
PCTUSED:PCTUSED参数指定可以向块中插入数据时块已使用的最大空间比列。当数据块使用空间低于PCTUSED时,此块标志为FREE,可以对数据块中数据进行插入操作;反之,如果使用空间高于PCTUSED,则不可以进行插入操作。该参数默认为10。
假设PCTFREE=20%,PCTUSED=40%具体工作机制如下:
0.当新块可以添加数据时,标记为TRUE。数据逐渐增多,但空闲率仍大于20,使用率仍小于40时,数据块标记TRUE不变,可以继续添加数据。
1.继续添加数据,空闲率大于20,使用率大于40时,数据块标记TRUE不变,可以继续添加数据。
2.继续添加数据,空闲率小于20,使用率大于40时,数据块标记变为FALSE,不能添加数据。
3.数据减少,空闲率大于20,使用率仍大于40,数据块标记FALSE不变,不能添加数据。
4.数据继续减少,空闲率大于20,使用率小于40时,数据块标记变为TRUE,可以添加数据了。
区
- 区是由一系列连续的数据块构成的逻辑存储单元,是存储空间分配的最小单位。
- 当创建一个数据库对象时,Oracle为对象分配若干个区,以构成一个段来为对象提供初始的存储空间。当段中已分配的区都写满后,Oracle会为段分配一个新区,以容纳更多的数据。
- 可以通过使用UNIFORM选项,指定所有段的初始区和后续区具有统一大小,也可以使用AUTOALLOCATE选项指定由Oracle自动决定后续区大小。用户不能通过其他参数来干预区的分配。
- 通常分配给对象的区将一直保留,不论区中的数据块是否被使用。只有当对象被删除时,区才会被回收。
段
- 段是由一个或多个连续或不连续的区组成的逻辑存储单元。
- 段的分类:
数据段:数据段用来存储表或簇的数据,可以细分为表数据段、索引表数据段、分区表数据段及簇数据段四种。
索引段:用来存放索引信息,主要包括存储ROWID和索引键。当创建一个索引时,系统会创建以该索引名字命名的索引段。
索引段与其相应的表段经常会被同时访问,为了减少硬盘访问的冲突,索引段与表段可以放到处于不同物理位置的表空间中(优化)。
临时段:当用户进行排序查询时,如果在指定的内存无法完成排序,Oracle将自动从用户默认的临时表空间中指派临时段进行排序。会话结束,数据将从临时段中自动删除。
回滚段:回滚段用于保存数据库的回滚信息,包含当前未提交事务所修改的数据的原始版本。一个事务只能使用一个回滚段存放它的回滚信息,但是一个回滚段可以存放多个事务的回滚信息。回滚段可以动态创建和撤销。回滚段的作用:事务回滚,读一致性,事务恢复,闪回查询。
表空间
- 表空间是Oracle数据库最大的逻辑存储单元,一个表空间由多个段组成。
- 表空间与数据库文件直接关联,一个表空间包含一个或多个数据文件,一个数据文件只能从属于某一个表空间,数据库对象就是存储在表空间对应的一个或多个数据文件中
一个数据对象(例如:表等)也要存储在一个表空间中。 - 数据库的大小从逻辑上看就是由表空间决定。
- 可通过dba_tablespace查看表空间信息
- 表空间分类
系统表空间:
非系统表空间:
有关用户表空间的用法