目录
1.数据库
1.1物理结构
1.2逻辑结构
2.实例
2.1内存
2.2进程
1.数据库
数据库由物理结构和逻辑结构两部分组成,数据库的物理结构是数据库中的操作系统文件的集合,数据库逻辑结构是面向用户的,描述oracle内部组织和管理数据的方式。逻辑结构和物理结构之间不直接影响,因此oracle的逻辑存储结构使用于任何的操作系统平台和硬件平台。
1.1物理结构
oracle数据库物理文件结构关键文件有4中,他们分别是以:
- 以.dbf结尾的数据文件
- 以.log结尾的日志文件
- 以.ora结尾的参数文件
- 以.ctl结尾的控制文件
了解一个软件应用,我们最直观的就是直接查看他的物理文件系统。这里以oracle11g数据库展示,我创建了一个orcl的数据库,数据库包含以下的文件:?
- 数据文件:
- temp01.dbf: ?临时表空间,主要用于排序使用,举例:内存有4G,数据有10G,数据文件大于内存时把数据放到temp1.dbf中,使用内存一点点排序。
- sysxxx.dbf: ?这些是oracle系统的文件,包含了数据字典、表定义、索引等系统信息,不能被使用。
- undotbs01.dbf:撤销表空间,用来存放撤销信息的,主要用于事务失败时回滚事务,或者在其他用户需要看到一致性数据视图时提供一致性读取。
- users01.dbf :用户数据文件,用来存放用户的表信息、索引等数据的。
- 一个数据文件仅与一个数据库联系,一旦建立,数据文件不能改变大小,最大是32g。一个表空间由一个或多个数据文件组成。
- 日志文件
- Oracle的日志文件主要有两种:重做日志文件(Redo Log Files)和归档日志文件(Archived Log Files)。
- redo01.log是重做日志文件,用来记录数据库的所有更改,大小50M,3个文件循环记录。在系统崩溃或其他故障发生时,重做日志可以用来恢复数据库。每个Oracle数据库都有一组重做日志文件。
- 归档日志文件是可选的,主要用于归档重做日志文件。如果数据库被配置为归档日志模式,那么当重做日志文件满了并且被切换出去时,Oracle会将其内容复制到归档日志文件中。主要用于提供对数据库的完整恢复及在多个数据库之间进行数据复制功能。
- 控制文件
- CONTROL01.CTL:每一ORACLE数据库有一个控制文件(control file),它记录数据库的物理结构,用于在数据库启动时验证数据库的结构。
- 控制文件内容包括数据库的名字、位置、创建数据库的时间戳、数据文件和重做日志文件的名字和位置等数据库相关内容。
- 参数文件
- 参数文件是数据库启动和运行的重要组成部分。主要包含两种类型的参数文件:SPFILE (Server Parameter File) 和 PFILE (Parameter File)
- 两种参数文件内容没有没有本质区别,SPFILE是一个二进制文件,PFILE是一个文本文件。
- 参数文件记录了Oracle数据库的基本参数信息,主要包括数据库名、控制文件所在路径、进程等、数据库的各种初始化参数,例如SGA大小,PGA大小等
- 可以使用 SELECT value FROM v$parameter WHERE name = 'spfile' 来查询spfile文件位置,pfile同理。
1.2逻辑结构
按照从小到大为:块→区→段→表空间→数据库。关系如图:
- 块
- oracle的所有存储的i/o操作都是以块为单位的,是最小的数据管理单位,块的大小是操作系统块的大小的整数倍。
- 我们把块头,表目录,行目录这三部分合称为头部信息区。头部信息区不存放数据,它存放的整个块的信息。头部信息区的大小是可变的。?一般来说,头部信息区的大小介于84字节(bytes)到107字节(bytes)之间。
- 查询表所在的数据文件和开始的块id以及块数量(EMP表为例):
select a.file_id,a.block_id,a.blocks,b.name
from dba_extents a,v$datafile b
where a.file_id=b.file# and a.owner='SCOTT' and a.segment_name='EMP';
- 区
- 区是由物理上连续存放的8个块所组成的,是oracle存储分配的最小单位。
- 一个区只能属于一个数据文件,一个段中的各个区可以分别在多个数据文件中。
- 段
- 段用于存储表空间中某一种特定的,具有独立存储结构的数据块对象的数据。比如索引段、数据段等。
- 段是由一个或多个连续的或不连续的区组成,并且可以跨越多个文件。
- 表空间
- 是数据库最大的逻辑划分,任何数据库对象在存储时都必须存储在某个表空间中。
- 表空间对应于若干个磁盘文件,即表空间是由一个或多个磁盘文件构成的。(理解:表空间相当于操作系统中的文件夹)
- 每个数据库至少有一个表空间(系统表空间),表空间的大小等于所有从属于它的数据文件大小的总和。
- 查看表空间:select * from dba_data_files
- 补充:数据块的行迁移与行链接:
- 行链接产生在第一次插入数据的时候,如果一个块不能存放一行记录的情况下,这时将剩余数据写道另一个块中的情况。
- 当一行记录初始插入的时候事可以存储在一个block中的,由于更新操作导致行长增加了,而块的自由空间已经完全满了,这个时候将整行数据拿出放到一个新的块上,在旧块的位置上写上新块的地址,就叫做行迁移。
- 行迁移和行链接都会引起额外的I/O操作,可以通过加大数据块、增大自由空间、拆分表、重新创建表等方案进行优化。
2.实例
oracle实例主要分为两部分,内存区和后台进程。具体关系如下:
2.1内存
数据库内存从大的方面来说就两个板块,分别是程序全局区(Program Global Area,PGA)和系统全局区(System Global Area,SGA),其中PGA是每个用户进程私有的内存区域,SGA包含6大池子,是数据库实例启动时分配的共享内存区域。以下是详细说明:
- PGA有私有SQL区和会话内存区两个主要部分,实际上在使用中我们只关心PGA大小,因为PGA另一个重要的作用就是为排序和HASH连接操作提供内存空间。
- 数据库缓冲区:存储最近访问的数据块,以提高数据访问性能,原理与高速数据缓冲类似,具有四种状态的buffer(Free、Pinned、Dirty、Kept)以及四种链(LRU链表、检查点链表、空闲链表、写链表)
- 共享池(Shared Pool):共享池主要有free cache、library chache、row cache三部分组成,一般我们称row cache为数据字典缓存,free cache和library chache为库缓存。row cache里面放的适合数据字典相关的信息,library chache里面放是执行计划的信息,library下面的free cache存放着对应的具体的执行计划?。
- 重做日志缓冲区(Redo Log Buffer):存储即将写入重做日志文件的重做条目,用于恢复操作。
- 大池(Large Pool):用于某些大型内存需求,如RMAN备份和恢复操作。
- Java池(Java Pool):用于Java代码和数据的存储空间。
- 流池(Streams Pool):用于Oracle Streams和相关操作。
2.2进程
- DBWn(Database Writer):负责将脏数据块(即已修改但尚未写入磁盘的数据块)从数据库缓冲区写入磁盘。触发条件包括:
- 数据库检查点进程触发发生时(例如,当执行了ALTER SYSTEM CHECKPOINT命令,或者在LOG_CHECKPOINT_INTERVAL和LOG_CHECKPOINT_TIMEOUT参数定义的间隔时间到达时)。
- 数据库缓冲区没有足够的空间来存储新的数据块时。
- 一个脏数据块在缓冲区中停留的时间过长时(3s)。
- 数据库正常关闭时。
- LGWR(Log Writer):负责将重做日志缓冲区中的数据写入重做日志文件。触发条件包括:
- 当一个数据库事务提交时。
- 当重做日志缓冲区满1/3时。
- 当DBWn进程开始写数据块到磁盘时。
- 每隔3秒钟,作为一个定期任务。
- CKPT(Checkpoint):负责在特定时间点创建数据库的检查点,以帮助恢复操作。触发条件包括:
- 当执行了ALTER SYSTEM CHECKPOINT命令时。
- 当LOG_CHECKPOINT_INTERVAL和LOG_CHECKPOINT_TIMEOUT参数定义的间隔时间到达时。
- 当数据库正常关闭时。
- SMON(System Monitor):负责恢复崩溃的数据库实例,清理临时段等。触发条件包括:
- 当数据库启动时,SMON会检查是否有需要恢复的事务。
- 当数据库运行过程中,SMON会定期检查是否有需要清理的临时段。
- PMON(Process Monitor):负责清理失败的用户进程,恢复资源等。触发条件包括:
- 当一个用户进程异常终止时,PMON会被触发来清理该进程占用的资源,如释放锁,回滚事务等。
- 当数据库运行过程中,PMON会定期检查是否有需要清理的用户进程。