Skip to content

Oracle恢复 - 10. page

_disable_logging对数据库产生的影响

测试下_disable_logging将对数据库产生的影响,由于是隐含参数,所以通过如下方法获取对这个参数的描述:

SQL> select ksppinm,ksppdesc from x$ksppi where ksppinm like '%logging';

KSPPINM              KSPPDESC
------------------------------------
_disable_logging     Disable logging
 

将其改为ture,也就是启用了不记录日志的方式:

SQL> alter system set "_disable_logging"=true scope=both;
System altered.
 

创建一个,并模拟事务运行,生成大量的redo,

SQL> create table mm tablespace marvener as select * from dba_objects;
Table created.

SQL> insert into mm  select * from dba_objects;
45167 rows created.

SQL> /
 45167 rows created.

此时模拟掉电,shutdown abort关闭数据库:

SQL> shutdown abort
ORACLE instance shut down.
SQL> startup
ORACLE instance started.

Total System Global Area 1610612736 bytes
Fixed Size                  2084296 bytes
Variable Size             385876536 bytes
Database Buffers         1207959552 bytes
Redo Buffers               14692352 bytes
Database mounted.
ORA-00354: corrupt redo log block header
ORA-00353: log corruption near block 81435 change 856029 time 01/30/2012
15:50:39
ORA-00312: online log 1 thread 1: '/u01/app/oracle/oradata/marven/redo01.log'
 

如上。可以发现数据库无法正常打开,并提示重做日志块头损坏,在告警中可见大量的告警,
即使通过Resetlogs方式打开数据库:

alter system set "_allow_resetlogs_corruption"=true scope=spfile;
shutdown abort
startup
 

数据库仍然会显然如下告警,并强制关闭实例:

SMON: enabling cache recovery
Mon Jan 30 16:15:41 2012
Errors in file /u01/app/oracle/admin/marven/udump/marven_ora_2900.trc:
ORA-00600: internal error code, arguments: [2662], [0], [855728], [0], [855937], [8388649], [], []
Mon Jan 30 16:15:42 2012
Errors in file /u01/app/oracle/admin/marven/udump/marven_ora_2900.trc:
ORA-00600: internal error code, arguments: [2662], [0], [855728], [0], [855937], [8388649], [], []
Mon Jan 30 16:15:42 2012
Error 600 happened during db open, shutting down database
USER: terminating instance due to error 600
Instance terminated by USER, pid = 2900
ORA-1092 signalled during: alter database open resetlogs...
Mon Jan 30 16:16:34 2012
  

然而可以通过推进Oracle的SCN来解决此类问题:

增进SCN有几种常用方法,这里介绍其中2种:
1.通过immediate trace name方式(在数据库Open状态下)
alter session set events ‘IMMEDIATE trace name ADJUST_SCN level x’;
2.通过10015事件(在数据库无法打开,mount状态下)
alter session set events ‘10015 trace name adjust_scn level x’;
注:10015的推进级别有个计算算法,具体可以参考adjust的官方说明。

alter session set events '10015 trace name adjust_scn level 10';

SQL> alter database open;

Database altered.
  

Block结构 :使用BBED的方法

 

 datafile.txt
 1 /oracle/oradata/znjtepp/system01.dbf                                              828375040
 2 /oracle/oradata/znjtepp/XSPGIMS_DEVICE.dbf                                       3877634048
 3 /oracle/oradata/znjtepp/sysaux01.dbf                                              513802240
 4 /oracle/oradata/znjtepp/users01.dbf                                               473169920
 5 /oracle/oradata/znjtepp/undotbs1.dbf                                             4294967296
 6 /oracle/oradata/znjtepp/XSPGIMS_FILE.dbf                                         3328180224
 7 /oracle/oradata/znjtepp/XSPGIMS_FUEL.dbf                                          524288000
 8 /oracle/oradata/znjtepp/XSPGIMS_MATERIAL.dbf                                      524288000
 9 /oracle/oradata/znjtepp/XSPGIMS_PLAN.dbf                                          524288000
