监视和管理存储结构

空间管理是DBA日常工作的一个主要组成部分。DBA必须确保有足够的空间来存储所有Oracle段。

1         联机和归档日志文件的存储

重做日志的作用:

。在实例失败事件中用于防止数据库讹误。

。在介质失败事件中用于数据库恢复。

但是配置糟糕的重做日志会导致性能退化,甚至导致整个实例挂起。

1.1   磁盘I/O和联机重做日志文件

在提交时,LGWR进程会将内存中的重做数据写入到磁盘上的联机重做日志文件。

LGWR决定性能的方面为:某位用户执行提交语句是,指定会话在LGWR进程将日志缓冲区的内容转储到磁盘之前将被挂起。这是oracle的一个根本的瓶颈。

只要LGWR将日志缓冲区的内容转储到磁盘,则该进程就会向操作系统发出一个并行写请求。如果联机重做日志文件组的各成员位于不同的物理磁盘上,则此并行请求会被执行;如果联机重做日志文件组的各成员位于相同的物理磁盘上,则只能执行顺序的写操作:先写一个成员,再写另一个成员。

为了解决上述问题:

。在不同的设备上存储联机重做日志文件成员。

。使用raid0raid0+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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值