知识库

标准化实施手册及常见错误


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把这些已删除的表的信息放到了一个虚拟容器&quot;回收站&quot;中,而只是对该表的数据块做了可以被覆写的标志,所以在块未被重新使用前还可以恢复 <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>

页面列表

ITEM_HTML