Oracle中truncate怎么用,用于Oracle数据库Truncate操作的保护方法与流程

dd365222b430540e6992282d42ca2b94.gif

本发明涉及一种Oracle数据库处理方法,尤其涉及一种用于Oracle数据库Truncate操作的保护方法。

背景技术:

在数据库系统运行的过程中,经常会出现以下情况:

1、数据量突然增长,客户已经没有存储空间,现在需要清理存储空间,经过沟通发现一张表的数据可以完全删除,于是就进行了Truncate删除方式(Oracle中使用delete较慢,会产生大量的归档)。删除完之后,发现数据还是有作用,需要重新弄回来的情况。

2、运维人员不小心执行了Truncate命令,进行了误操作,导致数据被完全删除。

目前业界一般没有方法可以避免此类情况,只能通过建立触发器进行一个提示警告,让运维人员三思而后行。但是此类办法并不能解决问题,出现了Truncate删除之后,恢复数据是非常麻烦的:

1、有RMAN完全备份+全部归档才能进行异机基于时间点的不完全恢复,把Truncate之前的数据找出来,然后导出,重新导入到以前的数据库当中。如果数据量非常大,这个恢复过程可能需要持续数天,从而会严重影响一些客户的业务正常进行。

2、没有完全备份也没开归档,这类数据如果被Truncate了想要找回,只能借助底层恢复工具:如DUL、ODU、AUL之类的工具。这个恢复也是非常麻烦。操作极其复杂。

由上可见,目前没有对Truncate的有效保护,一旦发生了Truncate操作,数据有可能彻底丢失,即使能进行恢复也极其耗时耗力。

技术实现要素:

本发明所要解决的技术问题是提供一种用于Oracle数据库Truncate操作的保护方法,使得Truncate的恢复变得简单快速,且不会影响正常的数据删除。

本发明为解决上述技术问题而采用的技术方案是提供一种用于Oracle数据库Truncate操作的保护方法,包括如下步骤:S1)当Oracle数据库发生Truncate操作时,设置触发器;所述触发器记录被Truncate删除的表名,并将记录的信息保存到beforetruncate表中;S2)定时扫描beforetruncate表,如果存在新删除的表,则执行查询dba_segments,找到该表的段头块;S3)执行脚本将该表相关的data_object_id修改成Truncate以前的值,同时生成修改回去的逆向脚本;S4)当达到预设的保护阈值之后,运行步骤S3中的逆向脚本,把标识再恢复成Truncate之后的情况,通过Oracle数据库对需要回收的数据进行清理。

上述的用于Oracle数据库Truncate操作的保护方法,其中,所述步骤S3包括:S31)执行脚本将该表所有位图块和数据块中的data_object_id修改成Truncate以前的值,同时生成修改回去的逆向脚本;S32)修改数据字典OBJ$表,把data_object_id的值修改成Truncate以前的值,同时生成修改回去的逆向脚本。

上述的用于Oracle数据库Truncate操作的保护方法,其中,所述新删除的表由一级位图块,二级位图块和三级位图块构成;三级位图块的表头块记录了若干的L2位图块,第一个L2位图块为Segment Header,每个L2位图块又记录了若干L1位图块,而L1位图块则记录了真正的数据块;所述S31将二级位图块、三级位图块以及第一个一级位图块中的data_object_id修改成Truncate以前的值。

本发明对比现有技术有如下的有益效果:本发明提供的用于Oracle数据库Truncate操作的保护方法,通过触发器记录被Truncate删除的表名,并将该表相关的data_object_id修改成Truncate以前的值,从而使得Truncate的恢复变得简单快速;当确认删除的数据不需要了,则可以执行逆向脚本,恢复成删除时的样子,这样数据库会自动对数据进行回收,不会影响正常的数据删除。

附图说明

图1为本发明的Oracle数据库的Truncate操作保护流程图;

图2为本发明表的三级位图结构;

图3为本发明实施例中用于Oracle数据库的Truncate操作保护流程示意图。

具体实施方式

下面结合附图和实施例对本发明作进一步的描述。

图1为本发明的Oracle数据库的Truncate操作保护流程图。

请参见图1,本发明提供的用于Oracle数据库Truncate操作的保护方法包括如下步骤:

S1)当Oracle数据库发生Truncate操作时,设置触发器;所述触发器记录被Truncate删除的表名,并将记录的信息保存到beforetruncate表中;

