oracle数据库中truncate表后如何快速恢复

2024-03-20 00:38

本文主要是介绍oracle数据库中truncate表后如何快速恢复,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

      在生产中,极有可能遇到不小心truncate表的情况,truncate表后不会产生日志记录和回滚段空间的使用,不能用闪回恢复。尤其是在没有任何备份的情况下所以恢复起来相当麻烦,虽然在有备份的情况下是可以用rman恢复,但是在生产业务库中,一般是不能轻易停库的,而且为了一张表而关库也会对其它正常的数据产生影响 ,所以这在时间上和空间上都是不可取的。那有没有在不影响数据业务正常运行的情况下去快速恢复表呢,答案是确定的。

truncate原理:

       TRUNCATE不会逐个清除用户数据块上的数据,而仅仅重置数据字典和元数据块上的元数据(如存储段头和扩展段图)。也就是说,此时,其基本数据并未被破坏,而是被系统回收、等待被重新分配————因此,要恢复被TRUNCATE的数据,需要及时备份其所在的数据文件。

    方法:用存储过程包 Fy_Recover_Data     它是利用Oracle表扫描机制、数据嫁接机制恢复TRUNCATE或者损坏数据的工具包,这个包是由行内有影响力的DBA大师黄炜先生通过PLSQL编写的,再这里再次感谢他的无私技术分享。Fy_Recover_Data去本文附近中下载

好了,闲话少说,下面通过oracle数据库中scott用户自带的emp表做测试:

步骤1:先把Fy_Recover_Data包拷贝到oracle相关目录下

步骤2:在scott用户下创建test_emp表:

SQL> conn scott/tiger;
Connected.
SQL> select * from tab;
TNAME       TABTYPE CLUSTERID
------------------------------ ------- ----------
BONUS       TABLE
DEPT       TABLE
EMP                TABLE
SALGRADE       TABLE
SQL> select count(*) from emp;
  COUNT(*)
----------
14

SQL> create table test_emp  as select * from emp;
Table created.
SQL> select count(*) from test_emp;
  COUNT(*)
----------
14

步骤3:用truncate删除test_emp表:

SQL> truncate table test_emp;
Table truncated.
SQL> select count(*) from test_emp;
  COUNT(*)
----------
0

步骤4:在linux中的oracle用户下解压FY_Recover_Data.zip包

$ unzip FY_Recover_Data.zip
Archive:  FY_Recover_Data.zip
  inflating: FY_Recover_Data.SQL 

步骤5:恢复

1)在sys用户下执行存储过程

SQL> @/home/oracle/FY_Recover_Data.SQL
Package created.
Package body created.

2)查看test_emp表在数据文件中的目录

SQL> select file_name from dba_data_files f, dba_tables t where t.owner='SCOTT' and t.table_name='TEST_EMP' and t.tablespace_name = f.tablespace_name;


FILE_NAME
--------------------------------------------------------------------------------
/u03/oracle/oradata/WUTONG/datafile/o1_mf_users_cx3xt940_.dbf

3)通过脚本恢复,可以用sqlplus命令行或者plsql developer执行

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);
   begin
     tgtowner := 'SCOTT'; --table owner
     tgttable := 'TEST_EMP';  --table name
     datapath := '/u03/oracle/oradata/WUTONG/datafile/';    --必须和test.t1表所在的数据文件的目录相同
     datadir := 'FY_DATA_DIR';        --oracle中目录的名字,可以修改
     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;
   以上SQL脚本产生2个表空间(2个数据文件),还有1个copy文件。

4)切换到scott用户下查看会发现多了些不一样以test_emp的表,这时找到相关有数据的表,把数据插入原表test_emp

SQL> conn scott/tiger
Connected.
SQL> select * from tab;
TNAME       TABTYPE CLUSTERID
------------------------------ ------- ----------
BONUS       TABLE
DEPT       TABLE
EMP       TABLE
SALGRADE       TABLE
TEST_EMP       TABLE
TEST_EMP$       TABLE
TEST_EMP$$       TABLE
7 rows selected.
SQL> insert into test_emp select * from TEST_EMP$$;
14 rows created.
SQL> commit;
Commit complete.
SQL> select count(*) from test_emp;
  COUNT(*)
----------
14

当你看到这一步的时候,说明truncate的表已经完全恢复了,恭喜你数据恢复成功!紧张的压力随之而释放,脸上露出灿烂的笑容和自豪感(做DBA很辛苦,数据库能保持正常运行,DBA在幕后做了大量的工作,有时是不会不被公司其他人理解的。。。。。)

步骤6:恢复数据后,把恢复时产生的2个表空间删除,再删除对应数据文件

