前言
昨天刚办完了入职手续,新公司使用的数据库是Oracle,而上家公司一直用MariaDB;长时间没用了,复习一下,从存储结构开始吧。
习惯了MySQL的我对于Oracle的存储结构有点不大适应,按照库划分就好了嘛,为什么还要什么表空间、段、区、块这些概念,特别是习惯了Navicat的我,突然换到PL SQL就更是一头雾水,还好第二天就周六了,赶快熟悉一下。
首先来罗列一下概念:Oracle数据库的存储结构分为物理存储结构和逻辑存储结构
- 物理存储结构:
- 数据文件
- 联机日志文件
- 控制文件
- 归档日志文件
- 参数文件
- 警报文件
- 跟踪文件
- 备份文件
- 逻辑存储结构
- 表空间(Tablespace)
- 段(Segment)
- 区(Extent)
- 数据块(Data Block)
概念罗列完毕,这里先来一张图,横线以下是对概念的详细介绍。
- 物理存储结构详细介绍:
数据文件
存放数据库数据。
日志文件
存放对数据的改变。至少两组,Oracle以循环方式来使用它们。日志文件最主要的功能就是用来做数据恢复。为了防止日志文件本身的故障,日志文件允许被镜像,可在不同磁盘上维护两个或多个日志副本。Oracle有两种日志文件类型,分别是联机日志和归档日志,归档日志又有两种归档模式,分别是NoArchiveLog与ArchiveLog。
控制文件
每个Oracle数据库有一个控制文件,它记录数据库的物理结构,包含下列信息类型:
- 数据库名
- 数据库数据文件和联机日志文件的名字和位置;
- 数据库创建时间戳。
为了安全起见,控制文件允许被镜像。当数据库的物理组成更改时,Oracle自动更改控制文件,数据恢复时,也要使用控制文件。
参数文件
通常情况下指的就是初始化参数文件(initialization parameter file)。参数文件包括了初始化参数文件和服务器端参数文件(server parameter file)。在数据库启动的时候就会读取参数文件,然后根据参数文件中的参数来分配SGA并启动一系列的后台进程,参数文件中存放的是数据库和实例的参数。
警报文件
就是警报日志文件,他记录了数据库的重大活动和所发生的错误。警报文件按照时间的先后来记录所发生的重大活动和错误,警报文件的名字的格式是 alertSID.log,警报文件的位置是由初始化参数background_dump_desc指定的。
跟踪文件
就是跟踪日志文件,每个服务器进程和后台进程都写跟踪文件。例如当后台进程发生了错误的时候,oracle就会把错误的信息写到跟踪文件中,DBA就可以根据跟踪文件的信息来查看进程中所发生的错误,跟踪文件被写到了两个目录中,和服务器进程有关的信息被写到了由初始化参数user_dump_desc指定的目录中,和后台进程有关信息被写到了由初始化参数background_dump_desc指定的目录中,伴随着时间跟踪文件就会被写满,DBA可以 手动来删除跟踪文件,也可以限制跟踪文件的大小,初始化参数MAX_DUMP_FILE_SIZE就可以限制跟踪文件的大小。
备份文件
就是在数据库发生介质损坏的时候用来还原(restore)数据库的,恢复(recover)数据的。
- 逻辑存储结构详细介绍:
我们可以用下面的比喻来描述逻辑结构关系:
块 :一张张纸
区:纸组成的本子
段:多个本子放到一个文件柜中
-
表空间:存放对个文件柜的房间
Data Block(块)
数据块是Oracle数据库逻辑存储结构中的最小单位,也是执行数据库输入输出的最小存储单位。Oracle数据库在进行输入输出时,都是以块为单位进行读写操作的。块尺寸是处理Oracle更新、选择、或者插入数据事务的最小单位。当用户从表中选择数据时,选择操作从数据库文件中以块为单位读取或者提取数据。例如Oracle块的大小为8kb,即使只想检索4kb的字符的名字,也必须读取含有这4个字符的整个8kb的块。操作系统也有一个磁盘块尺寸,oracle块尺寸应该为磁盘尺寸的倍数。否则在每个I/O中只使用部分数据,可能会浪费时间去读写磁盘快。
DB_BLOCK_SIZE初始化参数决定ORACLE 数据库的标准块尺寸,并且Oracle还可以指定4个额外的非标准的块尺寸。多个块尺寸主要用于在不同的数据库尺寸的数据库之间传送表空间。如果选择配置多个Oracle块尺寸,还必须配置SGA的缓冲区高速缓存中相应的子高速缓存。
Extents(区)
数据区由一组连续(一个或多个)的数据块构成。一个或多个数据区组成一个段,当段中的空间被使用完后,Oracle系统将自动为该段非配一个新的数据区,可见,数据区是Oracle存储分配和回收的最小逻辑单位。在创建具有独立段结构的数据库对象时,例如表、索引等,Oracle会为数据库对象创建一个数据段,并为数据段分配一个‘初始区’。后续区的分配方式,则根据表的空间管理办法不同,而采用不同的分配方式
Segments (段)
段是由多个区组成,这些区可以是连续的,也可以是不连续的。
当用户在数据库中创建各种具有实际存储结构的对象时(保存有数据的对象),比如表、索引等,Oracle将为这些对象创建“段”。一般一个对象只拥有一个段。在创建段时,可以为它指定PCTFREE、PCTUSED等参数来控制其中的块的存储空间管理方式,也可以为它指定INITIAL、NEXT、PCTINCREASE等存储参数,以指定其中区的分配方式。如果没有为段指定这些参数,段将自动继承表空间的相应参数。不同类型的数据库对象拥有不同类型的段:
索引段:索引段中包含了用于提高系统性能的索引。一旦建立索引,系统自动创建一个以该索引的名字命名的索引段。
回滚段:回滚段中保存了回滚条目,Oracle将修改前的旧值保存在回滚条目中。利用这些信息,可以撤销未提交的操作,以便为数据库提供读入一致性和回滚未提交的事务,即用来回滚事务的数据空间。当一个事务开始处理时,系统为之分配回滚段,回滚段可以动态创建和撤销。
临时段:当执行创建索引。查询等操作时,Oracle可能会使用一些临时存储空间,用于暂时性地保存解析过的查询语句以及在排序过程中产生的临时数据,Oracle系统将在专门用于存储临时数据的表空间中为操作分配临时段。
表空间(Tablespaces)
表空间是数据库的逻辑划分,一个表空间只能属于一个数据库。表空间(tablespace)是最大的逻辑单位,对应一个或多个数据文件,通常由相关的段组成。表空间的大小是它所对应的数据文件大小的总和。所有的数据库对象都存放在指定的表空间中。但主要存放的对象是表, 所以称作表空间。
表空间是Oracle数据库的最大逻辑划分区域,最高级的逻辑存储结构,数据库是由多个表空间组成的。在创建数据库时会自动创建一些默认的表空间,例如 SYSTEM表空间,SYSAUX表空间等。通过使用表空间,Oracle将所有相关的逻辑结构和对象组合在一起。
我们可以在表空间级别指定存储参数,也可以在段级别指定。
一个表空间由一个或多个数据文件组成,一个数据文件只属于一个表空间,表空间的大小等于所有从属于它的数据文件大小的总和。
Oracle 11g数据库存在6个默认的表空间。分别是:
EXAMPLE:用于安装Oracle使用的示例数据库。
SYSAUX:作为EXAMPLE的辅助表空间。
SYSTEM:用来存储SYS用户的表、视图以及存储过程等数据对象。
TEMP:用于存储SQL语句处理的表和索引的信息。
UNDOTBS1:用于存储撤销信息。
USERS:存储数据库用户创建的数据库对象。
后记
这是我在简书上的第一篇笔记,写完上面的文字,此时此刻,我脑海里浮现的是:路漫漫其修远兮...千里之行,始于足下...饭要一口一口吃,路得一步一步走……愿与诸君共勉。
——于2019年7月12