03.oracle体系架构
Oracle体系架构概述¶
Oracle体系结构主要用来分析数据库的组成、工作过程与原理,以及数据在数据库中的组织与管理机制。oracle数据库是一个逻辑概念,而不是物理概念上安装了oracle数据库管理系统的服务器。
在Oracle数据库管理系统中有3个重要的概念需要理解,实例(instance)、数据库(database)和数据库服务器(database server)
- 实例:实例是 Oracle 数据库在内存中的运行环境,包括一组操作系统进程和内存结构。实例负责处理对数据库的所有操作,如读取、写入和管理数据库文件。每个实例在启动时会被分配内存和启动后台进程,并与数据库(存储在磁盘上的数据文件)交互。
- SGA(System Global Area):共享内存区域,用于存储数据库的共享数据结构,如缓冲区缓存、共享 SQL 区、日志缓冲区等。SGA 在实例启动时分配。
- PGA(Program Global Area):每个用户进程的专用内存区域,存储用户会话的特定数据,如游标信息和 SQL 执行状态。
- 后台进程:实例在运行时启动的一组操作系统进程,包括 DBWn(数据库写入器)、LGWR(日志写入器)、CKPT(检查点进程)、SMON(系统监控进程)、PMON(进程监控进程)等。这些进程协同工作,管理数据库的输入/输出、事务处理、恢复和清理工作。
多实例架构:在 Oracle 的 RAC(Real Application Clusters)环境中,多个实例可以同时访问一个数据库,这些实例共享数据库的存储,但各自拥有独立的内存和进程。
-
数据库:由基于磁盘的数据文件、控制文件、日志文件、参数文件和归档日志文件等组成的物理文件集合;
-
数据文件(Data Files): 存储实际的用户数据,如表、索引等业务数据的磁盘文件。这些文件是数据库的核心组成部分。
-
控制文件(Control Files):包含数据库的元数据,如数据库名、数据文件和日志文件的位置、数据库的结构和状态等。控制文件对数据库的正常运行至关重要。
-
重做日志文件(Redo Log Files):记录数据库的所有修改操作,用于恢复数据库到一致状态。重做日志文件是数据库恢复机制的重要组成部分。
-
参数文件(Parameter File):定义实例启动时使用的配置参数,如 SGA 大小、后台进程配置等。
-
归档日志文件(Archived Log Files):存储重做日志的归档副本,用于恢复历史数据。
-
数据库服务器:管理数据库的各种软件工具和实例及数据库的三个部分。
从实例与数据库之间的辩证关系来讲,实例用于管理和控制数据库;而数据库为实例提供数据。 一个实例在其生存期内只能装载和打开一个数据库(在Oracle 12c 多租户之前)。多个实例(一般这些实例是运行在不同主机上的)可以同时访问一个数据库(在 RAC 环境中)。
RAC架构 Oracle Real Application Clusters 是 Oracle 数据库企业版的一个选件,在 Oracle 9i 中首次引入。目前,它已发展成为一项成熟的技术,其用户过千,遍及各个行业,涉及各类应用程序。 Oracle RAC 能够扩展应用程序,提供的性能可以超越单台服务器。 Oracle Real Application Clusters 是 Oracle 最高可用性架构 (MAA) 的关键组件之一,该架构是应用程序最高可用性架构的发展方向。Oracle RAC 提供了在任何数据库应用程序环境中移除单点故障服务器的能力。
在 Oracle Real Application Clusters 中,将 Oracle 实例(运行在服务器上的进程和内存结构,用于支持数据访问)与 Oracle 数据库(驻留在存储器上的实际用于保存数据的物理结构,通常称为数据文件)进行了分离。 集群数据库是一个可由多个实例访问的数据库。各实例在服务器池中不同的服务器上运行。当需要更多的资源时,可以在不停机的情况下轻松地向服务器池中添加服务器和实例。 在启动新实例后,使用服务的应用程序可立即利用该实例,无需对应用程序或应用程序服务器进行任何更改。
可以看出,Oracle RAC是典型的share disk架构,各个处理单元使用自己的私有 CPU和Memory,共享磁盘系统。可通过增加节点来提高并行处理的能力,扩展能力较好。 其类似于SMP(对称多处理)模式,但是当存储器接口达到饱和的时候,增加节点并不能获得更高的性能 。
实例启动: 在 Oracle 数据库中,启动实例是一个关键操作,涉及初始化数据库实例的内存结构、启动后台进程以及打开数据库,使其能够处理用户请求。 启动(STARTUP NOMOUNT):该阶段实例启动,初始化内存结构(SGA)并启动后台进程,但不加载数据库。此阶段可以用于创建数据库或重建控制文件。 加载数据库(STARTUP MOUNT):在这个阶段,实例加载控制文件,但数据库仍未打开。这时可以执行数据库恢复操作,如介质恢复。 打开数据库(STARTUP OPEN):数据库文件被打开,用户可以访问数据库。这是数据库正常运行的状态,允许执行各种操作,如查询、插入、更新等。
数据库的主要功能就是存储数据,数据库存储数据的方式通常称为存储结构,Oracle 数据库的存储结构分为逻辑存储结构和物理存储结构。 逻辑存储结构用于描述 Oracle 内部组织和管理数据的方式,而物理存储结构用于展示 Oracle 在操作系统中的物理文件组成情况。
启动 Oracle 数据库服务器实际上是在服务器的内存中创建一个 Oracle 实例, 然后用这个实例来访问和控制磁盘中的数据文件。 当用户连接到数据库时,实际上连接的是数据库的实例,然后由实例负责与数据库进行通信,最后将处理结果返回给用户。
Oracle逻辑存储结构¶
ORACLE在逻辑存储上分4个粒度 ,由大到小为: 表空间,段,区,块。
块Block¶
块是粒度最小的存储单位,现在标准的块大小是8K。ORACLE每一次I/O操作也是按块来操作的,也就是说当ORACLE从数据文件读数据时,是读取多少个块,而不是多少行。 每一个Block里可以包含多个row。数据块的大小是通过KB字节个数来指定的,默认为8KB。 块的大小在数据库创建时就已经固定下来,数据库中每个块的大小都是相同的,而且所有的块都有相同的格式,由“块头+表目录+行目录+空闲空间+数据空间”组成。 块头包含着块类型(比如是表块、还是索引块)的信息、磁盘上块的位置等信息。
区Extent¶
区由一系列相邻的块而组成,这也是ORACLE空间分配的基本单位。区extent是比数据块大一级的存储结构,表示的是一连串连续的数据块集合。区的大小从一个块到2GB不等
在进行存储数据信息的时候,Oracle将分配数据块进行存储,但是不能保证所有分配的数据块都是连续的结构。所以,出现分区extent的概念,表示一系列连续的数据块集合。
举个例子来说,当我们创建一个表时,首先ORACLE会分配一区的空间给这个表,随着数据不断地增长,原来的这个区容不下插入的数据时,ORACLE是以区为单位进行扩展的,也就是说再分配多少个区给这个表,而不是多少个块。 视图dba_extents(或者all_extents、user_extents)是我们研究分区结构和存储构成的重要手段。
段Segment¶
段是oracle数据库中的分配单位,对象如表、索引等都是以段为单位进行分配。当创建一个表时将创建一个表段,创建一个索引时就创建一个索引段。每一个消耗存储空间的对象最终被存储到一个单一的段中。 有回滚段、临时段、聚簇段、索引段等。段(SEGMENT)存在于表空间中,是包含于表空间中的一种指定类型的逻辑存储结构,段由一组区组成。 按照段中所存储数据的特性以及为优化系统性能的需要,将段分成4类,即数据段、索引段、回退段、临时段。 例如,对于每个表,Oracle都分配一个或多个区以构成该表的数据段;而对于每个索引,Oracle则分配一个或多个区以构成索引段。
段是簇的上级逻辑分区单元,它由一组簇组成。在同一个表空间中,段可以包含来自不同文件的簇,即一个段可以跨越不同的文件。而一个簇以及该簇所包含的数据页则只能来自一个文件,是连续的16或者32个数据页。 由于簇的数量是按需分配的,数据段中的不同簇在磁盘上不一定连续。段可以有数据段、临时段和回滚段,而最常用的段就是数据段。
表空间TableSpace¶
表空间是一个逻辑容器,它和数据文件(物理磁盘上的数据文件)关联起来,一个表空间由一个或多个数据文件组成。一个表空间可以有多个段,一个段只能属于一个表空间。
SELECT * FROM DBA_TABLESPACES -- 记录各个表空间的详细信息
SELECT * FROM DBA_TABLESPACE_USAGE_METRICS -- 记录各个表空间的使用状况
SELECT * FROM DBA_DATA_FILES -- 记录各个数据文件的详细信息
SELECT * FROM DBA_SEGMENTS -- 记录各个段的详细信息,与 DBA_TABLES,DBA_INDEXES,DBA_LOBS,DBA_PART_TABLES,DBA_PART_INDEXES,DBA_PART_LOBS,DBA_OBJECTS 搭配使用
SELECT * FROM DBA_LOBS --BLOB 字段所对应的字段名称
SELECT * FROM DBA_INDEXES -- 分区索引需要通过 DBA_INDEXS 来找到对应的表名
SELECT * FROM DBA_EXTENTS -- 记录各个区间对象的详细信息
Question: What is the difference between dba_segments and dba_tables ?
Answer: The dba_tables view describes a "logical" structure while dba_segments describes the "physical" data segment, like a data file.
Also, columns like "blocks" are different between dba_tables and dba_segments.
In dba_tables, the "blocks" are calculated when you run dbms_stats, while in dba_segments, "blocks" is the actual number of blocks used by the object on disk.
Oracle高水位问题
首先新建一张空表,大小占用5K,然后插入1000万条数据,直到表大小变为50G,此时使用DELETE删除所有的数据并且提交,这个时候查询表的大小的时候依然是50G,这就是因为表的高水位没有释放的缘故。 而在这时如果使用“SELECT * FROM TABLE_NAME;”语句来查询数据的话,那么查询过程依然会很慢,因为Oracle要执行全表扫描,高水位下所有的块都得去扫描,直到50G的所有块全部扫描完毕。 其实这个问题就是由于高水位的缘故。在Oracle中执行delete删除操作不会降低高水位。而执行truncate操作可以降低高水位,通常能把高水位降到0。 所以为了降低高水位,能尽量使用truncate的就不使用delete操作。
简单的说就像水库里的历史最高水位。 就如刚挖的水库一样里面没有一滴水,那么它的最高水位为0。同理在刚建的新表中由于没有一条数据,所以的高水位是0,随着不断的往里面添加数据,进行增删操作,那么它的高水位就会上涨。 当然也不是说你把表的数据删掉一半,它的高水位就会下降,因为高水位代表历史最高水位。 在Oracle中执行delete删除操作不会降低高水位。执行truncate操作可以降低高水位,通常能把高水位降到0。 所以为了降低高水位,能尽量使用truncate的就不使用delete操作。
高水位线影响最显著的就是全表扫描的效率,因为当进行全表扫描时,会扫描高水位线以下的所有数据块,用上述的例子说,如果1220万数据,删除了1200万,只剩下20万,当进行全表扫描的时候,不会只扫描这20万数据的数据块,他还会扫描1220万数据的数据块。
Oracle数据库逻辑上由一个或多个表空间组成,每个表空间在物理上由一个或多个数据文件组成,而每个数据文件是有数据块构成的。 所以,逻辑上数据存放在表空间中,而物理上存储在表空间所对应的数据文件中。 oarcle数据库真正存放数据的是数据文件(data files),Oarcle表空间(tablespaces)实际上是一个逻辑的概念,他在物理上是并不存在的,那么把一组data files 捻在一起就成为一个表空间。
表空间:最高级的逻辑存储结构,数据库是由多个表空间组成的。在创建数据库时会自动创建一些默认的表空间,例如 SYSTEM表空间,SYSAUX表空间等。 通过使用表空间,Oracle将所有相关的逻辑结构和对象组合在一起。我们可以在表空间级别指定存储参数,也可以在短级别指定。
下面我们列出常见的表空间,和他们所存储的信息: 数据表空间:用于存储用户数据的普通表空间。 系统表空间:默认的表空间,用于保存数据字典(一组保存数据库自身信息的内部系统表和视图,及用于Oracle内部使用的其他一些对象),保存所有的PL/SQL程序的源代码和解析代码,包括存储过程和函数、包、数据库触发器等,保存数据库对象(表、视图、序列)的定义。系统表空间,用于存放 Oracle 系统内部表和数据字典的数据,如表名、列名、用户名等。 Oracle 本身不赞成将用户创建的表、索引等存放在系统表空间中。表空间中的数据文件个数不是固定不变的,可以根据需要向表空间中追加新的数据文件。 回滚表空间:用于存放回滚段,每个实例最多只能使用一个撤销表空间 临时表空间:存储SQL执行过程中产生的临时数据
我们知道oarcle数据库真正存放数据的是数据文件(data files)。 Oarcle表空间(tablespaces)实际上是一个逻辑的概念,他在物理上是并不存在的,那么把一组data files 捻在一起就成为一个表空间。
表空间属性: 一个数据库可以包含多个表空间,一个表空间只能属于一个数据库 一个表空间包含多个数据文件,一个数据文件只能属于一个表空间 表空间可以划分成更细的逻辑存储单元。
oralce数据库的存储结构:
从逻辑的角度来看,一个数据库(database)下面可以分多个表空间(tablespace);一个表空间下面又可以分多个段(segment);一个数据表要占一个段(segment),一个索引也要占一个段(segment )。 一个段(segment)由多个 区间(extent)组成,那么一个区间又由一组连续的数据块(data block)组成。这连续的数据块是在逻辑上是连续的,有可能在物理磁盘上是分散。 那么从物理的角度上看,一个表空间由多个数据文件组成,数据文件是实实在在存在的磁盘上的文件。这些文件是由oracle数据库操作系统的block组成的。