===============STARTED====================================

事件起因:

业务的人mail过来说是有张表记录的10K+的优惠码记录没了,要我们确认下之前是否有这样的相关清除操作。

当然,先去数据库确认下这张表关于这个字段的count,的确没有相关的记录。

于是想着之前是不是有人做了相关的DML操作,

先看下这个视图,

select table_name, owner,num_rows, blocks, last_analyzed,partitioned

from dba_tables

where table_name ='NIKE_COUPON';

TABLE_OWNER   TABLE_NAME       PARTITION_NAME                 SUBPARTITION_NAME            INSERTS    UPDATES    DELETES TIMESTAMP TRU DROP_SEGMENTS

------------- ---------------- ------------------------------ ------------------------- ---------- ---------- ---------- --------- --- -------------

AP                      NIKE_COUPON                                                                                               4         66            0            02-JAN-17 NO         0

看了下deletes为0呀,想了下也许这个视图的数据来源不准,进一步分析,可以通过ASH来看看是否有着这样的DML操作。

(关于dba_tab_modifications这个视图有时候还是挺有用的,但是有几个限制,所以反馈的信息有时也不是很准~)

ASH信息获取:

SQL> set lines 1000

SQL> set pages 400

SQL> select  distinct a.sample_time,

2  a.sql_id,a.blocking_session,a.session_state,a.event,a.wait_class,a.program,a.module,a.machine,c.sql_text

3  from dba_hist_active_sess_history a ,v$sqlarea c

where  a.sql_id=c.sql_id

and sample_time between  to_date('1-JAN-17 00.00.00','dd-MON-yy hh24:mi:ss') and to_date('3-JAN-17 23.00.00','dd-MON-yy hh24:mi:ss')

and lower(c.sql_text) like '%delete%nike_coupon%'

order by 1 ;  4    5    6    7

SAMPLE_TIME                                                                 SQL_ID        BLOCKING_SESSION SESSION EVENT                                                            WAIT_CLASS          PROGRAM                                                           MODULE                                                           MACHINE

--------------------------------------------------------------------------- ------------- ---------------- ------- ---------------------------------------------------------------- ---------------

SQL_TEXT

----------------------------------------

01-JAN-17 02.02.47.280 AM                                                   8c7cw4xvync0v             7431 WAITING enq: TX - row lock contention                                    Application         JDBC Thin Client                                                  JDBC Thin Client                                                 ip-xxxx.xx.b2c.nike.com

DELETE FROM nike_coupon        WHERE coupon_id = :1

01-JAN-17 02.02.47.280 AM                                                   8c7cw4xvync0v             7431 WAITING enq: TX - row lock contention                                    Application         JDBC Thin Client                                                  JDBC Thin Client                                                  ip-xxxx.xx.b2c.nike.com

DELETE FROM nike_coupon        WHERE coupon_id = :1

01-JAN-17 02.02.47.280 AM                                                   8c7cw4xvync0v             7431 WAITING enq: TX - row lock contention                                    Application         JDBC Thin Client                                                  JDBC Thin Client                                                 ip-xxxx.xx.b2c.nike.com

DELETE FROM nike_coupon        WHERE coupon_id = :1

01-JAN-17 02.02.47.280 AM                                                   8c7cw4xvync0v             7431 WAITING enq: TX - row lock contention                                    Application         JDBC Thin Client                                                  JDBC Thin Client                                                  ip-xxxx.xx.b2c.nike.com

DELETE FROM nike_coupon        WHERE coupon_id = :1

01-JAN-17 02.02.47.280 AM                                                   8c7cw4xvync0v             7431 WAITING enq: TX - row lock contention                                    Application         JDBC Thin Client                                                  JDBC Thin Client                                                 ip-xxxx.xx.b2c.nike.com

DELETE FROM nike_coupon        WHERE coupon_id = :1

01-JAN-17 02.02.47.280 AM                                                   8c7cw4xvync0v             7431 WAITING enq: TX - row lock contention                                    Application         JDBC Thin Client                                                  JDBC Thin Client                                                 ip-xxxx.xx.b2c.nike.com

DELETE FROM nike_coupon        WHERE coupon_id = :1

01-JAN-17 02.04.53.276 AM                                                   8c7cw4xvync0v                  ON CPU                                                                                       JDBC Thin Client                                                  JDBC Thin Client                                                  ip-xxxx.xx.b2c.nike.com

DELETE FROM nike_coupon        WHERE coupon_id = :1

01-JAN-17 02.07.34.168 AM                                                   8c7cw4xvync0v                  ON CPU                                                                                       JDBC Thin Client                                                  JDBC Thin Client                                                 ip-xxxx.xx.b2c.nike.com

DELETE FROM nike_coupon        WHERE coupon_id = :1

01-JAN-17 02.13.30.192 AM                                                   8c7cw4xvync0v                  ON CPU                                                                                       JDBC Thin Client                                                  JDBC Thin Client                                                 ip-xxxx.xx.b2c.nike.com

DELETE FROM nike_coupon        WHERE coupon_id = :1

