暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

生产数据恢复系列之-Oracle 11g使用drop误删数据表

热衷于分享各种干货知识,大家有想看或者想学的可以评论区留言,秉承着“开源知识来源于互联网,回归于互联网”的理念,分享一些日常工作中能用到或者比较重要的内容,希望大家能够喜欢,不足之处请大家多宝贵地意见,我们一起提升,守住自己的饭碗。

一、背景

在日常运维过程中,如果不小心使用高危命令删除了数据库的数据,如果没有数据备份,记住不要跑路噢,跟着我一起学习如何恢复数据。

二、logminer概念普及

####1、logminer 的作用 LogMiner是Oracle数据库中的一个工具,它可以用于分析数据库的重做日志文件,以了解数据库的操作历史和数据变化情况。LogMiner可以将重做日志文件中的SQL语句提取出来,并将其转换成易于理解的格式,以便用户进行分析和查询。 LogMiner的主要作用包括:

数据恢复:LogMiner可以用于恢复误删除或误修改的数据,通过分析重做日志文件中的SQL语句,可以找到被删除或修改的数据,并进行恢复操作。 数据审计:LogMiner可以用于审计数据库的操作,通过分析重做日志文件中的SQL语句,可以了解数据库的操作情况和操作者。 数据分析:LogMiner可以用于分析数据库的历史数据,通过分析重做日志文件中的SQL语句,可以了解数据库的操作历史和数据变化情况。 数据备份:LogMiner可以用于备份数据库的数据,通过分析重做日志文件中的SQL语句,可以保证备份数据的完整性和可靠性。

####2、logminer包

1)dbms_logmnr.add_logfile

作用:用于为日志分析列表增加或删除日志文件,或者建立日志分析列表。

2)dbms_logmnr.start_logmnr

作用:用于启动logmnr会话

3)dbms_logmnr.end_logmnr

作用:结束logminer会话

4)dbms_logmnr.mine_value

作用:用于返回要摘取的列信息,该函数在启动logminer之后调用。

5)dbms_logmnr.column_present

作用:用于确定列是否出现在数据的redo部分或undo部分

6)dbms_logmnr_d.build

作用:用于建立字典文件

7)dbms_logmnr_d.set_tablespace

作用:用于改变logminer表所在的表空间

####3、LogMiner 使用注意事项

(1)LogMiner 字典必须在源数据库中生成;
(2)当分析多个重做日志和归档日志时,它们必须是同一个源数据库的重做日志和归档日志;
(3)当分析多个重做日志和归档日志时,它们必须具有相同的 resetlogs scn;
(4)当分析的重做日志和归档日志必须在 Oracle8.0 版本以上 ;
(5)必须开启归档日志和附加日志。

####4、什么是补充日志,补充日志的作用是什么? logminer日志支持80%左右的日志挖掘,如果开启附加日志,大概支持98%的日志挖掘 重做日志用于实现例程恢复和介质恢复,这些操作所需要的数据被自动记录在重做日志中。但是,重做应用可能还需要记载其他列信息到重做日志中,记录其他列的日志过程被称为补充日志。 默认情况下,Oracle 数据库没有提供任何补充日志,从而导致默认情况下LogMiner 无法支持以下特征:

(1)索引簇、链行和迁移行; (2)直接路径插入; (3)摘取 LogMiner 字典到重做日志; (4)跟踪 DDL; (5)生成键列的 SQL_REDO 和 SQL_UNDO 信息; (6)LONG 和 LOB 数据类型。

三、场景模拟

1、开启归档日志

SQL> archive log list;
[oracle@myoracle oracle]$ mkdir -/u01/app/oracle/arch
SQL> shutdown immediate;
SQL> startup mount; 
SQL> alter database archivelog;
SQL> alter system set log_archive_dest_1='location=/u01/app/oracle/arch';
SQL> alter database open;
SQL> archive log list;

2、开启补充日志

SQL> select SUPPLEMENTAL_LOG_DATA_MIN from V$database;
SQL> alter database add supplemental log data;
SQL> select SUPPLEMENTAL_LOG_DATA_MIN from V$database;

3、模拟新增数据