10 /oracle/oradata/znjtepp/XSPGIMS_PRODUCE.dbf                                      2359296000
11 /oracle/oradata/znjtepp/XSPGIMS_SEQURITY.dbf                                      104857600
12 /oracle/oradata/znjtepp/XSPGIMS_SYSTEM.dbf                                        943718400
13 /oracle/oradata/znjtepp/XSPGIMS_OTHER.dbf                                         314572800
14 /oracle/oradata/znjtepp/RIMS_DATA.dbf                                             209715200
15 /oracle/oradata/znjtepp/XSPGIMS_MONITOR.dbf                                       314572800
16 /oracle/oradata/znjtepp/XSPGIMS_HUMANRESOURCE.dbf                                 314572800
17 /oracle/oradata/TS1.ORA                                                             1048576
18 /oracle/oradata/TS2.ORA                                                             1048576
19 /oracle/oradata/TS3.ORA                                                             1048576
20 /oracle/oradata/TS4.ORA                                                             1048576
21 /oracle/oradata/TS5.ORA                                                             1048576
22 /oracle/oradata/TS6.ORA                                                             1048576
23 /oracle/oradata/TS7.ORA                                                             1048576
24 /oracle/oradata/TS8.ORA                                                             1048576
25 /oracle/oradata/TS9.ORA                                                             1048576
26 /oracle/oradata/TS10.ORA                                                            1048576
27 /oracle/oradata/TS11.ORA                                                            1048576
28 /oracle/oradata/TS12.ORA                                                            1048576
29 /oracle/oradata/TSI1.ORA                                                            1048576
30 /oracle/oradata/TSI2.ORA                                                            1048576
31 /oracle/oradata/TSI3.ORA                                                            1048576
32 /oracle/oradata/TSI4.ORA                                                            1048576
33 /oracle/oradata/TSI5.ORA                                                            1048576
34 /oracle/oradata/TSI6.ORA                                                            1048576
35 /oracle/oradata/TSI7.ORA                                                            1048576
36 /oracle/oradata/TSI8.ORA                                                            1048576
37 /oracle/oradata/TSI9.ORA                                                            1048576
38 /oracle/oradata/TSI10.ORA                                                           1048576
39 /oracle/oradata/TSI11.ORA                                                           1048576
40 /oracle/oradata/TSI12.ORA                                                           1048576
 
para.txt
blocksize=8192
listfile=datafile.txt
mode=edit
 
 
 
SQL> select header_file,header_block from dba_segments where owner='LUDA' and segment_name = 'T1';
 
HEADER_FILE HEADER_BLOCK
———– ————
          4        18587
这里以表t1的段头为例
 
RDBA由,rfile# + block#组成的
相对文件号10位 block号22位
先算22位的BLOCK,其他的就是FILE
如果是ROWID的话,先算16的slot
#########################set 命令################################################
 
set 命令 定位数据块。
例子
定位 4号文件的18587号块
set file 4 block 18587
用rdba定位的话先换算 file 4 和 18587 号块
从右边开始算起   18587 对应2进制 00 0000 0100 1000 1001 1011 
                 4   对应2进制  100
                 所以这里rdba为  0000 0010 000 0000 0100 1000 1001 1011 转换成16进制为 0x100489b
                 
                 所以也可以定位成:
                 set dba 0x100489b
                 BBED> set dba 0x100489b
                 DBA             0x0100489b (16795803 4,18587)
                 
###工具包换算10进制 dbms_utility.data_block_address_file 
用法
SQL> select dbms_utility.data_block_address_file(20971712) "file",dbms_utility.data_block_address_block(20971712) "block" from dual;
 
      file      block
———- ———-
         5        192
###
set dba 4,18587     
BBED> set dba 4,18587    
        DBA             0x0100489b (16795803 4,18587)
 
 
set filename
BBED> set filename "/oracle/oradata/znjtepp/users01.dbf"
      FILENAME        /oracle/oradata/znjtepp/users01.dbf 
      
