oracle 空间管理
表空间管理
•区(extent)的管理方式
Ølocal
Ødictionary
•段(segment)的管理方式
Øauto
Ømanual
区(EXTENT)的管理方式
•数据字典管理方式(DMT)
ØFET$:记录空闲区的使用情况
ØUET$:记录已使用区的使用情况
•本地管理方式(LMT)
ØAUTOALLOCATE:让Oracle来决定每个段的区大小,同一个段中的区大小可以不同
ØUNIFORM:可以详细指定每个区的大小,若不加指定,则为每个区默认使用1MB的大小。
•本地表空间管理的优点
Ø避免了数据字典管理的递归空间操作
Ø避免了在基表FET$、UET$中写入区信息,从而减少了数据字典表的竞争
Ø避免了字典表空间中一直让人头疼的碎片问题
Ø段的区数量对性能影响不大
Ø不需要去考虑最佳的INITIAL、NEXT、PACTINCREATE和MAXEXTENTS等STORAGE参数
段(SEGMENT)的管理方式
•手动段管理方式
Ø主要用FREE LIST、FREELIST GROUPS、PCTUSED和其他参数来控制如何分配、使用和重用段中的数据块
ØFREE LIST存储于段头中,默认情况下每个段的FREE LIST为1
•自动段管理方式
•使用位图块管理段中的数据块状态
•L3 BMB称为根节点,L2 BMB称为枝节点,L1 BMB称为叶节点
•忽略参数PCTUSED、NEXT、FREELISTS和FREELIST GROUPS指定的值
•从Oracle 10g开始,MAXTRANS参数也会被忽略,即所有段的MAXTRANS都是255
•ASSM中位图块结构图
提示:L1 BMB直接管理数据块,当数据块空间变化频繁时,L1 BMB的状态位也会发生相应的变化。极端情况下容易引起争用。
临时段管理
•临时段可以存放在如下表空间中:
Ø临时表空间:主要用于排序,当排序操作无法在内存中完成时,Oracle就会使用到它
Ø永久表空间:在创建对象(如表格、索引)的过程中临时使用。创建完成后由SMON进程负责清理永久表空间中的临时段
•产生临时段的场景
Ø创建索引时。
Ø在SELECT语句中有ORDER BY或者GROUP BY选项的情况下。
Ø在SELECT 语句中有DISTINCT关键字的情况下。
Ø有UNION、INTERSECT或者MINUS操作的情况下。
Ø使用Sort-Merge的表连接方式时。
Ø使用Analyze命令时。
Ø
•临时表空间中临时段的使用与释放
(1)进程获得SORT EXTENT POOL LATCH
(2)从SORT EXTENT POOL中分配空闲的EXTENT
Ø如果找不到可用的EXTENT,则从临时表空间分配新的空间
Ø如果临时表空间空间不足,则出现ORA-01652错误
(3)将EXTENT标注为可用状态
(4)排序操作完成
(5)进程需要再次获得SORT EXTENT POOL LATCH
(6)将使用过的EXTENT标记为FREE状态
(7)释放SORT EXTENT POOL LATCH
提示:基于性能上的考虑,新的临时段算法在分配临时段时采用“只分配不释放”的原则。
•永久表空间中临时段的使用和释放
Ø在创建对象的过程中,会在永久表空间中创建临时段,创建完成之后,则会将临时段转换成其他类型的段。
Ø如果创建过程中发生异常,将由SMON进程负责清理遗留的临时段。在清理过程中可能会发生错误,从而导致清理失败
提示:在极端的情况下,数据库启动时可能会由于SMON无法对临时段进行清理而导致数据库启动失败,可以通过设置10061 EVENT来屏蔽SMON对临时段的清理
•临时文件与稀疏文件
Ø创建临时表空间时Oracle会使用稀疏文件来创建
Ø在创建过程中稀疏文件并不会真正格式化临时文件,而是只占用一小部分的操作系统空间
注意:临时文件创建之初使用ls命令查看到的所占用空间大小其实是假象
•临时表和REDO日志
Ø在临时表空间中,临时表本身的操作不会记录REDO日志,因此,在数据处理过程中将中间表创建成临时表可以加快数据处理速度
Ø临时表中数据的改变会有UNDO记录(其目的是为了能够回滚临时表所做的改变)。由于UNDO变化会产生REDO日志,所以会生成临时表的REDO日志
回滚段管理
•自动管理
•手动管理
•回滚段自动管理的方式下,DBA要做的工作很简单,其步骤如下所示:
(1)创建UNDO类型的表空间,并分配足够大小的空间。
(2)设置UNDO相关参数(如undo_retention和undo_tablespace等)。
创建完回滚段之后可以自动完成如下工作:
Ø SMON进程根据UNDO表空间的空间大小和事务的并发度及大小自动创建、ONLINE、OFFLINE、SHRINK回滚段
Ø自动命名回滚段的名字,不同版本的回滚段其命名方式有所不同
Ø 根据参数undo_retention值自动设置UNDO区的状态
提示:创建、ONLINE和OFFLINE回滚段时,服务器或者后台进程都需要获得US锁,因此,在获得US锁的过程中总发生争用,这可能会引起enq: US – contention等待
•手动设置回滚段数量时我们建议:
Ø对于OLTP系统,每个回滚段至少平均分配10个活动事务。
Ø对于批处理系统,每个回滚段至少平均分配1个活动事务。
Ø设置每个回滚段的OPTIMAL SIZE。
•UNDO_RETENTION参数
Ø对于自动扩展的UNDO 表空间,Oracle会根据UNDO_RETENTION参数设定的阀值尽可能地保留UNDO 信息
Ø对于自动扩展关闭的UNDO表空间,会忽略UNDO_RETENTION参数设定的阀值,根据UNDO表空间的大小和使用率来自动调整UNDO信息的保留时间
•估算UNDO表空间的大小:
UndoSpace = UR * (UPS * DBS)
ØUR表示UNDO_RETENTION参数,以秒为单位
ØUPS表示业务高峰期每秒产生的回滚数据块数
ØDBS表示UNDO表空间所在的数据块大小
SQL> SELECT (UR * (UPS * DBS)) AS "Bytes"
FROM (SELECT value AS UR FROM v$parameter
WHERE name = 'undo_retention'),
(SELECT undoblks/((end_time-begin_time)*86400) AS UPS
FROM v$undostat
WHERE undoblks = (SELECT MAX(undoblks) FROM v$undostat)),
(SELECT block_size AS DBS
FROM dba_tablespaces
WHERE tablespace_name = (SELECT UPPER(value) FROM v$parameter WHERE name = 'undo_tablespace'));
•维护表空间的注意事项
Ø注意表空间级的NOLOGGING属性
Ø添加表空间会消耗大量的I/O资源
ØI/O资源紧张时,可以在线将UNDO表空间切换至其他存储中,从而减轻原存储的压力
Ø控制文件重建之后,不要忘记重建TEMP表空间
Ø对临时表空间和UNDO表空间设置一个最大阀值,否则容易导致自动扩展过大
Ø表空间进行RMAN备份、BEGIN BACKUP(Oracle 10g中)、READ ONLY、OFFLINE时会触发表空间级的CHECKPOINT
Ø删除表空间之前先OFFLINE表空间可能更为保险
Ø从空间管理和性能上考虑,建议不要将表格和索引放在同一个表空间中
Ødrop tablespace
Ø如果回收站存在太多对象,查询数据字典DBA_FREE_SPACE可能会非常缓慢(recyclebin$是组成DBA_FREE_SPACE的基表之一)
Ø最好有专门的表空间用于存储STATSPACK报告
Ø务必定期物理备份SYSTEM表空间,当数据库因基表损坏无法启动时,备份的SYSTEM表空间将会发挥重要作用
Ø原则上SYSTEM表空间内不应该存放业务数据
Ø在Oracle 11G R2版本中,参数audit_trail默认设置为DB级别
数据文件管理
•裸设备头上的保留信息:
提示:在AIX系统中,不同的VG类型,裸设备头偏移量的值不同
Ø Original Volume Group:带有4k
Ø Big Volume Group:使用-T O,则无4k
Ø Scalable Volume Group:无4k
可以使用dbfsize查看观察裸设备是否有4kB偏移量
•维护数据文件的注意事项
ØRAC系统中添加数据文件时注意两边权限一致
Ø在RAC系统中,添加数据文件时不要将其添加到本地文件系统中
Ø单个数据文件不宜过大
Ø注意数据文件的大小限制
ØOracle 10g以上系统中,注意单个数据文件使用率不用过高
Ø不要在业务高峰期添加数据文件。如果添加数据文件的会话挂起,不要随意KILL、Ctrl+C或硬性重启数据库。
Ø在添加数据文件时,数据文件名后不要带上空格,在操作系统中该空格很难显示,容易引起误操作。
Ø临时文件的信息记录在控制文件中,重建控制文件时不要忘记添加临时文件
Ø如果将数据文件放在不同的文件系统上,那么数据文件的名字最好互不相同。
Ø应有意识地避免在热点盘中添加数据文件
Ø在单位时间内,由于外磁道读取效率比内磁道高,一般建议数据文件存放在磁盘的外磁道上
在线日志文件管理
•维护日志文件的注意事项
Ø预计系统会产生比较多的日志量前(如DML、创建索引、逻辑导入),需要评估在线日志大小
Ø可以设置参数archive_lag_target保证在线日志的切换频率
Ø使用RESETLOGS选项打开数据库时,服务器进程会重新格式化所有的在线日志文件
Ø如果日志文件存放在存储上且存储级别做了镜像,那么为了避免不必要的I/O,可以不设置LOGFILE MEMBER
Ø如果有条件,建议将LOGFILE 放置在独立的存储系统中
归档日志管理
•准确评估系统的归档日志大小的应用场景:
Ø预估存放归档日志的空间大小时。
Ø预估备份恢复需要的时间时。
Ø搭建Golden Gate、Dataguard、Stream时。
•开启归档模式的注意点
Ø开启归档模式之前需要评估是否有足够空间存储归档日志
Ø数据库开启归档模式之后,要时刻关注归档目录的空间使用情况。
ØRMAN命令删除归档日志时会调用服务器进程更新控制文件,在业务高峰期间容易导致enq:CF-contention争用。
Ø在RAC系统中,个人倾向于将归档日志存储在本地文件系统中。为了便于备份和恢复,可以将归档目录在节点间通过NFS 互相挂载
ØOracle 9i版本的数据库在开启归档模式时还需要设置参数log_archive_start为TRUE,即启用自动归档。
Ø开启归档模式,会加大系统I/O压力。
•开启归档模式的好处
Ø数据库可以进行在线物理热备份。
Ø可以在Oracle上面部署基于归档日志应用的产品,如Golden Gate、Dataguard、Stream等
Ø表数据被误删除,可以使用LOGMNR工具挖掘归档日志,从而定位跟踪误删除的对象、SQL语句等信息
Ø如果数据文件被误删除,即使该数据文件没有备份依然可以将其重新恢复回来
闪回日志管理
•数据库级别的闪回分3种:
Ø数据库打开闪回模式
Ø创建普通闪回点
Ø创建强制闪回点
•当闪回空间紧张时,建议用以下方法删除闪回日志:
Ø关闭数据库闪回
Ø删除部分闪回点
Ø通过缩小数据库参数db_flashback_retention_target和db_recovery_file_dest_size的值间接删除闪回日志
注意:生产库打开闪回之前需要仔细评估闪回带来的I/O影响。如果闪回日志生成过快或者存在Oracle BUG,可能会引起FLASHBACK BUF FREE BY RVWR等待事件,进而会导致数据库性能缓慢。
控制文件管理
•维护控制文件的注意事项
Ø控制文件不要建立在I/O紧张的磁盘上
Ø除了CKPT、LGWR、ARCH进程以外,还有SERVER PROCESS 会更新控制文件
Ø更改控制文件中的内容不写REDO日志,如果控制文件从备份集中恢复回来,需要检查以下内容是否符合生产库的运行要求:
Ø确认在线日志文件个数及每个在线日志的大小是否能满足当前系统的要求。
Ø确认是否开启FORCE LOGGING模式。
Ø确认是否开启Supplemental Logging模式。
Ø确认临时文件的个数和大小是否满足当前系统的运行要求。
Ø在RMAN中使用SHOW ALL命令确认当前设置是否符合要求,尤其是部署了NBU之类的备份产品情况下。
Ø如果使用RMAN备份的控制文件,那么打开数据库必须使用RESETLOGS选项。
Ø重建控制文件之后,数据库闪回将会失效。
Ø控制文件的大小主要受控制文件创建时MAXDATAFILES、MAXLOGFILES、MAXLOGMEMBERS、MAXLOGHISTORY和 MAXINSTANCES等参数影响
Ø数据库参数CONTROL_FILE_RECORD_KEEP_TIME的值默认为7天
Ø如果在RMAN中未设置控制文件自动备份,那么数据库的物理结构发生改变时(如执行ALTER DATABSAE命令),需要及时备份控制文件
Ø从Oracle 10g开始,控制文件的BLOCK SIZE始终为16KB,跟数据库中的DB_BLOCK_ SIZE参数无关
Ø实践证明,当主机异常掉电导致控制文件损坏的概率极高,所以系统中至少需要保存2份控制文件,以防止单点故障
跟踪文件管理
•部分目录经常会由于日志文件过大、过多而占用较大的操作系统空间
•如果某个目录的日志文件过多,可能会无法一次性删除:
注意:当目录中跟踪文件过多时,其删除过程将会十分漫长。而且当空间紧张时,又会导致无法快速释放空间。