Oracle Database Server包括实例和数据库,实例包括内存结构和进程,数据库包括磁盘文件。
逻辑结构如表与物理结构如datafiles之间,是通过controlfile和数据字典建立联系的。
架构组件
单实例数据库架构
包括实例和数据库。数据库是持久的,而实例的生命周期是暂时的,可停止可启动。
实例包括后台进程和内存结构。内存机构由操作系统以shared memory segments形式实现,最典型的就是System Global Area (SGA).
用户会话包括在客户端的用户进程和位于实例所在主机上的服务器进程,也称为前台进程,以区别于后台进程。和前台进程关联的内存是非共享的,称为Program Global Area (PGA)。
PGA的大小与会话有关,DBA可定义其上限。
物理上,数据库是由数据文件(datafiles),日志文件(online redo log)和控制文件(Controlfiles)组成。开发者只需了解逻辑结构,DBA关注物理结构。逻辑与物理的映射通过数据字典,数据字典也存于数据库中而不是在外部,因此,实例启动需要分阶段进行。
数据库不能丢数据,因此数据必须备份。备份之间数据库的变化必须捕捉,以便在恢复时应用,这是一个前滚的过程,通过redo log实现。
redo log是change vectors的时序记录,change vectors由DML语句产生,当数据被改变时,change vectors也同时写到redo log。由于change vectors是可重复的,因此可以保证数据不丢。
控制文件存放了数据库的物理结构,实例打开数据库时,会首先读控制文件。通过控制文件,实例可以与数据库建立联系并打开数据字典。
架构的图例参见:Oracle Database 18c Technical Architecture或PDF
分布式系统架构
RAC:多个实例打开一个数据库。
Streams or GoldenGate:在多个Database Server间传播事务。
Data Guard:主数据库更新多个备数据库已保持同步。
以上三者可以组合。
确认数据库组件:
-- 是否多实例
ORCLCDB> select parallel from v$instance;
PAR
---
NO
-- 是否Data Guard
ORCLCDB> select protection_level from v$database;
PROTECTION_LEVEL
--------------------
UNPROTECTED
-- Streams是否配置
ORCLCDB> select * from dba_streams_administrator;
no rows selected
-- 数据库物理架构
ORCLCDB> select name,bytes from v$datafile;
NAME BYTES
------------------------------------------------------------ ----------
/opt/oracle/oradata/ORCLCDB/system01.dbf 954204160
/opt/oracle/oradata/ORCLCDB/sysaux01.dbf 587202560
/opt/oracle/oradata/ORCLCDB/undotbs01.dbf 361758720
/opt/oracle/oradata/ORCLCDB/pdbseed/system01.dbf 283115520
/opt/oracle/oradata/ORCLCDB/pdbseed/sysaux01.dbf 335544320
/opt/oracle/oradata/ORCLCDB/users01.dbf 5242880
/opt/oracle/oradata/ORCLCDB/pdbseed/undotbs01.dbf 104857600
/opt/oracle/oradata/ORCLCDB/ORCLPDB1/system01.dbf 304087040
/opt/oracle/oradata/ORCLCDB/ORCLPDB1/sysaux01.dbf 377487360
/opt/oracle/oradata/ORCLCDB/ORCLPDB1/undotbs01.dbf 104857600
/opt/oracle/oradata/ORCLCDB/ORCLPDB1/users01.dbf 361758720
11 rows selected.
ORCLCDB> select name,bytes from v$tempfile;
NAME BYTES
-------------------------------------------------------------------------------- ----------
/opt/oracle/oradata/ORCLCDB/temp01.dbf 33554432
/opt/oracle/oradata/ORCLCDB/pdbseed/temp012019-10-12_15-56-53-581-PM.dbf 37748736
/opt/oracle/oradata/ORCLCDB/ORCLPDB1/temp01.dbf 96468992
ORCLCDB> select member from v$logfile;
MEMBER
--------------------------------------------------------------------------------
/opt/oracle/oradata/ORCLCDB/redo03.log
/opt/oracle/oradata/ORCLCDB/redo02.log
/opt/oracle/oradata/ORCLCDB/redo01.log
ORCLCDB> select * from v$controlfile;
STATUS NAME IS_ BLOCK_SIZE FILE_SIZE_BLKS CON_ID
------- -------------------------------------------------- --- ---------- -------------- ----------
/opt/oracle/oradata/ORCLCDB/control01.ctl NO 16384 1142 0
/opt/oracle/oradata/ORCLCDB/control02.ctl NO 16384 1142 0
内存与进程架构:
$ ipcs -m
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 0 oracle 600 9138176 108
0x00000000 32769 oracle 600 1191182336 54
0x00000000 65538 oracle 600 7639040 54
0x43b375cc 98307 oracle 600 12288 54
$ ps -ef|grep ora_
oracle 1183 1 0 08:07 ? 00:00:00 ora_pmon_ORCLCDB
oracle 1185 1 0 08:07 ? 00:00:00 ora_clmn_ORCLCDB
oracle 1187 1 0 08:07 ? 00:00:02 ora_psp0_ORCLCDB
oracle 1189 1 1 08:07 ? 00:02:04 ora_vktm_ORCLCDB
oracle 1194 1 0 08:07 ? 00:00:00 ora_gen0_ORCLCDB
oracle 1196 1 0 08:07 ? 00:00:00 ora_mman_ORCLCDB
oracle 1200 1 0 08:07 ? 00:00:04 ora_gen1_ORCLCDB
oracle 1203 1 0 08:07 ? 00:00:00 ora_diag_ORCLCDB
oracle 1205 1 0 08:07 ? 00:00:00 ora_ofsd_ORCLCDB
oracle 1208 1 0 08:07 ? 00:00:13 ora_dbrm_ORCLCDB
oracle 1210 1 0 08:07 ? 00:00:32 ora_vkrm_ORCLCDB
oracle 1212 1 0 08:07 ? 00:00:00 ora_svcb_ORCLCDB
oracle 1214 1 0 08:07 ? 00:00:01 ora_pman_ORCLCDB
oracle 1217 1 0 08:07 ? 00:00:08 ora_dia0_ORCLCDB
oracle 1220 1 0 08:07 ? 00:00:01 ora_dbw0_ORCLCDB
oracle 1222 1 0 08:07 ? 00:00:00 ora_lgwr_ORCLCDB
oracle 1224 1 0 08:07 ? 00:00:05 ora_ckpt_ORCLCDB
oracle 1226 1 0 08:07 ? 00:00:00 ora_lg00_ORCLCDB
oracle 1228 1 0 08:07 ? 00:00:00 ora_smon_ORCLCDB
oracle 1230 1 0 08:07 ? 00:00:00 ora_lg01_ORCLCDB
oracle 1232 1 0 08:07 ? 00:00:01 ora_smco_ORCLCDB
oracle 1234 1 0 08:07 ? 00:00:00 ora_reco_ORCLCDB
oracle 1237 1 0 08:07 ? 00:00:00 ora_w000_ORCLCDB
oracle 1239 1 0 08:07 ? 00:00:00 ora_lreg_ORCLCDB
oracle 1241 1 0 08:07 ? 00:00:00 ora_w001_ORCLCDB
oracle 1243 1 0 08:07 ? 00:00:00 ora_pxmn_ORCLCDB
oracle 1247 1 0 08:07 ? 00:00:06 ora_mmon_ORCLCDB
oracle 1249 1 0 08:07 ? 00:00:03 ora_mmnl_ORCLCDB
oracle 1251 1 0 08:07 ? 00:00:00 ora_d000_ORCLCDB
oracle 1253 1 0 08:07 ? 00:00:00 ora_s000_ORCLCDB
oracle 1255 1 0 08:07 ? 00:00:00 ora_tmon_ORCLCDB
oracle 1327 1 0 08:07 ? 00:00:20 ora_m000_ORCLCDB
oracle 1976 1 0 08:07 ? 00:00:01 ora_p000_ORCLCDB
oracle 1980 1 0 08:07 ? 00:00:01 ora_p001_ORCLCDB
oracle 2022 1 0 08:07 ? 00:00:00 ora_tt00_ORCLCDB
oracle 2024 1 0 08:07 ? 00:00:00 ora_tt01_ORCLCDB
oracle 2033 1 0 08:07 ? 00:00:00 ora_tt02_ORCLCDB
oracle 2381 1 0 08:07 ? 00:00:00 ora_aqpc_ORCLCDB
oracle 2482 1 0 08:07 ? 00:00:01 ora_p002_ORCLCDB
oracle 2488 1 0 08:07 ? 00:00:01 ora_p003_ORCLCDB
oracle 2621 1 0 08:07 ? 00:00:00 ora_w002_ORCLCDB
oracle 3151 1 0 08:07 ? 00:00:00 ora_w003_ORCLCDB
oracle 3171 1 0 08:07 ? 00:00:27 ora_cjq0_ORCLCDB
oracle 3643 1 0 08:07 ? 00:00:00 ora_w004_ORCLCDB
oracle 3777 1 0 08:07 ? 00:00:14 ora_m001_ORCLCDB
oracle 3781 1 0 08:07 ? 00:00:15 ora_m002_ORCLCDB
oracle 3883 1 0 08:07 ? 00:00:00 ora_qm02_ORCLCDB
oracle 3898 1 0 08:07 ? 00:00:00 ora_q002_ORCLCDB
oracle 4511 1 0 08:08 ? 00:00:00 ora_q00h_ORCLCDB
oracle 5014 1 0 08:17 ? 00:00:00 ora_w005_ORCLCDB
oracle 5018 1 0 08:17 ? 00:00:00 ora_w006_ORCLCDB
oracle 5023 1 0 08:17 ? 00:00:00 ora_w007_ORCLCDB
oracle 6804 1 0 08:52 ? 00:00:11 ora_m004_ORCLCDB
oracle 7215 1 0 09:00 ? 00:00:11 ora_m003_ORCLCDB
oracle 13848 5258 0 11:12 pts/0 00:00:00 grep --color=auto ora_
解读内存结构
数据库示例包括共享内存,即SGA。SGA至少包括以下3个组件:
- 数据库buffer cache
- log buffer
- shared pool
实线为必须的组件。
数据库Buffer Cache
是执行SQL的区域。更新数据时,数据首先由磁盘拷贝到buffer cache,然后在buffer cache中修改。
查询数据时,也是通过buffer cache,如果不在其中,则由磁盘加载到buffer cache。目的是为了减少磁盘I/O,提升性能。数据会在buffer cache中存在一段时间,必要时会冲刷到磁盘,冲刷到磁盘后,仍可能位于buffer cache中。
数据更新的频度与写数据文件的频度无关。
Buffer cache的大小非常关键,如果太小会引起太多磁盘I/O,太多的话影响不大,通常只是启动慢些。
Buffer cache的大小在实例启动时指定,可动态调整。
Log Buffer
是change vectors写到redo log之前使用的小型的,短期的缓存区域。
change vector先写到log buffer而非磁盘,是为了提高速度,因为可以批量写盘。在commit时,log buffer会全部冲刷到磁盘,负责的后台进程为LGWR。注意,在commit时,DBWn什么都不做。
log buffer不大,通常几兆,使用默认就好。
log buffer的大小是静态的,在实例启动时指定,修改需要重启实例。
commit时的redo log写盘是同步的过程,因此用户会话会等待,这也是最主要的瓶颈。
DML操作的速度不会超过LGWR冲刷change vectors到redo log文件的速度。
Shared Pool
SGA中最复杂的。
这里重点谈3个。
Library Cache
存放最近执行的解析过(可执行)的代码, 包括SQL, PL/SQL和Java代码。
解析需要时间,因此重用Library Cache可提高性能。好的设计可以保证只需解析一次,后续执行千万次。
判读是否在Library Cache中,是通过SQL语句的ASCII比较。
data dictionary cache
存放最近使用的对象定义,包括表,索引,用户等各类元数据信息。可加快解析的速度。
SQL query and PL/SQL function result cache
缓存SQL和PL/SQL查询的结果集,如果表发生变化,会重新缓存。
规划Shared Pool
太小影响性能,太多搜索耗时太长。Shared Pool的大小在实例启动时指定,可动态调整。
Large Pool
可选。如果使用了 shared servers或parallel servers,则应配置。否则会使用Shared Pool中内存。
Java Pool
只有运行Java存储过程时需要。存Java对象,而非Java代码。
Streams Pool
Streams是从redo log中抽取change vector,重构SQL语句,并应用到目标数据库。
练习
ORCLCDB> show sga
Total System Global Area 1207955552 bytes
Fixed Size 9134176 bytes
Variable Size 402653184 bytes
Database Buffers 788529152 bytes
Redo Buffers 7639040 bytes
-- 上面命令的Database Buffers等于以下命令的DEFAULT buffer cache + Shared IO Pool
ORCLCDB> select component, current_size, min_size, max_size from v$sga_dynamic_components;
COMPONENT CURRENT_SIZE MIN_SIZE MAX_SIZE
------------------------------ ------------ ---------- ----------
shared pool 352321536 352321536 352321536
large pool 16777216 16777216 16777216
java pool 0 0 0
streams pool 33554432 33554432 33554432
unified pga pool 0 0 0
memoptimize buffer cache 0 0 0
DEFAULT buffer cache 721420288 721420288 721420288
KEEP buffer cache 0 0 0
RECYCLE buffer cache 0 0 0
DEFAULT 2K buffer cache 0 0 0
DEFAULT 4K buffer cache 0 0 0
DEFAULT 8K buffer cache 0 0 0
DEFAULT 16K buffer cache 0 0 0
DEFAULT 32K buffer cache 0 0 0
Shared IO Pool 67108864 67108864 67108864
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
20 rows selected.
-- PGA信息
ORCLCDB> select name, value from v$pgastat where name in ('maximum PGA allocated', 'total PGA allocated');
NAME VALUE
---------------------------------------------------------------- ----------
total PGA allocated 277111808
maximum PGA allocated 393135104
后台进程
后台进程的生命周期与实例一致。
最常用的是5个,完整列表参见这里:
- System Monitor (SMON)
- Process Monitor (PMON)
- Database Writer (DBWn)
- Log Writer (LGWR)
- Checkpoint Process (CKPT)
SMON - System Monitor
mount, open数据库,维护SCN及一些日常任务。
PMON - Process Monitor
PMON监控Server Process,在异常退出时完成清理等工作,如回退事务,释放内存等。
DBWn - Database Writer
定期将Database Buffer中的脏数据写到数据文件。可以有多个,默认每8CPU配置一个DBW。
并不是数据变脏后马上写盘,因为数据有可能再次被更新,写盘的条件包括:
- Database Buffer无空间
- 太多脏数据
- 每3秒
- Checkpoint
Checkpoint是刷新所有脏数据,其余的都只是部分。
自动的Checkpoint只在数据库关闭时发生,手工命令如下:
ORCLCDB> alter system checkpoint;
System altered.
LGWR - Log Writer
将log buffer中数据写到online redo log,即flushing。
以下会触发:GWR:
- commit
- 1/3 log buffer满
- DBWn写脏数据时,以保证未提交的事务可回退
server process接受到commit时,会在log buffer中插入一条commit记录,然后等待LGWR写盘完成,再返回到用户会话。这是一个同步的过程。
CKPT - Checkpoint Process
跟踪redo中Checkpoint的位置,Checkpoint位置是指在当实例Crash时,在redo中恢复开始的位置。
MMON - Manageability Monitor
定期(每小时,称为快照)将SGA中存放的统计信息存放到数据字典中,默认保存8天。并启动 Automatic Database Diagnostic Monitor (ADDM)。
MMNL - Manageability Monitor Light
是MMON的助手。
MMAN - Memory Manager
自动内存管理。
LREG - Listener Registration Process
实例会自动将自己注册到listener,然后用户可通过listener连到数据库。LREG还会更新性能和负载信息,以智能路由会话到实例。
ARCn - Archiver
归档redo log。online redo log的大小和数量是固定的。因此写满后会覆盖,这意味着online redo log只能保存最近的活动,为保持完整历史,online redo log在重用之前必须归档,ARCn正是此用途。
RECO - Recoverer Process
分布式事务是包含两个或以上数据库的事务。分布式事务通过Database Link操作。分布式事务需要两阶段提交。当两阶段提交失败时,RECO负责取消commit和恢复。
其它后台进程
单实例数据库典型的进程,每一个进程都有一行,如果地址不等于’00’,表示在运行:
ORCLCDB> select name, description from v$bgprocess where paddr <> '00' order by name;
NAME DESCRIPTION
----- ----------------------------------------------------------------
AQPC AQ Process Coord
CJQ0 Job Queue Coordinator
CKPT checkpoint
CLMN process cleanup
D000 Dispatchers
DBRM DataBase Resource Manager
DBW0 db writer process 0
DIA0 diagnosibility process 0
DIAG diagnosibility process
FENC IOServer fence monitor
GEN0 generic0
GEN1 generic1
LG00 Log Writer Slave
LG01 Log Writer Slave
LGWR Redo etc.
LREG Listener Registration
M000 MMON slave class 1
M001 MMON slave class 1
M002 MMON slave class 1
M003 MMON slave class 1
M004 MMON slave class 1
MMAN Memory Manager
MMNL Manageability Monitor Process 2
MMON Manageability Monitor Process
OFSD Oracle File Server BG
P000 Parallel query slave
P001 Parallel query slave
P002 Parallel query slave
P003 Parallel query slave
PMAN process manager
PMON process cleanup
PSP0 process spawner 0
PXMN PX Monitor
Q002 QMON MS
Q00H QMON MS
QM02 QMON MS
RECO distributed recovery
S000 Shared servers
SCMN
SCMN
SMCO Space Manager Process
SMON System Monitor Process
SVCB services background monitor
TMON Transport Monitor
TT00 Redo Transport
TT01 Redo Transport
TT02 Redo Transport
VKRM Virtual sKeduler for Resource Manager
VKTM Virtual Keeper of TiMe process
W000 space management slave pool
W001 space management slave pool
W002 space management slave pool
W003 space management slave pool
W004 space management slave pool
W005 space management slave pool
W006 space management slave pool
W007 space management slave pool
57 rows selected.
server process使用以下命令查看,此时我客户端有1个SQLDeveloper会话,服务器端有一个SQLPlus会话:
$ ps -ef|grep LOCAL
oracle 24027 1 0 15:29 ? 00:00:00 oracleORCLCDB (LOCAL=NO)
oracle 24374 1 2 15:35 ? 00:00:01 oracleORCLCDB (LOCAL=NO)
逻辑与物理存储的关系
逻辑数据存储为segment,segment有很多种,最典型的是table。segment物理存放于datafile,之间通过tablespace连接,映射关系存放于数据字典。
物理数据库结构
3类必备的物理文件包括控制文件,online redo log和datafile。可选的包括initialization parameter file, 口令文件, archive redo log files和log and trace files.
控制文件
一般几兆,但非常关键。控制文件只有一个,但有多份拷贝,最多8份,一般3份。其中包括关键数据库信息如online redo log文件和datafile的位置,以及数据库一致性信息,如时间戳,序列号等。
可控制控制文件的份数和存放位置。
Online Redo Log
存放按时序的change vector。如果datafile损坏,redo log可用于在备份文件上的重做。
online redo log文件至少两个,称为goup,以用于切换。group中的称为member,可以有多个。
group中一个称为当前group,当前group写满后会切换到下一group,每次切换产生一个归档文件。
group中member间的同步是自动的,我们需要考虑的是group的数量,member的大小。
member大小最小50M,与数据库负载有关。
Datafile
至少3个,用于SYSTEM(数据字典), SYSAUX和UNDO表空间。
server process读取datafile,DBWn写datafile。
因为数据库在OS之上,因此数据库的block应大于等于OS block。
数据库block(如果是table segment)中包含了行数据信息和锁信息。
其它数据库文件
- Instance parameter文件:实例启动唯一需要的文件,只有DB_NAME参数是必须的,其它都可使用默认值。
- password文件:数据库账户存于数据字典中,但数据库需打开才能访问。如果需要在数据库打开前访问数据库,就需要外部的password文件。
- archive redo log文件:不是数据库的一部分,可用于恢复数据库
- Alert log和trace文件:alert log记录关键事件,trace file由后台进程产生,记录错误和重要事件
逻辑数据库架构
使用segment来描述包含数据的结构。典型的segment类型包括table, index(快速定位行数据)和undo(用于回退)。
开发者关注逻辑架构,管理员关注物理架构,两者通过表空间(tablespace)衔接。表空间逻辑上由多个segment组成,物理上由多个datafile组成。
segment包含block, 连续的block组成extent。
数据字典
即元数据。包括数据库物理和逻辑架构,用户定义,安全信息,性能监控信息,一致性约束,对象定义等。存放于SYSTEM和SYSAUX表空间。
数据字典表在数据库创建时建立,不能直接访问,而是通过DDL语句访问。
CDB_, DBA_, ALL_或USER_前缀的表可访问数据字典。
表空间和数据文件的关系存放于controlfile中。
select tablespace_name, extent_id, bytes, file_id, block_id
from dba_extents where owner = 'HR' and segment_name = 'REGIONS';
TABLESPACE_NAME EXTENT_ID BYTES FILE_ID BLOCK_ID
------------------------------ ---------- ---------- ---------- ----------
USERS 0 65536 12 128
select name from v$datafile where file#=&file_id;
Enter value for file_id: 12
old 1: select name from v$datafile where file#=&file_id
new 1: select name from v$datafile where file#=12
NAME
--------------------------------------------------------------------------------
/opt/oracle/oradata/ORCLCDB/ORCLPDB1/users01.dbf
-- 寻找在文件中开始的位置
select block_size * &block_id from dba_tablespaces
2 where tablespace_name='&tablespace_name';
Enter value for block_id: 128
old 1: select block_size * &block_id from dba_tablespaces
new 1: select block_size * 128 from dba_tablespaces
Enter value for tablespace_name: USERS
old 2: where tablespace_name='&tablespace_name'
new 2: where tablespace_name='USERS'
BLOCK_SIZE*128
--------------
1048576
转载:https://blog.csdn.net/stevensxiao/article/details/102541647