set file
BBED> set file 4
      FILE#           4
 
set block and set block + ora –
BBED> set block 100
        BLOCK#          100
BBED> set block +100
        BLOCK#          200
BBED> set block +20
        BLOCK#          220
BBED> set block -200
        BLOCK#          20
 
set blocksize 
set listfile这两个set都是用在切换配置文件时候用的
 
#设置屏幕显示区域
BBED> set width 100
        WIDTH           100
        
########################offset 偏移量 以及count #################################################
offset 偏移量
 
 
BBED> dump
 File: /oracle/oradata/znjtepp/users01.dbf (4)
 Block: 18587            Offsets:    0 to  511           Dba:0x0100489b
————————————————————————
 23a20000 0100489b 0031fc19 00000104 f8880000 00000000 00000000 00000000 
 00000000 00000011 00000100 0a9c0000 00000010 00000080 00000080 01004989 
 00000000 00000010 00000000 000000f4 00000000 00000000 00000000 00000010
 …..
 
 
BBED> set offset 200
        OFFSET          200
 
BBED> dump
 File: /oracle/oradata/znjtepp/users01.dbf (4)
 Block: 18587            Offsets:  200 to  711           Dba:0x0100489b
————————————————————————
 00000000 00000000 00010000 00002000 00000000 00001434 00000000 0100489a 
 00000001 0100490a 0100489a 00000000 00000000 00000000 00000000 00000000 
 00000011 00000000 0000d7c4 10000000 01004899 00000008 010048a1 00000008 
 ….
 
 count可以设置dump的内容
 
 例:
 
 BBED> set count 5000
        COUNT           5000
 BBED> dump 
 File: /oracle/oradata/znjtepp/users01.dbf (4)
 Block: 18587            Offsets:  200 to 5199           Dba:0x0100489b
————————————————————————
 00000000 00000000 00010000 00002000 00000000 00001434 00000000 0100489a 
 00000001 0100490a 0100489a 00000000 00000000 00000000 00000000 00000000 
 00000011 00000000 0000d7c4 10000000 01004899 00000008 010048a1 00000008
….
BBED> set file 4 block 18587
        FILE#           4
        BLOCK#          18587
 
BBED> set count 20
        COUNT           20
##/v翻译内容
BBED> dump /v
 File: /oracle/oradata/znjtepp/users01.dbf (4)
 Block: 18587   Offsets:    0 to   19  Dba:0x0100489b
——————————————————-
 23a20000 0100489b 0031fc19 00000104 l #…..H..1……
 f8880000                            l ….
 
 <16 bytes per line>
 
 
 
##可以通过show ,info显示当前的设置情况
BBED> show
        FILE#           4
        BLOCK#          20
        OFFSET          0
        DBA             0x01000014 (16777236 4,20)
        FILENAME        /oracle/oradata/znjtepp/users01.dbf
        BIFILE          bifile.bbd
        LISTFILE        datafile.txt
        BLOCKSIZE       8192
        MODE            Edit
        EDIT            Unrecoverable
        IBASE           Dec
        OBASE           Dec
        WIDTH           100
        COUNT           5000
        LOGFILE         log.bbd
        SPOOL           No