可见,在01-JAN-17 02.02.47.280 AM 左右的确有应用服务器连过来做了delete这张表记录的操作,然后和应用,业务都确认好了,应用有每个月初的batch把一些过期的优惠券记录删掉,但是业务想在延长一个月,后面当然是和业务确认好数据,然后重新insert进去。

事情就这样告一段落。

但是可以看到delete语句是带有绑定变量的,如果业务没有数据副本保留,要我们DBA来去fetch到那些删掉的记录,我们如何去获取呢,那就得想办法去得到这个绑定变量的值。

SQL> select

2  dbms_sqltune.extract_bind(bind_data,1).value_string bind1,

3  dbms_sqltune.extract_bind(bind_data,2).value_string bind2,

dbms_sqltune.extract_bind(bind_data,3).value_string bind3

from sys.wrh$_sqlstat

where sql_id = '8c7cw4xvync0v';

4    5    6

BIND1

------------------------------

BIND2

------------------------------------

BIND3

---------------------

HO1234567

HO1234567

SELECT snap_id, NAME,POSITION,DATATYPE_STRING,VALUE_STRING,LAST_CAPTURED cdate

FROM DBA_HIST_SQLBIND WHERE SQL_ID='8c7cw4xvync0v'  ;

SNAP_ID NAME                             POSITION DATATYPE_STRING

---------- ------------------------------ ---------- ---------------

VALUE_STRING

-----------------------------------------------

CDATE

---------

33175 :1                                      1 VARCHAR2(128)

HO1234567

01-JAN-17

33175 :1                                      1 VARCHAR2(128)

HO1234567

01-JAN-17

SQL> select snap_id,BEGIN_INTERVAL_TIME,END_INTERVAL_TIME from dba_hist_snapshot where snap_id=33175;

SNAP_ID BEGIN_INTERVAL_TIME                                                         END_INTERVAL_TIME

---------- --------------------------------------------------------------------------- ---------------------------------------------------------------------------

33175 01-JAN-17 02.00.36.240 AM                                                   01-JAN-17 03.00.38.812 AM

33175 01-JAN-17 02.00.36.109 AM                                                   01-JAN-17 03.00.38.693 AM

只能查到这一个绑定变量的值:HO1234567

明显是不够的。

这里略带说一下,关于获取绑定变量的一些方法。

1.10043获取bind value,但是在这里不合适,因为要获取的是历史绑定变量

2. v$sql_bind_capture以及dba_hist_sqlbind

3.dbms_sqltune.extract_bind from dba_hist_sqlstat

Bind Capture History

Oracle captures the bind value and stores it into the repository(AWR), but with following restrictions.

  • Captured periodically(_cursor_bind_capture_interval), not at real time.
  • Captured under maximum size(_cursor_bind_capture_area_size)
  • Only bind variables in WHERE clause are captured

大致这三种方法获取bind value,

但是也有如下的限制,如下一小段英文转自Historical Bind Variable Storage

http://www.dba-oracle.com/t_historical_bind_variable_storage.htm

Question:  I need to see historical SQL with the bind variables used.  Does AWR or STATSPACK store bind variable information?  Does Oracle store SQL bind variable values anywhere?

Answer:  Only the PGA stores specific bind variable and cursor values, and these are not kept for historical analysis.

The extra cost AWR allows you to see a "representative" sample bind variable value, but all bind variable values are NOT present.  In Oracle 10g and beyond, bind variables are periodically captured in the v$sql_bind_capture anddba_hist_sqlbind views, but these are bind variables or ONLY for a single, specific session, and not all historical session bind variables for a SQL statement are kept.   

This is because the amount of disk storage to keep a history of all bind variable values would be huge, especially for database that process thousands of transactions per second.

These limited bind values can be found in some AWR and ASH tables as well as the v$sql_plan view.  Also, DML statements will have bind variable information in the archived redo logs available via LogMiner.

The best way to collect bind variable for any SQL statement is by using TKPROF(a 10046 trace).

v$sql_plan Bind Variable Display  

The v$sql_plan only shows Systemwide values and it does not contain session-level bind variable values.  However, you can use the dbms_xplan.display package to display a sample bind variable:

select

    sql_text,

    other_xml 

from

    $sql_plan 

where

    sql_id='XXXX' 

and

    id=0;

AWR dba_hist_sqlstat Bind Variable Display

select

   sql_text,

   other_xml 

from

    $dba_hist_sqlplan 

where

    sql_id='XXXX' 

and

    id=0;

Or you can use the dbms_xplan_display_awr procedure to see a sample bind
variable:

select

   * 

from

    table(dbms_xplan.display_awr('&SQL_ID',NULL,NULL,'ADVANCED'))

好的,所以看来只能通过logminer来获取sql redo和sql
undo的一些信息了。明天再来更新后续!~~

