存储概念 - 物理概念及逻辑概念
物理概念: 数据文件,控制文件,联机日志文件 等
逻辑概念: 表空间(tablespace), 段(segment), 区间(extent), 数据块(block)
Tablespace : 可以细分为更小的逻辑概念segment, segment可以跨多个数据文件。
Segment : 可以细分为更小的逻辑概念extent, 典型的segment是table, index 等。
Extent : 一个extent 不能跨多个数据文件,它是一个逻辑上连续的空间,Segment一次扩展
或收缩的最小单位就是extent . extent最终被细分为最小的逻辑单位block, extent
由多个连续的block组成。
6.1 表空间
分为系统表空间及非系统表空间
system tablespace : 在建库的时候就创建的表空间,包含数据字典信息。
non-system tablesapce : 用户数据 + 临时数据 + undo 数据
一般我们根据业务逻辑来为DB划分表空间,然后根据表的大小再次划分,比如
sales_large_tbs, sales_middle_tbs, sales_small_tbs 。
6.1.1 表空间的空间管理
表空间的空间管理是指对表空间中的segment的扩展和收缩进行管理,segment的扩张和
收缩的最小单位是extent, 所以表空间的空间管理也就是如何管理extent的分配和释放。
管理方式: 数据字典管理(DMT) 和 本地管理(LMT) .
数据字典管理(DMT): 用数据字典表FET$(Free Extent)和UET$(Used Extent)来管理extent的
扩张和收缩。 FET$记录tablespace中的可用空间,UET$记录表空间中已经分配的空间。
FET$字典表: 记录TS#, FILE#, BLK#, LENGTH
UET$字典表: 每个EXTENT占一条记录,记录EXTENT所在的TS,datafile,extent第一个blk#号,
以及extent长度。
DMT数据字典管理的方式就是通过这两个table之间转移数据行来实现的。
建立一个Tablespace TBS1, 那么在FET$会增加一条记录:
TS# File# Blk# Length
20 28 1 50
然后在其中建一个表,假设这个表定义的extent=8 block, 那么需要更新FET$
(表示后面的block分配由blk# 9 开始,8个块分配了,只有42个block free):
TS# File# Blk# Length
20 28 9 42
由于占用了extent,这时还需要更新UET$表,我们使用8个block生成了一个extent, 则
blk# 号码由1开始,长度为8 block :
EXT# TS# File# Blk# Length
100 20 28 1 8
删除数据后FET$及UET$的变化:
假设当前FET$ 为:
TS# File# Blk# Length
20 28 48 2
当前的UET$为:
EXT# TS# File# Blk# Length
100 20 28 1 8
101 20 28 9 12
用户删除一个表T1, 导致T1第一个extent即100号extent被释放了,那么:
FET$更新为:
TS# File# Blk# Length
20 28 48 2
20 28 1 8
UET#更新为:
EXT# TS# File# Blk# Length
101 20 28 9 12
假设用户又删除一个表T2, 导致T1第一个extent即101号extent被释放了,那么:
UET$表的101号extent记录被删除。
FET$更新为:
TS# File# Blk# Length
20 28 48 2
20 28 1 8
20 28 9 12
SMON负责定期合并这种相邻可用空间,所以FET$更新为:
TS# File# Blk# Length
20 28 48 2
20 28 1 20
字典管理的问题
A. 当用户进程对表DML操作需要空间时,Oracle会产生很多递归的SQL,来完成FET$及UET$的更新。
B. 对FET$及UET$的DML产生很多事务,会引起锁定,多个进程都要求扩展extent, 如果都需要
更新FET$中的相同记录,那么会引起锁定等待 。
C. 对FET$及UET$的更新操作会引起undo及redo 。
D. SMON要定期合并相邻的FET$中记录的可用空间,会消耗一定资源 。
要解决以上问题,Oracle引入了LMT: LMT不再使用FET$和UET$
LMT : 本地管理表空间,不使用FET$及UET$, 而是在表空间的数据文件头部选出6个block(从第
3个block到第8个block), 在其中存放bitmap来管理extent的分配及释放。
数据文件头部的bitmap由多个bit组成,比如 11001010001100111001000001,每个bit位对应一个extent,
或者多个bit位对应一个extent(因为有时一个extent过大)。 当进程需要extent时,只需要扫描文件
头部的bitmap, 找到0位,分配bit位对应的可用空间,更新bit值为1,删除extent则相反。
LMT的优点: 克服了DMT的缺点,没有递归SQL,只需要更新文件头部,无事务,速度快,没有锁及undo,
redo, 且不存在合并空间的问题。 Oracle9i开始需要创建LMT,而不是DMT .
10g数据文件头中会有64K的空间用来存放bitmap,其他空间都可用,所以我们在建立数据文件大小
的时候,需要在uniform. size 整数倍的前提下再加入这64K的大小,以免浪费空间 。
---------------------------------------------------------------------------------------
备注:
The locally-managed (bitmapped) tablespace (LMT) file has the following structure:
1、File header: 1 block
2、Bitmapped file space header: 1 block
3、Head portion of bitmap blocks: N blocks
4、Useful file blocks: U units (A unit is a number of blocks.)
5、Tail portion of bitmap blocks: M blocks
If a Unit = B blocks, then the total file size = 1 + 1 + N + U*B +M.
The operating system file allocated will in some cases be file size + 1 block for
the OS header.
---------------------------------------------------------------------------------------
6.1.2 创建和管理表空间
- DMT, LMT
- Permanent , Temporary(能被覆盖,关闭DB后删除)
临时表空间: 用户在对Data进行排序的时候,会先在PGA里完成,如果排序Data太多,PGA内存
不足,则Oracle会将要排序的data分割成多份,只取一份放在PGA中排序,其他部分都交换到临时
表空间中。当PGA中的部分排序完毕后,将排好序的部分数据交换到临时表空间中,同时再从临时
表空间中取一份没有排序的数据放到PGA里面进行排序,依此类推,直到将所有数据都排序完毕
为止 。
如果没有为数据库指定一个临时表空间,同时在创建用户时也没有明确指定其默认的临时表空间,
则会使用系统表空间作为该用户的临时表空间。DBCA会自动为数据库创建一个temp临时表空间。
- 表空间的各种状态
可以通过 select tablespace_name,status from dba_tablespaces; 查看表空间的各种状态。
可以通过 alter tablespace tbs_name offline/online/read only/read write; 修改状态。
例子:
CREATE TABLESPACE SYSAUX DATAFILE
'/ocfs_data/mxdell/sysaux01.dbf' SIZE 2028M AUTOEXTEND ON NEXT 1024M MAXSIZE 4096M,
'/ocfs_data/mxdell/sysaux02.dbf' SIZE 2025M AUTOEXTEND OFF
LOGGING
ONLINE
PERMANENT
EXTENT MANAGEMENT LOCAL AUTOALLOCATE
BLOCKSIZE 16K
SEGMENT SPACE MANAGEMENT AUTO
FLASHBACK ON;
CREATE TABLESPACE LOG_DATA DATAFILE
'/ocfs_data/mxdell/log_data01.dbf' SIZE 4001M AUTOEXTEND ON NEXT 2048M MAXSIZE 10240M,
'/ocfs_data/mxdell/log_data02.dbf' SIZE 4001M AUTOEXTEND OFF
LOGGING
ONLINE
PERMANENT
EXTENT MANAGEMENT LOCAL UNIFORM. SIZE 20M
BLOCKSIZE 16K
SEGMENT SPACE MANAGEMENT AUTO
FLASHBACK ON;
Read Write - 可以进行读写操作的表空间 。
Read Only - 只读表空间中的数据不能被修改,但是表可以被drop,因为删除一个表只是更新
系统tablespace中的数据字典,在数据字典中将该表的定义信息删除而已,并不实际地删除
该表包含的数据。
Offline - 离线状态,不能读写,系统表空间,默认temp空间及undo都不能置为offline .
Bigfile tablespace: Oracle10g时被引入,大文件表空间,只能包含一个数据文件,设置它的
最大好处就是减少了数据文件数量,简化了datafile的管理,根据block大小的不同,它的大小
可以达到8TB .
Smallfile tablespace: 创建表空间的时候默认就是smallfile,可以创建多个文件。
Storage(tablespace) : extent有自动扩展(AUTOALLOCATE),有uniform. size(同样大小)。
自动扩展的规律如下:
Oracle9i 下:
0-15 extents 每个大小是64K 合计大小 1M
16-79 extents 每个大小是1M 合计大小 63M --以上两项大小合计 64M
80-199 extents 每个大小是8M 合计大小 960M --以上三项大小合计 1024M=1G
200-? extents 每个大小是64M
Oracle10g下有变化 :
extent0 ~127= 8M 总大小 128×8M=1G
extent 128=64M 当segment的大小大于1G时,oracle开始分配64M的extents。
如何规划表空间: 一般是根据业务逻辑划分,然后再根据数据量大小来分。
Segment Space Manangement - 该选项从Oracle9i 开始引入,管理如何选择可用block.
a. Manual : Oracle9i之前,只能以手工设定参数方式来确定哪个block可以用来插入数据。
freelist(可用链表)指定了所有可用于insert操作的数据块的列表,管理HWM(高水位)线以下
的空闲空间。主要Storage参数有pctused, pctfree 等。
segment上的可用空间分为两种,一种是已经分配给segment的,在HWM上未被使用的空闲空间;
第二种是在HWM下连接在freelist上的空闲空间。
Freelist存储在每个segment的header block中,freelist中挂的都是可用来插入数据的block,
freelist的起点记录在segment header的第一个block中,当操作插入数据需要可用block时,
先锁定segment的header(多少数据块?), 然后在freelist中查找有足够空间的可用block,找到
后将data插入,最后释放segment header的锁定。
pctused/pctfree - 用于控制数据块可用与否。默认情况下pctfree=10, pctused=40, 当freelist
中某可用block不断插入数据,如果block剩余空间只有10%的时候,该block被从freelist中摘除,
不能再用于insert 数据,剩余的10%空间用于update操作中的字段长度扩展。 当删除某个非
freelist中的数据block中的data,使该block中已经使用的空间小于pctused的值(比如40%),那么
该block会被再次挂到freelist中(用户数据插入)。
当某个segment并发插入比较严重时,由于搜索freelist只能由一个进程锁定segment header,
其他进程必须等待,从而出现争用现象。
Automatic - ASSM (Auto Segment Space Manangement), 自动段空间管理
ASSM在9i中被引入,Oracle引入bitmap blocks来管理block, 他们与data block一起分布在
整个segment中,结构类似树状index 。
注意: ASSM必须在本地管理表空间(LMT)中才能使用。
ASSM结构 - bitmap block组织,一共三个层级,第一级类似index里的叶子节点,其中含有
block地址和每个块的使用状态;第二级类似index的分支节点,其中包含第一级bitmap块
的地址;第三级则类似根节点,包含第二级BMB(bitmap block)块地址。
Oracle ASSM三级位图块结构详见:
http://www.eygle.com/archives/2007/07/oracle_assm_level3_bmb.html
数据库块的使用状态分为六个等级:unformated(未格式化block), <25%(block可用空间小于
25%),25%~50%, 50%~75%,75%~100%, full(无可用空间)。
当服务器进程需找可用数据块来插入数据时,只需根据各个层级bitmap block的关联关系,找
到第一级(叶子节点)BMB即可。因此,服务器进程根据插入data大小来判断用哪个block,假设
当前的插入需要1KB (block大小为8K), 则表示需要12.5%的block大小空间(1/8), 于是在叶子
BMB块中找一个可用空间百分比大于12.5%的block即可,插入完成后,把被插入的数据块剩余
的可用空间状态信息更新到BMB块中对应的条目。
- 引入ASSM后,用BMB而不是freelist ,因此多个进程可同时使用多个BMB并行插入,防止了
freelist中对segment header的争用等待,Oracle建议用ASSM 。
- 在ASSM表空间里创建segment时,只能指定pctfree, 而pctused及freelist被忽略,pctused
被6个等级的block代替。
四种设置表空间offline的方式:
A. Normal - offline之前,被操作表空间对应的数据文件必须出于online状态,Oracle对
该表空间所有文件做checkpoint, 将对应的dirty data全写入datafile, 这样方式的offline,
表空间数据没有损失,下次online时不需恢复。
B. Immediate - 立即offline, 不为表空间的任何文件做checkpoint, 通常在tablespace对
应的datafile 全丢失或损坏的情况下采用这种模式,Oracle不会发出文件级别的ckpt, 所有
dirty data都不写入,这种方式offline的tbs 数据会被损坏,下次online的时需要恢复。
C. Temporary - 为所有在线文件做checkpoint, 通常在tablespace 对应的datafile没有完全
丢失或损坏的情况下采用,Oracle发出ckpt, dirty data能写入的即写入,不能写入就不写入 。
下次online的时候需要恢复。
系统及非系统表空间datafile转移方式:
系统表空间 -
A. shutdown immediate ;
B. startup mount;
C. cp /u01/system01.dbf /u02/system01.dbf
D. alter database rename datafile '....' to '....' ;
E. alter database open ;
非系统表空间 -
A. alter tablespace exam offline ;
B. cp /u01/exam01.dbf /u02/exam01.dbf
C. alter tablespace exam rename datafile '/u01/exam.dbf' to '/u02/exam.dbf' ;
D. alter tablespace exam online ;
6.1.3 临时表空间和临时表空间组
- Create temporary tablespace temp tempfile '/u01/temp01.dbf' ..... ;
6.1.4 非默认数据块大小的表空间
- db_2k_cache_size , db_16k_cache_size ...
6.2 联机日志文件
将数据库里所有数据块的变化记录下来,记录下来的变化叫做重做记录(redo record).注意这里
强调的是数据块的变化,而不是数据的变化,修改数据块的头部的标记信息时,也会产生重做记
录。
例如: 下面的一行代表log buffer中的一个重做记录
(update redo_test set name='CDF' where id=1)
行号 事务ID File# Block# row column value
1 T1 2 18 - - ABC --- 回滚段数据块
1 T1 4 111 1 2 CDF --- 表的数据块
以上重做条目先在log buffer中产生,当出现某种触发时间(比如达到1m或用户commit),唤醒
LGWR进程,将重做条目刷新到联机日志文件中,它的写入都是向前的顺序写,不像datafile
随机的写。由于顺序写入,不需要寻找空闲块等,所以LGWR写入redo file的速度会相对快。
联机日志文件存在的主要目的就是为了将数据库恢复到历史上的任何一个时间点。
联机日志文件切换的过程
A. 从controlfile中得到下一个可用的联机日志文件;
B. 在控制文件中记录写入当前redo log最后一个日志块的SCN(hing SCN), 关闭当前redo logfile;
C. 增加SCN, 修改controlfile,将下一个redo logfile标记为current, 判断前一个redo file里
包含的redo record 对应的dirty data是否已经写入datafile, 如果没有则标记为active, 如果有
写入datafile则标记为inactive , 若数据库为归档模式,那么lgwr后台进程将前一个redo file加
入到归档列表中,并唤醒ARCn进程进行归档 。
D. 打开新的redo logfile(如果是多组,则打开多组中的所有成员),记录当前log sequence和第一个
日志块的SCN(Low SCN),开始新一轮的重做记录。
联机日志文件online redo logfile的几种状态:
current/active/inactive/unused/clearing/clearing_current
active 状态: 该日志文件中包含有redo record 对应的dirty block还没有被写入datafile中,为
什么会出现这种状态呢? 由于redo logfile是active,说明日志已经切换到其他日志组上(状态为
current),日志切换的时候会触发增量检查点(incremental checkpoint), CKPT会触发DBWR写dirty
block, 不过注意,增量检查点只是在控制文件中记录当前检查点队列中dirty block在第一次修改时
对应的日志块在日志文件中的地址(检查点位置),DBWR启动并不表示立即写dirty block,除非检查
点队列中dirty block的数量达到一定程度或超过一定时间,active状态和归档无直接关系,可能已经
归档或还没有归档。
备注: 检查点队列上串起来的都是脏块对应的buffer cache, 启动dbwr后。进程会根据一些列
参数及规则, 计算出应该写的dirty block的数量(不是所有的dirty block)。
DBWR启动并不表示立即写dirty block的原因 --------
alter system checkpoint ; 手工触发完全检查点。
完全检查点优先级高,通过它触发的DBWR会立即写dirty block; 而增量检查点触发的DBWR启动的
条件的优先级低,DBWR不会立即写dirty block, 而是要等一段时间才实际写 。
- 我们可以设置log_checkpoint_to_alert为true,将检查点启动和结束的时间记录到trace文件中。
- lgwr写redo record 重做记录时,以组为单位,并行写入组里所有日志成员 。
- 强制切换日志 : alter system switch logfile;
6.2.2 管理日志文件
clear logfile - 清除指定的日志文件,在日志文件组有丢失或损坏部分成员时,可以清除该
日志文件组,Oracle会自动创建丢失或损坏的成员,被清除的文件组状态必须是inactive .
比如: alter database clear logfile group 3 ;
sizing advicor - 10g引入的顾问,帮组我们确定最佳redo logfile的大小,我们需要先设置
初始化参数; fast_start_mttr_target ,才能使用顾问,也可以查询v$instance_recovery中
的optimal_logfile_size 列 .
6.3 OMF : Oracle管理文件
OMF与非OMF可以同时存在。相关参数: db_create_online_dest_n , db_recovery_file_des 定义
快速闪回区 ,备份时如果没有指定文件所在地,备份文件会被放在快速闪回区中。
6.4 数据块的结构
数据块头部记录了当前数据块所属的segment类型(index或table), block地址,最重要的信息时ITL
(interested transaction list), 定义table时,inittrans,maxtrans指定ITL槽的初始及最大数。
当一个事务要更新block中的数据时,必须先在block的头部获取一个可用的ITL槽 ,然后将当前事务
ID, 事务使用到的undo块的地址,scn号及当前事务是否提交等信息注册到ITL槽,ITL槽可以重复
使用,但是只有当事务提交或回滚后,该ITL才能被复用; 如果ITL槽都在被使用,且事务需要使用,
则会动态创建一个新的ITL槽。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/35489/viewspace-672905/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/35489/viewspace-672905/
本文详细介绍了Oracle数据库的存储概念,包括物理概念如数据文件、控制文件和联机日志文件,以及逻辑概念如表空间、段、区间和数据块。深入探讨了表空间的空间管理方式、临时表空间的作用、联机日志文件的功能及其状态转换过程。
1万+

被折叠的 条评论
为什么被折叠?



