小言_互联网的博客

OCA/OCP Oracle 数据库12c考试指南读书笔记:第12章: Architectural Overview of Oracle Database 12c

329人阅读  评论(0)

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 ArchitecturePDF

分布式系统架构

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个组件:

  1. 数据库buffer cache
  2. log buffer
  3. 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个,完整列表参见这里

  1. System Monitor (SMON)
  2. Process Monitor (PMON)
  3. Database Writer (DBWn)
  4. Log Writer (LGWR)
  5. Checkpoint Process (CKPT)

SMON - System Monitor

mount, open数据库,维护SCN及一些日常任务。

PMON - Process Monitor

PMON监控Server Process,在异常退出时完成清理等工作,如回退事务,释放内存等。

DBWn - Database Writer

定期将Database Buffer中的脏数据写到数据文件。可以有多个,默认每8CPU配置一个DBW。
并不是数据变脏后马上写盘,因为数据有可能再次被更新,写盘的条件包括:

  1. Database Buffer无空间
  2. 太多脏数据
  3. 每3秒
  4. Checkpoint

Checkpoint是刷新所有脏数据,其余的都只是部分。
自动的Checkpoint只在数据库关闭时发生,手工命令如下:

ORCLCDB> alter system checkpoint;

System altered.

LGWR - Log Writer

将log buffer中数据写到online redo log,即flushing。
以下会触发:GWR:

  1. commit
  2. 1/3 log buffer满
  3. 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)中包含了行数据信息和锁信息。

其它数据库文件

  1. Instance parameter文件:实例启动唯一需要的文件,只有DB_NAME参数是必须的,其它都可使用默认值。
  2. password文件:数据库账户存于数据字典中,但数据库需打开才能访问。如果需要在数据库打开前访问数据库,就需要外部的password文件。
  3. archive redo log文件:不是数据库的一部分,可用于恢复数据库
  4. 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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场