SQL> conn / as sysdba
Connected.
SQL> select name from v$datafile;
NAME
--------------------------------------------------------------------------------
/u03/oracle/oradata/WUTONG/datafile/o1_mf_system_cx3xt90z_.dbf
/u03/oracle/oradata/WUTONG/datafile/o1_mf_sysaux_cx3xt930_.dbf
/u03/oracle/oradata/WUTONG/datafile/o1_mf_undotbs1_cx3xt93b_.dbf
/u03/oracle/oradata/WUTONG/datafile/o1_mf_users_cx3xt940_.dbf
/u03/oracle/oradata/WUTONG/datafile/o1_mf_wutong_cx415lcj_.dbf
/u03/oracle/oradata/WUTONG/datafile/FY_REC_DATA.DAT
/u03/oracle/oradata/WUTONG/datafile/FY_RST_DATA.DAT
7 rows selected.
SQL> drop tablespace FY_REC_DATA INCLUDING CONTENTS;

Tablespace dropped.
SQL> drop tablespace FY_RST_DATA INCLUDING CONTENTS;
Tablespace dropped.
SQL> select name from v$datafile;
NAME
--------------------------------------------------------------------------------
/u03/oracle/oradata/WUTONG/datafile/o1_mf_system_cx3xt90z_.dbf
/u03/oracle/oradata/WUTONG/datafile/o1_mf_sysaux_cx3xt930_.dbf
/u03/oracle/oradata/WUTONG/datafile/o1_mf_undotbs1_cx3xt93b_.dbf
/u03/oracle/oradata/WUTONG/datafile/o1_mf_users_cx3xt940_.dbf
/u03/oracle/oradata/WUTONG/datafile/o1_mf_wutong_cx415lcj_.dbf

然后去操作系统下把对应的数据文件删除即可

这篇关于oracle数据库中truncate表后如何快速恢复的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/827738

相关文章

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

SQL Server修改数据库名及物理数据文件名操作步骤

《SQLServer修改数据库名及物理数据文件名操作步骤》在SQLServer中重命名数据库是一个常见的操作,但需要确保用户具有足够的权限来执行此操作,:本文主要介绍SQLServer修改数据... 目录一、背景介绍二、操作步骤2.1 设置为单用户模式(断开连接)2.2 修改数据库名称2.3 查找逻辑文件名

SQL Server数据库死锁处理超详细攻略

《SQLServer数据库死锁处理超详细攻略》SQLServer作为主流数据库管理系统,在高并发场景下可能面临死锁问题,影响系统性能和稳定性,这篇文章主要给大家介绍了关于SQLServer数据库死... 目录一、引言二、查询 Sqlserver 中造成死锁的 SPID三、用内置函数查询执行信息1. sp_w

Oracle修改端口号之后无法启动的解决方案

《Oracle修改端口号之后无法启动的解决方案》Oracle数据库更改端口后出现监听器无法启动的问题确实较为常见,但并非必然发生,这一问题通常源于​​配置错误或环境冲突​​,而非端口修改本身,以下是系... 目录一、问题根源分析​​​二、保姆级解决方案​​​​步骤1:修正监听器配置文件 (listener.

Druid连接池实现自定义数据库密码加解密功能

《Druid连接池实现自定义数据库密码加解密功能》在现代应用开发中,数据安全是至关重要的,本文将介绍如何在​​Druid​​连接池中实现自定义的数据库密码加解密功能,有需要的小伙伴可以参考一下... 目录1. 环境准备2. 密码加密算法的选择3. 自定义 ​​DruidDataSource​​ 的密码解密3

Maven项目中集成数据库文档生成工具的操作步骤

《Maven项目中集成数据库文档生成工具的操作步骤》在Maven项目中,可以通过集成数据库文档生成工具来自动生成数据库文档,本文为大家整理了使用screw-maven-plugin(推荐)的完... 目录1. 添加插件配置到 pom.XML2. 配置数据库信息3. 执行生成命令4. 高级配置选项5. 注意事

在Java中基于Geotools对PostGIS数据库的空间查询实践教程

《在Java中基于Geotools对PostGIS数据库的空间查询实践教程》本文将深入探讨这一实践,从连接配置到复杂空间查询操作,包括点查询、区域范围查询以及空间关系判断等,全方位展示如何在Java环... 目录前言一、相关技术背景介绍1、评价对象AOI2、数据处理流程二、对AOI空间范围查询实践1、空间查

Python+PyQt5实现MySQL数据库备份神器

《Python+PyQt5实现MySQL数据库备份神器》在数据库管理工作中,定期备份是确保数据安全的重要措施,本文将介绍如何使用Python+PyQt5开发一个高颜值,多功能的MySQL数据库备份工具... 目录概述功能特性核心功能矩阵特色功能界面展示主界面设计动态效果演示使用教程环境准备操作流程代码深度解

MybatisX快速生成增删改查的方法示例

《MybatisX快速生成增删改查的方法示例》MybatisX是基于IDEA的MyBatis/MyBatis-Plus开发插件,本文主要介绍了MybatisX快速生成增删改查的方法示例,文中通过示例代... 目录1 安装2 基本功能2.1 XML跳转2.2 代码生成2.2.1 生成.xml中的sql语句头2

MySQL数据库实现批量表分区完整示例

《MySQL数据库实现批量表分区完整示例》通俗地讲表分区是将一大表,根据条件分割成若干个小表,:本文主要介绍MySQL数据库实现批量表分区的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考... 目录一、表分区条件二、常规表和分区表的区别三、表分区的创建四、将既有表转换分区表脚本五、批量转换表为分区