作为一个dba,随着工作时间越来越长,任何事情都可以遇到。那么就需要我们快速解决问题。
开发人员在工作过程中,由于网络,电脑慢,写错sql或存储过程等原因,导致数据库中的数据误删除。这样就需要dba来把误删除的数据给找回来。
误删除数据后,一般有两种方式找回,一种是利用rman找一个测试库,按时间点恢复后,找到历史数据。第二种方式就是使用9i以后的闪回查询,下面介绍的就是闪回查询。
由于现阶段正在作批处理,所以没有业务人员正在使用系统,数据误删除后,停止了批处理。
1、设置session时间格式
ALTER SESSION SET NLS_TIMESTAMP_FORMAT='YYYY-MM-DD HH24:MI:SS.FF3';
SELECT LOCALTIMESTAMP from dual;
2、定位数据被删除的时间
现在数据被误删:
select count(*) from bussesb t where t.st_camd='I' and t.cmodame_date >=sysdate-1;
COUNT(*)
----------
10
穿越查看历史数据:
SELECT count(*) FROM bussesb AS OF TIMESTAMP TO_TIMESTAMP('2016-08-10 10:30:00.000') where st_camd='I' and cmodame_date >=sysdate-1;
COUNT(*)
----------
197074
SELECT count(*) FROM bussesb AS OF TIMESTAMP TO_TIMESTAMP('2016-08-10 10:40:00.000') where st_camd='I' and cmodame_date >=sysdate-1;
COUNT(*)
----------
197770
SELECT count(*) FROM bussesb AS OF TIMESTAMP TO_TIMESTAMP('2016-08-10 10:41:00.000') where st_camd='I' and cmodame_date >=sysdate-1;
C
3、创建备份表开发自己恢复历史数据
create table bussesbbak as SELECT * FROM bussesb AS OF TIMESTAMP TO_TIMESTAMP('2016-08-10 10:40:34.000');
4、打开批处理,把误删除的数据insert到生产表中。算上交流时间,4分钟左右,历史数据快速找回。。。。
备注:这种方式可以查询到多长时间以前的数据呢????
SQL> show parameter undo_retention;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_retention integer 900
时间主要有undo_retention参数和数据库的undo表空间使用情况决定,也就是说不忙的库可以查到几天前的数据。900s内一般都能查到数据,不会报下面的错误。
ERROR at line 1:
ORA-08180: no snapshot found based on specified time
我的数据库可以查看到10天前的数据。
SQL> ! date
Wed Aug 10 15:17:52 CST 2016
SQL> SELECT count(*) FROM DBA_USERS AS OF TIMESTAMP TO_TIMESTAMP('2016-07-29 1:50:00.000');
SELECT count(*) FROM DBA_USERS AS OF TIMESTAMP TO_TIMESTAMP('2016-07-29 1:50:00.000')
*
ERROR at line 1:
ORA-08180: no snapshot found based on specified time
SQL> SELECT count(*) FROM DBA_USERS AS OF TIMESTAMP TO_TIMESTAMP('2016-07-30 1:50:00.000');
COUNT(*)
----------
23
Falshback query查询的局限:
1. 闪回查询无法恢复到表结构改变之前,因为闪回查询使用的是当前的数据字典。
2. 受到undo_retention参数的影响,对于undo_retention之前的数据,Flashback不保证能Flashback成功。
3. 对drop,truncate等不记录回滚的操作,不能恢复,当然在系统表中可以查看到sql语句的可以恢复。如存储过程。
4. 普通用户使用dbms_flashback包,必须通过管理员授权。命令如下:
SQL>grant execute on dbms_flashback to ***;