表误删记录恢复操作

表误删记录恢复操作

最近处理了个用户误删delete table 的故障,这里做了一个简单的汇总,文章内容整理自pub 里的各位大师的精粹,我这里偷个懒直接拿来用下。

基本处理思路:

1.如果还没有提交,用rollback。(应该不大可能。)

2.如果提交时间超过5分钟以上且小于undo_retention的设置,可以使用回闪功能。具体限制和操作可以参考:http://blog.itpub.net/post/468/15464

3.如果上述两条都不满足,可以使用logminer从redo中恢复,logminer的使用限制和描述可以参考:http://blog.itpub.net/post/468/13436

这里有一个使用logminer的简单的例子:http://blog.itpub.net/post/468/11764

4.如果这个日志已经重用且没有启用归档模式,那么你只能从备份中恢复了

2.使用闪回恢复表数据

2.1----flashback table

主要是是用undo 表空间的内容

注意:需要启用表的row movement

----格式化时间

SQL> alter session set nls_date_format=‘yyyy-mm-dd hh24:mi:ss‘;

SQL> select sysdate from dual;

SYSDATE

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

2014-07-27 20:23:37

----enable row movement

Alter table xxx enable row movement:

----根据scn
闪回表:

SQL> flashback table kel.t1 to scn 896744;

---根据时间点闪回表:

SQL> flashback table kel.t1 to timestamp to_timestamp(‘2014-07-28 00:18:00‘,‘yyyy-mm-dd hh24:mi:ss‘);

2.2----flashback query:

flashback query只能看到某一个时间点的对象的状态,而不能看到某个时间段内的状态变化。

select * from tb as of timestamp to_timestamp(‘2014-07-27 20:23:37‘,‘yyyy-mm-dd hh24:mi:ss‘);

2.3-----flashback drop

用于恢复用户误删除的对象,包括表、索引等,依赖于tablespace recycle bin
,表空间回收站

初始化参数recyclebin参数用于控制是否启用recyclebin功能,缺省是ON

在recycle bin中,oracle可以区分不同用户的同名的表。

recycle bin的维护:

1、只能用于非系统表空间和本地管理的表空间

2、如果对象创建在本地管理的表空间,而关联对象,比如索引创建在字典管理的表空间上,则恢复时字段管理的表空间关联对象不能被恢复

3、对象是否能恢复成功,取决于对象空间是否被覆盖重用

4、不能对recycle bin中的内容进行DML和DDL的操作,只能做查询操作

5、对象的参考约束不能被恢复,也就是外键约束需要重建

手动清除recycle bin的空间:

purge tablespace kel

db_flashback_retention_target Default value       
1440 (minutes)

闪回查询使用的是undo
信息

UNDO_RETENTION  理解:

The UNDO_RETENTION parameter is ignored for a fixed size undo tablespace. The database may overwrite unexpired undo information when tablespace space becomes low.

如果undo 表空间大小是固定的,则oracle会忽略 undo_retention
参数的设置,在undo
空间不足的情况下,oracle可能会覆盖未过期的undo
信息。

For an undo tablespace with the AUTOEXTEND option enabled, the database attempts to honor the minimum retention period specified by UNDO_RETENTION. When space is low, instead of overwriting unexpired undo information, the
tablespace auto-extends. If the MAXSIZE clause is specified for an auto-extending undo tablespace, when the maximum size is reached, the database may begin to overwrite unexpired undo information.

当undo 是自动扩展的,oracle
会尽可能的保证 undo_retention
设置的undo保留时间;当undo
空间不够使oracle
会优先自动扩展undo 表空间,而不是去覆盖未过期的undo
信息,如果undo tbs
设置了 maxsize  参数,则在达到undo最大空间时,oracle可能就会去覆盖那些未过期的undo信息。

注意:对于在system表空间的中对象,使用闪回drop
无效,因为被drop的对象不会被放在 recyclebin
中:

----确认是否启用recyclebin功能

SQL> show parameter recyclebin

----可以通过视图来进行查看recycle bin中的对象列表:

select object_name as recycle_name,original_name from recyclebin;

----可以像查看普通表一样,来查看recycle bin
中对象的内容:

select count(*) from "BIN$/ti6DA4axIDgQKjAbgFLmA==$0";

要使用flashback drop功能恢复误删除的表,需要做以下几点:

1、确认已删除的表在recycle bin中

2、使用flashback table来进行恢复

如果同名的表在recycle bin中存在,可以恢复到需要的那个表:

select count(*) from "BIN$/ti6DA4cxIDgQKjAbgFLmA==$0";--查看哪个是想恢复的表

---恢复表

flashback table "BIN$/ti6DA4exIDgQKjAbgFLmA==$0" to before drop;

---恢复表并且重命名为kel1

flashback table kel to before drop rename to kel1;

3.使用oracle 
logminer 来进行数据恢复

logmnr其实是非常有用的一个恢复数据的工具,今天有人提到恢复700万的数据,我也做过几万条财务数据的恢复,借此小结一下。

--创建一个表来保存提取出来的sql

create table logmnr_content tablespace tools as select scn,cscn,TIMESTAMP,sql_undo from v$logmnr_contents where 1=0;

--通过dba_objects
查到表对应的 object_id and data_object_id ,用来在log中提取该表相关的sql_undo

select object_id,data_object_id from dba_objects where object_name = ???

--通过在os中找到的归档日志范围,进行联机提取

将undo sql
插入一个表中,比如我的日志序号范围是 5813
到 5850

为了防止临时空间不足,一个一个归档日志文件处理。

begin

for i in 8..24 loop

