oracle体系架构基础、逻辑存储结构

体系架构概要

oracle的体系结构对分析数据库组成、工作过程和原理、及数据在数据库中的组织和管理机制时非常必要的

1. oracle server的基本结构

在理解数据库的结构之前,一定要分清楚什么是DB和DBMS,这在任何数据库中都适用。

DB:数据库,存储数据的容器

DBMS:数据库管理系统,又称为数据库软件或数据库产品,用于创建或管理DB。

RDBMS:关系型数据库管理系统

同样对应在oracle数据库中也有三个重要的概念:实例(instance)、数据库(database)、数据库服务器(database server)。

实例:实例是一组oracle后台进程以及在服务器中分配的共享内存区域(也就是常说的sga+后台进程),实例是访问数据库的通道。

数据库:数据库是由固定的、基于磁盘的数据文件、控制文件、日志文件、参数文件和归档日志文件等组成的物理文件集合。

实例用于管理和控制数据库、而数据库为实例提供数据

一个数据库可以被多个实例装载和打开,而一个实例在其生命周期内只能装载和打开一个数据库

数据库服务器:是指管理数据库的各种软件工具(SQL*Plus、OEM等)、启动的实例、数据库的集合

oracle内存组成:简单的可以归纳为sga+pga

2. 传统架构和CDB架构图解

11g体系架构图:

12体系架构图:

19c体系架构图:

3. 逻辑存储结构

官方博客参考:https://blogs.oracle.com/database4cn/post/oracle-v6
逻辑存储结构是从逻辑角度分析数据库构成,是对数据存储结构逻辑上的划分。oracle逻辑存储结构是一种层次结构,主要由表空间、段、区、块组成。oracle的逻辑存储中所包含的多个结构对象从数据块到表空间形成了不同层次的力度关系,如下图:

从图中可以看出,Oracle数据库是由多个表空间组成(数据库本身也属于逻辑概念),而表空间又是多个段组成,段又由多个区组成。

3.1 块

块(BLOCK)是Oracle逻辑存储结构中个头最小的存储单元,所有数据的存取都是以块为单位进行的。

oracle数据块通常是操作系统块的整数倍,oracle数据块有一定的标准大小。初始化参数文件中有一个参数叫DB_LOCK_SIZE,设置数据块的大小。

	查看块大小:
​	show parameter block_size
​	或者 
​	select name,value from v$parameter where name like '%block_size%';

数据块的结构:

  • 块头:存放数据块的基本信息,如物理地址、块所属的段类型
  • 表目录:存放表的相关信息,如果块中存储的是表数据,则表目录存储有关这些表的相关信息
  • 行目录:如果块中有行数据存在,则这些行的信息将被记录在行目录中。这些信息包括行地址等
  • 空余空间:块中未使用的区域,用于新的行插入和已存在的行更新
  • 行数据:用于存放表数据和索引数据的地方,这部分空间已被数据行占用(如表中的若干行记录)

通常把块头、表目录、行目录这三部分称为头部信息区。头部信息区不存放数据,而是放整个块的引导信息,起到引导系统读取数据的作用。若头部信息区遭到破坏,则oracle系统将无法读取这些部分数据。空余空间和行数据公共构成块的存储区,用于存放真正的数据记录。

官方的图解:

3.2 区

数据区(Extend,数据扩展区)是一组连续的块构成的存储结构,一个或多个数据块组成一个区,一个或多个区在组成一个段(Segment)。当一个段中的所有空间被使用完后,oracle将自动为该段分配一个新的数据区.

一个oracle对象至少包含一个区,如在设置一张表或索引的存储参数中包含了区的大小

特点:

数据区是由连续的数据块结合而成的

数据区是Oracle存储分配的最小单位

一个区不可 以跨数据文件,段中第一个区叫初始区,随后分配的区叫后续区。