[oracle@myoracle oracle]$mkdir -/u01/app/oracle/oradata/ceshi
SQL>createtablespace ceshi datafile '/u01/app/oracle/oradata/ceshi/ceshi.dbf' size 100M autoextend onnext10M MAXSIZE  500M;
SQL>createuser test identified by123456default tablespace ceshi;
SQL>grant dba to test;
SQL>commit;
SQL>conn test/123456
SQL>CREATETABLE test (id NUMBER PRIMARY KEY,data VARCHAR2(100));
SQL>INSERTINTO test (id, data)VALUES(1,'Sample data 1');
SQL>INSERTINTO test (id, data)VALUES(2,'Sample data 2');
SQL>INSERTINTO test (id, data)VALUES(3,'Sample data 3');
SQL>commit;
SQL>select*from test;

4、模拟误删数据

SQL> drop table test;
SQL> select * from test;

四、数据恢复

1、安装dbms包

[oracle@myoracle ~]$ sqlplus / as sysdba
SQL> @?/rdbms/admin/dbmslmd.sql
SQL> @?/rdbms/admin/dbmslm.sql
SQL> @?/rdbms/admin/dbmslms.sql

2、切换归档日志

SQL> alter system switch logfile;

3、查看utl_file_dir参数

SQL>show parameter utl_file_dir #如无路径,须添加路径
[oracle@myoracle oracle]$ mkdir -/u01/app/oracle/dblog
SQL> alter system set utl_file_dir='/u01/app/oracle/dblog' scope=spfile;
SQL> shutdown immediate;
SQL> startup;

4、查看日志文件和归档文件路径

SQL> select * from v$logfile;
SQL> select name from v$archived_log;

5、创建日志挖掘的字典

SQL> execute dbms_logmnr_d.build(dictionary_filename=>'log.ora',dictionary_location=>'/u01/app/oracle/dblog',options=>dbms_logmnr_d.store_in_flat_file);

6、添加归档日志

[oracle@myoracle arch]$ cd /u01/app/oracle/arch
[oracle@myoracle arch]$ ll

第一个归档日志为new,后面的都是add

SQL>exec dbms_logmnr.add_logfile('/u01/app/oracle/arch/1_5_1180882516.dbf',dbms_logmnr.new);
SQL>exec dbms_logmnr.add_logfile('/u01/app/oracle/arch/1_6_1180882516.dbf',dbms_logmnr.addfile);

说明:我这里是新建的库,大家可以根据实际情况进行归档日志添加,一般如果需要恢复的话,需进行日志的切换,大家可以根据切换日志的时间去选择需要添加的归档日志。

7、开启日志挖掘

SQL> exec dbms_logmnr.start_logmnr(dictfilename=>'/u01/app/oracle/dblog/log.ora');

8、查看日志挖掘记录

SQL>select username,scn,timestamp,sql_redo,sql_undo from v$logmnr_contents;

建议使用spool

SQL> spool /home/oracle/1.sql
SQL>select scn,to_char(timestamp,'yyyy-mm-dd hh24:mi:ss'),sql_redo from v$logmnr_contents where seg_name='TEST' and seg_owner='TEST'; #这里填误删除数据的用户和表
SQL> spool off

9、关闭日志挖掘

SQL> exec dbms_logmnr.end_logmnr;

10、查找丢失数据并导入

[oracle@myoracle ~]$ cat /home/oracle/1.sql

执行从 LogMiner 找到的 SQL_UNDO 语句来重新创建表结构。注意,这不会恢复表中的数据,只会恢复表结构。如果需要恢复表中的数据,可以通过基于时间或者SCN的恢复可以完全恢复该表数据。

五、总结

使用drop命令删除的数据表, LogMiner不太好恢复,只能恢复表机构,我们还是要做好日常的数据备份,管好权限,谨慎操作,避免因为误操作引起的业务故障和数据库故障。



文中的概念来源于互联网,如有侵权,请联系我删除。

欢迎关注公众号:小周的数据库进阶之路,一起交流数据库、中间件和云计算等技术。如果觉得读完本文有收获,可以转发给其他朋友,大家一起学习进步!感兴趣的朋友可以加我微信,拉您进群与业界的大佬们一起交流学习。



文章转载自小周的数据库进阶之路,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论