原因是,在应用程序升级之后,一个操作会将表的所有列更新为相同的值。这样的错误出现在应用程序代码中,这显然是一个主要错误。SQL语句是罪魁祸首,它只有一个,其中1 = 1为它的位置。

系统的维护人员在星期五说他们犯了一个错误。他们发现的错误是在星期日,这是我恢复数据的日期,已被分离从声称的错误时间近2天。开始试图恢复与闪回查询和报告ora-01555错误数据。这是没有办法的办法。维修人员说,在星期五之前已被删除的备份(备份恢复策略的另一个例子是不合适的),它是不可能使用基于时间的恢复,剩下的路只使用日志挖掘,文件仍在数据库服务器上的很好。

这个库是一组RAC数据库,因为没有人能够确认操作发生的节点,因此有必要将所有文件从一个节点复制到另一个节点(如果没有足够的空间,可以使用NFS),然后我们需要找到用于数据恢复的归档日志:

170设置线宽为10000

改变会话设置nls_date_format = 'yyyy-mm-dd hh24:MI:学生;



30 col name

Col first_change A10

Col next_change A10



选择最大(first_time)从V archived_log美元

在first_time < to_date('200909251900 ','yyyymmddhh24mi ');这里的时间是估计错误发生时的最早时间。



选择序列#,first_time,名字,to_char(first_change #,xxxxxxxx)first_change,