管理方式:

  1. 字典管理:在数据字典中管理表空间的区空间分配。Oracle 8i 以前只有通过 uet$和 fet$的字典管理。

    缺点:某些在字典管理方式下的存储分配有时会产生递归操作,并且容易产生碎片,从而影响了系统的性能,现在已经淘汰了。

  2. 本地管理:在每个数据文件中使用位图管理空间的分配。表空间中所有区(extent)的分配信息都保存在该表空间对应的数据 文件的头部。

    优点:速度快,存储空间的分配和回收只是简单地改变数据文件中的位图,而不像字典管理方式还需要修改数据库。无碎片, 更易于 DBA 维护。

预先分配空间:

--可以根据需要预先分配一些 extent,减少并发分配时可能发生申请区块的争用。
SQL>alter table scott.t1 allocate extent (datafile '/u01/oradata/prod/test01.dbf' size 5m);
--注意:预分配的空间一定是在表空间可达到的 size 范围内

--回收 free extent, 使用 deallocate, 
SQL> alter table scott.t1 deallocate unused;
--注意:只能收回从未使用的 extent

3.3 段

段(Segment)是一个或多个数据区构成的,它不是存储空间的分配单位,而是一个独立的逻辑存储结构,用于存储表、索引或簇等占用空间的数据对象,oracle也把这种占用空间的数据对象统称为段。

段是为特定的数据对象(如表、索引、回滚等)分配的一系列数据区。段包含的数据区可以不连续,并且可以跨越多个文件,使用段的目的时保存特定对象。

一个段只属于一个特定的数据对象,每当创建一个具有独立段的数据对象时,oracle就会为它创建一个段。但往往表没那么单纯,比如表上经常会有主键约束,那么就会有索引,索引有索引 段,还有分区表,每个分区会有独立的段,再有就是 Oracle 的大对象, 如果你的表里引用 blob,clob,那么这个表就又被分出多个段来。

延迟段:顾名思义,创建表的时候并不马上建立相应的段。

Oracle11gR2 又增加了一个新的初始化参数 DEFERRED_SEGMENT_CREATION(仅适用未分区的 heap table), 此参数默认 TRUE,当 create table 后并不马上分配 segment, 仅当第一个 insert 语句后才开始分配 segment。这对于应用程序的部署可能有些好处。 (PPT-II-476-478)

也可以使局部设置改变这一功能(覆盖 DEFERRED_SEGMENT_CREATION=TRUE),在 create table 语句时加上 SEGMENT CREATION 子 句指定。

如: SQL>create table scott.t1(id int,name char(10)) SEGMENT CREATION IMMEDIATE TABLESPACE TB1;

通常有4中创建的段的类型:

数据段 存储表中的所有数据
索引段 存储表上最佳查询的所有索引数据
临时段 存储表排序操作期间建立的临时表的数据
回滚段 存储修改之前的位置和值
  1. 数据段:数据段中保存的是表中的数据记录。创建表时,自动为表创建以该表命名的数据段,数据段的扩展时通过添加新的数据区来实现的。
  2. 索引段:索引段中包含了同于提高系统性能的索引。一旦建立索引,系统就会创建一个以该索引名字命名的索引段。
  3. 临时段:当执行创建索引、查询等操作时,oracle可能会使用一些临时存储空间,用于暂时性的保存解析过的查询语句以及在排序过程中产生的临时数据。oracle会在临时表空间中分配临时段。
  4. 回滚段:也被称为撤销段,其中保存回滚条目,oracle将修改前的旧值保存在回滚条目中。利用这些信息可以撤销未提交的操作,以便为数据库提供读入一致性和回滚未提交事务。即用来回滚事务的数据空间。当一个事务开始时,系统为它分配回滚段,回滚段可以动态创建和撤销。oracle有一个默认的回滚段,其管理方式可以是自动的,也可以是手动的。

段的管理方式:

3.4 表空间

