Oracle数据误删恢复
欢迎关注微信公众号: 程序员小圈圈
转载请标明出处^_^
原文首发于: www.zhangruibin.com
本文出自于: RebornChang的博客
对于删除数据,我们大致可以分为两种。
①一种是在控制台执行的sql进行数据删除。
②一种是在项目中,比如web项目,jdbc执行sql的删除。
有的人可能就这样说了,我是用datagrip之类的数据库连接软件,直接查询出来数据然后点击按钮删除的。这种就是①的情况,因为这种软件在底层都是连接数据库执行的sql。
那又有一个疑问,项目中执行的sql跟控制台执行的是否一样呢,有什么证明吗?
有的,那就涉及到一个视图:
v
s
q
l
a
r
e
a
。
说
到
v
sqlarea。 说到v
sqlarea。说到vsqlarea 就不得不说下 v
s
q
l
以
及
v
sql 以及v
sql以及vsqltext。
关于三者的详细说明见文末。
接下来说下为啥笔者会写这篇文章记录:
情景:某一在用系统对商品配置时,错误的删除了一个代理商,可怕的是,项目执行的是delete语句,并不是update状态,也就是说是彻底删除,瞬间炸裂,怎么找回刚误删的数据?
那么看下面两种,笔者使用的是第二种。
控制台执行的sql删除
在控制台执行的sql都会被oracle快照到一个视图:
v$sqlarea。
通过查询这个视图,我们可以看到刚才执行的语句,比如delete语句,然后通过对时间的排序,我们就可以得到想要的sql。
select t.SQL_TEXT, t.FIRST_LOAD_TIME from v$sqlarea t order by t.FIRST_LOAD_TIME desc ;
上面那句sql笔者执行后结果如下:
不过这样有一个问题,就是当我的数据比较复杂的时候,我是直接通过id之类的做的删除,那这个就不好使了,你可以想象下,这个视图存储的是控制台执行的语句,而且不包括上文中的②。
那么接下来再看另一种。
oracle数据快照找回删除数据
每条我们删除的数据,都会存在对应表的删除快照,所以我们只需要找到这个类似于回收站的东西,然后就可以筛选我们需要的数据,笔者的数据就是依赖这个找到的,先说下sql例子:
select * from GOODS_CONFIG_DETAIL as of timestamp to_timestamp('2019-08-28 09:30:00', 'yyyy-mm-dd hh24:mi:ss') where GOODS_CONFIG_ID = '0000000082AF0815AA953170ACD88F';
解释:
select * from 误删数据的表名 as of timestamp to_timestamp(‘从什么时候开始进行筛选,也就是需要定位到误删之前的时间’, ‘yyyy-mm-dd hh24:mi:ss’)。
v s q l a r e a 、 v sqlarea、 v sqlarea、vsql 、v$sqltext
共同点
1.都存储了sql内容;
- 记录的都是位于内存中的sql内容;
3.因为是内存,所以都不保留历史记录;
不同点
1.存储的为止不都是相同
其中v s q l 和 v sql和v sql和vsqlarea存储的sql都是位于shared sql area中的sql,而v$sqltext是位于sga中的sql。但文档没有明确说明这里的sga是否还包含了psa(私有sql区域--共享服务器模式下)。
2.存储sql的方式也不同
v
s
q
l
和
v
sql和v
sql和vsqlarea都是用一行来存储sql全文,而v$sqltext用一行存储sql的一行。
3.v$sql不存储包含group by的
通常这个视图,在每个查询执行完成后更新,但对于执行很久的sql,它是每5秒更新一次,这点对于查看sql执行状态是有意义的。
4.存储的明细不同
这是最基本的。
V$SQL
V S Q L 在 子 游 标 级 别 上 列 出 了 在 共 享 s q l 区 域 的 统 计 信 息 , 他 将 原 始 s q l 文 本 展 现 为 一 行 。 V SQL在子游标级别上列出了在共享sql区域的统计信息,他将原始sql文本展现为一行。V SQL在子游标级别上列出了在共享sql区域的统计信息,他将原始sql文本展现为一行。VSQL中的视图信息一般在sql执行的最后进行更新。然而,对于长时间执行的sql,每5秒会更新一次v$sql视图。这使得很容易查看长时间执行的sql在运行过程中带来的影响。
v s q l 列 说 明 , 如 没 有 特 别 说 明 , 均 指 子 游 标 , 存 储 的 是 具 体 的 S Q L 和 执 行 计 划 相 关 信 息 , 实 际 上 , v sql列说明,如没有特别说明,均指子游标,存储的是具体的SQL 和执行计划相关信息,实际上,v sql列说明,如没有特别说明,均指子游标,存储的是具体的SQL和执行计划相关信息,实际上,vsqlarea 可以看做 v$sql 根据 sqltext 等 做了 group by之后的信息。
V$SQL各列说明
v$sql
SQL_TEXT //当前正在执行的游标的sql文本的前1000个字符
SQL_FULLTEXT CLOB类型 整个sql文本,不用借助于 V$SQL_TEXT视图来查看整个文本
SQL_ID //库缓存中的SQL父游标的标志
SHARABLE_MEM //子游标使用的共享内存的大小,bytes
PERSISTENT_MEM //子游标生存时间中使用的固定内存的总量,bytes
RUNTIME_MEM //在子游标执行过程中需要的固定内存大小,bytes
SORTS //子游标发生的排序数量
LOADED_VERSIONS // 显示上下文堆是否载入,1是,0否
USERS_OPENING // 执行这个sql的用户数
FETCHES // sql取数据的次数
EXECUTIONS //自从被载入共享池后,sql执行的次数
FIRST_LOAD_TIME // 父游标产生的时间戳
PARSE_CALLS //解析调用的次数
DISK_CALLS //读磁盘的次数
DIRECT_WRITES //直接写的次数`
BUFFER_GETS //直接从buffer中得到数据的次数`
APPLICATION_WAIT_TIME // 应用等待时间,毫秒
CONCURRENCY_WAIT_TIME //并发等待时间,毫秒
USER_IO_WAIT_TIME //用户IO等待时间
ROWS_PROCESSED SQL //解析sql返回的总行数
OPTIMIZER_MODE //优化器模式
OPTIMIZER_COST //优化器对于sql给出的成本
PARSING_USER_ID //第一个创建这个子游标的用户id
HASH_VALUES //解析产生的哈希值
CHILD_NUMBER //该子游标的数量
SERVICE //服务名
CPU_TIME //该子游标解析,执行和获取数据使用的CPU时间
ELAPSED_TIME //sql的执行时间,毫秒
INVALIDATIONS //该子游标的无效次数
MODULE //第一次解析该语句时,通过DBMS_APPLICAITON_INFO.SET_ACTION设置的模块名
ACTION //第一次解析该语句时,通过DBMS_APPLICAITON_INFO.SET_ACTION设置的动作名
IS_OBSOLETE //标记该子游标过期与否,当子游标过大时会发生这种情况
is_bind_sensitive //不仅指出是否使用绑定变量窥测来生成执行计划,而且指出这个执行计划是否依赖于窥测到的值。如果是,这个字段会被设置为Y,否则会被设置为N。
is_bind_aware //表明游标是否使用了扩展的游标共享。如果是,这个字段会被设置为Y,如果不是,这个字段会被设置为N。如果是设置为N,这个游标将被废弃,不再可用。
is_shareable //表明游标能否被共享。如果可以,这个字段会被设置为Y,否则,会被设置为N。如果被设置为N,这个游标将被废弃,不再可用。
v$sqlarea
v s q l a r e a 的 字 段 定 义 和 v sqlarea的字段定义和v sqlarea的字段定义和vsql基本一致,不同的是V S Q L A R E A 是 在 父 游 标 级 别 上 统 计 的 s q l 信 息 , v SQLAREA是在父游标级别上统计的sql信息,v SQLAREA是在父游标级别上统计的sql信息,vsql的汇总表,进行了group by hash_value,sql_id的汇总。
v$sqltext
本视图包括Shared pool中SQL语句的完整文本,一条SQL语句可能分成多个块被保存于多个记录内。
注:V S Q L A R E A 和 v SQLAREA和v SQLAREA和vsql中的SQL_TEXT字段只包括头1000个字符, SQL_FULLTEXT以CLOB方式包含了所有的字符
V$SQLTEXT列说明
HASH_VALUE SQL语句的Hash值
ADDRESS sql语句在SGA中的地址
SQL_TEXT SQL文本。
PIECE SQL语句块的序号
SQL_ID SQL id
COMMAND_TYPE 命令类型,如select、insert等。
亲,博主的微信公众号
‘程序员小圈圈’开始持续更新了哟~~
识别二维码或者直接搜索名字 ‘程序员小圈圈’ 即可关注本公众号哟~~
不只是有技术哟~~
还有很多的学习娱乐资源免费下载哦~~
还可以学下教育知识以及消遣娱乐哟~~
求关注哟~~ ’