BBED> info
 File#  Name                                                                            Size(blks)
 —–  —-                                                                            ———-
     1  /oracle/oradata/znjtepp/system01.dbf                                                101120
     2  /oracle/oradata/znjtepp/XSPGIMS_DEVICE.dbf                                          473344
     3  /oracle/oradata/znjtepp/sysaux01.dbf                                                 62720
     4  /oracle/oradata/znjtepp/users01.dbf                                                  57760
     5  /oracle/oradata/znjtepp/undotbs1.dbf                                                     0
     6  /oracle/oradata/znjtepp/XSPGIMS_FILE.dbf                                            406272
     7  /oracle/oradata/znjtepp/XSPGIMS_FUEL.dbf                                             64000
     8  /oracle/oradata/znjtepp/XSPGIMS_MATERIAL.dbf                                         64000
     9  /oracle/oradata/znjtepp/XSPGIMS_PLAN.dbf                                             64000
    10  /oracle/oradata/znjtepp/XSPGIMS_PRODUCE.dbf                                         288000
    11  /oracle/oradata/znjtepp/XSPGIMS_SEQURITY.dbf                                         12800
    12  /oracle/oradata/znjtepp/XSPGIMS_SYSTEM.dbf                                          115200
    13  /oracle/oradata/znjtepp/XSPGIMS_OTHER.dbf                                            38400
    14  /oracle/oradata/znjtepp/RIMS_DATA.dbf                                                25600
    15  /oracle/oradata/znjtepp/XSPGIMS_MONITOR.dbf                                          38400
    16  /oracle/oradata/znjtepp/XSPGIMS_HUMANRESOURCE.dbf                                    38400        
……
 
############################find 命令###################################
map 命令
用于显示数据块的逻辑结构和这些逻辑结构的偏移量,一般配合/v参数使用
 
 
BBED> map /v dba 4,1
 File: /oracle/oradata/LUDA/datafile/o1_mf_users_6zlksyqo_.dbf (4)
 Block: 1                                     Dba:0x01000001
————————————————————
 Data File Header
 
 struct kcvfh, 676 bytes                    @0       
    struct kcvfhbfh, 20 bytes               @0       
    struct kcvfhhdr, 76 bytes               @20      
    ub4 kcvfhrdb                            @96      
    struct kcvfhcrs, 8 bytes                @100     
    ub4 kcvfhcrt                            @108  
    ……
    
    
 
   

Rman 备份存储格式参数

%a,活动ID
%c,在多重备份中,备份片的拷贝数,最大256
不是多重备份时,用于备份集为1,用于代理副本拷贝为0
%d,数据库
%D,公历某月的日期(只有day部分),格式DD
%e,归档日志序号
%f,绝对文件号
%F,由DBID(数据库ID),日月年,序号组成
形式为c-IIIIIIIIII-YYYYMMDD-QQ,c为固定
IIIIIIIIII表示DBID,连接RMAN时指定target,会显示DBID
YYYYMMDD为生成备份时的公历时间,比如20081122
QQ表示为16进制序号,00到FF
%h,归档日志线程号
%I,DBID
%M,公历月份,格式MM
%N,表空间名
%n,数据库名,如果数据库名不满8字符,将在右边自动填充'x'
比如,库名为test,结果将是testxxxx
%p,备份集中的备份片号,从1开始,步进1
Note: If you specify PROXY, then the %p variable must be included in the
FORMAT string either explicitly or implicitly within %U.
%s,备份集号,此号记录在控制文件中,每次备份会自动增加
重建控制文件将会初始化为1
%t,备份集时间戳,秒为单位
%T,公历年月日,格式YYYYMMDD
%u,8字符名称,利用备份集或副本拷贝号,备份生成时间,由系统通过某种算法得出
%U,许多FORMAT的默认值,由系统生成的唯一名称,对于副本拷贝和备份集的含义不同
对于备份集的备份片来说,等同于%u_%p_%c
对于数据文件副本拷贝,等同data-D-%d_id-%I_TS-%N_FNO-%f_%u
对于归档日志副本拷贝,等同arch-D_%d-id-%I_S-%e_T-%h_A-%a_%u
对于控制文件副本拷贝,等同cf-D_%d-id-%I_%u
%Y,公历年,格式YYYY
%%,表示一个百分号字符'%'

ORA-00600: internal error code, arguments: [4193], [10837], [10841], [], [], [], [], []

大清早遭遇这个内部错误

Thu May 26 08:48:01 2011
Error 607 happened during db open, shutting down database
USER: terminating instance due to error 607
Thu May 26 08:48:01 2011
Errors in file d:oracleadmincqkfbdumpcqkf_smon_2904.trc:
ORA-00604: error occurred at recursive SQL level 1
ORA-00607: Internal error occurred while making a change to a data block
ORA-00600: internal error code, arguments: [4193], [10837], [10841], [], [], [], [], []

