【Oracle学习12】 Oracle 12c体系结构
- https://docs.oracle.com/en/database/oracle/oracle-database/index.html
Oracle版本:
12.1 Oracle数据库体系结构组件
Oracle主要体系为:三大文件,五大进程,六大池.
- 三大文件:ctl(控制文件),log(日志文件),dbf(数据文件)
- 五大进程:PMON,SMON,DBWR,LGWR,CKPT
- 六大池:buffer cache,shared pool,redo log buffer,large pool,java pool,streams pool
12.1.1 单实例数据库体系结构
数据库物理结构:
select name,bytes from v$datafile;
select name,bytes from v$tempfile;
select member from v$logfile;
select * from v$controlfile;
#
SQL> select name,bytes from v$datafile;
NAME BYTES
-------------------------------------------------------
/u01/app/oracle/oradata/orcl/system01.dbf 870318080
/u01/app/oracle/oradata/orcl/jinlian_undo.dbf 20971520
/u01/app/oracle/oradata/orcl/sysaux01.dbf 954204160
/u01/app/oracle/oradata/orcl/undotbs01.dbf 188743680
/u01/app/oracle/oradata/orcl/users01.dbf 10485760
SQL> select * from v$controlfile;
STATUS NAME IS_REC BLOCK_SIZE FILE_SIZE_BLKS CON_ID
------ ---------- -------------- ---------- ------ ---------- -------------- ----------
null /u01/app/oracle/oradata/orcl/control01.ctl NO 16384 646 0
null /u01/app/oracle/oradata/orcl/control02.ctl NO 16384 646 0
内存及进程结构:
[oracle@db01 ~]$ ipcs -m
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 131076 oracle 600 4096 0
0x00000000 163845 oracle 600 4096 0
0x00000000 196614 oracle 600 4096 0
0xc8f412cc 229383 oracle 600 12288 46
[oracle@db01 ~]$ ps -ef |grep ora_
oracle 2245 1 0 Feb03 ? 00:00:07 ora_pmon_orcl
oracle 2247 1 0 Feb03 ? 00:00:02 ora_clmn_orcl
oracle 2249 1 0 Feb03 ? 00:00:43 ora_psp0_orcl
oracle 2251 1 0 Feb03 ? 00:00:59 ora_vktm_orcl
...
12.1.2 分布式系统体系结构
分布式环境,多种组合实例和数据库的方式:
- 实时应用群集(Real Appliction Clusters,RAC) : 多个实例打开一个数据库
- 流或GoldenGate : 多个Oracle服务器相互之间传播事务。
- 数据保护: 主数据库更新备用数据库,或它们之间同步。
#是否是RAC (Real Appliction Clusters)
SQL> select parallel from v$instance;
PARALL
------
NO
# DG (Data Guard)
SQL> select protection_level from v$database;
PROTECTION_LEVEL
----------------------------------------
UNPROTECTED
#是否配置了流
select * from dba_streams_adminstrator;
#物理结构
select name,blocks,block_size from v$datafile;
select * from v$tempfile;
select * from v$logfile;
select * from v$controlfile;
SQL> select name from v$datafile;
NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/orcl/system01.dbf
/u01/app/oracle/oradata/orcl/sysaux01.dbf
/u01/app/oracle/oradata/orcl/undotbs01.dbf
/u01/app/oracle/oradata/orcl/mytest.dbf
/u01/app/oracle/oradata/orcl/users01.dbf
--创建表空间
create tablespace example datafile '/u01/app/oracle/oradata/orcl/example.dbf' size 50m;
select file_id,file_name,tablespace_name,autoextensible from dba_data_files;
select tablespace_name,block_size,status,contents,logging from dba_tablespaces;
select * from dba_tablespaces where tablespace_name like 'EXAMPLE%';
12.2 内存结构
Oracle 实例由系统共享内存块(SGA) + 后台进程构成。SGA至少包括:如下
- 数据库缓冲区(Database buffer cache): 用于执行SQL的工作区域。
- 日志缓存区:
- 共享池:
可选项有,Large pool,Java pool,Streams pool。 - 大池 :
- JAVA Pool:
- 流缓冲池:
说明:
- 共享池,大池,流池的大小是动态的,可以系统自动管理。
查看内存结构:
#查看
SQL> show sga;
Total System Global Area 1610612736 bytes
Fixed Size 8621232 bytes
Variable Size 905970512 bytes
Database Buffers 687865856 bytes
Redo Buffers 8155136 bytes
SQL> select name,value from v$pgastat where name in ('maxinum PGA allowcated','total PGA allocated');
NAME VALUE
----------------------------------------------------- ----------
total PGA allocated 147928064
SQL> select component,current_size,min_size ,max_size from v$sga_dynamic_components order by CURRENT_SIZE desc;
COMPONENT CURRENT_SIZE MIN_SIZE MAX_SIZE
-------------------------------------------------- ------------ ---------- ----------
DEFAULT buffer cache 637534208 587202560 704643072
shared pool 301989888 234881024 301989888
Shared IO Pool 50331648 50331648 50331648
large pool 33554432 33554432 150994944
java pool 16777216 16777216 16777216
DEFAULT 8K buffer cache 0 0 0
DEFAULT 16K buffer cache 0 0 0
DEFAULT 32K buffer cache 0 0 0
Data Transfer Cache 0 0 0
In-Memory Area 0 0 0
In Memory RW Extension Area 0 0 0
In Memory RO Extension Area 0 0 0
ASM Buffer Cache 0 0 0
DEFAULT 2K buffer cache 0 0 0
RECYCLE buffer cache 0 0 0
KEEP buffer cache 0 0 0
streams pool 0 0 0
DEFAULT 4K buffer cache 0 0 0
18 rows selected.
12.2.1 数据库缓冲区(Database buffer cache)
数据库缓冲区(Database buffer cache): 用于执行SQL的工作区域。
#
12.2.2 日志缓冲( Redo log buffer)
日志缓冲区:
- 用于短期存储将写入到磁盘上的重做日志的变更修改。
-
是一个循环缓冲区。
会话服务器进程先写redo log到日志缓冲区,这样性能较好。 当会话Commit时,会执行日志缓冲区的写操作,把日志缓冲刷新到磁盘中。操作由日志后台写进程(LGWR)完成。
12.2.3 共享池 (Shared pool)
共享池 :
- 库缓存
- 数据字典缓存
- SQL查询和PL/SQL结果缓存.
说明:
- 共享池在实例启动。 使用LRU(最近最少使用)来分配。
- 大小可以Oracle服务器内部自动调整,也可以手动调整。
1)库缓存(Library cache)
Library cache存放SQL编译后的可执行代码。
2)数据字典缓存
数据字典缓存: 存放最近使用对象的定义,如表索引,用户和其它元数据。此位于SGA的内存中,以便全部会话都可以直接访问。
表信息等内容会加入到缓存中。 后续语句分析速度将因此而加快。
3)SQL查询及函数结果缓存
存放查询结果/函数结果,若有更新则结果失效。
4)设置共享池大小
12.2.4 大池(Large pool)
Large pool是一个可选区,主要是供共享的服务器进程使用。
12.2.5 Java池(Java pool)
若应用程序需要在数据库中运行Java存储过程时,需要java池。 作为实例化Java对象所需的堆空间。
注意:java代码在共享池中缓存,与SQL代码的缓存方式相同。
12.2.6 流池(Streams pool)
流池(Streams pool)重做日志中提取变更向量会使用到。
Oracle 10G后已用较少,很多功能被OGG替换了。
12.2.7 程序全局区(Program global area,PGA)
PGA是一个私有的内存区,只属于一个进程,随进程创建而分配,终止而回收。
- 排序区 (sort area): 处理SQL语句排序。
- 游标状态区(cursor state): SQL当前的状态。
- 会话信息区(session info): 用户会话时的权限和统计信息。
- 堆栈区(stack space): 一些会话信息
12.3 后台进程
后台进程在启动实例时启动,在终止实例时终止运行。
- 系统监视器(System Monitor,SMON):
- 进程监视器(Process Monitor,PMON):
- 数据库写入器(Database Writer,DBWn):
- 日志写入器(Log Writer,LGWR):
- 检查点进程(Checkpoint Process,CKPT):
其它的还有:
- 可管理监视器(Manageablility Monitor,MMON):
- 内存管理器(Memory Manager,MMAN):
- Archiver(ARCn):
- Recoverer(RECO):
进程查看:
当前有哪些进行在运行:
select program,paddr from v$session order by program;
select program,addr from v$process order by program;
SQL> select name,description from v$bgprocess where paddr <>'00' and DESCRIPTION is not null;
NAME DESCRIPTION
---------- --------------------------------------------------------------------------------------------------------------------------------
PMON process cleanup
CLMN process cleanup
PSP0 process spawner 0
VKTM Virtual Keeper of TiMe process
GEN0 generic0
MMAN Memory Manager
...
12.3.1 SMON
系统监视器(System Monitor,SMON): 负责先安装及打开数据库,任务完成后负责内部管理任务,如合并数据文件可用空间等。
12.3.2 PMON
进程监视器(Process Monitor,PMON): 监视所有服务器进程,并检测会话中的任何问题。 若会话异常终止,PMON将销毁服务器进程,将其PGA内存返回给操作系统空闲内存池,并回滚未完成事务。
12.3.3 DBWn
数据库写入器(Database Writer,DBWn): 会话将数据改写写入数据缓冲区,DBWn,将脏缓冲区数据写入磁盘。
DBWn用极懒算法来执行写入:尽量少的写。在如下进行写操作:
- 没有可用数据缓冲区:
- 脏缓冲区过多:
- 三秒超时: DBWn每3秒对缓冲区清理一次。
- 遇到检查点:
检查点:
- 唯一绝对需要检查点场景是关闭数据库时,会要将所有缓冲区数据写入磁盘。 这是完全检查点。
- 分为 完全检查点,局部检查点。局部检查点权包括一个或多个数据文件的块的所有脏缓冲区。
alter system checkpoint;
12.3.4 LGWR
LGWR(Log Writer) 将日志缓冲区的内容写入到磁盘上的联机日志文件中。这过程通常称为 "日志缓冲区转储";
- 会话发出Commit: 日志缓冲区数据写入磁盘,保证事务不丢失。
- 日志缓冲区占用率达1/3
- DBWn要写入脏缓冲区:
12.3.5 CKPT
CKPT(Checkpoint Process,CKPT): 不再必须发出完全检查点,但是它必须跟踪增量检查点的位置,并不断更新控制文件。
12.3.6 MMON
可管理监视器(Manageablility Monitor,MMON): 数据库的自我监视和自我调整功能的支持进程。
12.3.7 MMNL
MMNL(Manageablility Monitor Light) 是MMON的辅助进程。
12.3.8 MMAN
内存管理器(Memory Manager,MMAN): 支持内存分配的自动管理。 MMAN观察PGA和SGA内存的需求,并分配,控制总量在DBA的设置限制内。
12.3.9 LREG
监听注册LREG(Listener Registration Process): 以前由PMON实现,12C新增。
12.3.10 ARCn
Archiver(ARCn): 对数据库来说这是可选的进程,但是对企业来说是必须的。 做为日志归档需要ARCn.
- LGWR 对联机日志文件执行写操作。
- ARCn 读联机日志文件。
12.3.11 RECO
Recoverer(RECO): 操作回滚时会用到。
12.3.12 其它后台进程
SQL> select name,description from v$bgprocess where paddr <>'00' and DESCRIPTION is not null;
NAME DESCRIPTION
---------- ---------------------------------------------------------------
PMON process cleanup
CLMN process cleanup
PSP0 process spawner 0
VKTM Virtual Keeper of TiMe process
GEN0 generic0
MMAN Memory Manager
RECO distributed recovery
GEN1 generic1
DIAG diagnosibility process
OFSD Oracle File Server BG
DBRM DataBase Resource Manager
VKRM Virtual sKeduler for Resource Manager
SVCB services background monitor
PMAN process manager
DIA0 diagnosibility process 0
DBW0 db writer process 0
LGWR Redo etc.
CKPT checkpoint
SMON System Monitor Process
SMCO Space Manager Process
LREG Listener Registration
PXMN PX Monitor
FENC IOServer fence monitor
MMNL Manageability Monitor Process 2
MMON Manageability Monitor Process
TMON Transport Monitor
AQPC AQ Process Coord
CJQ0 Job Queue Coordinator
28 rows selected.
12.4 逻辑和物理存储结构之间的关系
12.4.1 物理数据库结构
必需的文件:
- 控制文件(controlfile):
- 联机重做日志文件(online redo logfile):
- 数据文件(datafile):
其它外部文件:
- 初始化参数文件
- 口令文件:
- 归档重做日志文件:
- 日志和跟踪文件:
1)控制文件
控制文件:包含指向数据库其余部分的指针: 联机重做日志文件和数据库数据文件,归档日志的位轩。 还存储维护数据库完整性的信息,如各种序列号和时间戳。
- 至少有一个控制文件,建议多个复本。
2)联机重做日志文件
重做日志(redo log)按时间顺序存储应用于数据库的一连串变更向量。 重做日志(redo log)包括: 联机重做日志: 必需。归档日志: 可选。
- 至少需要两个联机重做日志文件组;为了安全,每组至少两个成员。
3)数据文件
数据库创建阶段,至少需要创建两个数据文件。
- SYSTEM表空间(存数据字典),及 SYSAUX表空间(存数据字典辅助数据).
- UNDO 表空间:存事务所需的撤消段。
数据文件和逻辑文件:
- 数据文件是系统管理员看的真实的物理文件。
- 逻辑文件: Database > Tablespce > Segment(段) > Extent 段区间> Oracle block。
4)其它数据库文件
如下文件实际上也是必需的,但严格地讲,它们不是数据库的一部分。
- 实例参数文件(Instance Parameter File):
- 口令文件(Password File):
- 归档重做日志文件(Archive Redo Log Files):
- 警报日志和跟踪文件( Alert Log and Trace Files):
12.4.2 逻辑数据库结构
逻辑文件: Database > Tablespce > Segment(段) > Extent 段区间> Oracle block。
- Segment(段) 描述任何包括数据的结构。 典型的段是包括数据行的表,索引,撤消段。 撤消段用于回滚事务。
- Tablespace: 逻辑上是多个段的集合,物理上是一个或多个文件。
- Extent 区间: 段由Block组成,为了管理方便把块分组成Extent区间。
- Block 块: 一个Block可以包括多个 OS block。
12.4.3 数据字典
数据字典: 包括描述数据库及其内容的元数据。用户定义,安全信息,完整性约束,性能监控信息都是数据字典的一部分。
- 数据字典做为一组段,存于SYSTEM和SYSAUX表空间。
- 数据字典 在创建数据库时生成,无权直接访问它们。
- 可以通过DDL语言进行维护。如Create Table,即在数据字典中insert了记录。
- 可通过视图来查看: CDB_,DBA_,ALL_,USER_
示例:
create table tab34 (c1 varchar2(10)) segment creation immediate;
desc dba_extents;
select * from dba_tables where table_name = 'TAB34';
#
select tablespace_name,extent_id,bytes,file_id,block_id from dba_extents where owner='SYSTEM' and UPPER(segment_name) = 'TAB34';
select name from v$datafile where file=#=&file_id;
select * from dba_tablespaces where tablespace_name='USERS';
12.5 其它及总结
12.5.1 ASM(自动存储管理)
12.5.2 多租户
12.5.3 Oracle用户交互
12.6 测试
#
参考:
https://docs.oracle.com/en/database/oracle/oracle-database/index.html
https://www.oracle.com/webfolder/technetwork/tutorials/obe/db/12c/r1/odb_quickstart/odb_quick_start.html
https://www.jianshu.com/p/ccb7863eb31d