to_char(next_change #,xxxxxxxx)next_change

从V archived_log美元

在first_time > = to_date('200909251707 ','yyyymmddhh24mi)

为2;-这里的时间最大(first_time)的SQL结果



序列# first_time名字first_chan next_chang

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

4039总监17:07:10 /拱门/ db1_1_4039.arc 88ce7eff 88d1457c

4040 2009-09-26 12:24:52 / / db1_1_4040.arc 88d1457c 88d1459f拱

4041 2009-09-26 12:25:22 / / db1_1_4041.arc 88d1459f 88d156a4拱

4688 2009-09-26 12:37:59 / / db1_2_4688.arc 88d1457f 88d1464a拱

4689 2009-09-26 12:38:27 / / db1_2_4689.arc 88d1464a 88d1569c拱

4042 2009-09-26 12:54:44 / / db1_1_4042.arc 88d156a4 88d157e7拱

4043 2009-09-26 12:54:56 / / db1_1_4043.arc 88d157e7 88d1ab06拱

4690 2009-09-26 13:07:47 / / db1_2_4690.arc 88d1569c 88d1570b拱

4691 2009-09-26 13:08:00 / / db1_2_4691.arc 88d1570b 88d1ab09拱

4044 2009-09-26 15:27:32 / / db1_1_4044.arc 88d1ab06 88d1ab0d拱

4045 2009-09-26 15:27:35 / / db1_1_4045.arc 88d1ab0d 88d25091拱

4692 2009-09-26 15:40:36 / / db1_2_4692.arc 88d1ab09 88d1ab77拱

4693 2009-09-26 15:40:39 / / db1_2_4693.arc 88d1ab77 88d25094拱

4046 2009-09-26 22:24:07 / / db1_1_4046.arc 88d25091 88d250db拱

4047 2009-09-26 22:24:19 / / db1_1_4047.arc 88d250db 88d2515e拱

4048 2009-09-26 22:24:29 / / db1_1_4048.arc 88d2515e 88d25167拱

4049 2009-09-26 22:24:41 / / db1_1_4049.arc 88d25167 88d25cac拱

4694 2009-09-26 22:37:13 / / db1_2_4694.arc 88d25094 88d25147拱

4695 2009-09-26 22:37:25 / / db1_2_4695.arc 88d25147 88d2515b拱

4696 2009-09-26 22:37:33 / / db1_2_4696.arc 88d2515b 88d2516a拱

4697 2009-09-26 22:37:47 / / db1_2_4697.arc 88d2516a 88d25ca9拱

4050 2009-09-26 22:41:57 / / db1_1_4050.arc 88d25cac 88d25cde拱

4698 2009-09-26 22:55:01 / / db1_2_4698.arc 88d25ca9 88d25dcf拱

4699 2009-09-26 22:55:19 / / db1_2_4699.arc 88d25dcf 88dbd27e拱

170设置线宽为10000

改变会话设置nls_date_format = 'yyyy-mm-dd hh24:MI:学生;

30 col name

Col first_change A10

Col next_change A10

选择最大(first_time)从V archived_log美元

在first_time < to_date('200909251900 ','yyyymmddhh24mi ');这里的时间是估计错误发生时的最早时间。

选择序列#,first_time,名字,to_char(first_change #,xxxxxxxx)first_change,

to_char(next_change #,xxxxxxxx)next_change

从V archived_log美元

在first_time > = to_date('200909251707 ','yyyymmddhh24mi)

为2;-这里的时间最大(first_time)的SQL结果

序列# first_time名字first_chan next_chang

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

4039总监17:07:10 /拱门/ db1_1_4039.arc 88ce7eff 88d1457c

4040 2009-09-26 12:24:52 / / db1_1_4040.arc 88d1457c 88d1459f拱

4041 2009-09-26 12:25:22 / / db1_1_4041.arc 88d1459f 88d156a4拱

4688 2009-09-26 12:37:59 / / db1_2_4688.arc 88d1457f 88d1464a拱

4689 2009-09-26 12:38:27 / / db1_2_4689.arc 88d1464a 88d1569c拱

4042 2009-09-26 12:54:44 / / db1_1_4042.arc 88d156a4 88d157e7拱

4043 2009-09-26 12:54:56 / / db1_1_4043.arc 88d157e7 88d1ab06拱

4690 2009-09-26 13:07:47 / / db1_2_4690.arc 88d1569c 88d1570b拱

4691 2009-09-26 13:08:00 / / db1_2_4691.arc 88d1570b 88d1ab09拱

4044 2009-09-26 15:27:32 / / db1_1_4044.arc 88d1ab06 88d1ab0d拱

4045 2009-09-26 15:27:35 / / db1_1_4045.arc 88d1ab0d 88d25091拱

4692 2009-09-26 15:40:36 / / db1_2_4692.arc 88d1ab09 88d1ab77拱

4693 2009-09-26 15:40:39 / / db1_2_4693.arc 88d1ab77 88d25094拱

4046 2009-09-26 22:24:07 / / db1_1_4046.arc 88d25091 88d250db拱

4047 2009-09-26 22:24:19 / / db1_1_4047.arc 88d250db 88d2515e拱

4048 2009-09-26 22:24:29 / / db1_1_4048.arc 88d2515e 88d25167拱

4049 2009-09-26 22:24:41 / / db1_1_4049.arc 88d25167 88d25cac拱

4694 2009-09-26 22:37:13 / / db1_2_4694.arc 88d25094 88d25147拱

4695 2009-09-26 22:37:25 / / db1_2_4695.arc 88d25147 88d2515b拱

4696 2009-09-26 22:37:33 / / db1_2_4696.arc 88d2515b 88d2516a拱

4697 2009-09-26 22:37:47 / / db1_2_4697.arc 88d2516a 88d25ca9拱

4050 2009-09-26 22:41:57 / / db1_1_4050.arc 88d25cac 88d25cde拱

4698 2009-09-26 22:55:01 / / db1_2_4698.arc 88d25ca9 88d25dcf拱

4699 2009-09-26 22:55:19 / / db1_2_4699.arc 88d25dcf 88dbd27e拱

设法找出错误更新数据的时间点:



执行sys.dbms_logmnr.add_logfile(logfilename = > / / db1_1_4038弧拱。);

执行sys.dbms_logmnr.add_logfile(logfilename = > / / db1_1_4039弧拱。);



执行sys.dbms_logmnr.start_logmnr(选项= >系统。dbms_logmnr。dict_from_online_catalog);



Col sql_redo A50



选择SCN,时间,用户名,sql_redo V logmnr_contents美元

在操作上(= 'update'and sql_redo)是tbl_form_form %

和sql_redo像% sgs0900021bnc10 %这个价值是价值的列已被更新,在更新的时间,用在这里,便于搜索。

按SCN排序,时间戳;

执行sys.dbms_logmnr.end_logmnr;

执行sys.dbms_logmnr.add_logfile(logfilename = > / / db1_1_4038弧拱。);

执行sys.dbms_logmnr.add_logfile(logfilename = > / / db1_1_4039弧拱。);

执行sys.dbms_logmnr.start_logmnr(选项= >系统。dbms_logmnr。dict_from_online_catalog);

Col sql_redo A50

选择SCN,时间,用户名,sql_redo V logmnr_contents美元

在操作上(= 'update'and sql_redo)是tbl_form_form %

和sql_redo像% sgs0900021bnc10 %这个价值是价值的列已被更新,在更新的时间,用在这里,便于搜索。

按SCN排序,时间戳;

执行sys.dbms_logmnr.end_logmnr;

不幸的是,没有需要的数据。我后来发现了一些日志,他们没有找到它们。

如果你一直在寻找它,它将需要相当长的时间和业务已经停止了。但你可以使用一个简单的方法来更新的时间来寻找错误的数据是:一个比较大的规模,通常的块头后面的部分,这是存储在表中的数据块通常是第一,很少更新,表至少恢复正是这样一种情况,我们可以通过对数据块的ITL事务SCN满足我们的要求。



SQL >选择tablespace_name,extent_id,file_id,block_id,块

从dba_extents,业主= 'xxx

和segment_name = 'tbl_form_form

为了extent_id;



tablespace_name extent_id file_id block_id块

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

XXXX 01625481128

XXXX 11723433128

XXXX 21821385128

XXXX 31919977128

XXXX 41623945128

XXXX 5178585128

XXXX 61814217128

XXXX 71918825128



警告:改变系统转储文件16块25482;



系统的改变。



开始转储数据块文件# TSN:4:16 minblk 25482 maxblk 25482

缓冲区:4 rdba TSN:0x0400638a(16 / 25482)

SCN:0x0000.88e21027 SEQ:0x02 0x00尾:0x10270602看图:

FRMT:0x02 chkval:0x0000 0x06 =跨数据类型:

块头部倾倒:0x0400638a

在y块上的对象id

赛格 /目标:0x40d8 CSC:0x00.88e20c40 ITC:2看图:型:1数据

FSL:0 FNX:0x0版本:0x01



ITL XID UBA旗LCK SCN / FSC

0x01 0x0010.011.0006ed74 0x03c002a0.2f48.07 C—0 SCN 0x0000.88d7af30

0x0012.019.000027e0 0x02 0x03c00ede.05de.42 C—0 SCN 0x0000.44e2ee39

SQL >选择tablespace_name,extent_id,file_id,block_id,块

从dba_extents,业主= 'xxx

和segment_name = 'tbl_form_form

为了extent_id;

tablespace_name extent_id file_id block_id块

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

XXXX 01625481128

XXXX 11723433128

XXXX 21821385128

XXXX 31919977128

XXXX 41623945128

XXXX 5178585128

XXXX 61814217128

XXXX 71918825128

警告:改变系统转储文件16块25482;

系统的改变。

开始转储数据块文件# TSN:4:16 minblk 25482 maxblk 25482

缓冲区:4 rdba TSN:0x0400638a(16 / 25482)

SCN:0x0000.88e21027 SEQ:0x02 0x00尾:0x10270602看图:

FRMT:0x02 chkval:0x0000 0x06 =跨数据类型:

块头部倾倒:0x0400638a

在y块上的对象id

赛格 /目标:0x40d8 CSC:0x00.88e20c40 ITC:2看图:型:1数据

FSL:0 FNX:0x0版本:0x01

ITL XID UBA旗LCK SCN / FSC

0x01 0x0010.011.0006ed74 0x03c002a0.2f48.07 C—0 SCN 0x0000.88d7af30

0x0012.019.000027e0 0x02 0x03c00ede.05de.42 C—0 SCN 0x0000.44e2ee39

从上面的结果,我们可以看到,在数据块的ITL,最近交易SCN是88d7af30,这是最后的归档日志first_change #和last_change #,这之间,88d25dcf和88dbd27e之间,很难做出这个错误发生在今天早上。所以我挖上1档案记录,其结果是发生在早上,在我开始恢复运行了半个小时。

由于错误没有太长,而且系统也允许丢失一定数量的数据,我们使用闪回查询在更新操作之前获取数据。

创建表tbl_form_form_new

As select * from tbl_form_form

随着时间to_date('2009-09-27 09:08:00 ','yyyy-mm-dd hh24:MI:SS);

当然,这里也可以根据SCN进行闪回。

创建表tbl_form_form_new

如选择*从tbl_form_form

随着时间to_date('2009-09-27 09:08:00 ','yyyy-mm-dd hh24:MI:SS);

当然,这里也可以根据SCN进行闪回。

幸运的是,闪回查询是成功的。它看起来足够大,撤销表空间仍然很好,至少我有一个闪回查询来多次恢复数据。