空间管理是DBA日常工作的一个主要组成部分。DBA必须确保有足够的空间来存储所有Oracle段。
1 联机和归档日志文件的存储
重做日志的作用:
。在实例失败事件中用于防止数据库讹误。
。在介质失败事件中用于数据库恢复。
但是配置糟糕的重做日志会导致性能退化,甚至导致整个实例挂起。
1.1 磁盘I/O和联机重做日志文件
在提交时,LGWR进程会将内存中的重做数据写入到磁盘上的联机重做日志文件。
LGWR决定性能的方面为:某位用户执行提交语句是,指定会话在LGWR进程将日志缓冲区的内容转储到磁盘之前将被挂起。这是oracle的一个根本的瓶颈。
只要LGWR将日志缓冲区的内容转储到磁盘,则该进程就会向操作系统发出一个并行写请求。如果联机重做日志文件组的各成员位于不同的物理磁盘上,则此并行请求会被执行;如果联机重做日志文件组的各成员位于相同的物理磁盘上,则只能执行顺序的写操作:先写一个成员,再写另一个成员。
为了解决上述问题:
。在不同的设备上存储联机重做日志文件成员。
。使用raid0或raid0+1条带化来优化性能。
。日志文件不能与数据文件在相同的设备上。
1.2 日志切换与性能
如果实例崩溃,那么联机日志文件中始终存在足够的重做数据,用于完全恢复数据库。
在DBWn进程将某个日志文件组中的变化所影响的所有数据块写入到磁盘前,LGWR不允许重写这个日志文件组。
日志切换要求:DBWn进程必须在每次日志切换时,将脏缓冲区从db cache写入到数据文件中,从而将检查点位置前移至相应日志切换所发生的时间点。
频繁的日志切换会导致DBWn进程进行超出其正常范围的更多磁盘I/O操作,从而导致性能的退化。
理想情况:DBWn进程的写操作应当由恢复时的需求驱动,而不是日志切换驱动。
为了解决上述问题:
。日志文件的大小不能设置得太小。
。确保日志文件的大小能够满足fast_start_mttr_target参数的设置要求。
1.3 归档日志文件与性能
联机日志在未归档之前不能被重写。
联机文件位于最快速度的设备上;归档文件位于较慢速度的设备上。
如果归档器进程无法跟上日志写入器进程,那么实例在归档器进程追上日志写入器进程之前将被挂起。
为了解决上述问题;
。不能将归档日志与联机日志文件定位在相同的设备上。
。启动的归档器进程数应该始终不少于归档目的数。
。添加更多的联机日志文件组。
2 空间错误和可恢复语句
对空间使用前摄式监视可以避免空间错误问题。
空间错误默认的行为是:这条语句被回滚,并且会向相应的会话返回一条错误信息。
这种行为可以被修改为将指定的语句挂起,从而使DBA有机会解决问题,随后,这条语句继续运行。
2.1 与空间相关的常见错误
。指定的表空间被填满。
。撤销表空间被填满。
。临时表空间被填满。
2.2 数据文件的自动扩展
在创建表空间时,可以指定其自动扩展的属性;也可以在表空间创建完后使用alter database datafile ‘$ORACLE_HOME\oradata\user01.dbf’ autoextend on命令指定自动扩展属性。
可以使用dba_data_files文件的自动扩展属性:
Select file_name, bytes, autoextensible, increment_by, maxbytes from dba_data_files;
启用数据文件的自动扩展能够避免许多空间错误。
2.3 可恢复语句
在默认情况下,语句会被挂起两个小时。如果在这段时间内没有解决问题,那么语句就会被回滚,并且还将生成错误消息。
使用以下命令可以启动可恢复语句:
alter session enable resumable timeout 60 name ‘AR archive’; |
其中:
timeout: (option)以秒为单位指定挂起时间。
name (option)指定被挂起会话的名称。
用户在使用前必须被授予RESUMABLE权限。
为了在实例级别启用可恢复语句,就需要设置实例参数RESUMABLE_TIMEOUT.
不存在任何能够为自己和其他用户的会话编程启用可恢复语句的API.
可以使用DBA_RESUMABLE视图查询某条语句是否被挂起。
可以使用DBMS_RESUMABLE.ABORT过程终止挂起的语句并立即向相应的会话返回错误的信息。
可以使用V$SESSION视图,可以查看到被挂起语句的填充信息“statement suspended, wait error to be cleared”.
某个会话被挂起时,会引发AFTER SUSPEND系统事件,该事件能够激发一条数据库触发器。
Create trigger suspend_message after suspend on database begin utl_mail.send( sender=>’suspend alert’, recipients=>’TOHill@treesofthehill.com’, message=>’session suspended!’); end; / |
其中:
utl_mail包用于向DBA发送电子邮件。
该触发器必须在SYS模式中创建。
可以使用DBMS_RESUMABLE.SPACE_ERROR.INFO函数查看错误的原因。
SPACE_ERROR.INFO函数:This function looks for space-related errors in the error stack. If it cannot find a space related error, it will return FALSE. Otherwise, TRUE is returned and information about the particular object that causes the space error is returned.(详见oracle document:
http://docs.oracle.com/cd/B10501_01/appdev.920/a96612/d_resum2.htm)
例子:
1 准备 system@ORCL>create tablespace small datafile 'small1.dbf' size 1m;
表空间已创建。
system@ORCL>create table toobig(c1 char(1000)) tablespace small;
表已创建。 2 填满表空间,出现错误 system@ORCL>begin 2 for i in 1..1000 loop 3 insert into toobig values('a'); 4 end loop; 5 end; 6 / begin * 第 1 行出现错误: ORA-01653: 表 SYSTEM.TOOBIG 无法通过 8 (在表空间 SMALL 中) 扩展 ORA-06512: 在 line 3 3 为会话启用可恢复语句 system@ORCL>alter session enable resumable;
会话已更改。 4 重新执行填满表空间,会话被挂起。 system@ORCL>begin 2 for i in 1..1000 loop 3 insert into toobig values('a'); 4 end loop; 5 end; 6 /
5 查询DBA_RESUMABLE视图 system@ORCL>select error_msg,status,sql_text from dba_resumable; ERROR_MSG -------------------------------------------------------------------------------- STATUS SQL_TEXT ------------------------------------------------------------ ------------------- ORA-01653: 表 SYSTEM.TOOBIG 无法通过 8 (在表空间 SMALL 中) 扩展 SUSPENDED INSERT INTO TOOBIG VALUES('a') 6 通过添加数据文件解决问题 system@ORCL>alter tablespace small add datafile 'small2.dbf' size 10m;
表空间已更改。 7 会话被执行 system@ORCL>begin 2 for i in 1..1000 loop 3 insert into toobig values('a'); 4 end loop; 5 end; 6 /
PL/SQL 过程已成功完成。 |
3 监视表空间使用的告警
监视表空间属于DBA日常工作的一部分。
使用DBA_FREE_SPACE视图,监视表空间的自由空间。
Select tablespace_name, sum(bytes) from dba_free_space group by tablespace_name;
10g后,监视表空间由告警系统自动完成。
4 监视与管理段的大小
4.1 估计段的大小
使用顾问程序来评估段的大小
4.2 缩小表段
一次完整的表扫描操作需要耗费数小时。如果删除所有记录,那么再次进行一次扫描需要的时间与先前的时间一样长。
使用alter table shrink space命令重新构造一个表,可以缩小表段。
段缩小操作在内部实现为一系列插入和删除DML操作,缩小操作的最后阶段是一个DDL操作。
因为数据本身不会发生变化,所以段缩小操作不会激发插入和删除触发器。
必须为表启动记录转移功能,才能对表进行缩小操作。
段缩小操作只能被应用于堆结构表,包括:标准表、分区表、物化视图容器表和物化视图日志表。
不能被缩小的表有:集群表、具有LONG类型列的表、LOB段、具有基于提交的物化视图的表、IOT表和IOT溢出表、索引基于函数的表和未启用记录转移的堆表。
4.3 缩小索引段
索引缩小:可以为使已删除条目所占用的空间可以重用。
Alter index i1 shrink space; 或 alter index i1 coalesce;
Analyze index i1 validate structure; 分析索引
Select lf_rows_len, del_lf_rows_len from index_stats where name = ‘I1’;
4.4 重构索引段
索引缩小(或聚结)操作有足浴释放索引内的空间,但是不能向表空间返回任何空间。
索引重构能够创建一个全新的索引,能向表空间返回空闲空间。
Alter index i1 rebuild online;
Alter index i1 rebuild online tablespace idx_ts; 将索引重构在不同的表空间内。
4.5 监视索引的使用
索引能够动态地改善查询的性能,但是也会使DML操作的性能退化。
DBA的目标是使用最少的索引来支持查询。
Alter index reg_id_pk monitoring usage; 启用索引监视
Select index_name,table_name, used from v$object_usage;
Alter index reg_id_pk nomonitoring usage;
5 高级表类型
标准表类型是堆(heap)表
高级表类型有:索引组织表和3种集群表。
5.1 索引组织表(index-organized table)
一个索引组织表是一个B*Tree索引,但是其叶块包含索引键值与记录的其余部分。记录本身被存储在索引中,并不存在任何堆表。
5.2 索引集群表(index cluster)
5.3 散列集群表(hash cluster)
5.4 有序散列集群表(sorted hash cluster)
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9537053/viewspace-731479/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/9537053/viewspace-731479/