Overview of Oracle Database

Oracle Database Documents

Oracle Database 9i Release 2
Oracle Database 11g Release 2 |
Oracle Database 12c Release 2 |
Oracle Database 19c |
Oracle Database 21c |
Oracle Database 23ai |

Physical Architecture

Session

1 区 -> 2 区 -> 3 区
1 区 -> 3 区

PGA

  1. 保存用户的连接信息,如会话属性、绑定变量、用户权限等重要信息。
  2. 硬解析首次执行的 SQL 指令,生成唯一指令 HASH 值。
  3. 当发起的 SQL 指令需要排序时,如果内存空间充足,则在 PGA 中完成,如果不足,超出部分在临时表空间完成排序。

SGA

  1. Shared Pool - Library Cache 保存硬解析生成唯一 SQL 指令 HASH 值,保留了语法语意检查及执行计划等解析动作的劳动成功,下次执行该 SQL 指令时,直接拿来主义。
  2. 如果 SQL 指令需要的数据不在 Database Buffer Cache,则从硬盘中获取数据到数据缓存区。
  3. Redo Log Buffer 保存数据库相关操作日志。

Background Processes

DBWR: 将数据缓存区的数据批量写入(提高数据库写性能)磁盘数据文件中,需等待 LGWR 先完成。
CKPT: Check Point,由 Oracle 的 FAST_SMART_MTTR_TARGET 参数控制,用于触发 DBWR 将数据缓存区的数据中写入磁盘。
LGWR: 将日志缓存区的数据写入磁盘的联机日志文件,记录所有从数据缓存区写入磁盘数据文件的动作。为了顺序记录日志,因此 LGWR 采用单线程。

  • 每隔 3 秒,LGWR 运行一次
  • 任何 COMMIT,触发 LGWR 运行一次
  • DBWR 要把数据从数据缓存区写入磁盘,触发 LGWR 运行一次
  • 日志缓存区满三分之一或记满 1MB,触发 LGWR 运行一次
  • 联机日志文件切换,触发 LGWR 运行一次

PMON: Processes Monitor,进程监视器。在执行某些更新语句,未提交时进程崩溃了,这时候 PMON 会自动回滚该操作。除此之外还可以干预后台进程,比如 RECO 一次失败,会重启 RECO 进程,遇到 LGWR 进程失败,会中止实例,用于防止数据错乱。
SMON: System Mointor,系统监视器。重点工作在于 Instance Recovery,还有清理临时表空间、清理回滚段表空间、合并空闲空间等。
LCKn: 仅使用于 RAC 数据库,最多可有 10 个进程(LCK0 - LCK9),用于实例间的封锁。
RECO: Distributed Database Recovery,用于分布式数据库的恢复。
ARCH: 在 LGWR 写联机日志写到需要覆盖重写时,触发 ARCH 进程复制联机日志,生成归档日志文件。

Undo Segment

SQL> show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS1

UNDO_MANAGEMENT=AUTO,表示自动回滚段管理,空间不足时自动扩展;
UNDO_RETENTION=900,表示回滚段需要 900 秒后才能覆盖标记为重新使用的空间。

Logical Architecture

数据库组成:DATABASE <- Tablespace <- Segment <- Extent <- Block
Extent 是数据库分配空间的最小单位
Block 是数据库的最小逻辑单位

Block

数据库组成:

1. 数据块头 (Common and Variable Header) 包含了数据块的概要信息,例如块地址及此数据块所属的段的类型
2. 表目录 (Table Directory) 存储行数据所在的表的信息
3. 行目录 (Row Directory) 存储插入的行的地址
4. 可用空间区 (Free Space) 块中的空余空间,由 PCTFREE 参数设置。如果是表或索引块,该区域还会存储事务条目,大概有 23 字节开销
5. 行数据区 (Row Data) 存储具体的行的信息或者索引的信息,这部分占用了数据块绝大部分的空间

数据块头、表目录、行目录为管理开销,平均在 84-107 字节之间。

Table

全局临时表:一种是基于会话的全局临时表(commit preserve rows),一种是基于事务的全局临时表(commit delete rows)。