oracle误操作清空或删除表的恢复方案
<p>[TOC]</p>
<h2>一、Delete或者手动操作误删除表数据的解决方法</h2>
<h3>注意:确保表中没有新数据产生,才能直接进行数据回滚</h3>
<p><strong>首先清空某张表</strong>
<img src="http://60.191.64.5:16100/server/index.php?s=/api/attachment/visitFile/sign/0bb921c2cde17204b05ea588de8cd2dd" alt="" /></p>
<pre><code class="language-shell">--清空表数据
DELETE FROM CORE_ACCOUNT;</code></pre>
<p><img src="http://60.191.64.5:16100/server/index.php?s=/api/attachment/visitFile/sign/e86e13a5d66db053aceb7a3e3c027088" alt="" /></p>
<h3>方法一:使用时间戳</h3>
<pre><code class="language-shell">--查询当前数据库时间
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;</code></pre>
<p><img src="http://60.191.64.5:16100/server/index.php?s=/api/attachment/visitFile/sign/920db28fe824d22c41141965c1273c2a" alt="" />
根据上图可知数据在 <strong>2021-12-14 14:29</strong> 之前没有被删除</p>
<h4>1.Oracle的闪回功能,用以下语句找回某个时间点的表记录</h4>
<pre><code class="language-shell">--查询某个时间点的表记录
select * from CORE_ACCOUNT as of timestamp to_timestamp('2021-12-14 14:29:00','yyyy-mm-dd hh24:mi:ss')</code></pre>
<p><img src="http://60.191.64.5:16100/server/index.php?s=/api/attachment/visitFile/sign/0f8fcd70f06a475930e1412bbf8f9930" alt="" /></p>
<h4>2.把查询到的数据插入原表(二选一):</h4>
<pre><code class="language-shell">insert into CORE_ACCOUNT (select * from CORE_ACCOUNT as of timestamp to_timestamp('2021-12-14 14:29:00','yyyy-mm-dd hh24:mi:ss'));</code></pre>
<p><img src="http://60.191.64.5:16100/server/index.php?s=/api/attachment/visitFile/sign/977cbd146131e4323f5c410663bd4b92" alt="" />
表数据恢复正常</p>
<h4>3.闪回整个表数据到未被删除的时间段(二选一):</h4>
<pre><code class="language-shell">--开启表的行移动功能
alter table CORE_ACCOUNT enable row movement;
--恢复已清空的表数据
flashback table CORE_ACCOUNT to timestamp to_timestamp('2021-12-14 14:29:00','yyyy-mm-dd hh24:mi:ss');
--关闭表的行移动功能
alter table CORE_ACCOUNT disable row movement;</code></pre>
<p><img src="http://60.191.64.5:16100/server/index.php?s=/api/attachment/visitFile/sign/6805e9623891c0646f381668e0da83df" alt="" />
表数据恢复正常</p>
<h3>方法二:使用SCN</h3>
<p>SCN(System Change Number 简称 SCN)是当Oracle数据库更新后,由DBMS自动维护去累积递增的一个数字。在Oracle中,有四种SCN,分别为:系统检查点SCN、数据文件检查点SCN、启动SCN、终止SCN。</p>
<h4>1.获得当前数据库的SCN号</h4>
<pre><code class="language-shell">select current_scn from v$database;</code></pre>
<p><img src="http://60.191.64.5:16100/server/index.php?s=/api/attachment/visitFile/sign/e2c0d6419662ca889c3d51ec406f96e8" alt="" />
查询到的SCN号为:1031376</p>
<h4>2.根据当前SCN号获取已删除的表数据</h4>
<p>确定删除的数据是否存在,如果存在,则恢复数据;如果不是,则继续缩小scn号,直到查询出全部表数据</p>
<pre><code class="language-shell">--缩小scn号查询人员表所有数据
select * from CORE_ACCOUNT as of scn 1031370;</code></pre>
<p><img src="http://60.191.64.5:16100/server/index.php?s=/api/attachment/visitFile/sign/2b9a23ca1f9aa622064217154070e8fb" alt="" /></p>
<h4>3.恢复删除且已提交的数据(需要启用行移动功能)</h4>
<pre><code class="language-shell">--开启表的行移动功能
alter table CORE_ACCOUNT enable row movement;
--恢复已清空的表数据
flashback table CORE_ACCOUNT to scn 1031370;
--关闭表的行移动功能
alter table CORE_ACCOUNT disable row movement;</code></pre>
<p><img src="http://60.191.64.5:16100/server/index.php?s=/api/attachment/visitFile/sign/d506d7cf0584f641f95fd4366e0b0098" alt="" />
表数据恢复正常</p>
<h2>二、Drop或者手动操作误删除整张表的解决方法</h2>
<h3>方法一:使用oracle的回收站功能</h3>
<p>原理:由于oracle在删除表时,没有直接清空表所占的块,oracle把这些已删除的表的信息放到了一个虚拟容器"回收站"中,而只是对该表的数据块做了可以被覆写的标志,所以在块未被重新使用前还可以恢复
<strong>首先删除某张表</strong></p>
<pre><code class="language-shell">--删除表
DROP TABLE CORE_ACCOUNT;</code></pre>
<p><img src="http://60.191.64.5:16100/server/index.php?s=/api/attachment/visitFile/sign/6e6b2de0aed229765777b0a482b33fa6" alt="" /></p>
<h4>1.查询收回站找到已被删除的表</h4>
<pre><code class="language-shell">--查看用户回收站
select object_name,original_name,type,droptime from user_recyclebin;</code></pre>
<p><img src="http://60.191.64.5:16100/server/index.php?s=/api/attachment/visitFile/sign/11071b9191d7a6d8545898f29d1c5c94" alt="" /></p>
<h4>2.根据表名通过下列语句来恢复误删的表</h4>
<p><strong>通过次方法恢复表之后需要重新手动添加索引</strong></p>
<pre><code class="language-shell">--从回收站恢复误删的表
flashback table CORE_ACCOUNT to before drop;</code></pre>
<p><img src="http://60.191.64.5:16100/server/index.php?s=/api/attachment/visitFile/sign/39a1a35845391ac11565ee8a46366fec" alt="" />
误删的表恢复正常</p>