S2)定时扫描beforetruncate表,如果存在新删除的表,则执行查询dba_segments,找到该表的段头块;

S3)执行脚本将该表相关的data_object_id修改成Truncate以前的值,同时生成修改回去的逆向脚本;

S4)当达到预设的保护阈值之后,运行步骤S3中的逆向脚本,把标识再恢复成Truncate之后的情况,通过Oracle数据库对需要回收的数据进行清理。

Truncate之所以非常块,那是因为他其实并没有真正立马去删除数据块当中的数据。当删完数据,然后又发现数据很重要的时候,本发明的保护方法可以把数据保护住,只要修改几处位置,就能在需要时把数据找回来。当删完数据,发现确实删除的数据不需要了,就可以执行逆向脚本,恢复成删除时候的样子,这样数据库会自动对数据进行回收。

图2为本发明表的三级位图结构,请继续参见图2,本发明的表是由一级位图,二级位图,三级位图构成的。而三级位图块一般就是表头。表头块记录了若干的L2位图块,而每个L2位图块又记录了若干L1位图块,而L1位图块则记录了真正的数据块。由图2可以看出,想要知道这个表究竟占用了那些L3,L2,L1,数据块。都需要知道第一个L3位图块,因为第一个L3位图块记录了其他L3和L2的位置。而第一个L2位图块也被称作是Segment Header。如前面所述,本发明用触发器记录了表名,这样本发明就能通过dba_segments视图根据表名查询到Header_file和Header_block的信息;也就是Segment Header在哪个数据文件和哪个数据块上面。

通过上述信息,本发明可以顺藤摸瓜,把这个表的所使用的L1,L2,L3数据块都挖出来。掌握了一个表的构造信息,本发明在后面就可以很方便的通过脚本设置开关来控制是否删除。当数据库发起Truncate之后,数据块的标识会发生改变,而本发明知道了整个表的构造信息,本发明就可以把标识再改回去,并生成反向脚本用于可逆操作。这样本发明就能起到一个保护的作用。当达到保护的阈值之后,本发明直接运行反向脚本,就能把标识再改成Truncate之后的情况。这样数据库就会把这部分数据清理掉,然后真正的回收资源。

下面再分析一下Truncate的具体操作:

1、发生Truncate之后,数据块的object_id未发生变化,data_object_id会发生变化。

2、段头和L2上面的data_object_id均发生变化,第一个L1的data_object_id也会发生了变化。

3、修改第一个L1高水位的信息,这样做是为了将仅存的数据进行屏蔽,不让查询出来。

那么Oracle为什么要这样做?因为Truncate之后,数据是要被回收使用的,但是表的对象还存在,因为表存在,那么这个表就需要一个结构,一个表的基本结构就需要L3,L2和L1块。那么它就把基本结构需要的数据块的Data_object_id给修改掉了。剩下没有修改的块L1及其指定的数据块都是可以清理的。数据块会在需要使用空间的时候,把这一部分进行清理,然后回收使用。

请继续参见图3,知道了上述原理之后,本发明就可以编写一个脚本进行Truncate的保护,这个脚本叫R1.Sh。它的作用如下:

1.每分钟循环扫描beforetruncate表,如果发现有表存在,立马执行查询dba_segments,找到这个表的段头块。

2.找到了段头块,就能迅速的找到全部的L2块。

3.找到了L2块,选在就能迅速的找到全部的L1块。

既然不等于Data_object_id的都会被循环利用掉。那么执行脚本修改所有全部的L3,L2块,还有第一个L1块,把data_object_id改成以前的值,也就是修改成object_id,同时生成逆向脚本(修改回去的脚本)。

修改数据字典OBJ$表,把data_object_id的值修改成object_id,与object_id一样;并生成逆向脚本(修改回去的脚本)。

这个保护脚本帮助本发明把数据保护住了,如果在一段时间内,确实该表的数据不在需要了,本发明可以执行逆向脚本,将L3,L2块,还有第一个L1块的Data_object_id再修改回去,同时将数据字典OBJ$表的data_object_id修改掉。这样数据库就仍然会对需要回收的数据进行清理。

虽然本发明已以较佳实施例揭示如上,然其并非用以限定本发明,任何本领域技术人员,在不脱离本发明的精神和范围内,当可作些许的修改和完善,因此本发明的保护范围当以权利要求书所界定的为准。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值