表空间将相关的逻辑结构(如段、区等)组合在一起,表空间是数据库的最大逻辑划分区域,通常用来存放数据表、索引、回滚段等对象,任何数据对象在创建时都必须指定存储在某个表空间上。

表空间(逻辑存储结构)与数据文件(物理存储结构)相对应,一个表空间由一个或多个数据文件组成,一个数据文件只属于一个表空间。

类型:

①PERMANENT 永久表空间 (保存用户数据)

②UNDO 撤销表空间 (用户ROLLBACK,从逻辑中恢复(可以创建多个表空间,但只能激活一个表空间))

③TEMPORARY 临时表空间(用户排序,分组,索引等)

特性:

​ 一个表空间由一个或者多个数据文件组成,但一个数据文件只属于一个表空间

​ 一个数据库可以有多个表空间,可以在数据库中创建,删除表空间。

​ 一个表空间只属于一个数据库,

​ 一个表空间的大小等于所有数据文件的大小之和。

​ 表空间可以联机,脱机(系统表空间和带有回滚段的表空间不能OFFLINE)

​ 数据库对象、表、索引的数据被存储在表空间的数据文件中。

​ 一个用户默认使用一个表空间

管理方式:

重点是段的管理方式和区的管理方式是在建立表空间时确定的

段管理方式有 AUTO 和 MANUAL 两种,区管理方式有本地管理和字典管理(已淘汰)两种。

SQL> select TABLESPACE_NAME,STATUS,EXTENT_MANAGEMENT,ALLOCATION_TYPE,SEGMENT_SPACE_MANAGEMENT from 	dba_tablespaces;

TABLESPACE_NAME                STATUS    EXTENT_MANAGEMENT ALLOCATION_TYPE SEGMENT_SPACE_MANAGEMENT
------------------------------ --------- ----------------- --------------- ------------------------
SYSTEM                         ONLINE    LOCAL             SYSTEM          MANUAL
SYSAUX                         ONLINE    LOCAL             SYSTEM          AUTO
UNDOTBS1                       ONLINE    LOCAL             SYSTEM          MANUAL
TEMP                           ONLINE    LOCAL             UNIFORM         MANUAL
USERS                          ONLINE    LOCAL             SYSTEM          AUTO

注意两点:
1)如果 system 表空间是数据字典管理,其他表空间可以是数据字典管理或 local 管理(默认)
2)字典管理可以转换成本地管理,但是对于系统表空间,要求执行一些附加步骤,比较麻烦。
SQL>execute dbms_space_admin.tablespace_migragte_to_local('tablespacename');

oracle默认创建的表空间

1.system表空间:用于存放oracle系统内部表和数据字典的数据,如表名列名、用户名等。oracle不赞成将用户的表、索引放在系统表空间中。通过dict表查看数据字典的信息,通过v$fixed_view_definition查看内部系统表信息

2.sysaux表空间:充当system的辅助表空间,降低system表空间负荷,主要存储除数据字典意外的其他数据对象,一般不存储用户数据,由oracle系统内部自动维护

3.undo表空间:用于存储撤销信息的表空间。用户对表进行修改操作时,oracle自动使用undo表空间来临时存储修改前的旧数据。在所做操作修改完成并提交后,根据设置的undo保留时长来决定何时释放部分空间。默认创建的名字是UNDOTBS1,对应数据文件为UNDOTBS01.DBF

4.user表空间:oracle建议用户使用的表空间,可以在这个表空间上创建各种数据对象。如表、索引、用户等数据对象。

除了默认表空间外,用户可以根据应用系统的实际情况及所需存储对象类型创建多个自定义的表空间,用以区分用户数据和系统数据。同样,不同的应用系统的数据存放在不同的表空间上,不同的表空间存储在不同的盘上,可以减少IO冲突,提高性能。

posted @ 2022-05-03 22:39  EverEternity  阅读(384)  评论(0编辑  收藏  举报