600的4193错误是由于undo和redo块不一致造成的,一般伴随在2662之后

PURPOSE:           
  This article discusses the internal error “ORA-600 [4193]”, what
  it means and possible actions. The information here is only applicable
  to the versions listed and is provided only for guidance.

ERROR:             
  ORA-600 [4193] [a] [b]

VERSIONS:          
  versions 6.0 to 10.1

DESCRIPTION:       

  A mismatch has been detected between Redo records and Rollback (Undo)
  records.

  We are validating the Undo block sequence number in the undo block against
  the Redo block sequence number relating to the change being applied.

  This error is reported when this validation fails.

ARGUMENTS:
  Arg [a] Undo record seq number
  Arg [b] Redo record seq number

这里的解决办法很简单,重建表空间可以解决问题

1.设置undo为手动管理,然后设置参数_CORRUPTED_ROLLBACK_SEGMENTS=(_SYSSMU1$, _SYSSMU2$, _SYSSMU3$, _SYSSMU4$, _SYSSMU5$, _SYSSMU6$, _SYSSMU7$, _SYSSMU8$, _SYSSMU9$, _SYSSMU10$)

这些回滚段可以在日志中找到:

SMON: enabling cache recovery
Thu May 26 08:47:48 2011
Undo Segment 1 Onlined
Undo Segment 2 Onlined
Undo Segment 3 Onlined
Undo Segment 4 Onlined
Undo Segment 5 Onlined
Undo Segment 6 Onlined
Undo Segment 7 Onlined
Undo Segment 8 Onlined
Undo Segment 9 Onlined
Undo Segment 10 Onlined

………

然后启动数据库使用初始化参数文件,再重建回滚表空间,问题解决。

如果出现错误的回滚段存在与system表空间中,那么以上的方法无法解决,需要修改system回滚表空间的块信息才能够打开数据库,具体方法参考如下:
《使用bbed修改system undo segment修复4193》

诊断事件:10513 禁止smon回滚

禁用smon进行tx recovery(所谓tx recovery就是open后数据文件包含提交和未提交数据,数据不一致),不会造成数据库不一致,虽然禁用了smon自动恢复,但是当查询的时候还是会进行回滚从undo中读取 回滚数据(
等同于用到哪个对象回滚哪个对象,这种方式会带来压力,且若undo损坏就十分麻烦了,那么这将是另一个恢复问题select segment_name,status,tablespace_name from dba_rollback_segs看那个段损坏
使用隐藏参数_offline_rollback_segments 标记,然后drop rollback segment ‘xxx’ ,此时才会造成真正的数据不一致)

实验证明:
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.

Total System Global Area  943718400 bytes
Fixed Size                  2025400 bytes
Variable Size             247466056 bytes
Database Buffers          692060160 bytes
Redo Buffers                2166784 bytes
Database mounted.
Database opened.
SQL> show parameter event

NAME                                 TYPE        VALUE
———————————— ———– ——————————
event                                string
SQL> conn luda/luda
Connected.
SQL> drop table t1;
create table t1 (id number,id2 number);

declare
begin
for i in 1..100000 loop
insert into t1 values(i,i+1);
end loop;
end;
/
Table dropped.

SQL>
Table created.

SQL> SQL>   2    3    4    5    6    7 

PL/SQL procedure successfully completed.

SQL> conn / as sysdba
Connected.
SQL> shutdown abort
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.

Total System Global Area  943718400 bytes
Fixed Size                  2025400 bytes
Variable Size             251660360 bytes
Database Buffers          687865856 bytes
Redo Buffers                2166784 bytes
Database mounted.
SQL> alter system set events ‘10513 trace name context forever,level 2′;

System altered.

SQL> alter database open;

Database altered.

SQL> select usn,UNDOBLOCKSDONE,UNDOBLOCKSDONE from v$fast_start_transactions;

no rows selected

