精华内容
下载资源
问答
  • truncate表后恢复方法总结 1.1 BLOG文档结构图 1.2 前言部分 1.2...

    truncate表后恢复方法总结

     

    1.1  BLOG文档结构图

    image

     

    1.2  前言部分

     

    1.2.1  导读和注意事项

    各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~:

    truncate操作后的恢复方法(重点)

     

      Tips:

           ① 若文章代码格式有错乱,推荐使用QQ、搜狗或360浏览器,也可以下载pdf格式的文档来查看,pdf文档下载地址:http://yunpan.cn/cdEQedhCs2kFz (提取码:ed9b 

           ② 本篇BLOG中命令的输出部分需要特别关注的地方我都用灰色背景和粉红色字体来表示,比如下边的例子中,thread 1的最大归档日志号为33thread 2的最大归档日志号为43是需要特别关注的地方;而命令一般使用黄色背景和红色字体注;对代码或代码输出部分的注释一般采用蓝色字体表示

     

      List of Archived Logs in backup set 11

      Thrd Seq     Low SCN    Low Time            Next SCN   Next Time

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

      1    32      1621589    2015-05-29 11:09:52 1625242    2015-05-29 11:15:48

      1    33      1625242    2015-05-29 11:15:48 1625293    2015-05-29 11:15:58

      2    42      1613951    2015-05-29 10:41:18 1625245    2015-05-29 11:15:49

      2    43      1625245    2015-05-29 11:15:49 1625253    2015-05-29 11:15:53

     

     

     

     

    [ZFXXDB1:root]:/>lsvg -o

    T_XDESK_APP1_vg

    rootvg

    [ZFXXDB1:root]:/>

    00:27:22 SQL> alter tablespace idxtbs read write;

     

     

    ====》2097152*512/1024/1024/1024=1G 

     

     

     

    本文如有错误或不完善的地方请大家多多指正,ITPUB留言或QQ皆可,您的批评指正是我写作的最大动力。

     

     

    1.2.2  相关参考文章链接

     

     

    1.2.3  本文简介

    truncate操作是比较危险的操作,不记录redo,不能通过闪回查询来找回数据,但是只要段所占用的块没有全部被重新占用的情况下,我们还是可以通过一些特殊的办法来找回truncate掉的数据,因为当Truncate命令发起之后,Oracle实际上并没有在删除底层数据块上的数据,而是要等到重用的时候才会把这一部分数据回收,于是这给了我们一个能够恢复数据库的机会。

    总体而言,恢复的办法是通过一些大牛写的工具来恢复,分为收费和免费的,我们下边分别说明。实验部分我们只实验fy_recover_data包和gdul工具。

    有的实验是很久之前做的,这篇文章发布太晚,因为中间学习了DUL和BBED的相关知识。

    1.3  收费软件

     

    这里简单列举一下,具体内容请到相关网站了解:

    工具名称

    下载地址

    作者

    软件

    ODU

    http://www.oracleodu.com/cn/

    老熊

    命令行操作

    PRM-DUL

    http://www.parnassusdata.com/ 

    Maclean Liu

    图形界面操作

    AUL/mydul

    http://www.dbatools.net/mydul/

    d.c.b.a/楼方鑫

    命令行

     

     

     

    1.4  免费软件

    1.4.1  fy_recover_data

    作者个人信息:

    WWW.HelloDBA.COM                                                   

    Created By: Fuyuncat                                               

    Created Date: 08/08/2012                                           

    Email: Fuyuncat@gmail.com                                          

    Copyright (c), 2014, WWW.HelloDBA.COM All rights reserved.         

    Latest Version: http://www.HelloDBA.com/download/FY_Recover_Data.zip

    该包采用纯plsql语句恢复被truncate掉的表,操作比较简单,下载可以去官网下载,或者小麦苗的云盘共享目录。

     

    Fy_Recover_Data是利用Oracle表扫描机制、数据嫁接机制恢复TRUNCATE或者损坏数据的工具包。由纯PLSQL编写,原理图如下:

    wps33F2.tmp 

     

     

    包内容:

    wps3403.tmp

     

    1.4.2  gdul工具

    GDUL老耿开发的一款类dul工具,当数据库于某种原因无法打开,可以利用GDUL把表数据直接读取出来工具下载地址参考小麦苗的blog老耿的信息如下:

    *********************************************************************

      GDUL for ORACLE DB.

      Version 4.0.0.1, build date: 2016.04.12.

      Copyright (c) 2007, 2016. Andy Geng.  ALL RIGHTS RESERVED.

      Email: dbtool@aliyun.com

      WeChat official account: dbtool

      QQ group: 235019291

    *********************************************************************

     

    1.4.2.1  gDUL功能特点

    完整支持多种格式导出,包括expdp,exp,text格式。目前市面上的类dul工具只有gDUL支持expdp格式。

    支持ASM文件系统,并内置asmcmd命令。

    支持绝大多数列类型,支持常见的NUMBER,CHAR, VARCHAR2, DATE,LOB, LONG等类型。。其中 SecureFile LOB 支持压缩,尚不支持去重和加密。

    支持导出常规表、IOT、Cluster 表、分区表、压缩表。

    支持 truncated 表、删除行恢复。

    支持常规表空间和 bigfile 表空间。

    支持主流硬件平台(HP-UX,AIX, Solaris, Linux, Windows),各个平台仅需单一的可执行文件,方便分发。

    重点是——永久免费使用,无需额外费用,不开源。

     

     

     

    1.4.3  dul

    DUL Data Unloader 的缩写,是一个荷兰的 Oracle 工程师开发的,他的名字为 Bernard Van DuijnenDUL 是一个 C 开发的小程序,编译后整个程序只有一个文件,大小也不过几百 KB,它工作时不需 Oracle RDBMS 以及任何的 Oracle 的程序、组件,它可以直接从一个坏了数据库的数据文件中读取数据,生成 IMP SQL*Loader 可以识别的文件。

    DUL 不是一个商用化的产品,Oracle 不卖、不提供也不支持它的使用。DUL 只有在 Oracle 的内部网站才可以下载到,因此也只有 Oracle Supporter 才能下载到有这个工具,如果与 Oracle Supporter 熟悉,没准他私底下会给你一个,这个工具也因此有一些流落到民间,被一些人收入囊中,奉为珍宝。 

    不同的平台、不同版本的数据库都有相应的 DUL 软件,9.x 及之前 DUL 是没有 License 限制的,也就是有这个工具可以无限制的使用,不过最新的 DUL 在这方面已经改进了,kamus 说最新 DUL 拿到手只能用一个月。 

    关于这一小点稍总结一下,获得 DUL 有以下几种途径: 

    wps3404.tmp 如果你是 Oracle Supporter ,可以在内部网站下载,地址为: http://www.nl.oracle.com/support/dul/ 

    wps3405.tmp 如果你有 Oracle Supporter 的朋友可以向他们要一个,itpub 也几位斑竹都到 Oracle 了,如 coolylkamus,lunar 

    wps3406.tmp 一些 dul 流落到民间,可以向有这软件的朋友要一个,不过他们不一定有你需要的那个。 

     

    所以关于DUL我们不做过多的解释。

     

    1.4.4  bbed来恢复

    这个比较复杂,若对oracle不熟悉或者bbed不熟悉都不推荐使用这个,具体案例参考:http://blog.itpub.net/26736162/viewspace-2080727/

     

     

    第二章 实验部分

    2.1  实验环境介绍

    项目

    db

    db 类型

    单实例

    db version

    11.2.0.4.0

    db 存储

    FS

    主机IP地址/hosts配置

    192.168.59.129

    OS版本及kernel版本

    AIX 7.1 64位

    归档模式

    Archive Mode

    ORACLE_SID

    oralhr

     

     

    2.2  实验目标

    将truncate掉的表数据成功找回。

     

    2.3  实验过程

     

    2.3.1  fy_recover_data包恢复truncate的表

    [ZFXDESKDB1:oracle]:/oracle>ORACLE_SID=oraESKDB1

    [ZFXDESKDB1:oracle]:/oracle>sqlplus / as sysdba

     

    SQL*Plus: Release 11.2.0.4.0 Production on Mon Mar 21 15:51:55 2016

     

    Copyright (c) 1982, 2013, Oracle.  All rights reserved.

     

     

    Connected to:

    Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

    With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,

    Data Mining and Real Application Testing options

     

    SYS@oraESKDB1> set time on;

    15:52:10 SYS@oraESKDB1> set timing on;

    15:52:10 SYS@oraESKDB1> set serveroutput on;

    15:52:10 SYS@oraESKDB1> create table scott.TB_0321    as SELECT * FROM dba_objects;

     

    Table created.

     

    Elapsed: 00:00:00.59

    15:52:18 SYS@oraESKDB1> SELECT COUNT(1) FROM   scott.TB_0321;

     

      COUNT(1)

    ----------

         86651

     

    Elapsed: 00:00:00.19

    15:52:24 SYS@oraESKDB1> INSERT INTO scott.TB_0321 SELECT * FROM scott.TB_0321;

     

     

    86651 rows created.

     

    Elapsed: 00:00:00.26

    15:52:30 SYS@oraESKDB1> COMMIT;

    Commit complete.

     

    Elapsed: 00:00:00.01

    15:52:30 SYS@oraESKDB1> INSERT INTO scott.TB_0321 SELECT * FROM scott.TB_0321;

    COMMIT;

     

    173302 rows created.

     

    Elapsed: 00:00:00.43

    15:53:02 SYS@oraESKDB1> SELECT COUNT(1) FROM   scott.TB_0321;

     

      COUNT(1)

    ----------

      346604

     

    Elapsed: 00:00:00.27

    16:15:18 SYS@oraESKDB1> SELECT d.BYTES/1024/1024 FROM dba_segments d WHERE d.segment_name ='TB_0321';

     

    D.BYTES/1024/1024

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

                   40

     

    Elapsed: 00:00:00.44

    16:15:25 SYS@oraESKDB1> truncate table scott.TB_0321;

     

    Table truncated.

     

    Elapsed: 00:00:00.20

    16:15:46 SYS@oraESKDB1> SELECT COUNT(1) FROM   scott.TB_0321;

     

      COUNT(1)

    ----------

             0

     

    Elapsed: 00:00:00.01

     

    ====》数据已经被truncate掉了,下边我们来恢复

     

     

    16:15:52 SYS@oraESKDB1> @/oracle/FY_Recover_Data.pck

     

    Package created.

     

    Elapsed: 00:00:00.06

     

    Package body created.

     

    Elapsed: 00:00:00.03

    16:15:59 SYS@oraESKDB1> exec fy_recover_data.recover_truncated_table('scott','TB_0321');

    16:16:06: Use existing Directory Name: FY_DATA_DIR

    16:16:07: Recover Table: SCOTT.TB_0321$

    16:16:09: Restore Table: SCOTT.TB_0321$$

    16:16:24: Copy file of Recover Tablespace: FY_REC_DATA_COPY.DAT1

    16:16:24: begin to recover table SCOTT.TB_0321

    16:16:24: Use existing Directory Name: TMP_HF_DIR

    16:17:09: Recovering data in datafile +DATA/oraeskdb/datafile/users.351.902678817

    16:17:09: Use existing Directory Name: TMP_HF_DIR

    16:39:16: 4984 truncated data blocks found.

    16:39:16: 346604 records recovered in backup table SCOTT.TB_0321$$

    16:39:17: Total: 4984 truncated data blocks found.

    16:39:17: Total: 346604 records recovered in backup table SCOTT.TB_0321$$

    16:39:17: Recovery completed.

    16:39:17: Data has been recovered to SCOTT.TB_0321$$

     

    PL/SQL procedure successfully completed.

     

    Elapsed: 00:23:11.59

     

    16:39:17 SYS@oraESKDB1> SELECT COUNT(1) FROM   scott.TB_0321$$;

     

      COUNT(1)

    ----------

       346604

     

    Elapsed: 00:00:01.55

    16:40:51 SYS@oraESKDB1>

    16:40:51 SYS@oraESKDB1> alter table scott.TB_0321 nologging;

     

    Table altered.

     

    Elapsed: 00:00:00.03

    16:41:43 SYS@oraESKDB1> insert /*+append*/ into scott.TB_0321 select * from scott.TB_0321$$;

     

    346604 rows created.

     

    Elapsed: 00:00:00.86

    16:41:52 SYS@oraESKDB1> commit;

     

    Commit complete.

     

    Elapsed: 00:00:00.01

    16:41:55 SYS@oraESKDB1> alter table scott.TB_0321 logging;

     

    Table altered.

     

    Elapsed: 00:00:00.02

    16:42:06 SYS@oraESKDB1>

    16:42:06 SYS@oraESKDB1> drop tablespace   FY_REC_DATA  including contents and datafiles;

     

    Tablespace dropped.

     

    Elapsed: 00:00:08.00

    16:42:35 SYS@oraESKDB1> drop tablespace   FY_RST_DATA  including contents and datafiles;

     

    Tablespace dropped.

     

    Elapsed: 00:00:07.59

    16:42:44 SYS@oraESKDB1>

     

     

    数据成功恢复。

     

     

    2.3.2  gdul恢复truncate的表

    set time on;

    set timing on;

    set serveroutput on;

    drop table scott.TB_0322_05;

    create table scott.TB_0322_05    as SELECT * FROM dba_objects;

     

    SELECT COUNT(1) FROM   scott.TB_0322_05;

    INSERT INTO scott.TB_0322_05 SELECT * FROM scott.TB_0322_05;

    COMMIT;

    INSERT INTO scott.TB_0322_05 SELECT * FROM scott.TB_0322_05;

    COMMIT;

    INSERT INTO scott.TB_0322_05 SELECT * FROM scott.TB_0322_05;

    COMMIT;

    INSERT INTO scott.TB_0322_05 SELECT * FROM scott.TB_0322_05;

    COMMIT;

    SELECT COUNT(1) FROM   scott.TB_0322_05;

     

    SELECT d.BYTES/1024/1024 FROM dba_segments d WHERE d.segment_name ='TB_0322_05';

     

     

    truncate table scott.TB_0322_05;

     

    alter system checkpoint;

     

    col ownere format a10

    col DIRECTORY_NAME format a30

    col DIRECTORY_PATH format a50

    select OWNER,DIRECTORY_NAME,DIRECTORY_PATH from  dba_directories;

     

     

    bootstrap

    desc scott.TB_0322_05

    unload table  scott.TB_0322_05

    scan tablespace 4

    untrunc table  scott.TB_0322_05

     

    cp SCOTT_TB_0322_05.dmp /oracle/app/oracle/admin/oralhr/dpdump/

    impdp  scott/tiger directory=DATA_PUMP_DIR dumpfile=SCOTT_TB_0322_05.dmp LOGFILE=SCOTT_TB_0322_05.log TABLES=TB_0322_05

     

    15:41:04 SQL> set time on;

    15:59:49 SQL> set timing on;

    15:59:49 SQL> set serveroutput on;

    15:59:49 SQL> drop table scott.TB_0322_05;

    create table scott.TB_0322_05    as SELECT * FROM dba_objects;

     

    SELECT COUNT(1) FROM   scott.TB_0322_05;

    INSERT INTO scott.TB_0322_05 SELECT * FROM scott.TB_0322_05;

     

    Table dropped.

     

    Elapsed: 00:00:00.07

    15:59:49 SQL> COMMIT;

    INSERT INTO scott.TB_0322_05 SELECT * FROM scott.TB_0322_05;

    COMMIT;

    INSERT INTO scott.TB_0322_05 SELECT * FROM scott.TB_0322_05;

    COMMIT;

    INSERT INTO scott.TB_0322_05 SELECT * FROM scott.TB_0322_05;

    COMMIT;

    SELECT COUNT(1) FROM   scott.TB_0322_05;

     

    SELECT d.BYTES/1024/1024 FROM dba_segments d WHERE d.segment_name ='TB_0322_05';

     

     

    truncate table scott.TB_0322_05;

     

    alter system checkpoint;

     

    Table created.

     

    Elapsed: 00:00:00.97

    15:59:50 SQL> 15:59:50 SQL>

      COUNT(1)

    ----------

         75707

     

    Elapsed: 00:00:00.86

    15:59:51 SQL>

    75707 rows created.

     

    Elapsed: 00:00:00.23

    15:59:52 SQL>

    Commit complete.

     

    Elapsed: 00:00:00.17

    15:59:52 SQL>

    151414 rows created.

     

    Elapsed: 00:00:00.50

    15:59:52 SQL>

    Commit complete.

     

    Elapsed: 00:00:00.23

    15:59:52 SQL>

    302828 rows created.

     

    Elapsed: 00:00:01.63

    15:59:54 SQL>

    Commit complete.

     

    Elapsed: 00:00:00.22

    15:59:54 SQL>

    605656 rows created.

     

    Elapsed: 00:00:06.19

    16:00:00 SQL>

    Commit complete.

     

    Elapsed: 00:00:00.02

    16:00:01 SQL>

      COUNT(1)

    ----------

       1211312

     

    Elapsed: 00:00:00.07

    16:00:01 SQL> 16:00:01 SQL>

    D.BYTES/1024/1024

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

                  136

     

    Elapsed: 00:00:00.17

    16:00:01 SQL> 16:00:01 SQL> 16:00:01 SQL>

    Table truncated.

     

    Elapsed: 00:00:01.26

    16:00:02 SQL> 16:00:02 SQL>

    System altered.

     

    Elapsed: 00:00:00.15

    16:00:02 SQL>

    16:00:02 SQL> SELECT COUNT(1) FROM   scott.TB_0322_05;

     

      COUNT(1)

    ----------

             0

     

    Elapsed: 00:00:00.00

    16:02:35 SQL>

     

    [oracle@ZFFR4CB1101:/home/oracle/gdul]$ ./gdul

     

    *********************************************************************

      GDUL for ORACLE DB.

      Version 3.5.0.1, build date: 2016.03.07.

      Copyright (c) 2007, 2016. Andy Geng.  ALL RIGHTS RESERVED.

      Email: gengyonghui@aliyun.com

      QQ group: 235019291, WeChat Official Account: dbtool

    *********************************************************************

     

    GDUL> bootstrap

    Bootstrap finish.

    GDUL> desc scott.TB_0322_05

     

    object_id: 78302, dataobj#: 78303, cluster tab#: 0

    segment header: (ts#: 4, rfile#: 4, block#: 682))

     

    Seg Column#  Column#    Name                 Null?           Type     

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

    1            1          OWNER                                VARCHAR2(30)

    2            2          OBJECT_NAME                          VARCHAR2(128)

    3            3          SUBOBJECT_NAME                       VARCHAR2(30)

    4            4          OBJECT_ID                            NUMBER   

    5            5          DATA_OBJECT_ID                       NUMBER   

    6            6          OBJECT_TYPE                          VARCHAR2(19)

    7            7          CREATED                              DATE     

    8            8          LAST_DDL_TIME                        DATE     

    9            9          TIMESTAMP                            VARCHAR2(19)

    10           10         STATUS                               VARCHAR2(7)

    11           11         TEMPORARY                            VARCHAR2(1)

    12           12         GENERATED                            VARCHAR2(1)

    13           13         SECONDARY                            VARCHAR2(1)

    14           14         NAMESPACE                            NUMBER   

    15           15         EDITION_NAME                         VARCHAR2(30)

     

    GDUL> unload table  scott.TB_0322_05

    2016-03-22 16:01:54...unloaded "SCOTT"."TB_0322_05"   0 rows

    GDUL> scan tablespace 4

    start scan tablespace 4...

    scan tablespace completed.

    GDUL> untrunc table  scott.TB_0322_05

    2016-03-22 16:04:29...untruncating table TB_0322_05 1211312 rows unloaded.

    GDUL>

     

    16:02:35 SQL> select * from dba_directories;

     

    OWNER                          DIRECTORY_NAME                 DIRECTORY_PATH

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

    SYS                            SUBDIR                         /u01/app/oracle/product/11.2.0/dbhome_1/demo/schema/order_entry//2002/Sep

    SYS                            SS_OE_XMLDIR                   /u01/app/oracle/product/11.2.0/dbhome_1/demo/schema/order_entry/

    SYS                            LOG_FILE_DIR                   /u01/app/oracle/product/11.2.0/dbhome_1/demo/schema/log/

    SYS                            MEDIA_DIR                      /u01/app/oracle/product/11.2.0/dbhome_1/demo/schema/product_media/

    SYS                            XMLDIR                         /u01/app/oracle/product/11.2.0/dbhome_1/rdbms/xml

    SYS                            DATA_FILE_DIR                  /u01/app/oracle/product/11.2.0/dbhome_1/demo/schema/sales_history/

    SYS                            DATA_PUMP_DIR                  /u01/app/oracle/product/11.2.0/dbhome_1/rdbms/log/

    SYS                            ORACLE_OCM_CONFIG_DIR          /u01/app/oracle/product/11.2.0/dbhome_1/ccr/state

     

    8 rows selected.

     

    Elapsed: 00:00:00.00

    16:05:29 SQL>

     

    [oracle@ZFFR4CB1101:/home/oracle/gdul/dump]$ impdp  scott/tiger directory=DATA_PUMP_DIR dumpfile=SCOTT_TB_0322_05.dmp LOGFILE=SCOTT_TB_0322_05.log TABLES=TB_0322_05

     

    Import: Release 11.2.0.3.0 - Production on Tue Mar 22 16:16:48 2016

     

    Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

     

    Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

    With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,

    Data Mining and Real Application Testing options

    Master table "SCOTT"."SYS_IMPORT_TABLE_01" successfully loaded/unloaded

    Starting "SCOTT"."SYS_IMPORT_TABLE_01":  scott/******** directory=DATA_PUMP_DIR dumpfile=SCOTT_TB_0322_05.dmp LOGFILE=SCOTT_TB_0322_05.log TABLES=TB_0322_05

    Processing object type TABLE_EXPORT/TABLE/TABLE_DATA

    . . imported "SCOTT"."TB_0322_05"                        117.1 MB 1211312 rows

    Job "SCOTT"."SYS_IMPORT_TABLE_01" successfully completed at 16:16:59

     

    [oracle@ZFFR4CB1101:/home/oracle/gdul/dump]$

    [oracle@ZFFR4CB2101:/home/oracle]$ sqlplus / as sysdba

     

    SQL*Plus: Release 11.2.0.3.0 Production on Tue Mar 22 16:17:39 2016

     

    Copyright (c) 1982, 2011, Oracle.  All rights reserved.

     

     

    Connected to:

    Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

    With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,

    Data Mining and Real Application Testing options

     

    SQL> SELECT COUNT(1) FROM   scott.TB_0322_05;

     

      COUNT(1)

    ----------

       1211312

     

    SQL>

     

    数据成功恢复。

     

     

     

    2.4  实验总结

     

    总体而言用fy_recover_data包或GDUL工具都是非常好的,fy_recover_data可以恢复truncate的数据,但不能恢复drop的数据,而GDUL工具就比较全面了,具体可以参考前边的简介或下载文档来看,小麦苗的共享云盘里也有比较全的文档。

     

     

     

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

     

     

     






    About Me

    ...............................................................................................................................

    ● 本文作者:小麦苗,只专注于数据库的技术,更注重技术的运用

    ● 本文在itpub(http://blog.itpub.net/26736162)、博客园(http://www.cnblogs.com/lhrbest)和个人微信公众号(xiaomaimiaolhr)上有同步更新

    ● 本文itpub地址:http://blog.itpub.net/26736162/viewspace-2082965/

    ● 本文博客园地址:http://www.cnblogs.com/lhrbest

    ● 本文pdf版及小麦苗云盘地址:http://blog.itpub.net/26736162/viewspace-1624453/

    ● 数据库笔试面试题库及解答:http://blog.itpub.net/26736162/viewspace-2134706/

    ● QQ群:230161599     微信群:私聊

    ● 联系我请加QQ好友(646634621),注明添加缘由

    ● 于 2016-03-10 10:00~ 2016-04-15 19:00 在魔都完成

    ● 文章内容来源于小麦苗的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解

    ● 版权所有,欢迎分享本文,转载请保留出处

    ...............................................................................................................................

    拿起手机使用微信客户端扫描下边的左边图片来关注小麦苗的微信公众号:xiaomaimiaolhr,扫描右边的二维码加入小麦苗的QQ群,学习最实用的数据库技术。

    ico_mailme_02.png
    DBA笔试面试讲解
    欢迎与我联系

    来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26736162/viewspace-2082965/,如需转载,请注明出处,否则将追究法律责任。

    展开全文
  • oracle truncate恢复方法

    千次阅读 2017-08-15 14:34:43
    truncate表后恢复方法总结   百度云有fy_recover_data包 https://pan.baidu.com/s/1c2tlfUS 1.1 BLOG文档结构图   1.2 前言部分   1.2.1 导读和注意事项 各位技术爱好者,看完本文后,你可以...
    truncate表后恢复方法总结


     
    百度云有fy_recover_data包 https://pan.baidu.com/s/1c2tlfUS
    1.1  BLOG文档结构图
    image
     
    1.2  前言部分
     
    1.2.1  导读和注意事项
    各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~:
    ① truncate操作后的恢复方法(重点)
     
      Tips:
           ① 若文章代码格式有错乱,推荐使用QQ、搜狗或360浏览器,也可以下载pdf格式的文档来查看,pdf文档下载地址:http://yunpan.cn/cdEQedhCs2kFz (提取码:ed9b) 
           ② 本篇BLOG中命令的输出部分需要特别关注的地方我都用灰色背景和粉红色字体来表示,比如下边的例子中,thread 1的最大归档日志号为33,thread 2的最大归档日志号为43是需要特别关注的地方;而命令一般使用黄色背景和红色字体标注;对代码或代码输出部分的注释一般采用蓝色字体表示。
     
      List of Archived Logs in backup set 11
      Thrd Seq     Low SCN    Low Time            Next SCN   Next Time
      ---- ------- ---------- ------------------- ---------- ---------
      1    32      1621589    2015-05-29 11:09:52 1625242    2015-05-29 11:15:48
      1    33      1625242    2015-05-29 11:15:48 1625293    2015-05-29 11:15:58
      2    42      1613951    2015-05-29 10:41:18 1625245    2015-05-29 11:15:49
      2    43      1625245    2015-05-29 11:15:49 1625253    2015-05-29 11:15:53
     
     
     
     
    [ZFXXDB1:root]:/>lsvg -o
    T_XDESK_APP1_vg
    rootvg
    [ZFXXDB1:root]:/>
    00:27:22 SQL> alter tablespace idxtbs read write;
     
     
    ====》2097152*512/1024/1024/1024=1G 
     
     
     
    本文如有错误或不完善的地方请大家多多指正,ITPUB留言或QQ皆可,您的批评指正是我写作的最大动力。
     
     
    1.2.2  相关参考文章链接
     
     
    1.2.3  本文简介
    truncate操作是比较危险的操作,不记录redo,不能通过闪回查询来找回数据,但是只要段所占用的块没有全部被重新占用的情况下,我们还是可以通过一些特殊的办法来找回truncate掉的数据,因为当Truncate命令发起之后,Oracle实际上并没有在删除底层数据块上的数据,而是要等到重用的时候才会把这一部分数据回收,于是这给了我们一个能够恢复数据库的机会。
    总体而言,恢复的办法是通过一些大牛写的工具来恢复,分为收费和免费的,我们下边分别说明。实验部分我们只实验fy_recover_data包和gdul工具。
    有的实验是很久之前做的,这篇文章发布太晚,因为中间学习了DUL和BBED的相关知识。
    1.3  收费软件
     
    这里简单列举一下,具体内容请到相关网站了解:
    工具名称 下载地址 作者 软件
    ODU http://www.oracleodu.com/cn/ 老熊 命令行操作
    PRM-DUL http://www.parnassusdata.com/ Maclean Liu 图形界面操作
    AUL/mydul http://www.dbatools.net/mydul/ d.c.b.a/楼方鑫 命令行
     
     
     
    1.4  免费软件
    1.4.1  fy_recover_data包
    作者个人信息:
    WWW.HelloDBA.COM                                                   
    Created By: Fuyuncat                                               
    Created Date: 08/08/2012                                           
    Email: Fuyuncat@gmail.com                                          
    Copyright (c), 2014, WWW.HelloDBA.COM All rights reserved.         
    Latest Version: http://www.HelloDBA.com/download/FY_Recover_Data.zip
    该包采用纯plsql语句恢复被truncate掉的表,操作比较简单,下载可以去官网下载,或者小麦苗的云盘共享目录。
     
    Fy_Recover_Data是利用Oracle表扫描机制、数据嫁接机制恢复TRUNCATE或者损坏数据的工具包。由纯PLSQL编写,原理图如下:
    wps33F2.tmp
     
     
     
    包内容:
    wps3403.tmp
     
    1.4.2  gdul工具
    GDUL是老耿开发的一款类dul工具,当数据库由于某种原因无法打开时,可以利用GDUL把表数据直接读取出来,工具下载地址参考小麦苗的blog,老耿的信息如下:
    *********************************************************************
      GDUL for ORACLE DB.
      Version 4.0.0.1, build date: 2016.04.12.
      Copyright (c) 2007, 2016. Andy Geng.  ALL RIGHTS RESERVED.
      Email: dbtool@aliyun.com
      WeChat official account: dbtool
      QQ group: 235019291
    *********************************************************************
     
    1.4.2.1  gDUL功能特点
    v 完整支持多种格式导出,包括expdp,exp,text格式。目前市面上的类dul工具只有gDUL支持expdp格式。
    v 支持ASM文件系统,并内置asmcmd命令。
    v 支持绝大多数列类型,支持常见的NUMBER,CHAR, VARCHAR2, DATE,LOB, LONG等类型。。其中 SecureFile LOB 支持压缩,尚不支持去重和加密。
    v 支持导出常规表、IOT、Cluster 表、分区表、压缩表。
    v 支持 truncated 表、删除行恢复。
    v 支持常规表空间和 bigfile 表空间。
    v 支持主流硬件平台(HP-UX,AIX, Solaris, Linux, Windows),各个平台仅需单一的可执行文件,方便分发。
    v 重点是——永久免费使用,无需额外费用,不开源。
     
     
     
    1.4.3  dul
    DUL 是 Data Unloader 的缩写,是一个荷兰的 Oracle 工程师开发的,他的名字为 Bernard Van Duijnen。 DUL 是一个 C 开发的小程序,编译后整个程序只有一个文件,大小也不过几百 KB,它工作时不需 Oracle RDBMS 以及任何的 Oracle 的程序、组件,它可以直接从一个坏了数据库的数据文件中读取数据,生成 IMP 或 SQL*Loader 可以识别的文件。
    DUL 不是一个商用化的产品,Oracle 不卖、不提供也不支持它的使用。DUL 只有在 Oracle 的内部网站才可以下载到,因此也只有 Oracle 的 Supporter 才能下载到有这个工具,如果与 Oracle 的 Supporter 熟悉,没准他私底下会给你一个,这个工具也因此有一些流落到民间,被一些人收入囊中,奉为珍宝。 
    不同的平台、不同版本的数据库都有相应的 DUL 软件,9.x 及之前 DUL 是没有 License 限制的,也就是有这个工具可以无限制的使用,不过最新的 DUL 在这方面已经改进了,kamus 说最新 DUL 拿到手只能用一个月。 
    关于这一小点稍总结一下,获得 DUL 有以下几种途径: 
    wps3404.tmp
     如果你是 Oracle 的 Supporter ,可以在内部网站下载,地址为: http://www.nl.oracle.com/support/dul/ 
    wps3405.tmp
     如果你有 Oracle 的 Supporter 的朋友可以向他们要一个,itpub 也几位斑竹都到 Oracle 了,如 coolyl,kamus,lunar。 
    wps3406.tmp
     一些 dul 流落到民间,可以向有这软件的朋友要一个,不过他们不一定有你需要的那个。 
     
    所以关于DUL我们不做过多的解释。
     
    1.4.4  bbed来恢复
    这个比较复杂,若对oracle不熟悉或者bbed不熟悉都不推荐使用这个,具体案例参考:http://blog.itpub.net/26736162/viewspace-2080727/
     
     
    第二章 实验部分
    2.1  实验环境介绍
    项目 db
    db 类型 单实例
    db version 11.2.0.4.0
    db 存储 FS
    主机IP地址/hosts配置 192.168.59.129
    OS版本及kernel版本 AIX 7.1 64位
    归档模式 Archive Mode
    ORACLE_SID oralhr
     
     
    2.2  实验目标
    将truncate掉的表数据成功找回。
     
    2.3  实验过程
     
    2.3.1  fy_recover_data包恢复truncate的表
    [ZFXDESKDB1:oracle]:/oracle>ORACLE_SID=oraESKDB1
    [ZFXDESKDB1:oracle]:/oracle>sqlplus / as sysdba
     
    SQL*Plus: Release 11.2.0.4.0 Production on Mon Mar 21 15:51:55 2016
     
    Copyright (c) 1982, 2013, Oracle.  All rights reserved.
     
     
    Connected to:
    Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
    With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
    Data Mining and Real Application Testing options
     
    SYS@oraESKDB1> set time on;
    15:52:10 SYS@oraESKDB1> set timing on;
    15:52:10 SYS@oraESKDB1> set serveroutput on;
    15:52:10 SYS@oraESKDB1> create table scott.TB_0321    as SELECT * FROM dba_objects;
     
    Table created.
     
    Elapsed: 00:00:00.59
    15:52:18 SYS@oraESKDB1> SELECT COUNT(1) FROM   scott.TB_0321;
     
      COUNT(1)
    ----------
         86651
     
    Elapsed: 00:00:00.19
    15:52:24 SYS@oraESKDB1> INSERT INTO scott.TB_0321 SELECT * FROM scott.TB_0321;
     
     
    86651 rows created.
     
    Elapsed: 00:00:00.26
    15:52:30 SYS@oraESKDB1> COMMIT;
    Commit complete.
     
    Elapsed: 00:00:00.01
    15:52:30 SYS@oraESKDB1> INSERT INTO scott.TB_0321 SELECT * FROM scott.TB_0321;
    COMMIT;
     
    173302 rows created.
     
    Elapsed: 00:00:00.43
    15:53:02 SYS@oraESKDB1> SELECT COUNT(1) FROM   scott.TB_0321;
     
      COUNT(1)
    ----------
      346604
     
    Elapsed: 00:00:00.27
    16:15:18 SYS@oraESKDB1> SELECT d.BYTES/1024/1024 FROM dba_segments d WHERE d.segment_name ='TB_0321';
     
    D.BYTES/1024/1024
    -----------------
                   40
     
    Elapsed: 00:00:00.44
    16:15:25 SYS@oraESKDB1> truncate table scott.TB_0321;
     
    Table truncated.
     
    Elapsed: 00:00:00.20
    16:15:46 SYS@oraESKDB1> SELECT COUNT(1) FROM   scott.TB_0321;
     
      COUNT(1)
    ----------
             0
     
    Elapsed: 00:00:00.01
     
    ====》数据已经被truncate掉了,下边我们来恢复
     
     
    16:15:52 SYS@oraESKDB1> @/oracle/FY_Recover_Data.pck
     
    Package created.
     
    Elapsed: 00:00:00.06
     
    Package body created.
     
    Elapsed: 00:00:00.03
    16:15:59 SYS@oraESKDB1> exec fy_recover_data.recover_truncated_table('scott','TB_0321');
    16:16:06: Use existing Directory Name: FY_DATA_DIR
    16:16:07: Recover Table: SCOTT.TB_0321$
    16:16:09: Restore Table: SCOTT.TB_0321$$
    16:16:24: Copy file of Recover Tablespace: FY_REC_DATA_COPY.DAT1
    16:16:24: begin to recover table SCOTT.TB_0321
    16:16:24: Use existing Directory Name: TMP_HF_DIR
    16:17:09: Recovering data in datafile +DATA/oraeskdb/datafile/users.351.902678817
    16:17:09: Use existing Directory Name: TMP_HF_DIR
    16:39:16: 4984 truncated data blocks found.
    16:39:16: 346604 records recovered in backup table SCOTT.TB_0321$$
    16:39:17: Total: 4984 truncated data blocks found.
    16:39:17: Total: 346604 records recovered in backup table SCOTT.TB_0321$$
    16:39:17: Recovery completed.
    16:39:17: Data has been recovered to SCOTT.TB_0321$$
     
    PL/SQL procedure successfully completed.
     
    Elapsed: 00:23:11.59
     
    16:39:17 SYS@oraESKDB1> SELECT COUNT(1) FROM   scott.TB_0321$$;
     
      COUNT(1)
    ----------
       346604
     
    Elapsed: 00:00:01.55
    16:40:51 SYS@oraESKDB1>
    16:40:51 SYS@oraESKDB1> alter table scott.TB_0321 nologging;
     
    Table altered.
     
    Elapsed: 00:00:00.03
    16:41:43 SYS@oraESKDB1> insert /*+append*/ into scott.TB_0321 select * from scott.TB_0321$$;
     
    346604 rows created.
     
    Elapsed: 00:00:00.86
    16:41:52 SYS@oraESKDB1> commit;
     
    Commit complete.
     
    Elapsed: 00:00:00.01
    16:41:55 SYS@oraESKDB1> alter table scott.TB_0321 logging;
     
    Table altered.
     
    Elapsed: 00:00:00.02
    16:42:06 SYS@oraESKDB1>
    16:42:06 SYS@oraESKDB1> drop tablespace   FY_REC_DATA  including contents and datafiles;
     
    Tablespace dropped.
     
    Elapsed: 00:00:08.00
    16:42:35 SYS@oraESKDB1> drop tablespace   FY_RST_DATA  including contents and datafiles;
     
    Tablespace dropped.
     
    Elapsed: 00:00:07.59
    16:42:44 SYS@oraESKDB1>
     
     
    数据成功恢复。
     
     
    2.3.2  gdul恢复truncate的表
    set time on;
    set timing on;
    set serveroutput on;
    drop table scott.TB_0322_05;
    create table scott.TB_0322_05    as SELECT * FROM dba_objects;
     
    SELECT COUNT(1) FROM   scott.TB_0322_05;
    INSERT INTO scott.TB_0322_05 SELECT * FROM scott.TB_0322_05;
    COMMIT;
    INSERT INTO scott.TB_0322_05 SELECT * FROM scott.TB_0322_05;
    COMMIT;
    INSERT INTO scott.TB_0322_05 SELECT * FROM scott.TB_0322_05;
    COMMIT;
    INSERT INTO scott.TB_0322_05 SELECT * FROM scott.TB_0322_05;
    COMMIT;
    SELECT COUNT(1) FROM   scott.TB_0322_05;
     
    SELECT d.BYTES/1024/1024 FROM dba_segments d WHERE d.segment_name ='TB_0322_05';
     
     
    truncate table scott.TB_0322_05;
     
    alter system checkpoint;
     
    col ownere format a10
    col DIRECTORY_NAME format a30
    col DIRECTORY_PATH format a50
    select OWNER,DIRECTORY_NAME,DIRECTORY_PATH from  dba_directories;
     
     
    bootstrap
    desc scott.TB_0322_05
    unload table  scott.TB_0322_05
    scan tablespace 4
    untrunc table  scott.TB_0322_05
     
    cp SCOTT_TB_0322_05.dmp /oracle/app/oracle/admin/oralhr/dpdump/
    impdp  scott/tiger directory=DATA_PUMP_DIR dumpfile=SCOTT_TB_0322_05.dmp LOGFILE=SCOTT_TB_0322_05.log TABLES=TB_0322_05
     
    15:41:04 SQL> set time on;
    15:59:49 SQL> set timing on;
    15:59:49 SQL> set serveroutput on;
    15:59:49 SQL> drop table scott.TB_0322_05;
    create table scott.TB_0322_05    as SELECT * FROM dba_objects;
     
    SELECT COUNT(1) FROM   scott.TB_0322_05;
    INSERT INTO scott.TB_0322_05 SELECT * FROM scott.TB_0322_05;
     
    Table dropped.
     
    Elapsed: 00:00:00.07
    15:59:49 SQL> COMMIT;
    INSERT INTO scott.TB_0322_05 SELECT * FROM scott.TB_0322_05;
    COMMIT;
    INSERT INTO scott.TB_0322_05 SELECT * FROM scott.TB_0322_05;
    COMMIT;
    INSERT INTO scott.TB_0322_05 SELECT * FROM scott.TB_0322_05;
    COMMIT;
    SELECT COUNT(1) FROM   scott.TB_0322_05;
     
    SELECT d.BYTES/1024/1024 FROM dba_segments d WHERE d.segment_name ='TB_0322_05';
     
     
    truncate table scott.TB_0322_05;
     
    alter system checkpoint;
     
    Table created.
     
    Elapsed: 00:00:00.97
    15:59:50 SQL> 15:59:50 SQL>
      COUNT(1)
    ----------
         75707
     
    Elapsed: 00:00:00.86
    15:59:51 SQL>
    75707 rows created.
     
    Elapsed: 00:00:00.23
    15:59:52 SQL>
    Commit complete.
     
    Elapsed: 00:00:00.17
    15:59:52 SQL>
    151414 rows created.
     
    Elapsed: 00:00:00.50
    15:59:52 SQL>
    Commit complete.
     
    Elapsed: 00:00:00.23
    15:59:52 SQL>
    302828 rows created.
     
    Elapsed: 00:00:01.63
    15:59:54 SQL>
    Commit complete.
     
    Elapsed: 00:00:00.22
    15:59:54 SQL>
    605656 rows created.
     
    Elapsed: 00:00:06.19
    16:00:00 SQL>
    Commit complete.
     
    Elapsed: 00:00:00.02
    16:00:01 SQL>
      COUNT(1)
    ----------
       1211312
     
    Elapsed: 00:00:00.07
    16:00:01 SQL> 16:00:01 SQL>
    D.BYTES/1024/1024
    -----------------
                  136
     
    Elapsed: 00:00:00.17
    16:00:01 SQL> 16:00:01 SQL> 16:00:01 SQL>
    Table truncated.
     
    Elapsed: 00:00:01.26
    16:00:02 SQL> 16:00:02 SQL>
    System altered.
     
    Elapsed: 00:00:00.15
    16:00:02 SQL>
    16:00:02 SQL> SELECT COUNT(1) FROM   scott.TB_0322_05;
     
      COUNT(1)
    ----------
             0
     
    Elapsed: 00:00:00.00
    16:02:35 SQL>
     
    [oracle@ZFFR4CB1101:/home/oracle/gdul]$ ./gdul
     
    *********************************************************************
      GDUL for ORACLE DB.
      Version 3.5.0.1, build date: 2016.03.07.
      Copyright (c) 2007, 2016. Andy Geng.  ALL RIGHTS RESERVED.
      Email: gengyonghui@aliyun.com
      QQ group: 235019291, WeChat Official Account: dbtool
    *********************************************************************
     
    GDUL> bootstrap
    Bootstrap finish.
    GDUL> desc scott.TB_0322_05
     
    object_id: 78302, dataobj#: 78303, cluster tab#: 0
    segment header: (ts#: 4, rfile#: 4, block#: 682))
     
    Seg Column#  Column#    Name                 Null?           Type     
    ------------ ---------- -------------------- --------------- --------------
    1            1          OWNER                                VARCHAR2(30)
    2            2          OBJECT_NAME                          VARCHAR2(128)
    3            3          SUBOBJECT_NAME                       VARCHAR2(30)
    4            4          OBJECT_ID                            NUMBER   
    5            5          DATA_OBJECT_ID                       NUMBER   
    6            6          OBJECT_TYPE                          VARCHAR2(19)
    7            7          CREATED                              DATE     
    8            8          LAST_DDL_TIME                        DATE     
    9            9          TIMESTAMP                            VARCHAR2(19)
    10           10         STATUS                               VARCHAR2(7)
    11           11         TEMPORARY                            VARCHAR2(1)
    12           12         GENERATED                            VARCHAR2(1)
    13           13         SECONDARY                            VARCHAR2(1)
    14           14         NAMESPACE                            NUMBER   
    15           15         EDITION_NAME                         VARCHAR2(30)
     
    GDUL> unload table  scott.TB_0322_05
    2016-03-22 16:01:54...unloaded "SCOTT"."TB_0322_05"   0 rows
    GDUL> scan tablespace 4
    start scan tablespace 4...
    scan tablespace completed.
    GDUL> untrunc table  scott.TB_0322_05
    2016-03-22 16:04:29...untruncating table TB_0322_05 1211312 rows unloaded.
    GDUL>
     
    16:02:35 SQL> select * from dba_directories;
     
    OWNER                          DIRECTORY_NAME                 DIRECTORY_PATH
    ------------------------------ ------------------------------ -----------------------------------------------------------------------
    SYS                            SUBDIR                         /u01/app/oracle/product/11.2.0/dbhome_1/demo/schema/order_entry//2002/Sep
    SYS                            SS_OE_XMLDIR                   /u01/app/oracle/product/11.2.0/dbhome_1/demo/schema/order_entry/
    SYS                            LOG_FILE_DIR                   /u01/app/oracle/product/11.2.0/dbhome_1/demo/schema/log/
    SYS                            MEDIA_DIR                      /u01/app/oracle/product/11.2.0/dbhome_1/demo/schema/product_media/
    SYS                            XMLDIR                         /u01/app/oracle/product/11.2.0/dbhome_1/rdbms/xml
    SYS                            DATA_FILE_DIR                  /u01/app/oracle/product/11.2.0/dbhome_1/demo/schema/sales_history/
    SYS                            DATA_PUMP_DIR                  /u01/app/oracle/product/11.2.0/dbhome_1/rdbms/log/
    SYS                            ORACLE_OCM_CONFIG_DIR          /u01/app/oracle/product/11.2.0/dbhome_1/ccr/state
     
    8 rows selected.
     
    Elapsed: 00:00:00.00
    16:05:29 SQL>
     
    [oracle@ZFFR4CB1101:/home/oracle/gdul/dump]$ impdp  scott/tiger directory=DATA_PUMP_DIR dumpfile=SCOTT_TB_0322_05.dmp LOGFILE=SCOTT_TB_0322_05.log TABLES=TB_0322_05
     
    Import: Release 11.2.0.3.0 - Production on Tue Mar 22 16:16:48 2016
     
    Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.
     
    Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
    With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
    Data Mining and Real Application Testing options
    Master table "SCOTT"."SYS_IMPORT_TABLE_01" successfully loaded/unloaded
    Starting "SCOTT"."SYS_IMPORT_TABLE_01":  scott/******** directory=DATA_PUMP_DIR dumpfile=SCOTT_TB_0322_05.dmp LOGFILE=SCOTT_TB_0322_05.log TABLES=TB_0322_05
    Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
    . . imported "SCOTT"."TB_0322_05"                        117.1 MB 1211312 rows
    Job "SCOTT"."SYS_IMPORT_TABLE_01" successfully completed at 16:16:59
     
    [oracle@ZFFR4CB1101:/home/oracle/gdul/dump]$
    [oracle@ZFFR4CB2101:/home/oracle]$ sqlplus / as sysdba
     
    SQL*Plus: Release 11.2.0.3.0 Production on Tue Mar 22 16:17:39 2016
     
    Copyright (c) 1982, 2011, Oracle.  All rights reserved.
     
     
    Connected to:
    Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
    With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
    Data Mining and Real Application Testing options
     
    SQL> SELECT COUNT(1) FROM   scott.TB_0322_05;
     
      COUNT(1)
    ----------
       1211312
     
    SQL>
     
    数据成功恢复。
     
     
     
    2.4  实验总结
     
    总体而言用fy_recover_data包或GDUL工具都是非常好的,fy_recover_data可以恢复truncate的数据,但不能恢复drop的数据,而GDUL工具就比较全面了,具体可以参考前边的简介或下载文档来看,小麦苗的共享云盘里也有比较全的文档。
     
    展开全文
  • ORACLE数据truncate、delete删除恢复

    千次阅读 2017-11-15 10:39:56
    1、DELETE删除。根据快照快速恢复删除的数据 一、select *from 表名 as ...2、truncate 表删除恢复,注意:根据此方法回滚的表,在truncate后,不能insert新数据插入 1、根据Fy_Recover_data恢复truncate表数据 2、网

    1、DELETE删除。根据快照快速恢复删除的数据

    一、select *from 表名 as of timestamp(systimestamp - interval '36000' second)


    2、truncate 表删除恢复,注意:根据此方法回滚的表,在truncate后,不能insert新数据插入

    1、根据Fy_Recover_data恢复truncate表数据

    2、网上下载Fy_Recover_data.SQL脚本,网上下的脚本,大多数识别windows斜杠,linux的反斜杠不识别,需要修改脚本Fy_Recover_data.SQL,将斜杠改为反斜杠
    3、将Fy_Recover_data.SQL上传的oracle环境下
    4、登陆数据库执行脚本Fy_Recover_data.SQL

     sqlplus /”as sysdba”
     SQL>!ls
     SQL>@Fy_Recover_data.sql

    5、根据数据库用户名和表查询表当前数据文件路径:


    select f.FILE_NAME

       from dba_data_files f, dba_tables t

      where t.owner = 'USERDB'

        and lower(t.table_name)= 'lcmcc_sync_order_bak'

        and t.tablespace_name = f.tablespace_name ;


    6、执行脚本:


      set serveroutput on
      
      set timing on 
      
      declare  
        tgtowner varchar2(30);  
        tgttable varchar2(30);  
        datapath varchar2(4000);  
        datadir varchar2(30);  
        rects varchar2(30);  
        recfile varchar2(30);  
        rstts varchar2(30);  
        rstfile varchar2(30);  
        blksz number;  
        rectab varchar2(30);  
        rsttab varchar2(30);  
        copyfile varchar2(30); 
        v_sqlerrm varchar2(1000); 
      begin  
        tgtowner := 'USERDB';                               --------- 表所在schema
        tgttable := 'LCMCC_SYNC_ORDER_BAK';                                       ---------需恢复的表
        datapath := '/opt/oracle/oradata/orcl/';        ---------数据文件存放路径
        datadir := 'FY_DATA_DIR';                      ---------可保持不变
        Fy_Recover_data.prepare_files(tgtowner, tgttable, datapath, datadir, rects, recfile, rstts, rstfile, blksz);  
        Fy_Recover_data.fill_blocks(tgtowner, tgttable, datadir, rects, recfile, rstts, 8, tgtowner, tgtowner, rectab, rsttab, copyfile);  
        Fy_Recover_data.recover_table(tgtowner, tgttable, tgtowner, rectab, tgtowner, rsttab, datadir, datadir, recfile,datadir, copyfile, blksz);  
      end;  
      

    执行结果如下:
    23:04:03: Directory Name: FY_DATA_DIR26

    23:04:03:Recover Tablespace: FY_REC_DATA6; Data File: FY_REC_DATA1.DAT

    23:04:04:Restore Tablespace: FY_RST_DATA6; Data File: FY_RST_DATA1.DAT

    23:04:06:Recover Table: USERDB.LCMCC_SYNC_ORDER_HISBAK$3

    23:04:07:Restore Table: USERDB.LCMCC_SYNC_ORDER_HISBAK$$3

    23:04:16:[fill_blocks] Data Blocks formatted.

    23:04:16:[copy_file] begin copy file: FY_DATA_DIR26/FY_REC_DATA1.DAT =>

    FY_DATA_DIR26/FY_REC_DATA_COPY.DAT

    23:04:16:[copy_file] completed.

    23:04:16: Copyfile of Recover Tablespace: FY_REC_DATA_COPY.DAT

    23:04:16: beginto recover table USERDB.LCMCC_SYNC_ORDER_HISBAK

    23:05:30:[restore_table] Trying to restore data to

    USERDB.LCMCC_SYNC_ORDER_HISBAK$$3

    23:05:30:[restore_table] Expected Records in this round: 13

    23:05:30:[restore_table] 13 records recovered

    23:05:30: 1truncated data blocks found.

    23:05:30: 13records recovered in backup table USERDB.LCMCC_SYNC_ORDER_HISBAK$$3

    23:05:30:Recovery completed.

     

    要恢复的数据在USERDB.LCMCC_SYNC_ORDER_HISBAK$$3表中


    参考链接:http://www.hellodba.com/reader.php?ID=216&lang=cn

     包下载地址:                  http://blog.itpub.net/20553601/viewspace-749458/




    展开全文
  • 记录一次阿里云mysql数据库的所有表被truncate后数据库恢复的过程。谁遇到这种事情都会情不自禁的喊几声国骂。还好阿里云做了备份设置。每周二、周四、周六的全量备份。还有每6个小时的日志备份。步骤1:先下载一个...

    记录一次阿里云mysql数据库的所有表被truncate后数据库恢复的过程。

    谁遇到这种事情都会情不自禁的喊几声国骂。

    还好阿里云做了备份设置。

    每周二、周四、周六的全量备份。还有每6个小时的日志备份。





    步骤1:先下载一个故障点之前的全量备份,注意【恢复】按钮就不要点了。

    毕竟那个按钮操作完能得到什么结果我们是不可控的。

    步骤2:在本地安装一个mysql服务端

    步骤3:将下载下来的全量备份解压,拷贝yjwlxt文件夹和ibdata1到mysql/data文件夹下。



    步骤4:下载需要恢复时间段的日志备份 

    步骤5:执行下面的脚本

    mysqlbinlog    -d yjwlxt /Users/hepei/Downloads/mysql-bin.001556 --result-file=001556.sql 


    这个是生成指定时间段内的执行sql。 

    mysqlbinlog --start-date='2018-03-30 09:29:58' --stop-date='2018-03-30 11:00:00' -d yjwlxt /Users/hepei/Downloads/mysql-bin.001553 --result-file=001553-1.sql



    你恢复的时间段如果超过6个小时,就要相应的下载日志文件。


    步骤6:进入mysql 

    mysql -u root -p

    source  001556.sql



    步骤7:现在就可以查看在本地的数据库先检查数据是否已经恢复到那个时间段了。

    步骤8:如果确认没有问题,就开始利用你的工具进行数据同步。








    展开全文
  • #在数据库可视化工具中,通过以下两条语句,查询mysql操作日志,查找最近两次truncate清理表数据的节点,准备恢复两次truncate之间新建的数据,并新建备份数据库和表,表结构要和原数据库表结构一致 show binary ...
  • *操作数据库涉及到“删除”数据...truncate先摧毁表,再重建 (2)最重要的区别是 delete是DML(DML语句,可以回滚,没有提交事务) truncate是DDL(不可以回滚) (3)delete不会释放空间; truncate会 (4)del...
  • oracle truncate恢复

    2009-07-03 12:58:45
    使用ODU恢复Truncate表ODUmanual ODU3月 15th, 2009 意外Truncate表的事情时有发生,ODU提供了方便的恢复Truncate表的功能。被Truncate的表,只要原来的空间没有被重用(即数据被覆盖),则数据都是可以恢复的。 ...
  • oracle drop/truncate table 恢复

    千次阅读 2016-02-24 10:52:18
     drop table 并且回收站已经被情况了,如何恢复? 前提:数据库开规档,并且删除之前的归档没有被删掉...2. 利用备份加archivelog 进行不完全恢复(该方法同样适用于truncate恢复) ++++Session 1 SQL>
  • TRUNCATE TABLE恢复-脚本

    2021-12-03 00:12:02
    基于本周二发的文章《TRUNCATE恢复-bbed》(详戳),有些朋友或许对块结构和bbed不熟悉,且bbed的方法也较为复杂,那么大家也可以尝试使用本文的方法来修复。结合truncate...
  • oracle 恢复truncate

    2016-07-08 15:26:49
    odu 工具介绍: ... 环境: 1. linux 64位 ,单实例,...2.无法使用flashbask 闪回的方式恢复truncate掉的数据 3.备份不是当前的数据,数据有差别 4.odu_test1表 实际数据 9202136条 5.某员工不小心 TRUNCATE tableodu_t
  • truncate操作是比较危险的操作,不记录redo,不能通过闪回查询来找回数据,但是只要段所占用的块没有全部被重新占用的情况下,我们还是可以通过一些特殊的办法来找回tr...
  • Truncate用法详解

    千次阅读 2020-06-27 08:03:40
    前言: 当我们想要清空某张表时,往往会使用...truncate的语法很简单,后面直接跟表名即可,例如: truncate table tbl_name 或者 truncate tbl_name。 执行truncate语句需要拥有表的drop权限,从逻辑上讲,tr..
  • 关注我们获得更多精彩作者 | 李翔宇,云和恩墨西区交付技术顾问,长期服务移动运营商行业客户精通 oracle 性能优化,故障诊断,特殊恢复领域。摘要众所周知,trunca...
  • 这个能理解,因为delete是DML操作,事务控制的,在删除的时候,会写入redo、undo等日志,为了能做回滚,或者异常恢复,删除的数据越多,消耗的资源越高,等待时间越久,因此不建议对大量数据的删除使用delete,应该...
  • truncate table 误删除数据后的恢复

    千次阅读 2011-08-17 23:26:46
    晚上吃饭时间,接到软件部开发组电话,用truncate table方式误删除生产库上几个表的数据,问能不能恢复。因为truncate table 是ddl操作,没有写日志到redo,基于事物的闪回不太...
  • Truncate的使用详解

    千次阅读 2021-03-05 15:59:03
    删除表中数据的方法有 delete 和 truncate, 其中TRUNCATE TABLE用于删除表中的所有行,而不记录单个行删除操作;TRUNCATE TABLE 与没有 WHERE 子句的 DELETE 语句类似,但是,TRUNCATE TABLE 速度更快,使用的系统...
  • 非DBA人员也可以恢复truncate掉的数据了。。。哈哈 借着本人犯点错误的机会,连错数据库,truncate掉了10张本不想删除的数据 :o (还好此次错误没照成什么影响,自己负责的小系统刚运行个把月,客户没当回事未...
  • Mysql Truncate用法详解

    2021-03-08 09:46:42
    用法案例:TRUNCATE table1; 前言: 当我们想要清空某张表时,往往会使用truncate语句。大多时候我们只关心能否满足需求,而不去想这类语句的使用场景及注意事项。本篇文章主要介绍truncate语句的使用方法及注意...
  • (一)truncate操作概述在生产中,truncate是使用较多的命令,在使用不当的情况下,往往会造成表的数据全部丢失,恢复较为困难。...将数据库恢复truncate之前的时刻,但是恢复时间较长;使用odu、prm-dul、...
  • Hbase

    千次阅读 多人点赞 2019-10-22 20:14:12
    文章目录 Hbase 来源: 应用: 行业: Hbase定义: Hbase特性: Hbase shell namespace DDL ...truncate 'myns:user_info' Hbase Java Api 依赖 < dependencies > < dependency > ...
  • 测试开发笔记

    万次阅读 多人点赞 2019-11-14 17:11:58
    所有的测试都度量 1指标生成需要很长的周期, 很多的项目区累计经验 2要有比较稳定的团队这个指标才有意义 成熟度较高的测试团队应用于指标达成法 (适用度很低,很少有公司使用) 分类 步骤 优点 确定周边 范围的...
  • 数据库面试题

    千次阅读 多人点赞 2018-05-24 10:46:20
    死锁处理:预防死锁协议,死锁恢复机制   14.存储过程有什么优点 1. 存储过程因为 SQL 语句已经预编绎过了,因此运行的速度比较快。 2. 保证数据的安全性和完整性。通过存储过程可以使没有权限的...
  • truncate table table_name立刻释放磁盘空间 ,不管是 Innodb和MyISAM; delete from table_name 删除表的全部数据,对于MyISAM 会立刻释放磁盘空间 ,而InnoDB 不会释放磁盘空间; delete from table_name where ...
  • 编写背景: 近日调试存储过程,就未与同事商量先truncate了表,事后得知表中另一个部门插入的数据全没了,为了想法找回数据, 特测试了logminer的用法 1,logminer可否用于恢复tru...
  • 数据库面试

    千次阅读 多人点赞 2019-02-13 09:03:42
    解决不重复读的问题只需锁住满足条件的行,解决幻读需要锁表 事务隔离级别 脏读 不重复读 幻读 读未提交(read-uncommitted) 是 是 是 读已提交(read-committed) 否 是 是 重复读(repeatable-read) 否 否...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 27,420
精华内容 10,968
关键字:

truncate可恢复