ITPUB??ì3
订阅ITPUB精粹播报,社区精彩内容不错过
ITPUB论坛 » Oracle数据库管理 » 请问如何模拟块损坏


您有 1 条公共消息
  • 来自: 公共消息 标题: ITPUB国庆假期数 ... 内容: 全新编排的Oracle数据库课程,第一线数据库工程师传授亲身经验,完全摆 ...

    标题: [精华] 请问如何模拟块损坏
    离线 西门吹牛
    高级会员


    精华贴数 4
    个人空间 0
    技术积分 12803 (125)
    社区积分 2675 (665)
    注册日期 2002-4-29
    论坛徽章:3
    会员2007贡献徽章会员2006贡献徽章授权会员   
          

    发表于 2004-3-8 17:55 
    请问如何模拟块损坏

    我单独建立一个表空间,里面数据文件1M,然后建立一个新的用户,指定默认表空间是新建的,然后用新的用户建立表,插入记录,直到表空间满了,commit了。

    而且也切换了归档日志了。然后用uedit打开新建的数据文件,修改其中的字节,但是用新用户查询的时候还是可以从表里面查询出正确的数据,请问,应该如何模拟块的损坏?


    __________________
    春莺啼岸柳弄春晴,柳弄春晴夜月明。明月夜晴春弄柳,晴春弄柳岸啼莺。夏香莲碧水动风凉,水动风凉夏日长。长日夏凉风动水,凉风动水碧莲香。秋秋江楚雁宿沙洲,雁宿沙洲浅水流。流水浅洲沙宿雁,洲沙宿雁楚江秋。冬红炉透炭炙寒风,炭炙寒风御隆冬。冬隆御风寒炙炭,风寒炙炭透炉红。
    只看该作者    顶部
    离线 piner
    that's life


    精华贴数 15
    个人空间 0
    技术积分 63444 (11)
    社区积分 1691 (904)
    注册日期 2003-2-24
    论坛徽章:49
    管理团队成员ITPUB元老2010数据库技术大会纪念徽章   
          

    发表于 2004-3-8 18:59 
    那就是修改的不好

    还有一个办法,nologging写数据后,再恢复数据库,肯定是有坏块了


    __________________
    if not now,when?if not me,who?

    欢迎访问我的网站Blog www.ixdba.com

    欢迎访问Taobao dba团队Blog www.taobaodba.com

    热烈庆祝新书出版,欢迎购买

    天将降大任于斯人也,必先苦其心志,劳其筋骨,饿其体肤
    只看该作者    顶部
    离线 eygle
    天下有雪


    精华贴数 66
    个人空间 0
    技术积分 208184 (2)
    社区积分 6464 (333)
    注册日期 2001-10-8
    论坛徽章:86
    现任管理团队成员2007年度ITPUB杰出贡献年度精华徽章ITPUB元老ITPUB维基人2010系统架构师大会纪念
    2010数据库技术大会纪念徽章2009架构师大会纪念徽章参与2009年中国云计算大会纪念ITPUB北京2009年会纪念徽章八级虎吧徽章2010新春纪念徽章

    发表于 2004-3-8 20:43 
    可以的,注意你的步骤

    数据库Open状态下是不能写入数据文件的

    以下是个测试步骤:

    E:\Oracle\ora92\bin>sqlplus "/ as sysdba"

    SQL*Plus: Release 9.2.0.4.0 - Production on 星期一 3月 8 20:27:15 2004

    Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.


    连接到:
    Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
    With the Partitioning, OLAP and Oracle Data Mining options
    JServer Release 9.2.0.4.0 - Production

    SQL> select name from v$datafile;

    NAME
    --------------------------------------------------------------------------------
    E:\ORACLE\ORADATA\EYGLE\SYSTEM01.DBF
    E:\ORACLE\ORADATA\EYGLE\UNDOTBS01.DBF
    E:\ORACLE\ORADATA\EYGLE\EYGLE01.DBF

    SQL> create tablespace block
      2  datafile 'e:\oracle\oradata\eygle\block.dbf'
      3  size 1M
      4  extent management local;

    表空间已创建。

    SQL> alter user eygle default tablespace block;

    用户已更改。

    SQL> alter user eygle quota unlimited on block;

    用户已更改。

    SQL> connect eygle/eygle
    已连接。

    SQL> create table t as select * from dba_users;

    表已创建。

    SQL> insert into t select * from t;

    已创建8行。

    SQL> /

    已创建16行。

    SQL> /

    已创建32行。

    SQL> /

    已创建64行。

    SQL> /

    已创建128行。

    SQL> /

    已创建256行。

    SQL> /

    已创建512行。

    SQL> /

    已创建1024行。

    SQL> /

    已创建2048行。

    SQL> /

    已创建4096行。

    SQL> /
    insert into t select * from t
    *
    ERROR 位于第 1 行:
    ORA-01653: 表EYGLE.T无法通过8(在表空间BLOCK中)扩展


    SQL> commit;

    提交完成。

    SQL> alter system checkpoint;

    系统已更改。

    SQL> select count(*) from t;

      COUNT(*)
    ----------
          8192

    SQL> connect / as sysdba
    已连接。
    SQL> shutdown immediate
    数据库已经关闭。
    已经卸载数据库。
    ORACLE 例程已经关闭。


    关闭数据库后用Ultredit编辑数据文件,随便更改几个字符.


    SQL> startup
    ORACLE 例程已经启动。

    Total System Global Area  101785252 bytes
    Fixed Size                   454308 bytes
    Variable Size              75497472 bytes
    Database Buffers           25165824 bytes
    Redo Buffers                 667648 bytes
    数据库装载完毕。
    数据库已经打开。
    SQL> select count(*) from eygle.t;
    select count(*) from eygle.t
                               *
    ERROR 位于第 1 行:
    ORA-01578: ORACLE 数据块损坏(文件号4,块号35)
    ORA-01110: 数据文件 4: 'E:\ORACLE\ORADATA\EYGLE\BLOCK.DBF'


    SQL>

    有个内部工具BBED也可以用来编辑数据块的内容


    __________________
    只看该作者    顶部
    离线 eygle
    天下有雪


    精华贴数 66
    个人空间 0
    技术积分 208184 (2)
    社区积分 6464 (333)
    注册日期 2001-10-8
    论坛徽章:86
    现任管理团队成员2007年度ITPUB杰出贡献年度精华徽章ITPUB元老ITPUB维基人2010系统架构师大会纪念
    2010数据库技术大会纪念徽章2009架构师大会纪念徽章参与2009年中国云计算大会纪念ITPUB北京2009年会纪念徽章八级虎吧徽章2010新春纪念徽章

    发表于 2004-3-8 21:00 
    然后用DBV来检验:

    E:\Oracle\oradata\eygle>dbv file=block.dbf blocksize=8192

    DBVERIFY: Release 9.2.0.4.0 - Production on 星期一 3月 8 20:48:50 2004

    Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

    DBVERIFY - 验证正在开始 : FILE = block.dbf
    标记为损坏的页35
    ***
    Corrupt block relative dba: 0x01000023 (file 4, block 35)
    Bad check value found during dbv:
    Data in bad block -
    type: 6 format: 2 rdba: 0x01000023
    last change scn: 0x0000.00049097 seq: 0x1 flg: 0x06
    consistency value in tail: 0x90970601
    check value in block header: 0xd6cb, computed block checksum: 0x2c0a
    spare1: 0x0, spare2: 0x0, spare3: 0x0
    ***

    标记为损坏的页69
    ***
    Corrupt block relative dba: 0x01000045 (file 4, block 69)
    Bad check value found during dbv:
    Data in bad block -
    type: 6 format: 2 rdba: 0x01000045
    last change scn: 0x0000.00049097 seq: 0x1 flg: 0x06
    consistency value in tail: 0x90970601
    check value in block header: 0x33d1, computed block checksum: 0x653
    spare1: 0x0, spare2: 0x0, spare3: 0x0
    ***



    DBVERIFY - 验证完成

    检查的页总数         :128
    处理的页总数(数据):117
    失败的页总数(数据):0
    处理的页总数(索引):0
    失败的页总数(索引):0
    处理的页总数(其它):9
    处理的总页数 (段)  : 0
    失败的总页数 (段)  : 0
    空的页总数            :0
    标记为损坏的总页数:2
    汇入的页总数           :0


    __________________
    只看该作者    顶部
    离线 eygle
    天下有雪


    精华贴数 66
    个人空间 0
    技术积分 208184 (2)
    社区积分 6464 (333)
    注册日期 2001-10-8
    论坛徽章:86
    现任管理团队成员2007年度ITPUB杰出贡献年度精华徽章ITPUB元老ITPUB维基人2010系统架构师大会纪念
    2010数据库技术大会纪念徽章2009架构师大会纪念徽章参与2009年中国云计算大会纪念ITPUB北京2009年会纪念徽章八级虎吧徽章2010新春纪念徽章

    发表于 2004-3-8 21:07 
    顺便把这个测试简单的做完:

    在这种情况下,如果有备份,需要从备份中恢复
    如果没有备份,那么坏块部分的数据肯定要丢失了

    在这个时候导出是不允许的:

    E:\>exp eygle/eygle file=t.dmp tables=t

    Export: Release 9.2.0.4.0 - Production on 星期一 3月 8 20:54:15 2004

    Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.


    连接到: Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
    With the Partitioning, OLAP and Oracle Data Mining options
    JServer Release 9.2.0.4.0 - Production
    已导出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集

    即将导出指定的表通过常规路径 ...
    . . 正在导出表                               T
    EXP-00056: 遇到 ORACLE 错误 1578
    ORA-01578: ORACLE 数据块损坏(文件号4,块号35)
    ORA-01110: 数据文件 4: 'E:\ORACLE\ORADATA\EYGLE\BLOCK.DBF'

    导出成功终止,但出现警告。


    __________________
    只看该作者    顶部
    离线 eygle
    天下有雪


    精华贴数 66
    个人空间 0
    技术积分 208184 (2)
    社区积分 6464 (333)
    注册日期 2001-10-8
    论坛徽章:86
    现任管理团队成员2007年度ITPUB杰出贡献年度精华徽章ITPUB元老ITPUB维基人2010系统架构师大会纪念
    2010数据库技术大会纪念徽章2009架构师大会纪念徽章参与2009年中国云计算大会纪念ITPUB北京2009年会纪念徽章八级虎吧徽章2010新春纪念徽章

    发表于 2004-3-8 21:09 
    当然,对于不同的情况需要区别对待

    首先你需要检查损坏的对象,使用以下SQL:
    PHP code:


    SQL
    SELECT tablespace_namesegment_typeownersegment_name

      2            FROM dba_extents

      3           WHERE file_id 
    4

      4             
    and 35 between block_id AND block_id blocks 1

      5     
    ;



    TABLESPACE_NAME                SEGMENT_TYPE       OWNER

    ------------------------------ ------------------ -------------------------

    SEGMENT_NAME

    ---------------------------------------------------------------------------

    BLOCK                          TABLE              'EYGLE'

    'T'




    __________________
    只看该作者    顶部
    离线 eygle
    天下有雪


    精华贴数 66
    个人空间 0
    技术积分 208184 (2)
    社区积分 6464 (333)
    注册日期 2001-10-8
    论坛徽章:86
    现任管理团队成员2007年度ITPUB杰出贡献年度精华徽章ITPUB元老ITPUB维基人2010系统架构师大会纪念
    2010数据库技术大会纪念徽章2009架构师大会纪念徽章参与2009年中国云计算大会纪念ITPUB北京2009年会纪念徽章八级虎吧徽章2010新春纪念徽章

    发表于 2004-3-8 21:15 
    如果损失的是数据,ok
    我们可以设置内部事件,使exp跳过这些损坏的block

    ALTER SYSTEM SET EVENTS='10231 trace name context forever,level 10' ;

    SQL> ALTER SYSTEM SET EVENTS='10231 trace name context forever,level 10' ;

    系统已更改。

    然后我们可以导出未损坏的数据


    SQL> host
    Microsoft Windows XP [版本 5.1.2600]
    (C) 版权所有 1985-2001 Microsoft Corp.

    E:\

    E:\>exp eygle/eygle file=t.dmp tables=t

    Export: Release 9.2.0.4.0 - Production on 星期一 3月 8 20:57:13 2004

    Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.


    连接到: Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
    With the Partitioning, OLAP and Oracle Data Mining options
    JServer Release 9.2.0.4.0 - Production
    已导出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集

    即将导出指定的表通过常规路径 ...
    . . 正在导出表                               T       8036 行被导出
    在没有警告的情况下成功终止导出。

    这时候数据成功导出.
    然后我们可以drop table,recreate,然后导入数据

    本例中
    我们损失了

    8192 - 8036 =  156 行数据


    __________________
    只看该作者    顶部
    离线 eygle
    天下有雪


    精华贴数 66
    个人空间 0
    技术积分 208184 (2)
    社区积分 6464 (333)
    注册日期 2001-10-8
    论坛徽章:86
    现任管理团队成员2007年度ITPUB杰出贡献年度精华徽章ITPUB元老ITPUB维基人2010系统架构师大会纪念
    2010数据库技术大会纪念徽章2009架构师大会纪念徽章参与2009年中国云计算大会纪念ITPUB北京2009年会纪念徽章八级虎吧徽章2010新春纪念徽章

    发表于 2004-3-8 21:21 
    SQL> connect eygle/eygle
    已连接。
    SQL> drop table t;

    表已丢弃。

    SQL> host
    Microsoft Windows XP [版本 5.1.2600]
    (C) 版权所有 1985-2001 Microsoft Corp.

    E:\Oracle\ora92\bin>cd \

    E:\>imp eygle/eygle file=t.dmp tables=t

    Import: Release 9.2.0.4.0 - Production on 星期一 3月 8 21:12:38 2004

    Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.


    连接到: Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
    With the Partitioning, OLAP and Oracle Data Mining options
    JServer Release 9.2.0.4.0 - Production

    经由常规路径导出由EXPORT:V09.02.00创建的文件
    已经完成ZHS16GBK字符集和AL16UTF16 NCHAR 字符集中的导入
    . 正在将EYGLE的对象导入到 EYGLE
    . . 正在导入表                             "T"       8036行被导入
    成功终止导入,但出现警告。

    E:\>exit

    SQL> select count(*) from t;

      COUNT(*)
    ----------
          8036

    完成数据恢复


    __________________
    只看该作者    顶部
    离线 xzh2000
    仙人抚我须 结发授长生



    精华贴数 13
    个人空间 0
    技术积分 47346 (23)
    社区积分 5411 (393)
    注册日期 2002-7-17
    论坛徽章:37
    现任管理团队成员ITPUB元老九尾狐狸玉石琵琶紫蜘蛛蓝色妖姬
    八级虎吧徽章红孩儿铁扇公主玉兔嫦娥授权会员

    发表于 2004-3-8 22:21 
    用dbms_repair可以來模擬并標記壞塊的﹐
    也比較安全。


    __________________
    过目即忘  插柳成荫
    只看该作者    顶部
    在线/呼叫 husthxd
    版主


    精华贴数 13
    个人空间 4317
    技术积分 63846 (10)
    社区积分 4220 (469)
    注册日期 2002-2-20
    论坛徽章:143
    现任管理团队成员ITPUB元老参与项目管理沙龙活动纪念世界杯纪念徽章管理团队2006纪念徽章会员2007贡献徽章
    会员2006贡献徽章2010年世界杯参赛球队:日本2010年世界杯参赛球队:科特迪瓦设计板块每日发贴之星2010新春纪念徽章2010年世界杯参赛球队:朝鲜

    发表于 2004-3-8 23:24 
    eygle's step by step!
    good job!


    __________________
    少吃饭,多吃菜少说话,多做事少灌水,多看文档
    -----------------------吃遍全城!--------------------
    -----------------------Java钻研中--------------------
    --------------------学好英语,报效祖国--------------------
    人生最幸福的事情莫过于通过自己的努力实现自己的梦想!
    http://space.itpub.net/6906/
    只看该作者    顶部
    相关内容


    CopyRight 1999-2006 itpub.net All Right Reserved.
    北京皓辰网域网络信息技术有限公司. 版权所有
    网站律师 隐私政策 知识产权声明
    广播电视节目制作经营许可证:编号(京)字第1149号
    京ICP证:060528号 联系我们

    北京市公安局海淀分局网监中心备案编号:1101082001