对应图中的体系结构,
Oracle Server:database + Instance
Oracle内存结构:SGA( System Global Area) + PGA( Program Global Area) PGA为用户级别,每个用户/session独立,SGA为共享内存区
Database:data file + control file + redo log files,都存储在磁盘上
instance:SGA + background Process,通过触发Background Process来进行写脏块,生成检查点等动作
background Process :PMON + SMON + DBWR + LGWR + CKPT + Others
SGA:随着instance启动而分配的内存空间。instance down,SGA被释放。SGA为用户共享
Parameter Files:pfile(动态配置文件,数据库运行时修改,只有当前session生效)+spfile(静态配置文件,通过修改文件的方式修改,下次并持久生效)
SGA:Share Pool:Library Cache 存放最近的sql和其执行计划
Data Directory Cache 数据字典,存放数据库中内容信息,静态视图,如user_tab等
Database Buffer Cache :sql语句执行时设计的数据(sql执行时会与datafile磁盘进行I/O 操作读取数据,只有脏块会被写回磁盘)
Redo log Buffer:日志,DBbuffer Cache中的脏块还没有被写到磁盘中时,修改会记录在日志中。读取仍为旧数据
PGA:用户执行存储过程时,先使用PGA,不够在使用磁盘中的Temp表空间
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
background Process的触发条件:
DBWR:1.CKPT发生 2.脏块太多 3.db_buffer的空间不够 4.3秒一触发 5.表空间redo only / offline / backup等
LGWR:1.commit 2.三分之一满 3.1M满 4.先于DBWR写所写(日志先记录,脏块后写)5.3秒一触发(由先记后写的规则引发)
CKPT:督促DBWR写脏块,生成检查点。检查点发生,DBWR直接传导,LGWR间接传导
两种检查点:完全检查点(保证数据一致性)
增量检查点(不断更新控制文件中的检查点位置,当发生实例崩溃时,可以尽量缩短恢复时间)
Others:arcn:归档模式下,发生日志切换时,把当前日志写入归档日志。作为备份历史日志。 log->磁盘日志(当前日志-> achieved log)
( LGWR对当前日志写,arcn将当前日志写到归档日志中 )
MMON:Oracle自我见识和自我调整的支持进程(与AWR有关)
MMNL:MMON的辅助进程(与ASH有关)
MMAN:内存自动管理,10g后才有,11g中负责Oracle内存结构SGA+PGA的自动调整(Auto管理方式)
CJQN:和job队列有关
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
data file 分为表块和undo 块,PGA也分为表块和undo 块
使用undo块的情况为:roll back
读一致性,在commit之前,其他session读取undo块中的数据
实例恢复
闪回 flash back query / flash back table
data files对应表空间
表空间分为:PERMANENT永久表空间,UNDO表空间,TEMPORARY临时表空间
表空间中的存储单位为:SEGMENT->EXTENT->BLOCK
——————————————————————————————————————————
以BLOCK为例列举结构:
BLOCK :block header :ITL:事务槽
initrans:初始化事务槽个数
maxtrans:最大事务槽个数
free space
data
(标准块8k,支持2~32k)
———————————————————————————————————————————
ITL: 可以有多个ITL以支持并发事务。当一个事务要更新数据块中数据时,必须先得到一个ITL槽,然后将当前事务ID和事务所用的undo数据块地址,SCN号,当前事务是否提交等信息写到ITL槽中
initrans:对于不同的模式对象(表默认1,index默认2)
maxtrans:默认255
==================================================================================
表空间,SEGMENT, EXTENT, BLOCK 的管理方式
表空间:段管理 AUTO
MANUAL
区管理 Local
SEGMENT:AUTO( ASSM ) --采用位图管理段, 创建表空间为Local管理方式
MANUAL( MSSM ) --采用FREE List(空闲列表)管理段
EXTENT:字典管理 --已废除
本地管理 Local
BLOCK:AUTO (ASSM ) --创建表空间为本地管理方式,且段的存储空间方式为Auto(ASSM)
MANUAL( MSSM )
管理方式可以在创建表空间是或建立数据库的模式对象(表,索引)中设置,模式对象中设置的优先级高于表空间设置,如果都未设置管理方式,则使用自动管理方式
位图管理方式:每个段/区 的段/ 区头都有一组位图(5个位图),位图描述了每个块/区的满度
5个位图分别对应:1.满块,2. 75%~100% 3. 50% ~75% 4. 25%~ 50% 5. 0%~25%
MSSM管理(FREELIST空闲列表方式)维护三个链表freelist,pctfree,pctused
freelist:空闲列表,登记了可以插入数据的可用块,在段头
pctfree:一个块的保留空间百分比临界值,当一个块中的保留空间百分比 < pctfree时,则视为此块已满,将其从freelist中删除
pctused:一个块的使用水位百分比临界值,当使用百分比 < pctused 时,视为此块仍可插入数据,将此块恢复至freelist 中
pctfree 和 pctused 控制了可用存储区的大小,避免了行迁移 / 行链接,缩短了I/O时间
当一行数据大于块大小时会发生两种情况:1.行链接,2.行迁移
行链接 是指表中的一行数据,由于数据量过大,而存储在多个块中的情况
行迁移 是指在update时由于空间限制由原块迁移到新的数据块(有足够空间的数据块)中。
行迁移发生时,在原数据块中仍保留指针指向新的数据块,index中的Rowid也不做改变,通过原数据块中的指针寻找到新的数据块
行链接和行迁移的出现情况未确认(store时行链接?update时行迁移?),暂时确认行迁移只发生在update时