使用logminer挖掘日志,分析历史操作 系列一的更多相关文章

  1. 10.2.0.5环境dg测试logminer挖掘日志分析

    起因:客户需求,数据库正常每天总的日志切换是20以内,有一天日志切换总数,达到30,客户建议使用Logminer进行日志挖掘分析,到底什么应用导致的问题. 说明:使用logminer进行日志挖掘,只能 ...

  2. oracle实现通过logminer实现日志抓取分析

    场景:现场库到前置库. 思考:使用触发器? 1.侵入性解决方案 2.需要时各种配置,不需要时又是各种配置 Change Data Capture:捕捉变化的数据,通过日志监测并捕获数据库的变动(包括数 ...

  3. oracle (9I/10G/11G)数据库日志挖掘(审计误操作)

    文档结构: 资料来自官方网站: https://docs.oracle.com/cd/E11882_01/server.112/e22490/logminer.htm#SUTIL019 来自论坛: h ...

  4. 日志分析方法概述 & Web日志挖掘分析的方法

    日志在计算机系统中是一个非常广泛的概念,任何程序都有可能输出日志:操作系统内核.各种应用服务器等等.日志的内容.规模和用途也各不相同,很难一概而论. 本文讨论的日志处理方法中的日志,仅指Web日志.其 ...

  5. Spark SQL慕课网日志分析(1)--系列软件(单机)安装配置使用

    来源: 慕课网 Spark SQL慕课网日志分析_大数据实战 目标: spark系列软件的伪分布式的安装.配置.编译 spark的使用 系统: mac 10.13.3 /ubuntu 16.06,两个 ...

  6. Dubbo学习系列之十六(ELK海量日志分析框架)

    外卖公司如何匹配骑手和订单?淘宝如何进行商品推荐?或者读者兴趣匹配?还有海量数据存储搜索.实时日志分析.应用程序监控等场景,Elasticsearch或许可以提供一些思路,作为业界最具影响力的海量搜索 ...

  7. nginx高性能WEB服务器系列之八--nginx日志分析与切割

    nginx系列友情链接:nginx高性能WEB服务器系列之一简介及安装https://www.cnblogs.com/maxtgood/p/9597596.htmlnginx高性能WEB服务器系列之二 ...

  8. 【MM系列】SAP 的账期分析和操作

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP 的账期分析和操作   前言部 ...

  9. 【MM系列】SAP SAP的账期分析和操作

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP SAP的账期分析和操作   ...

随机推荐

  1. JavaWeb学习总结(五十二)——使用JavaMail创建邮件和发送邮件

    一.RFC882文档简单说明 RFC882文档规定了如何编写一封简单的邮件(纯文本邮件),一封简单的邮件包含邮件头和邮件体两个部分,邮件头和邮件体之间使用空行分隔. 邮件头包含的内容有: from字段 ...

  2. js制作点击会自动隐藏的导航栏(固定在在头部的)

    想必大家应该见过这样的特效,本来头部是固定在网页的最上方的,点一下缩进去,再点一下 又可以缩回来,这种效果怎么实现的呢,我今天就做了一个.菜鸟勿喷. @charset "utf-8" ...

  3. 浅析JS中的模块规范(CommonJS,AMD,CMD)

    如果你听过js模块化这个东西,那么你就应该听过或CommonJS或AMD甚至是CMD这些规范咯,我也听过,但之前也真的是听听而已. 现在就看看吧,这些规范到底是啥东西,干嘛的. 一.CommonJS ...

  4. 使用idea debug多线程

    最近采用hystrix远程访问webservice, 遇到一个重定向303的exception,想要debug一下,发现打了断点后总是被跳过.想到hystrix异步线程的问题,于是想要debug就得支 ...

  5. 【原创】Kafka console consumer源代码分析(一)

    上一篇中分析了Scala版的console producer代码,这篇文章为读者带来一篇console consumer工作原理分析的随笔.其实不论是哪个consumer,大部分的工作原理都是类似的. ...

  6. jQuery鼠标滚动垂直全屏切换代码

    体验效果:http://hovertree.com/texiao/jquery/68/ 源码下载:http://hovertree.com/h/bjaf/f643upc4.htm 代码如下: < ...

  7. [WCF编程]10.操作:回调操作

    一.回调操作概述 WCF支持服务将调用返回给它的客户端.在回调期间,许多方面都将颠倒过来:服务将成为客户端,客户端将编程服务.回调操作可以用在各种场景和应用程序中,但在涉及事件或者服务发生时间需要通知 ...

  8. Java字节、十进制、十六进制、字符串之间的相互转换

    1. 字节转10进制 直接使用(int)类型转换. /* * 字节转10进制 */ public static int byte2Int(byte b){ int r = (int) b; retur ...

  9. Hibernate插入数据后获得ID

    很多表的主键都是自增型的,新增的记录使用save()方法保存以后,要获得ID,直接使用getId()就可以了,因为此时记录已经保存进数据库,已经有了ID. 另一种方法是使用MySQL的SELECT L ...

  10. windows下新安装的mysql修改root password问题

    常用步骤: 1. 在my.ini中的mysqld下添加一行 skip-grant-tables 2.重启mysql后直接进入后,用SQL直接修改password列: C:\> net stop ...