[20181122]模拟ORA-08103错误.txt

$ oerr ora 8103
08103, 00000, "object no longer exists"
// *Cause:  The object has been deleted by another user since the operation
//          began, or a prior incomplete recovery restored the database to
//          a point in time during the deletion of the object.
// *Action: Delete the object if this is the result of an incomplete
//          recovery.

在 Master Note for Handling Oracle Database Corruption Issues (文档 ID 1088018.1)中对ORA-8103错误的描述如下:

The object has been deleted by another user since the operation began.
If the error is reproducible, following may be the reasons:-
a.) The header block has an invalid block type.
b.) The data_object_id (seg/obj) stored in the block is different than the data_object_id stored in the segment header.

See dba_objects.data_object_id and compare it to the decimal value stored in the block (field seg/obj).

--//以前做过的测试.链接:http://blog.itpub.net/267265/viewspace-2131848/
--//听别人提起高水位下的块出现了未格式化的块.自己模拟测试看看.

1.环境:
SCOTT@book> @ ver1
PORT_STRING                    VERSION        BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx            11.2.0.4.0     Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

--//建立表空间:
CREATE TABLESPACE TEA DATAFILE
  '/mnt/ramdisk/book/tea01.dbf' SIZE 40M AUTOEXTEND ON NEXT 1M MAXSIZE UNLIMITED
LOGGING
ONLINE
EXTENT MANAGEMENT LOCAL AUTOALLOCATE
BLOCKSIZE 8K
SEGMENT SPACE MANAGEMENT MANUAL
FLASHBACK ON;

--//顺便做1个备份.
RMAN> backup as copy datafile 6 format '/home/oracle/backup/%b' ;
Starting backup at 2018-11-22 16:22:12
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=67 device type=DISK
allocated channel: ORA_DISK_2
channel ORA_DISK_2: SID=94 device type=DISK
allocated channel: ORA_DISK_3
channel ORA_DISK_3: SID=106 device type=DISK
channel ORA_DISK_1: starting datafile copy
input datafile file number=00006 name=/mnt/ramdisk/book/tea01.dbf
output file name=/home/oracle/backup/tea01.dbf tag=TAG20181122T162213 RECID=13 STAMP=992881334
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:01
Finished backup at 2018-11-22 16:22:15

Starting Control File and SPFILE Autobackup at 2018-11-22 16:22:15
piece handle=/u01/app/oracle/fast_recovery_area/BOOK/autobackup/2018_11_22/o1_mf_s_992881335_fzdssq4g_.bkp comment=NONE
Finished Control File and SPFILE Autobackup at 2018-11-22 16:22:16

2.建立测试环境:
SCOTT@book> create table t tablespace tea as select * from all_objects where rownum<=1e4;
Table created.

SCOTT@book> select object_id,data_object_id from dba_objects where object_name = 'T' and owner = user;
 OBJECT_ID DATA_OBJECT_ID
---------- --------------
     90463          90463

SCOTT@book> select segment_type, HEADER_FILE, HEADER_BLOCK from dba_segments where owner = user and segment_name = 'T';
SEGMENT_TYPE       HEADER_FILE HEADER_BLOCK
------------------ ----------- ------------
TABLE                        6          128

SCOTT@book> select FILE_ID, block_id, blocks from dba_extents where owner = user and segment_name = 'T';
   FILE_ID   BLOCK_ID     BLOCKS
---------- ---------- ----------
         6        128          8
         6        136          8
         6        144          8
         6        152          8
         6        160          8
         6        168          8
         6        176          8
         6        184          8
         6        192          8
         6        200          8
         6        208          8
         6        216          8
         6        224          8
         6        232          8
         6        240          8
         6        248          8
         6        256        128
17 rows selected.

2.破坏数据块看看:
SCOTT@book> alter system flush buffer_cache;
System altered.

SCOTT@book> select max(rowid) from t ;
MAX(ROWID)
------------------
AAAWFfAAGAAAAEBABJ

SCOTT@book> @ rowid AAAWFfAAGAAAAEBABJ
    OBJECT       FILE      BLOCK        ROW ROWID_DBA            DBA                  TEXT
---------- ---------- ---------- ---------- -------------------- -------------------- ----------------------------------------
     90463          6        257         73  0x1800101           6,257                alter system dump datafile 6 block 257 ;

--//dba=6,257块上有数据.

SCOTT@book> insert into t  select * from all_objects where rownum<=1;
1 row created.

SCOTT@book> commit ;
Commit complete.

SCOTT@book> alter system flush buffer_cache;
System altered.

SCOTT@book> @ rowid AAAWFfAAGAAAAECAAA
    OBJECT       FILE      BLOCK        ROW ROWID_DBA            DBA                  TEXT
---------- ---------- ---------- ---------- -------------------- -------------------- ----------------------------------------
     90463          6        258          0  0x1800102           6,258                alter system dump datafile 6 block 258 ;

