环境大了,情况复杂,需要考虑的事情就多了。前几天遇到个5节点rac做parmary+3节点rac做pyhsical dataguard的环境,在primary的某个节点,由于突然的宕机,当我们把它启动重新加入cluster后,就出来了很多问题。这次故障不是我处理的,是我的几位同事一起处理的,从12月14号开始就一直追这个case,期间跑analyze table validate structure cascade online,从14日开始跑一直跑了十多天还跑不完,期间和oracle support也多次打交道。等处理完毕后,同事发邮件和大家共享了这个case。我也觉得这个case挺有意思,在这里按照我的理解,再次整理了一遍这个case的思路,写成博文和大家共享一下。
事情的起因是这样的,在12月14日的时候,同事收到告警,说某rac的节点2宕机了,登录后发现该数据库已经down库,且相关的bdump,cdump,udump目录都不见了,在恢复业务为第一要务的情况下,新建了目录,重启了数据库。但是在重启之后的几个小时,数据库开始报错了,先是ora-600[kclchkblk_3],再是ora-600[12700],并且有ORA-00600 [6122],后续的,还在standby上还发生ORA-600 [3020]。
我们按照时间,先看看600 error出现经历:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
node0: Tue Dec 13 18:00:28 2011 the instance re-config,node 1 down. Tue Dec 13 20:47:26 2011 the instance re-config ,node 1 add to cluster. Tue Dec 13 20:58:29 2011 ORA-00600: internal error code, arguments: [kclchkblk_3], [2519], [18446744072481280771], [6], [], [], [], [] Tue Dec 13 23:55:52 2011 ORA-00600: internal error code, arguments: [12700], [542490], [2357330096], [5], [0], [24], [], [] Wed Dec 14 00:25:09 2011 ORA-00600: internal error code, arguments: [12700], [542490], [2357330096], [5], [0], [24], [], [] ... node1: Tue Dec 13 20:47:26 2011 Reconfiguration started (old inc 0, new inc 7) Wed Dec 14 01:09:20 2011 ORA-00600: internal error code, arguments: [12700], [542490], [2357330096], [5], [0], [24], [], [] Wed Dec 14 04:10:55 2011 ORA-27091: skgfqio: unable to queue I/O Wed Dec 21 03:08:00 2011 ORA-00600: internal error code, arguments: [6122], [0], [1], [0], [], [], [], [] ... node2: Tue Dec 13 18:00:27 2011 the instance re-config,node 1 down. Tue Dec 13 20:47:26 2011 the instance re-config ,node 1 add to cluster. Wed Dec 14 03:02:29 2011 control file error:ORA-27091: skgfqio: unable to queue I/O Wed Dec 14 03:02:30 2011 control file error:ORA-27091: skgfqio: unable to queue I/O Wed Dec 14 04:10:53 2011 control file error:ORA-27091: skgfqio: unable to queue I/O Wed Dec 14 10:44:14 2011 ORA-07445: exception encountered: core dump [000000010113DF70] [SIGSEGV] Wed Dec 14 15:28:49 2011 ORA-00600: internal error code, arguments: [12700], [542490], [2357330096], [5], [0], [24], [], [] ... node3 Tue Dec 13 18:00:27 2011 the instance re-config,node 1 down. Tue Dec 13 20:47:26 2011 the instance re-config ,node 1 add to cluster. Wed Dec 14 03:21:54 2011 ORA-00600: internal error code, arguments: [12700], [542490], [2357330096], [5], [0], [24], [], [] Wed Dec 14 03:38:56 2011 ORA-00600: internal error code, arguments: [12700], [542490], [2357330096], [5], [2839977527], [25], [], [] ... node4 Tue Dec 13 18:00:27 2011 the instance re-config,node 1 down. Tue Dec 13 20:47:26 2011 the instance re-config ,node 1 add to cluster. Tue Dec 13 23:53:13 2011 ORA-00600: internal error code, arguments: [12700], [542490], [2357330096], [5], [0], [24], [], [] Wed Dec 14 15:48:09 2011 ORA-00600: internal error code, arguments: [12700], [542490], [2357330096], [5], [0], [24], [], [] ... |
1 2 3 4 5 6 |
standby node0: Sat Dec 17 19:50:49 2011 ORA-00600: internal error code, arguments: [3020], [2357330096], [5], [27066], [891734], [76], [], [] Sat Dec 17 19:50:50 2011 ORA-00600: internal error code, arguments: [3020], [2357330096], [5], [27066], [891734], [76], [], [] ... standby node1 |
我们看到,问题的起因是因为数据库由于某种原因,数据库重启了,目前该原因已经无法分析,因为bdump等目录在重启前已经被删除(或许有可能是被谁删除了该目录才导致宕库的,但是,也无法追查),在数据库重启之后,引发了ora-600[kclchkblk_3]的报错,该报错是后续所有报错的起因。而该报错,经过oracle确认,是由于Bug 4767885: “OERI [kclchkblk_3] possible in RAC”引起的,这个bug在9208下没有fix,但是该bug的后果却很严重,会导致写丢失(lost write)。在本案例中,由于复杂的架构,你会看到该bug引起了很多问题。
在正常的情况下,oracle会把所有的更改信息写入redo log,在checkpoint时也将dirty buffer中的内容刷入到数据文件中。但是由于ora-600[kclchkblk_3],写丢失,某个块中的某些行没有写入(下文的dump的文件中,你会看到file#562,block#131248中的第五行丢失),于是就导致报错出来了ora-600[12700]。
ora-600[12700],简单的说是rowid指向了一个不存在的数据块,即索引中的slot是包含rowid信息,然后根据rowid去找表中的数据块。当出现rowid无法找到其对应的数据块时,就抛出了ora-600[12700]。
根据ora-600[12700], [542490], [2357330096], [5], [0], [24], [], []的报错,我们在metalink上找到12700后面几个参数的含义。
1 2 3 4 5 6 7 8 |
ORA-600 [12700] [a] [b] [c] [d] [e] For Oracle 8i and 9i, there are up to five additional arguments: Arg [a] Data Object ID Arg [b] Table Relative Data Block Address (RDBA) Arg [c] Row Slot Number of the row in the data block Arg [d] If present - Index Relative Data Block Address (RDBA) Arg [e] If present - Index Row Source Class |
根据metalink上的指示,对于该错误我们的做法是重建索引或者修复坏块。
我们根据a,data_object_id去找该报错所对应的对象:
1 2 3 4 5 6 7 8 9 10 |
SQL> l 1 select owner,object_name,object_type,status,object_id,data_object_id 2* from dba_objects where data_object_id=542490 SQL> / OWNER OBJECT_NAME OBJECT_TYPE STATUS OBJECT_ID DATA_OBJECT_ID ---------- --------------- ------------------ ------- ---------- -------------- SBUXXE M_IMPOR TABLE VALID 333588 542490 SQL> |
从data object id上看,这个对象似乎是在表上M_IMPOR,是和数据的坏块,但是接下去的检查,我们发现,他是在索引上的。(我们注意到,这里的object_id和data_object_id已经不一样了。)
用上述的方式检查,我们也用b,通过RDBA去找对象是什么:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
SQL> select dbms_utility.data_block_address_file(2357330096) as file_id, 2 dbms_utility.DATA_BLOCK_ADDRESS_BLOCK(2357330096) as block_id from dual; FILE_ID BLOCK_ID ---------- ---------- 562 131248 SQL> SELECT owner, segment_name, segment_type FROM dba_extents WHERE file_id = 562 AND 131248 between block_id and block_id + blocks - 1; Owner Segment_name Segment_type ----------------------------------------------------------------------------- SBUXXE M_IMPOR TABLE |
我们看到也是同样的表。
那么我们再看看该问题所指的rowid是什么?我们用dbms_rowid,将data_object_id,file_id,block_id,和row代入进去。
1 2 3 4 5 6 7 |
SQL> select dbms_rowid.rowid_create(1,542490,562,131248,5) from dual; DBMS_ROWID.ROWID_C ------------------ AACEcaAIyAAAgCwAAF SQL> |
但是此时如果用select * from SBUXXE.M_IMPOR where rowid=AACEcaAIyAAAgCwAAF就会触发ora-600[12700]的报错。因为该rowid指向的数据是不存在的。
除了上述的检查,我们还能从trace文件中找到相关的信息:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
ksedmp: internal or fatal error ORA-00600: internal error code, arguments: [12700], [542490], [2357330096], [5], [2839977527], [25], [], [] Current SQL statement for this session: SELECT /*+ ALL_ROWS */ ....省略 T10.ROW_ID FROM ....省略 SBUXXE.M_IMPOR T34 WHERE T4.PR_ADDR_ID = T2.ROW_ID (+) AND ...省略 (T34.BILL_ACCNT_ID = :5) ...... Block header dump: 0x8c8200b0 【十六进制转换成十进制后,即为RDBA 2357330096】 Object id on Block? Y seg/obj: 0x8471a 【十六进制转成十进制后,即为data object id 542490】 csc: 0x9d7.b6ca1303 itc: 5 flg: E typ: 1 - DATA brn: 0 bdba: 0x8c820009 ver: 0x01 inc: 0 exflg: 0 Itl Xid Uba Flag Lck Scn/Fsc 0x01 0x0310.01b.00072a36 0x57807d12.2ad1.01 C--- 0 scn 0x09d7.b6c82f3c 0x02 0x1693.029.0000b9a9 0x688d6ead.0568.0b C--- 0 scn 0x09d7.b6c9f7ac 0x03 0x056b.02e.0001257f 0x5804829e.0896.0b C--- 0 scn 0x09d7.b6c82deb 0x04 0x03d9.02c.000577d2 0x56c981f1.22d8.09 C--- 0 scn 0x09d7.b6c82e0d 0x05 0x1c7c.00b.0004b173 0xa1088eed.16c4.23 C--- 0 scn 0x09d7.b6c846a8 data_block_dump,data header at 0xa446280ac =============== tsiz: 0x1f50 hsiz: 0x26 pbl: 0xa446280ac bdba: 0x8c8200b0 76543210 flag=-------- ntab=1 nrow=10 【number of row,即该块上有10行数据】 frre=5 fsbo=0x26 fseo=0x2ec avsp=0x7e4 tosp=0x7e4 0xe:pti[0] nrow=10 offs=0 0x12:pri[0] offs=0x1cba 【这里开始显示每一行的地址】 0x14:pri[1] offs=0x1a22 0x16:pri[2] offs=0x178a 0x18:pri[3] offs=0x2ec 0x1a:pri[4] offs=0x14ef 0x1c:pri[5] sfll=-1 【注意!!这里的slot 5出现了意外,为free】 0x1e:pri[6] offs=0x1268 0x20:pri[7] offs=0xfcd 0x22:pri[8] offs=0xd3d 0x24:pri[9] offs=0xa9e block_row_dump: tab 0, row 0, @0x1cba tl: 662 fb: --H-FL-- lb: 0x0 cc: 230 col 0: [10] 31 2d 31 31 47 37 50 55 53 55 col 1: [ 7] 78 6f 0c 0d 0a 07 3c col 2: [ 3] 30 2d 31 col 3: [ 7] 78 6f 0c 0d 0a 09 31 col 4: [ 3] 30 2d 31 col 5: [ 2] c1 11 col 6: [ 1] 30 col 7: [ 1] 59 .... tab 0, row 4, @0x14ef tl: 667 fb: --H-FL-- lb: 0x0 cc: 211 col 0: [ 9] 31 2d 47 46 55 57 4e 47 45 col 1: [ 7] 78 6e 04 09 05 1e 3c ....【注意这里,row 5丢失!!】 tab 0, row 6, @0x1268 tl: 647 fb: --H-FL-- lb: 0x0 cc: 211 col 0: [ 9] 31 2d 47 46 57 56 45 42 56 .... |
上述的2种方法去找问题都是可以的。
综上所述,有个rowid为AACEcaAIyAAAgCwAAF需要指向在file id为562,block id为131248的块上的第5个slot的这一行,而file id为562,block id为131248的块上的第5个slot的数据丢失。即rowid AACEcaAIyAAAgCwAAF指向一个空块。
打个比方,就像一群人拿着名片,上面写着IBM公司在第562号大街上的第131248号大楼的第五层,而当他们按图索骥的去到那里,发现第五层根本没有公司在那里,是一层空屋子而已。
那么究竟是名片印错了,还是大楼第五层的房子被强拆了?我们开始检查:
我们用dbv检查:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
au11qap2yatels2:SCRM01P4:/ora/admin>dbv file=/ora/data008/SCRM01P/USRM01UX_IMPOR_tbl09.dbf blocksize=8192 start=131248 end=131248 DBVERIFY: Release 9.2.0.8.0 - Production on Tue Jan 10 01:48:35 2012 Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved. DBVERIFY - Verification starting : FILE = /ora/data008/SCRM01P/USRM01UX_IMPOR_tbl09.dbf DBVERIFY - Verification complete Total Pages Examined : 1 Total Pages Processed (Data) : 1 Total Pages Failing (Data) : 0 Total Pages Processed (Index): 0 Total Pages Failing (Index): 0 Total Pages Processed (Other): 0 Total Pages Processed (Seg) : 0 Total Pages Failing (Seg) : 0 Total Pages Empty : 0 Total Pages Marked Corrupt : 0 Total Pages Influx : 0 Highest block SCN : 10824146196148 (2520.828610228) |
没有发现数据上的坏块,也就是说,我们从工商局发现那个地方确实没有公司注册在那里,那个空层是正常的,错误的是名片印错了。我们要来纠正名片上的错误。
由于该表上有73个索引,大约120多G,开始运行analyze cascade online,由于transaction也很多,所以跑起来很慢很慢了,运行了十几天没跑完。这里我们先放着它跑,来看其他的问题。
在跑的时候,物理的DG数据库又报错了ORA-00600: internal error code, arguments: [3020], [2357330096], [5], [27066], [891734], [76], [], [],表明在RDBA为2357330096的块的第五行上出现问题,redo上的信息和用于recover的块上的信息不一致,引起了所谓的“stuck recovery”。也就是说,在Primary中,在触发ora-600[kclchkblk_3]时,相关的信息虽然没有写入到RDBA为2357330096的块的第五行上,但是却成功的写入到了primary的redo上(因为先写redo,再在checkpoint的时候刷到数据块中),该redo被传输到physical datagaurd上,并且被apply,且成功apply,修改了在physical dg上的RDBA为2357330096的块的第五行上。当主库再次更新RDBA为2357330096的块时(可能是除第五行外的其他9行),primary将该redo的信息传输到physical dg,发现redo上的信息和在dg上要做recover的块上的信息不一致,于是报错了ora-600[3020]了。
对于这个问题,我们将主库的该文件至于热备模式,拷贝到备库,通过这种方式达到主库备库的文件一致,来修复dg。并且,在操作的时候,幸运的是我们的同事先备份了dg上的该文件,再把拷贝过来的文件覆盖。为什么备份重要?后续的故事你会听到……
好了,我们的故事继续,在做analyze cascade online的时候,application team发现他们的应用中,有个M_IMPOR的子表——M_IMPOR_CHIL表的数据已经存在了,但是父表,即M_IMPOR表却没有对应的数据。
为什么会造成这样的现象?不该子表有数据父表没数据啊?难道是遇到了更大的bug?
通过检查发现,发现子表和父表建没有建立约束关系,仅仅是存储数据罢了,因此oracle在lost write父表的时候,还是写入了子表。
但是由于父表的数据非常重要,必须得找回这条丢失的数据,我们又要开始想办法了。
直接通过select * from M_IMPOR where rowid=AACEcaAIyAAAgCwAAF得到的返回值是空,我们如何得到rowid为AACEcaAIyAAAgCwAAF的相关的值呢?
我们知道,在索引中,不仅仅存储了rowid,还存储了键值,在执行计划走索引的情况下,会直接读取键值,而不会根据rowid再去读表中的数据块。
因此我们将通过强制走索引的方式,来获取索引上存储的值,希望通过这些值能还原表的数据,或者说,希望能通过这部分的数据,帮助application team找到线索去还原数据,毕竟,表有248个字段,索引才73个。
我们知道,在当前的数据库中,该表的索引存在2种状态,一种是rowid=AACEcaAIyAAAgCwAAF不包含数据的。一种是在rowid=AACEcaAIyAAAgCwAAF上有数据的。前者用强制索引查询,会返回0行,后者强制索引查询,能返回该索引块上的数据,即存储的键值,如果强制用rowid去找表的记录,将返回ora600[12700]
我们用hints的方式直接读取索引中的键值:(以索引M_IMPOR_M9_X为例)
1 2 3 4 5 |
SQL> select INDEX_NAME, COLUMN_NAME, COLUMN_POSITION from dba_ind_columns where index_name = 'M_IMPOR_M9_X'; INDEX_NAME COLUMN_NAME COLUMN_POSITION ------------------------------ ------------------------------ --------------- M_IMPOR_M9_X USEDATE 1 |
有一个索引字段,是建立在表的USEDATE的字段上,我们看看用hints的执行计划,注意我们这里只选择了被索引的USEDATE字段,而没有选其他字段:
1 2 3 4 5 6 7 8 9 10 11 |
SELECT /*+ INDEX_FFS(a M_IMPOR_M9_X) */ ROWID , TO_CHAR(USEDATE,'DD-MON-YYYY HH24:MI:SS') FROM SBUXXE.M_IMPOR a WHERE USEDATE IS NOT NULL AND ROWID = 'AACEcaAIyAAAgCwAAF'; Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=15601 Card=750398 Bytes=11255970) 1 0 INDEX (FAST FULL SCAN) OF 'M_IMPOR_M9_X' (NON-UNIQUE) (Cost=15601 Card=750398 Bytes=11255970) |
发现是走index fast full scan的,而不是走通过TABLE ACCESS BY INDEX ROWID找表上的块的数据。
因此,当我们运行:
1 2 3 4 5 6 |
SELECT /*+ INDEX_FFS(a M_IMPOR_M9_X) */ ROWID , TO_CHAR(USEDATE,'DD-MON-YYYY HH24:MI:SS') FROM SBUXXE.M_IMPOR a WHERE USEDATE IS NOT NULL AND ROWID = 'AACEcaAIyAAAgCwAAF'; |
的时候,可以直接从索引中,而不经过表中,取得该索引的键值:
1 2 3 4 5 |
M_IMPOR_M9_X ROWID USEDATE ------------------ -------------------- AACEcaAIyAAAgCwAAF 18-JAN-2008 07:41:39 |
以此类推,我们可以获取其他72个索引的值。
不过遗憾的是,由于为了减少ora-600[12700]的报错,之前由于索引ananlyze cascade online一直出不来,就停止了analyze脚本,直接重建了部分索引了。因此,重建后的索引,已经不会报ora-600[12700],但是却已经无法取到索引上的键值。怎么办?
上文中已经提到了,同事在physical dg上处理ora-600[3020]的时候,在覆盖数据文件之前,先备份了一个数据文件。注意,这个被备份的数据文件,是已经redo apply成功数据文件,它上面有完整的块信息。因此,我们只要从这个备份中读取数据,就能把数据提取出来,然后在主库插入该记录即可。怎么提取?我们便用到了分析block的利器BBED:
BBED的e(x)amine可以用来显示整行数据的信息:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 |
BBED> set dba 562,131248 DBA 0x8c8200b0 (2357330096 562,131248) BBED> show all FILE# 562 BLOCK# 131248 OFFSET 0 DBA 0x8c8200b0 (2357330096 562,131248) FILENAME /ora/data004/restore/stuck_recovery_USRM01UX_IMPOR_tbl09.dbf_SJ BIFILE bifile.bbd LISTFILE filelist2.txt BLOCKSIZE 8192 MODE Edit EDIT Unrecoverable IBASE Dec OBASE Dec WIDTH 80 COUNT 512 LOGFILE log.bbd SPOOL No BBED> p *kdbr[5] rowdata[0] ---------- ub1 rowdata[0] @254 0x2c BBED> p rowdata[0] ---------- ub1 rowdata[0] @254 0x2c BBED> map /v File: /ora/data004/restore/stuck_recovery_USRM01UX_IMPOR_tbl09.dbf_SJ (562) Block: 131248 Dba:0x8c8200b0 ------------------------------------------------------------ KTB Data Block (Table/Cluster) struct kcbh, 20 bytes @0 ub1 type_kcbh @0 ub1 frmt_kcbh @1 ub1 spare1_kcbh @2 ub1 spare2_kcbh @3 ub4 rdba_kcbh @4 ub4 bas_kcbh @8 ub2 wrp_kcbh @12 ub1 seq_kcbh @14 ub1 flg_kcbh @15 ub2 chkval_kcbh @16 ub2 spare3_kcbh @18 struct ktbbh, 144 bytes @20 ub1 ktbbhtyp @20 union ktbbhsid, 4 bytes @24 struct ktbbhcsc, 8 bytes @28 b2 ktbbhict @36 ub1 ktbbhflg @38 ub1 ktbbhfsl @39 ub4 ktbbhfnx @40 struct ktbbhitl[5], 120 bytes @44 struct kdbh, 14 bytes @172 ub1 kdbhflag @172 b1 kdbhntab @173 b2 kdbhnrow @174 sb2 kdbhfrre @176 sb2 kdbhfsbo @178 sb2 kdbhfseo @180 b2 kdbhavsp @182 b2 kdbhtosp @184 struct kdbt[1], 4 bytes @186 b2 kdbtoffs @186 b2 kdbtnrow @188 sb2 kdbr[10] @190 ub1 freespace[44] @210 ub1 rowdata[7934] @254 ub4 tailchk @8188 BBED> p kdbr[5] sb2 kdbr[5] @200 82 BBED> p *kdbr[5] rowdata[0] ---------- ub1 rowdata[0] @254 0x2c BBED> x /rctctcncccccccccccccccccccccccncccctctttntnnnntnttnttttttntnnnnncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccctcctcctccctcccccccnccccccccccctcctccctnccccccccctnnnccccnnnncnnnctccccttcccnccccccc rowdata[0] @254 ---------- flag@254: 0x2c (KDRHFL, KDRHFF, KDRHFH) lock@255: 0x00 cols@256: 230 col 0[10] @257: 1-11G8YOMD col 1[7] @268: 18-JAN-08 col 2[3] @276: 0-1 col 3[7] @280: 18-JAN-08 col 4[3] @288: 0-1 col 5[2] @292: 16 col 6[1] @295: 0 col 7[1] @297: Y col 8[1] @299: Y col 9[1] @301: N col 10[1] @303: N col 11[1] @305: Y col 12[6] @307: 0-SHDY col 13[1] @314: Y col 14[1] @316: N .... col 178[0] @824: *NULL* col 179[0] @825: *NULL* col 180[0] @826: *NULL* col 181[0] @827: *NULL* col 182[0] @828: *NULL* col 183[0] @829: *NULL* col 184[6] @830: 0-R9NH col 185[14] @837: Product Happil col 186[1] @852: N col 187[0] @854: *NULL* col 188[0] @855: *NULL* col 189[0] @856: *NULL* col 190[0] @857: *NULL* col 191[0] @858: *NULL* col 192[0] @859: *NULL* col 193[0] @860: *NULL* col 194[0] @861: *NULL* col 195[0] @862: *NULL* col 196[0] @863: *NULL* col 197[0] @864: *NULL* col 198[0] @865: *NULL* col 199[0] @866: *NULL* col 200[0] @867: *NULL* col 201[0] @868: *NULL* col 202[0] @869: *NULL* col 203[0] @870: *NULL* col 204[0] @871: *NULL* col 205[0] @872: *NULL* col 206[0] @873: *NULL* col 207[0] @874: *NULL* col 208[1] @875: N col 209[1] @877: Y col 210[0] @879: *NULL* col 211[0] @880: *NULL* col 212[0] @881: *NULL* col 213[7] @882: 18-JAN-08 col 214[2] @890: 30 col 215[2] @893: 7 col 216[2] @896: 7 col 217[0] @899: *NULL* col 218[0] @900: *NULL* col 219[0] @901: *NULL* col 220[3] @902: 0-1 col 221[0] @906: *NULL* col 222[0] @907: *NULL* col 223[0] @908: *NULL* col 224[0] @909: *NULL* col 225[0] @910: *NULL* col 226[0] @911: *NULL* col 227[0] @912: *NULL* col 228[0] @913: *NULL* col 229[1] @914: N BBED> exit |
注意,这个表有248个字段但是只导出了230个字段,因为230个字段后顿时null,。所以bbed导出的时候,会不记录这些null值。
至此,我们已经完全得到了丢失的数据,后续要操作的工作,就是把该表相关的索引都重建一次(注意这里的重建,不是指rebuild,而是drop and create),把丢失的数据交给application team,让其在主库插入该数据。
3条评论
cool,学习了。
够刺激,我喜欢
dbv bbed 都用上了,学习了!