本节实验主要介绍 Oracle 12c 的物理存储、内存、进程和逻辑存储结构。
- 12c 简介
- Oracle 数据库概述
- 物理存储结构
- 内存结构
- 进程结构
- 逻辑存储结构
Oracle Database 12c 是 Oracle 11g 的升级版。它执行计划管理的自动化程度更高,新增了虚拟化特性,大大提高了可用性和故障转移能力。
数据库是位于磁盘上的一组文件,用于存储数据。由数据库实例和数据库紧密连接。组成数据库的文件主要分为两类:
- 数据库文件:包含数据和元数据。
- 非数据库文件:包含初始参数和日志纪录信息等。
实例是存储在服务器内存中的,它主要由两部分组成:
- 大型内存块:分配在 SGA (系统全局区域)中。
- 大量后台进程:后台进程在 SGA 和数据库文件之间交互。
我们连接数据库的时候就需要通过实例去连接。一个数据库可以有多个实例。
我们可以查看当前所在的数据库名和实例名。
注意:打开实验楼环境是在 shiyanlou 用户下,后面所有章节的实验均是在 oracle 用户下操作,所以首先我们需要切换到 oracle 用户下。
$ sudo su oracle
然后使用 system 用户登入数据库:
$ sqlplus system/Syl12345;
- 查看当前数据库名
SQL> select name from v$database;
NAME
---------
XE
- 查看当前数据库实例名
SQL> select instance_name from v$instance;
INSTANCE_NAME
----------------
xe
在操作系统级别,数据库数据被存储在称为数据文件的结构中。每个 Oracle 数据库都必须至少有一个数据文件。数据文件和表空间是多对一的关系。
也称为联机的重做日志文件,记录对 Oracle 数据库数据文件和控制文件所做的所有更改。
一个二进制文件,记录数据库的物理结构,包含重做日志文件的名称和位置,数据库创建的时间戳,当前日志序列号等信息。
数据库有两种操作模式:ARCHIVELOG
和 NOARCHIVELOG
模式。如果选择了 ARCHIVELOG 模式,也就是归档模式,就会有归档的日志文件,是重做日志文件的备份,可以用来将数据库的内容恢复到某个时间点。
除此之外,还有很多其他的文件,比如初始参数文件,备份文件,密码文件等。了解更多可以参考物理存储结构-官方文档
主要了解共享内存中的 SGA (系统全局区域)部分。为了便于理解,把它单独提出来,用一个更简单的图表示:
在执行命令启动实例的时候会显示 SGA 的大小,如下例所示:
/*启动需要系统管理权限,所以先退出 SQL 命令行再重新作为系统管理员身份登入*/
SQL> quit;
$ sqlplus system/Syl12345 as sysdba
SQL> startup;
ORACLE instance started.
Total System Global Area 1610612736 bytes
Fixed Size 8793304 bytes
Variable Size 520094504 bytes
Database Buffers 1073741824 bytes
Redo Buffers 7983104 bytes
Database mounted.
Database opened.
如果提示 Oracle 已经在运行,可以使用
shutdown immediate
关闭 Oracle 再启动,或者使用startup force
强制启动。
数据库高速缓存区(Database buffer cache)用来保存来自磁盘的数据块。它可以减少物理 I/O,提高性能。
共享池(share pool)的大小由初始参数 SHARED_POOL_SIZE
确定,它的大小可调节。共享池包含两个主要的子缓存:
- 库缓存(Library cache):存储数据库运行的 SQL 和 PL/SQL 语句有关信息。
- 数据字典缓存(Data dictionary cache):数据字典高速缓存也被称为行高速缓存,因为它将数据保存为行而不是保存整个数据块的缓冲区。它是数据库表和视图的只读集合,其中包含有关数据库及其结构和用户的参考信息。
重做日志缓冲区(Redo Log buffer)保存对数据文件中的数据块所进行的最近的改动。
大型池(Large pool)是 SGA 中的可选区域,由初始参数 LARGE_POOL_SIZE
控制其大小。它可以为 I/O 服务器进程和会话内存提供大量内存分配。还可以用于 RMAN 并行备份和还原操作。
想了解更多信息可以参考
可以用如下命令获取每个进程的系统进程标识和系统线程标识:
SQL> COL SPID FORMAT a8
SQL> COL STID FORMAT a8
SQL> SELECT SPID,STID,PROGRAM FROM V$PROCESS ORDER BY SPID;
还可以用下面的命令查看进程的名称和描述:
SQL> select name,description from v$bgprocess;
SMON 是系统监控器(System Monitor)进程。它负责
- 清理未使用的临时段。
- 通过将联机重做日志文件中的条目应用与数据文件,为一个失败的实例进行实例恢复。
- 合并字典管理表空间的连续可用范围。
PMON 是进程监控器(Process Monitor)进程。它负责检测其他后台进程的终止。如果一台服务器或调度进程异常终止,那么PMON 负责执行进程恢复。
DBWn 是数据库写入程序(database writer)的进程。它负责将脏数据(缓冲区缓存中新增或改动的数据块)写入数据文件。
LGWR 是日志写入程序(log writer)的进程。它负责管理联机重做日志缓冲区。当 LGWR 已经成功写入重做信息到重做日志文件后,才可以通过 DBWn 将脏数据写入数据文件。
ARCn 是归档程序进程,跟我们前面说到的归档重做日志文件相关。它将重做日志文件备份到一个地方。它的进程数量由初始参数 LOG_ARCHIVE_MAX_PROCESSES
控制。
想了解更多内容可以参考后台进程-官方文档
逻辑存储结构图如下:
表空间将逻辑存储从物理存储中抽象出来,在逻辑上,表空间是段的逻辑存储容器,在物理上,表空间将数据存储在一个或多个数据文件或临时文件中。数据库必须具有 SYSTEM 和 SYSAUX 这两个表空间。
- SYSTEM 表空间:管理任何其他表空间。它包含数据字典,有关数据库管理信息的表和视图,编译的存储对象(如触发器,过程等)。
- SYSAUX 表空间:辅助 SYSTEM 的表空间,减少了 SYSTEM 表空间的负载。了解更多有关 SYSAUX 可以参考SYSAUX 表空间
了解更多有关表空间信息可参考表空间
段是为用户对象(例如表或索引),撤消数据或临时数据分配的一组扩展区。
盘区是逻辑上连续的特定数量的数据块,在单个分配中获得,用于存储特定类型的信息。
块是 Oracle 数据库中最小的存储单位。一个数据块对应于磁盘上特定数量的字节。
表空间(Tablespace),段(Segment),盘区(Extent),块(Data block)的关系如下图所示:
连接线表示一对多的关系。
我们可以使用命令查看表的逻辑存储信息。
- 以 system 用户连接到数据库(这里用的是 sqlplus 工具,你也可以用其他工具连接)
$ sqlplus system/Syl12345
- 创建一个表
SQL> create table syl(name varchar2(10));
- 查看所在的表空间,区间大小,区间所在文件编号,以及区间开始位置的文件块。
SQL> select tablespace_name,bytes,file_id,block_id from dba_extents where owner='SYSTEM' and segment_name='SYL';
输出结果如下:
TABLESPACE_NAME BYTES FILE_ID BLOCK_ID
-------------------- ---------- ---------- ----------
SYSTEM 65536 1 100536
可以看出这张表所在的表空间名为 SYSTEM,区间大小为 64KB,区间所在文件编号为 1,区间开始位置的文件块编号为 100536 。
如果输出的格式比较乱,可以使用
col <col_name> format <宽度>
设置某列的宽度,比如col TABLESPCE_NAME format a20
。 然后再查询。
- 查看在文件中的开始字节数。
SQL> select block_size * 100536 from dba_tablespaces where tablespace_name='SYSTEM';
BLOCK_SIZE*100536
-----------------
823590912
可以看出从文件的大约 785.4 MB 的地方开始。另外,我们还可以查看文件所在的具体位置。
SQL> select name from v$datafile where file#=1;
NAME
--------------------------------------------------------------------------------
D:\APP\SHIYANLOU\VIRTUAL\ORADATA\ORCL\SYSTEM01.DBF
##总结