在数据操作过程中,经常会出现一些误操作。比如,误删除数据,误删除表,误update表等。数据库里各种误操作都是可以恢复的。
这里只简单的讨论下关于几种恢复方式
1. 对于drop操作的恢复
1.1操作时间在15分钟以内
如果删除表的操作时间与当前时间间隔不超过15分钟,可以执行如下命令恢复:
Flashback table TABLE_NAME to before drop;
1.2操作时间在15分钟以上,且回收站没有被清空
首先确认被删除的表名,其次确认用户。在无法确认以上需求时,用下面语句查看所有被删除的表
SELECT owner, object_name, original_name, droptime
FROM DBA_RECYCLEBIN
WHERE operation = ‘DROP’
AND type = ‘TABLE’
AND original_name LIKE ‘%\&table_name%’;
–确定以上要求后,使用下面语句查看出被删除以后的对象名
SELECT owner, object_name, original_name, droptime
FROM DBA_RECYCLEBIN
WHERE
AND original_name = ‘\&table_name’
AND owner = ‘\&user’;
–得出表被删除后的对象名,开始恢复被删除表数据
CREATE TABLE
AS
SELECT * FROM sns.”"
1.3 表删除超过15分钟,且回收站被清空
这种情况下的恢复工作是非常非常麻烦的。这里分两种方式分别说下思路:
RMAN方式:
将RMAN备份恢复到别一个数据库上,从已经恢复的数据库中将表导出(EXP、expdp),再导入主库
EXP/IMP(EXPDP/IMPDP)方式:
imp user/password file=&path/file_name.dmp tables=’&table_name’ fromuser=’&from_user’ touser=’&TO_USER’
这样恢复,只能恢复到上次备份的状态。从最近一次备份到被删除时的数据,是无法恢复的。
2. 对于Delete操作的恢复
对于delete操作,如果开启了归档模式,会被记录在归档日志中。所以,我们可以通过归档日志中的记录来恢复。但是归档日志是二进制文件,我们看不懂其中的内容。所以要通过Oracle提供的特殊工具来分析日志、查看分析内容,恢复数据。这个工具就是logmnr。如果没有开启归档日志,很高兴的通知你,这个数据恢复不了了(如果没有其他备份)。
具体操作命令如下:
2.1 确认表名、用户名
可通过相关工具人员询问得知。如果提供信息的工作人员,对表不熟悉,只能提供一个大概的印象,那么,需要在数据库中进行确认,语句如下
SELECT owner, table_name
FROM dba_tables
WHERE table_name LIKE ‘%&table_name%’;
2.2 确认对应的归档日志
为什么要进行这一步操作呢?很简单,因为归档日志是会进行切换的。良好状态下,日志组切换频率为15分钟/次。语句如下:
–查看视图结构
desc V$ARCHIVED_LOG;
–确保日志格式能将时间完全显示
alter session set nls_date_format=’yyyy-mm-dd hh24:mi:ss’;
通过时间字段查找操作日志记录的归档日志文件
select name,first_time from V$ARCHIVED_LOG where FIRST_TIME > sysdate -1;
2.3 安装logMiner,需要运行以下两脚本:
@’\$ORACLE_HOME/rdbms/admin/dbmslm.sql’;
@’\$ORACLE_HOME/rdbms/admin/dbmslmd.sql’;
实例:
SQL> @’\$ORACLE_HOME/rdbms/admin/dbmslm.sql’;
Package created.
Grant succeeded.
Synonym created.
SQL> @’\$ORACLE_HOME/rdbms/admin/dbmslmd.sql’;
Package created.
Synonym created.
2.4 检查utl_file_dir参数
Utl_file_dir是utl_file包用于进行I/O传输的。Logmnr工具调用到这个包。
Show parameter utl_file_dir;
Alter system set utl_file_dir=’/u01/logmnr’ scope=both;
shutdown immediate;
startup;
2.5 创建数据字典文件
sqlplus / as sysdba;
Execute dbms_logmnr_d.build(dictionary_filename => ‘dict.ora’,dictionary_location => ‘/u01/logmnr’);
2.6 装载日志文件
execute dbms_logmnr.add_logfile(LogFileName => ‘/data1/oracle/archivelog/epmdb/1_4449.dbf’,Options =dbms_logmnr.new);
execute dbms_logmnr.add_logfile(LogFileName => ‘/data1/oracle/archivelog/epmdb/1_4450.dbf’,Options =dbms_logmnr.addfile);
2.7开始分析日志
execute dbms_logmnr.start_logmnr(startTime => to_date(’ \&start_time′,’yyyy-mm-dd hh24:mi:ss’),endTime =to_date(’\&end——time′,’yyyy-mm-dd hh24:mi:ss’),DictFileName =’/data1/dict.ora’);
2.8 获取分析日志
create table &data_recovery as select * from v$logmnr_contents;
select timestamp, seg_name, operation, sql_redo, sql_undo
from &data_recovery
where username = ‘&user_name’
and seg_name = ‘&table_name’
and operation = ‘DELETE’
2.9 通过上面查询出来的undo语句将数据还原!
3. 对于update操作的恢复
与第二部分中的恢复过程类似。
不过,2.8 中select 语句中的operation = ‘UPDATE‘