--//dba=6,258块上有数据.通过bbed观察dba=6,259
BBED> map dba 6,259
 File: /mnt/ramdisk/book/tea01.dbf (6)
 Block: 259                                   Dba:0x01800103
------------------------------------------------------------
 KTB Data Block (Table/Cluster)
 struct kcbh, 20 bytes                      @0
 struct ktbbh, 72 bytes                     @20
 struct kdbh, 14 bytes                      @92
 struct kdbt[0], 0 bytes                    @106
 sb2 kdbr[0]                                @106
 ub1 freespace[8082]                        @106
 ub1 rowdata[0]                             @8188
 ub4 tailchk                                @8188

--//可以发现dba=6,259已经格式化.但是没有数据.
SCOTT@book> select count(*) from t;
  COUNT(*)
----------
     10001
--//OK一切正常.现在破坏dba=6,259

BBED> set offset 0
        OFFSET          0
--//注意一定要设置offset 0,不然可能copy仅仅剩下的部分.

BBED> copy filename '/home/oracle/backup/tea01.dbf' block 259 to filename '/mnt/ramdisk/book/tea01.dbf' block 259
Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) y
 File: /mnt/ramdisk/book/tea01.dbf (6)
 Block: 259                                                  Offsets:    0 to   63                                               Dba:0x01800103
------------------------------------------------------------------------------------------------------------------------------------------------
 00a20000 03018001 00000000 00000105 83a70000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
<64 bytes per line>

--//现在已经未格式化块.

4.继续测试:
SCOTT@book> alter system flush buffer_cache;
System altered.

SCOTT@book> select count(*) from t;
select count(*) from t
*
ERROR at line 1:
ORA-08103: object no longer exists
--//再线ora-08103.
--//而执行如下不会报错:
SCOTT@book> select count(*) from t where rownum<=10001;
  COUNT(*)
----------
     10001
SCOTT@book> select count(*) from t where rownum<=10002;
select count(*) from t where rownum<=10002
                     *
ERROR at line 1:
ORA-08103: object no longer exists
    
--//检查跟踪文件:
kcbzibmlt: dump suspect buffer, err=8103
buffer tsn: 7 rdba: 0x01800103 (6/259)
scn: 0x0000.00000000 seq: 0x01 flg: 0x05 tail: 0x00000001
frmt: 0x02 chkval: 0xa783 type: 0x00=unknown
Hex dump of corrupt header 4 = CORRUPT
Dump of memory from 0x000000006A4EA000 to 0x000000006A4EA014
06A4EA000 0000A200 01800103 00000000 05010000  [................]
06A4EA010 0000A783                             [....]
Hex dump of block: st=4, typ_found=0
Dump of memory from 0x000000006A4EA000 to 0x000000006A4EC000
06A4EA000 0000A200 01800103 00000000 05010000  [................]
06A4EA010 0000A783 00000000 00000000 00000000  [................]
06A4EA020 00000000 00000000 00000000 00000000  [................]
        Repeat 508 times
06A4EBFF0 00000000 00000000 00000000 00000001  [................]
Dump of buffer cache at level 8 for tsn=7 rdba=25166080

--//可以发现dba =6,259报错.

5.如何跳过呢?
--//我测试仅仅设置坏块.如果真有数据可以通过一些特殊的方式读出来,这个给看运气.通过10231事件跳过坏块

$ oerr ora 10231
10231, 00000, "skip corrupted blocks on _table_scans_"
// *Cause:
// *Action: such blocks are skipped in table scans, and listed in trace files
--//alter session set db_file_multiblock_read_count=1 ;
ALTER SESSION SET EVENTS '10231 TRACE NAME CONTEXT FOREVER, LEVEL 10';

SCOTT@book> ALTER SESSION SET EVENTS '10231 TRACE NAME CONTEXT FOREVER, LEVEL 10';
Session altered.

SCOTT@book> select count(*) from t ;
select count(*) from t
*
ERROR at line 1:
ORA-08103: object no longer exists

--//不行.在bbed设置坏块看看.
BBED> set dba 6,259
        DBA             0x01800103 (25166083 6,259)

BBED> corrupt
Block marked media corrupt.

BBED> sum apply ;
Check value for File 6, Block 259:
current = 0xa683, required = 0xa683

SCOTT@book> select count(*) from t ;
  COUNT(*)
----------
     10001

--//ok.跳过坏块.

