一次归档日志被删除导致offline的datafile 无法访问的问题

版本:10.2.0.5, asm 方式的2个节点rac,rhel5.5

其实该问题的解决思路,应该说是抢救数据出来。

该datafile是索引表空间的非第一个数据文件。app的开发工程师说该表空间内只有index,没有table

使用如下语句查询出该datafile内含有的object:

select distinct owner, segment_name, segment_type, partition_name
  from dba_extents
 where relative_fno IN (select relative_fno
                          from dba_data_files
                         where tablespace_name = 'XXX'
                           and file_name = 'YYYY');

--注意:该语句写的不够完善,请提出宝贵意见。

从以上的查询结果中,可以看到,不包括table,仅仅是index 以及index 的partition

根据这个实际情况,工程师决定使用rebuild online的方式来重构索引,具体语句为:

alter index index_owner.index_name rebuild partition partition_name online tablespace XXX parallel 20;

--注释:也就是说,还是将索引放在原来的XXX表空间。

以上语句的执行时间超过6小时,不断的执行v$session的查询,以确定20个并行session在v$session中的等待事件为(v$session.event列):

绝大多数并行进程在绝大多数的执行次数中,都是 control file sequential read 等待时间,还有零星的 enq: RO - fast object reuse等待事件

这个等待感觉极不正常。以”control file sequential read“在mos上搜索,没有找到有价值的信息。

事后截取了6小时其中1小时的awr,control file sequential read 等待事件是相当突出:

后来去查询XXX表空间的使用率,发现表空间使用率的脚本的输出居然没有该XXX表空间:

--这一般意味着该表空间中的dba_data_files.bytes已经全部使用了。(这句话等于:在不考虑datafile 自动扩展的情况下,表空间满了。)

SQL> select f.tablespace_name tablespace_name,round((d.sumbytes/1024/1024/1024),2) total_g,
  2  round(f.sumbytes/1024/1024/1024,2) free_g,
  3  round((d.sumbytes-f.sumbytes)/1024/1024/1024,2) used_g,
  4  round((d.sumbytes-f.sumbytes)*100/d.sumbytes,2) used_percent
  5  from (select tablespace_name,sum(bytes) sumbytes from dba_free_space group by tablespace_name) f,
  6  (select tablespace_name,sum(bytes) sumbytes from dba_data_files group by tablespace_name) d
  7  where f.tablespace_name= d.tablespace_name
  8  order by  used_percent desc;
  

后来继续检查该datafile的信息,发现该XXX表空间一共4个datafile,除了那个offline掉的datafile,剩余还有3个,每个datafile的bytes 大概6G左右,而这些datafile的maxbytes为32GB

于是工程师决定resize datafile:

alter database datafile 'datafile全部路径\idx_tool3.dbf' resize 20000M;

该datafile 被resize完毕后, 下面的的语句:

alter index index_owner.index_name rebuild partition partition_name online tablespace XXX parallel 20;

也立即执行完毕了。

因此,也就推断出一件事情:

索引rebuild online 的过程中,只会去使用该表空间内各个datafile的dba_data_files.bytes大小的容量,不会去使用(dba_data_files.maxbytes - dba_data_files.bytes)大小的容量。

若是rebuild 开始前,该表空间已经用完(不考虑datafile的自动扩展属性,只考虑dba_data_files.bytes),那么开始rebuild后,在索引rebuild online 的过程中,不会报ora-错误,等待事件大多是control file sequential read ---这一点比较有迷惑性。

时间: 2024-10-01 02:42:55

一次归档日志被删除导致offline的datafile 无法访问的问题的相关文章

oracle 删除归档日志的正确方式

在使用plsql使用游标的%rowcount时,导致了一个死循环,手动终止后数据库无法连接,服务重启后依然不行.windows日志管理器报归档日志相关的错误,最终手动启动到mount状态,禁用归档日志后,数据库正常.由于是本机的实验数据库,所以希望把归档日志删掉: 以下摘自这里ORACLE正确删除归档并回收空间的方法 一个ORACLE归档日志经常满,表现为/oraarchive 这个文件空间占用100%大家一定抱怨ORACLE为何没有归档维护工具,很多人直接删除了事,错了,ORACLE有,而且很

delete archivelog all 无法彻底删除归档日志?

