truncate能恢复

Truncate的恢复相对delete表和drop表来说,要困难很多,这个时候要考虑ORACLE 10g的新特性,闪回数据库。

现做简单实验如下:

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0

Connected as scott

目前ljb_test表有记录!

[quote]
SQL> insert into test select rownum from emp;

14 rows inserted

SQL> commit;

Commit complete

SQL> select count(*) from test;

COUNT(*)
----------
14
[/quote]
开始truncate该表

SQL> truncate table test;

Table truncated

查询当前时间为20090314 12:21:29

[quote]SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

TO_CHAR(SYSDATE,'YYYYMMDDHH24:

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

2010-12-22 15:33:09[/quote]
怎么办,表被truncate了,当然是想法子恢复回来了,首先将数据库置于MOUNT模式

[quote] SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> flashback database to timestamp to_timestamp('2010-12-22 15:32:20' ,'yyyy-mm-dd hh24:mi:ss');
flashback database to timestamp to_timestamp('2010-12-22 15:32:20' ,'yyyy-mm-dd hh24:mi:ss')
*
第 1 行出现错误:
ORA-01034: ORACLE not available


SQL> startup mount;
ORACLE 例程已经启动。

Total System Global Area 171966464 bytes
Fixed Size 787988 bytes
Variable Size 145488364 bytes
Database Buffers 25165824 bytes
Redo Buffers 524288 bytes
数据库装载完毕。
SQL> flashback database to timestamp to_timestamp('2010-12-22 15:32:20' ,'yyyy-mm-dd hh24:mi:ss');

闪回完成。

quote]
提示成功了,将数据库打开,请注意这个restlogs!

[quote]SQL> alter database open resetlogs;

数据库已更改。[/quote]
现在让登陆进去看看结果

[quote]SQL> connect scott/liweiwei@liweiwei
已连接。[/quote]
该表记录终于找回来了,非常激动人心吧!

[quote]SQL> select count(*) from test;

COUNT(*)
----------
14[/quote]
除了上面说的格式问题外,还要另外注意一点,就是这个闪回的时间是有限的,要有足够的闪回空间,否则将无法将数据库闪回到时间太前的时间,比如该例子说明到早上10点就无法闪回了。

SQL> flashback database to timestamp to_timestamp('2009-03-14 10:00:00','yyyy-mm-dd hh24:mi:ss');

ERROR at line 1:

ORA-38729: Not enough flashback database log data to do FLASHBACK.

总结:本小节通过闪回了整个数据库找回了被truncate的数据,不过现实中这样闪回整个数据库的操作可能只适合在开发库和测试库,生产中做这样操作的可能性非常小,首先是闪回整个庞大的数据库要足够的空间,其次是你如果闪回了你当前失误点时刻的数据库,好象时光倒流了,但是你是并发用户数据库,别人的正常操作过程也被你给回退了。所以生产中即便要做这样的操作,也要有非常严谨的考虑和规划才开始操作。

联想与引申:本例是讲述了如何找回被truncate的表,大家想想,虽然我把delete+commit,drop表,truncate table三个最容易发生的误操作分别用闪回查询,回收站和闪回数据库三种不同的方法找回,实际上闪回数据库的方法是包含了恢复delete+commit 和drop两类,整个数据库都可以回到某个时刻,被delete+commit和drop的表能不恢复回来吗!此外被drop的表如果回收站被人清空了,估计也就不得不依赖闪回数据库了。不过闪回数据库和回收站必须依赖oracle 10g版本数据库才可以,这点要牢记!
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值