SQL> show parameter event

NAME                                 TYPE        VALUE
———————————— ———– ——————————
event                                string
SQL> alter session set events’10046 trace name context forever ,level 12’;

Session altered.

SQL> select * from t1;
select * from t1
              *
ERROR at line 1:
ORA-00942: table or view does not exist
SQL> select * from luda.t1;
SQL> alter system set events ‘10046 trace name context off’;

System altered.

在系统的10046的跟踪文件头部记录着:
“znjtepp_ora_26610.trc” 23617 lines, 2172756 characters
/oracle/admin/znjtepp/udump/znjtepp_ora_26610.trc
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 – 64bit Production
With the Partitioning, OLAP and Data Mining options
ORACLE_HOME = /oracle/product/10.2/db_1
System name:    AIX
Node name:      aix53
Release:        3
Version:        5
Machine:        0009AFDA4C00
Instance name: znjtepp
Redo thread mounted by this instance: 1
Oracle process number: 15
Unix process pid: 26610, image: oracle@aix53 (TNS V1-V3)

*** 2011-05-25 11:46:13.172
*** SERVICE NAME:() 2011-05-25 11:46:13.163
*** SESSION ID:(159.3) 2011-05-25 11:46:13.163
Thread 1 checkpoint: logseq 39, block 8118, scn 3255055
  cache-low rba: logseq 39, block 8119
    on-disk rba: logseq 39, block 59764, scn 3255568
  start recovery at logseq 39, block 8119, scn 0
—– Redo read statistics for thread 1 —–
Read rate (ASYNC): 25823Kb in 0.28s => 90.06 Mb/sec
Total physical reads: 26624Kb
Longest record: 20Kb, moves: 0/101746 (0%)
Change moves: 0/2 (0%), moved: 0Mb
Longest LWN: 683Kb, moves: 25/94 (26%), moved: 16Mb
Last redo scn: 0x0000.0031ad12 (3255570)
———————————————-
—– Recovery Hash Table Statistics ———
Hash table buckets = 32768
Longest hash chain = 2
Average hash chain = 1251/1246 = 1.0
Max compares per lookup = 2
Avg compares per lookup = 202468/203698 = 1.0
———————————————-
*** 2011-05-25 11:46:13.452
KCRA: start recovery claims for 1251 data blocks
*** 2011-05-25 11:46:13.830
KCRA: blocks processed = 1251/1251, claimed = 1251, eliminated = 0
*** 2011-05-25 11:46:13.831
Recovery of Online Redo Log: Thread 1 Group 2 Seq 39 Reading mem 0
—– Recovery Hash Table Statistics ———
Hash table buckets = 32768
Longest hash chain = 2
…..略

证明在扫描T1表时候还是会使用undo的段进行回滚。

关于10513的设置以及oracle的解释

查询smon进程号:
luda_dba:/home/oracle$ sqlplus ‘/as sysdba’

SQL*Plus: Release 10.2.0.1.0 – Production on Wed May 25 10:28:34 2011

Copyright (c) 1982, 2005, Oracle.  All rights reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 – 64bit Production
With the Partitioning, OLAP and Data Mining options

SQL> select pid,program from v$process where program like ‘%SMON%’;

       PID PROGRAM
———- ————————————————
         8 oracle@aix53 (SMON)

SQL> oradebug setorapid 8
Unix process pid: 22736, image: oracle@aix53 (SMON)
SQL> oradebug event 10513 trace name context forever,level 2
Statement processed.
SQL>

Oracle官方对于event 10513解释,该文件存放在
$ORACLE_HOJE/rdbms/mesg/oraus.msg文件中。

引用
10513, 00000, “turn off wrap source compression”
// *Cause:
// *Action: Set this event if you do not want source of wrapped PL/SQL
//          objects to be concatenated and stored multiple lines to a row.
// *Comment: This event should be set if you want the source of wrapped
//           PL/SQL objects to be stored one line per source row. The
//           new storage method is multiple lines per row, which
//           improves load and compile performance.