dbms_logmnr.add_logfile(LogFileName=>‘/disk2/oradata/arch/crmcn/crmcn_1_‘||i||‘.arc‘);

dbms_logmnr.start_logmnr(Options => sys.dbms_logmnr.DICT_FROM_ONLINE_CATALOG);

dbms_logmnr.start_logmnr();

insert into logmnr_content(scn,cscn,TIMESTAMP,sql_undo )

select scn,cscn,TIMESTAMP,sql_undo from v$logmnr_contents

where DATA_OBJD# = 52528;

commit;

dbms_logmnr.end_logmnr();

end loop;

end

/

--将提取出来的sql通过动态sql执行插入表

declare

sql_str varchar2(4000);

begin

for c in (select * from logmnr_content) loop

sql_str := replace(c.sql_undo,‘;‘,‘‘);

execute immediate sql_str;

end loop;

commit;

end;

注意:如果在这段日志中还有其他对该表的操作的话,可以结合操作类型 OPERATION
和提交scn cscn
来判断到底是不是该恢复的这部分数据。

表误删记录恢复操作

时间: 2024-11-05 12:28:32

表误删记录恢复操作的相关文章

mysql学习笔记——对数据表中记录的操作

对记录的操作,主要有增.删.改.查 一.记录插入命令:insert into 表名(列名,列名, .... ) values(值, 值, ....); 值个数应该列个数相同,值顺序和列顺序相同,值类型和列字段类型匹配 当表名后面省略列名时,values后面要给出所有列的值 插入数据时,字符串添加 单引号 '' ---- 字符型和日期型数据应包含在单引号中 插入数据时,中文乱码问题:将客户端的编码集设置为gbk 修改mysql 配置文件,永久改变客户端编码集 ----- mysql/my.ini

xtrabackup全备操作和误删备份恢复操作

1.安装percona源rpm -Uhv http://www.percona.com/downloads/percona-release/percona-release-0.0-1.x86_64.rpm 2.使用yum安装percona-xtrabackup:yum -y install percona-xtrabackupyum install -y perl-DBD-MySQL perl-DBI perl-Time-HiRes libaio* 3.安装结果rpm -qa |grep xtr

mysql的学习(四)-数据库表的记录的操作

INSERT INTO bookcategory(category_id,category,parent_id) VALUES(1,'计算机',0);//指定插入的顺序 INSERT INTO bookcategory VALUES(1,'计算机',0);//按照默认的插入 INSERT INTO bookcategory(category_id,category,parent_id) VALUES(1,'计算机',0),(2,'xxx',3)(3,'xxxxx',4);//同时插入多条数据 I

MYSQL触发器记录用户操作的命令

假如有一张重要的表btb,需要几个管理员来管理 管理员:[email protected].[email protected].[email protected] 要求给表btb创建触发器: trigger触发器需求: 1.当在btb表中做insert.update.delete操作时,在btb_trace表中记录执行操作的用户.时间.操作命令. 1.当在btb表中插入新记录时,atb_bak表中会将atb表中的所有数据记录下来.保持同步备份. 2.当在btb表中删除数据前,在atb_del表中

Oracle误删一个表数据的恢复方案

同事找回时操作的数据库为oracle 10g , 之前删除方式为delete 不晓得trancate好使不 SCN(系统改变号),它的英文全拼为:System Change Number ,它是数据库中非常重要的一个数据结构. SCN提供了Oracle的内部时钟机制,可被看作逻辑时钟,这对于恢复操作是至关重要的 注释:Oracle 仅根据 SCN 执行恢复. 它定义了数据库在某个确切时刻提交的版本.在事物提交时,它被赋予一个唯一的标示事物的SCN .一些人认为 SCN 是指, System Co

背景:表A数据误操作,被delete了,恢复。

SELECT MAX(Scn) FROM Sys.Smon_Scn_Time WHERE Time_Dp < TO_DATE('2015-09-18', 'YYYY/MM/DD') select b.file_name 物理文件名, b.tablespace_name 表空间, b.bytes/1024/1024 大小M, (b.bytes-sum(nvl(a.bytes,0)))/1024/1024 已使用M, substr((b.bytes-sum(nvl(a.bytes,0)))/(b.b

数据库:MySQL(单表的表记录的操作)(二)

一.表记录的增删改查 1.增加表记录 <1>插入一条记录: insert [into] tab_name (field1,filed2,.......) values (value1,value2,.......); 示例: insert into employee_new (id,name,birthday,salary) values (1,'yuan','1990-09-09',9000); insert into employee_new values (2,'alex','1989-

python--MySql 表记录的操作

表记录的增删改查 ---插入表记录 INSERT -- 插入一条数据 INSERT [INTO] table_name (字段名称,...) VALUES(值,...); ---插入多条数据 INSERT [INTO] table_name (字段名称,...) VALUES(值,...), (值,...), ... (值,...); ---修改表记录 UPDATE UPDATE table_name SET 字段=值,字段=值... WHERE 字句: ---删除表记录 DELETE FROM

SQL Server 2012设置某用户对某些表的记录限制其删除操作

第一步:用sa用户进入SSMS: 第二步:在安全性---用户上面点击右键---"属性": 第三步:在选择页中选择"安全对象",点击"搜索",弹出添加对象页面,这里默认为特定对象不用选择: 第四步:点击对象类型对话框,打开选择对象类型,选择"表": 第五步:对要进行加权限限制的表进行选择: 第六步:对所选择的表进行授权设置,点击完成即可.我这里主要是限制不可以删除,选择相应的表,勾选删除即可. SQL Server 2012设置