[20181122]模拟ORA-08103错误.txt的更多相关文章

  1. [20190918]shrink space与ORA-08102错误.txt

    [20190918]shrink space与ORA-08102错误.txt 1.环境:SCOTT@test01p> @ ver1PORT_STRING                    V ...

  2. [20180904]工作中一个错误.txt

    [20180904]工作中一个错误.txt --//昨天看我提交一份修改建议,发现自己写的sql语句存在错误.--//链接:http://blog.itpub.net/267265/viewspace ...

  3. [20170914]tnsnames.ora的管理.txt

    [20170914]tnsnames.ora的管理.txt --//昨天朋友讲tnsnams.ora的内容太长了,而且许多不需要的.管理不方便.我记得以前写[20150409]tnsnames.ora ...

  4. csp模拟赛低级错误及反思

    \(csp\)模拟赛低级错误及反思. 1.没开\(longlong\). 反思:注意数据类型以及数据范围. 2.数组越界(前向星数组未开两倍,一题的数据范围应用到另一题上,要开两倍的写法为开两倍数组) ...

  5. ruby on rails模拟HTTP请求错误发生:end of file reached

    在文章 Ruby On Rails中REST API使用演示样例--基于云平台+云服务打造自己的在线翻译工具 中,利用ruby的Net::HTTP发起http请求訪问IBM Bluemix上的sour ...

  6. ORA 00972 错误处理

    Oracle 11G SQL 写好的脚本执行后报错:ORA 00972 标识符过长 可能的原因一: select 语句中的字段别名太长,中文字符别名最长为10个汉字,简化别名名称,问题得到解决. 可能 ...

  7. navicat cannot load oci dll||oracle 改字符集为GBK后 navicat 连不上||Ora-28547 ora net错误

    此段适用于 解决 navicat cannot load oci dll 环境 Navicat Premium  和 oracle 原因,navicat 32 和64 都只支持 32位的oci.dll ...

  8. 关于oracle 11g导出数据时 报 ORA 1455错误的处理

    因为导出的该用户的表可能存在空数据表,那么可能就会出现此其异常. 首先:  查看:     SQL>show parameter deferred_segment_creation;  假设为T ...

  9. Oracle Ora 错误解决方案合集

    注:本文来源于 < Oracle学习笔记 --- Oracle ORA错误解决方案 > ORA-00001: 违反唯一约束条件 (.)错误说明:当在唯一索引所对应的列上键入重复值时,会触发 ...

随机推荐

  1. [疑难杂症]__关于cmd命令正确而显示不是内部指令的错误(ps:已解决)

    前言 事情的起因是因为我在使用上网程序的时候,运行程序发现端口被占用,这个当然我们知道要将占用的端口结束掉就行,但是显然我们首先要找到占用窗口的程序是什么,才方便在任务管理器中找到并结束掉它. 查找了 ...

  2. RabbitMQ系列(一)RabbitMQ在Ubuntu上的环境搭建

    环境配置 Ubuntu Server 18.04 RabbitMQ 3.6.10 安装之前 我们使用apt-get进行RabbitMQ安装,在安装之前,强烈建议您把apt源换位国内,大大增加下载安装的 ...

  3. QT 完美实现圆形按钮

    QT 版本:5.6.0 官方的按钮有些普通,如果我们想要换成自己喜欢的按钮而却无从下手,那么请继续往下阅读(皮一下). 首先,可以在网络上搜索一下自己喜欢的按钮图形(或者可以自行绘制),我以下面的图形 ...

  4. 分布式系统监视zabbix讲解八之自动发现/自动注册--技术流ken

    自动发现(LLD) 概述 自动发现(LLD)提供了一种在计算机上为不同实体自动创建监控项,触发器和图形的方法.例如,Zabbix可以在你的机器上自动开始监控文件系统或网络接口,而无需为每个文件系统或网 ...

  5. MySQL系列详解七:MySQL双主架构演示-技术流ken

    前言 在企业中,数据库高可用一直是企业的重中之重,中小企业很多都是使用mysql主从方案,一主多从,读写分离等,但是单主存在单点故障,从库切换成主库需要作改动.因此,如果是双主或者多主,就会增加mys ...

  6. Visual Studio 2017 - Windows应用程序打包成exe文件(1)- 工具简单总结

    最近有对一个Windows应用程序少许维护和修改.修改之后要发布新的exe安装文件,打包exe文件时,遇到了很头疼的问题,还好最后解决了,记录一下. Visual Studio版本:Visual St ...

  7. SVN服务器本地搭建与使用

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6623026.html  使用SVN进行代码管理,需要搭建服务端资源库,然后在使用SVN的电脑安装SVN客户端或 ...

  8. vbscript 语言通过序列和ADODB实现取号不重复

    目的:通过VBScript脚本利用序列的性质,实现取号不重复 首先,表空间中创建表名为TABLE_YEWID的表格,主要有以下几个字段 -- Create table create table TAB ...

  9. spring-framework-中文文档三:依赖注入DI

    5.4依赖性 典型的企业应用程序不包含单个对象(或Spring的说法中的bean).即使最简单的应用程序也有几个对象一起工作来展示最终用户将其视为一个连贯的应用程序.下一节将介绍如何从定义许多独立的b ...

  10. python之匿名函数以及在内置函数中的使用

    一. 匿名函数 Python使用 lambda 来创建匿名函数.所谓匿名函数,它与用 def 关键字定义的函数相比,没有函数名称. 1.1 匿名函数定义及特点 语法: lambda [para1, p ...