当前位置: 移动技术网 > IT编程>数据库>Oracle > Oracle数据库中delete表后commit后找回的方法

Oracle数据库中delete表后commit后找回的方法

2018年03月21日  | 移动技术网IT编程  | 我要评论

同一银行 异地存取现 手续费取消,江系胡派,www15iiicom

有些时候,不小心删除了一些需要的表,而且数据库不能停止,只能一直运行下去,这样的话很麻烦

下面介绍的方法就是删除表后通过时间戳后者scn找回删除的数据

模拟实验环境:

创建一个新表

SQL> create table www as select * from hr.employees;

Table created.

查看新表是否有数据

SQL> select count(*) from www;

COUNT(*)

----------

107

查看当前的时间,这里时间或者scn有一个就行。后面会有通过scn恢复的案例

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

TO_CHAR(SYSDATE,'YY

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

2017-11-13 17:34:45

查找时间戳之前是否有数据

SQL> select count(*) from www as of timestamp to_timestamp('2017-11-13 17:30:45','yyyy-mm-dd hh24:mi:ss');

select count(*) from www as of timestamp to_timestamp('2017-11-13 17:30:45','yyyy-mm-dd hh24:mi:ss')

*

ERROR at line 1:

ORA-01466: unable to read data - table definition has changed

查询下这个时间段的数据是存在的

SQL> select count(*) from www as of timestamp to_timestamp('2017-11-13 17:34:45','yyyy-mm-dd hh24:mi:ss');

COUNT(*)

----------

107

删除表:

SQL> delete from www;

107 rows deleted.

SQL> commit;

Commit complete.

查看www表是没有数据的

SQL> select * from www;

no rows selected

当前时间查看也是没有数据了

SQL> select count(*) from www as of timestamp to_timestamp('2017-11-13 17:37:45','yyyy-mm-dd hh24:mi:ss');

COUNT(*)

----------

0

我们需要这样做,查看下删除之前的时间,根据删除之前的时间戳找到www表中的数据

SQL> select count(*) from www as of timestamp to_timestamp('2017-11-13 17:34:45','yyyy-mm-dd hh24:mi:ss');

COUNT(*)

----------

107

查看时间戳发现有数据存在,说明数据可以恢复

SQL> insert into www select * from www as of timestamp to_timestamp('2017-11-13 17:34:45','yyyy-mm-dd hh24:mi:ss');

107 rows created.

SQL> commit;

Commit complete.

数据恢复成功

SQL> select count(*) from www;

COUNT(*)

----------

107

同理,scn也是可以恢复的

SQL> select current_scn from v$database;

CURRENT_SCN

-----------

3698087

SQL> create table www as select * from hr.employees;

Table created.

SQL> select count(*) from www;

COUNT(*)

----------

107

查看创建表之后的scn

SQL> select current_scn from v$database;

CURRENT_SCN

-----------

3698135

SQL> delete from www;

107 rows deleted.

表中的数据已经没有了

SQL> select count(*) from www;

COUNT(*)

----------

0

SQL> commit;

Commit complete.

通过创建表之后的scn号来查询后,找到了相关数据

SQL> select count(*) from www as of scn 3698135;

COUNT(*)

----------

107

将数据插入到表中即可

SQL> insert into www select * from www as of scn 3698135;

107 rows created.

SQL> commit;

Commit complete.

完成恢复。

同理scn和时间戳可以互相转换 scn-->timestamp

SQL> select scn_to_timestamp(3698087) scn from dual;

SCN

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

13-NOV-17 05.43.11.000000000 PM

timestamp-->scn

SQL> select timestamp_to_scn(to_timestamp('2017-11-13 17:34:45','yyyy-mm-dd hh24-mi-ss')) scn from dual;

SCN

----------

3697660

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网