最近在因归档日志暴增,使用delete archivelog all貌似无法清除所有的归档日志,到底是什么原因呢? [python] view plain copy print? 1.演示环境 SQL> select * from v$version where rownum<2; BANNER ---------------------------------------------------------------- Oracle Database 10g Release 10.2.0.

在归档模式下删除非系统文件的恢复

众所周知,我们的核心生产数据库通常都是在归档模式下执行的,更不用说还配置DG环境的了.开启归档,并保证全部归档不丢失,就能保证我们对数据库所做的不论什么改动不会丢失,归档日志可谓是恢复的根本,假设丢失归档,那么即使RMAN功能再强大,也无法对丢失的数据进行恢复.所以我们通常配置的RMAN策略就是全备+归档+控制文件自己主动备份.这里的归档不是指数据库创建以来生成的归档(那量也太大了),而是当进行RMAN非一致性备份时新产生的那部分归档日志,用来保证数据库能够前推到一致性状态,这样才干顺利open

rman 还原归档日志(restore archivelog)

听说过还原(restore)数据库,表空间及数据库文件,使用归档日志恢复(recover)数据库,表空间,数据库文件. 咦,还有还原归档日志这一说法呢?没错,可能我们忽略了还原归档日志这一个过程,原因是还原归档日志通常情况下是oracle在recover时自动完成的. 大多数情况下我们是先还原数据库,恢复数据库,打开数据库.实际上在恢复数据库之前有一个动作,那就是还原归档日志,也就是将日志文件还原到缺省的归档位置, 如果我们在备份归档日志时使用了delete [all] input子句的话. 本

oracle从备份集中恢复归档日志方法

oracle从备份集中抓出归档日志方法 在大连医院遇到这个问题,数据库为归档状态,但归档完毕后rman通过crontab自动备走归档日志并删除存在系统上的归档日志文件.在RealSync程序停止一段时间后,需要应用归档日志来解决日志丢失问题. 问题是: 数据库中的控制文件中关于备份的元数据已经丢失,但备份集存在.这时候我们开始调用oracle的一个内部非公开的函数包:dbms_backup_restore 来从备份集中抽取归档日志到指定的系统目录.以满足我们的需求. 语句如下: declare

oracle清理归档日志

我们都都知道在controlfile中记录着每一个archivelog的相关信息,当然们在OS下把这些物理文件delete掉后,在我们的 controlfile中仍然记录着这些archivelog的信息,在oracle的OEM管理器中有可视化的日志展现出,当我们手工清除archive目录下的文件后,这些记录并没有被我们从controlfile中清除掉,也就是oracle并不知道这些文件已经不存在了!这时候我们要做手工的清除的话,下面我经过实验,可以尝试这种方法: 1. 进入rman 2. con

归档日志的一些操作,设置,检查无效文件

有关归档的一些操作       ps: --这个符号是解释 有颜色字体标示是需要注意的地方     [[email protected] ~]# su – oracle   --设置一下ORACLE_SID [[email protected] ~]$ export ORACLE_SID=denver   --查看一下denver实例是否启动 [[email protected] ~]$ ps -ef|grep oracle root    27264  6887  0 04:23 tty1  

RMAN备份归档日志ORA-19575

RMAN备份归档日志ORA-19575 一.问题描述 1)环境oracle 10g; 2)报错现象RMAN进行备份归档报错失败ORA-19575 二.问题处理 1)根据客户说明的现象,百度了一波(详见参考链接) 2)操作系统mv修改名称存在问题的归档日志后,crosscheck检查归档日志,delete删除无效的归档日志后,再次进行备份,问题已解决. 三.参考链接 https://smarttechways.com/2012/11/01/ora-19575-expected-blocks-in-

Oracle归档日志满了导致Oracle连接(ORA-00257)报错处理

最近一段时间,有收到一台Oracle服务器的连接告警, 刚刚开始还以为是Oracle的监听被关闭导致,结果连上服务器看下Oracle的监听进程正常,自己连接一次发现有报ORA-00257错,又去监控系统中在看下日志再用sqlplus连上Oracle后查了下,知道是Oracle的归档日志写满闪回区导致Oracle连接异常,查看归档日志方法如下: SQL> show parameter db_recovery_file_dest; #查看归档日志的物理路径及闪回区的大小 SQL> select f