精华内容
下载资源
问答
  • Oracle变更趋势追踪记录(转)

    千次阅读 2013-11-14 12:41:05
    DBA_HIST_SEG_STAT视图内记录了数据库实例启动以来段的变化信息,该视图的数据来自于v$segstat Column Datatype NULL Description SNAP_ID NUMBER   Unique snapshot ID ...

    注意文章中的object_type='TABLE' 条件忽略了分区表“TABLE PARTITION”,各位看客使用的时候修改下即可

    from http://www.myexception.cn/database/489598.html


    这几天数据库上的用户表空间疯涨,一天的增长量达到了20~30GB,平时就4~5GB的增长量。问了开发商,他们也说不出个所以然。PS:那些鸟开发商,现在我已经对他们绝望了,什么都不知道。情急之下直接对该表空间进行了扩容,问题总算解决了。事后总想弄个明白,想知道是那张表导致的表空间增长如此之快,以免下次出现同样的问题又是不知所措。

    google了一番后发现DBA_HIST_SEG_STAT可以看出对象的使用趋势 
    构造如下SQL查询出每个时间段内数据库对象的增长量,其中DB_BLOCK_CHANGES_DELTA为块个数

    select c.SNAP_ID,to_char(c.END_INTERVAL_TIME,'yyyy-mm-dd') SNAP_TIME,a.OWNER ,a.OBJECT_NAME, a.OBJECT_TYPE, b.DB_BLOCK_CHANGES_DELTA
    from dba_objects a,
    (select SNAP_ID,obj#,DB_BLOCK_CHANGES_DELTA from DBA_HIST_SEG_STAT where DB_BLOCK_CHANGES_DELTA > 20000 order by snap_id desc, DB_BLOCK_CHANGES_DELTA desc) b,
    DBA_HIST_SNAPSHOT c
    where a.object_id=b.obj# and object_type='TABLE' and b.SNAP_ID=c.SNAP_ID
    order by DB_BLOCK_CHANGES_DELTA

    下面的SQL查询出某个时间段内,数据库对象的变化大小,单位以换算成GB

    select a.OBJECT_NAME, to_char(c.END_INTERVAL_TIME,'yyyy-mm-dd') SNAP_TIME, sum(b.DB_BLOCK_CHANGES_DELTA)/1024/1024 GB from dba_objects a,(select SNAP_ID,obj#,DB_BLOCK_CHANGES_DELTA from DBA_HIST_SEG_STAT where DB_BLOCK_CHANGES_DELTA > 20000 order by snap_id desc, DB_BLOCK_CHANGES_DELTA desc) b,DBA_HIST_SNAPSHOT c
    where a.object_id=b.obj# and object_type='TABLE' and b.SNAP_ID=c.SNAP_ID
    group by a.OBJECT_NAME,c.END_INTERVAL_TIME
    order by GB 

    简单介绍下DBA_HIST_SEG_STAT

    DBA_HIST_SEG_STAT视图内记录了数据库实例启动以来段的变化信息,该视图的数据来自于v$segstat

    Column Datatype NULL Description
    SNAP_IDNUMBER Unique snapshot ID
    DBIDNUMBER Database ID for the snapshot
    INSTANCE_NUMBERNUMBER Instance number for the snapshot
    TS#NUMBER Tablespace number
    OBJ#NUMBER Dictionary object number
    DATAOBJ#NUMBER Data object number
    LOGICAL_READS_TOTALNUMBER Cumulative value for logical reads
    LOGICAL_READS_DELTANUMBER Delta value for logical reads
    BUFFER_BUSY_WAITS_TOTALNUMBER Cumulative value for buffer busy waits
    BUFFER_BUSY_WAITS_DELTANUMBER Delta value for buffer busy waits
    DB_BLOCK_CHANGES_TOTALNUMBER Cumulative value for db block changes
    DB_BLOCK_CHANGES_DELTANUMBER Delta value for db block changes
    PHYSICAL_READS_TOTALNUMBER Cumulative value for physical reads
    PHYSICAL_READS_DELTANUMBER Delta value for physical reads
    PHYSICAL_WRITES_TOTALNUMBER Cumulative value for physical writes
    PHYSICAL_WRITES_DELTANUMBER Delta value for physical writes
    PHYSICAL_READS_DIRECT_TOTALNUMBER Cumulative value for physical reads direct
    PHYSICAL_READS_DIRECT_DELTANUMBER Delta value for physical reads direct
    PHYSICAL_WRITES_DIRECT_TOTALNUMBER Cumulative value for physical writes direct
    PHYSICAL_WRITES_DIRECT_DELTANUMBER Delta value for physical writes direct
    ITL_WAITS_TOTALNUMBER Cumulative value for ITL waits
    ITL_WAITS_DELTANUMBER Delta value for ITL waits
    ROW_LOCK_WAITS_TOTALNUMBER Cumulative value for row lock waits
    ROW_LOCK_WAITS_DELTANUMBER Delta value for row lock waits
    GC_CR_BLOCKS_SERVED_TOTALNUMBER Cumulative value for global cache CR blocks served
    GC_CR_BLOCKS_SERVED_DELTANUMBER Delta value for global cache CR blocks served
    GC_CU_BLOCKS_SERVED_TOTALNUMBER Cumulative value for global cache current blocks served
    GC_CU_BLOCKS_SERVED_DELTANUMBER Delta value for global cache current blocks served
    GC_BUFFER_BUSY_TOTALNUMBER Cumulative value for global cache buffer busy
    GC_BUFFER_BUSY_DELTANUMBER Delta value for global cache buffer busy
    GC_CR_BLOCKS_RECEIVED_TOTALNUMBER Cumulative value for global cache CR blocks received
    GC_CR_BLOCKS_RECEIVED_DELTANUMBER Delta value for global cache CR blocks received
    GC_CU_BLOCKS_RECEIVED_TOTALNUMBER Cumulative value for global cache current blocks received
    GC_CU_BLOCKS_RECEIVED_DELTANUMBER Delta value for global cache current blocks received
    SPACE_USED_TOTALNUMBER Cumulative value for space used
    SPACE_USED_DELTANUMBER Delta value for space used
    SPACE_ALLOCATED_TOTALNUMBER Cumulative value for space allocated
    SPACE_ALLOCATED_DELTANUMBER Delta value for space allocated
    TABLE_SCANS_TOTALNUMBER Cumulative value for table scans
    TABLE_SCANS_DELTANUMBER Delta value for table scans

    顺便说一句DBA_HIST_TBSPC_SPACE_USAGE视图可以监控表空间的使用趋势

     

    感谢杨帅军的指点

    参考至:http://oracle.erkansaka.org/2007/09/how-to-determine-tables-with-highest.html

                http://docs.oracle.com/cd/B19306_01/server.102/b14237/statviews_3165.htm

    本文原创,转载请注明出处、作者
    如有错误,欢迎指正

    邮箱:czmcj@163.com


    展开全文
  • 需将DB数据实时到kafka中,甲方使用第三方商用产品,还总有bug,甲方很满足,无语,自己简单看了下,原来只对DCN有印象,下面主要讲下几个技术的区别,也参考了几个文章会贴出来和大家分享oracle有几种获得变更数据的...

    最近做项目,需将DB数据实时到kafka中,甲方使用第三方商用产品,还总有bug,甲方很满足,无语,自己简单看了下,原来只对DCN有印象,下面主要讲下几个技术的区别,也参考了几个文章会贴出来和大家分享


    oracle有几种获得变更数据的技术


    trigger


    DCN(data change notify)


    CDC(change data capture)


    oracle stream


    trigger大家都熟悉,肯定都知道它对DB本身的影响也一定很大


    DCN:它主要是用于通知客户端数据有变化,内部相当于一个队列,队列里存放的是rowid,获得rowid用户自己获得新数据,当然它本身还提供很多其他信息,如Commit SCN,日期等


    CDC


    CDC有两个模式:同步和异步。两种模式的实现机制是截然不同的。同步CDC主要是采用触发器记录新增数据,基本能够做到实时增量抽取。而异步CDC则是通过分析已经commit的日志记录来得到增量数据信息,有一定的时间延迟,CDC中将系统分为两个角色:发布者和订阅者。发布者主要负责捕获增量数据,订阅者则将增量数据传递给实际应用。这些任务都可以通过oracle提供的PL/SQL包实现,CDC还有几种不同的方式,适用不同场景,下面的参考链接有介绍。


    oracle stream


    oracle stream与CDC不同的一点是,它本身直接同步数据到其他DB,而CDC只是让你获得数据变化信息,同步到哪里你自己实现。


    参考链接


    https://blog.csdn.net/awenzhangc/article/details/7974162


    https://code-examples.net/zh-CN/q/4298b

    展开全文
  • 一、Oracle CDC技术概要 对于增量数据采集,Oracle推出了两种主要方案,一种是我们熟悉的物化视图(materialized view),另一种就是CDC组件(Change Data Capture 变更...

    一、Oracle CDC技术概要

    对于增量数据采集,Oracle推出了两种主要方案,一种是我们熟悉的物化视图(materialized view),另一种就是CDC组件(Change Data Capture 变更数据捕获)。利用CDC,在对源表进行INSERT、UPDATE或DELETE等操作的同时就可以提取数据,并且变化的数据被保存在数据库的变化表中。这样就可以捕获发生变化的数据,然后利用数据库视图以一种可控的方式提供给目标系统。

    CDC体系结构基于发布者/订阅者模型。发布者捕捉变化数据并提供给订阅者。订阅者使用从发布者那里获得的变化数据。通常,CDC系统拥有一个发布者和多个订阅者。发布者首先需要识别捕获变化数据所需的源表。然后,它捕捉变化的数据并将其保存在特别创建的变化表中。它还使订阅者能够控制对变化数据的访问。订阅者需要清楚自己感兴趣的是哪些变化数据。一个订阅者可能不会对发布者发布的所有数据都感兴趣。订阅者需要创建一个订阅者视图来访问经发布者授权可以访问的变化数据。

    CDC有几个重要的基本术语:
    源表(Source Table),业务数据库的需要捕获数据的源表。
    变化表(Change Table),保存从源表捕获的变化数据(包括各种DML产生的数据)。
    变化集(Change Set),是保证事务一致性的数据集合,一个变化集对应多个变化表。
    订阅视图(Subscription View),提供给读取变化表数据的视图。
    订阅窗口(Subscription Window),定义了查看变化数据的时间范围,就象一个观察变化数据的滑动窗口,变化数据处理完成后,可以清除订阅窗口。

    CDC分同步和异步模式:

    同步模式,实时的捕获变化数据并存储到变化表中,发布者与订阅都位于同一数据库中,同步模式实际使用trigger的形式来捕捉变化数据。

     

     

    异步模式,以Oracle流复制技术为基础,从redo log中读取日志记录来捕捉变化数据。异步模式分为三种:

    1)Asynchronous HotLog Configuration(异步在线日志CDC)

     

    该过程不再使用触发器,而是使用在线日志,不是归档日志。原表与目标表仍然必须是同一个库。该模式相对简单,是在Oracle 10g以上产生的,9i没有该机制。

    2)Asynchronous Distributed HotLog Configuration(异步分布式在线日志CDC)

     

    该模式是对异步在线日志CDC的一种优化,也比较容易理解,就是加入了DB-LINK机制,使原表、目标表不在同一个库,实际和异步在线日志CDC没有什么本质区别。

    3)Asynchronous AutoLog Mode(通过异步自动日志复制的CDC)

    这个又分两种:

    3.1)Asynchronous Autolog Online Change Data Capture Configuration(异步在线日志复制CDC)

     

    异步在线日志复制CDC模式使用Standby热备数据库日志,将日志写入了热备数据库,目标表就可以建立在热备库上,这对主数据库性能影响就进一步降低。

    3.2)Asynchronous AutoLog Archive Change Data Capture Configuration(异步归档日志复制CDC)

     

     

    该模式几乎可以完全不影响原数据库的性能。需要做异地同步归档,然后在目标端分析归档日志进行变化数据处理。

    关于Oracle CDC的更多介绍可参考Oracle官方资料:

    https://docs.oracle.com/cd/E11882_01/server.112/e25554/cdc.htm#DWHSG016

    同步模式以trigger形式来捕捉,不如自主创建trigger灵活,且对性能的影响比从日志捕捉变化数据的影响大,所以这里以异步Hotlog来进行部署。

    二、CDC环境搭建

    1、确认数据库对CDC(变更数据捕获)的支持
    col parameter for a20
    col value for a10
    select * from v$option where parameter = 'Change Data Capture';

    PARAMETER            VALUE
    -------------------- ----------
    Change Data Capture  TRUE

    2、确认数据库运行在归档模式
    archive log list;

    3、修改数据库为强制日志
    alter database force logging;

    4、添加数据库补充日志
    alter database add supplemental log data;

    5、确认数据库修改后的状态
    col log_mode for a15
    col force_logging for a15
    col supp_log_min for a15
    select log_mode, supplemental_log_data_min supp_log_min, force_logging from v$database;

    LOG_MODE        SUPP_LOG_MIN    FORCE_LOGGING
    --------------- --------------- ---------------
    ARCHIVELOG      YES             YES

    6、准备发布数据和用户

    -- 创建业务用户表,这里业务用户以Oracle自带的SCOTT用户为例
    conn scott/tiger
    create table t1(a number, b varchar2(20));

    -- 创建发布者并授权
    conn / as sysdba
    create user cdc_pubr identified by cdc_pubr default tablespace users;

    alter user cdc_pubr quota unlimited on system quota unlimited on sysaux;
    grant connect, resource, dba to cdc_pubr;
    grant create session to cdc_pubr;
    grant create table to cdc_pubr;
    grant create tablespace to cdc_pubr;
    grant unlimited tablespace to cdc_pubr;
    grant select_catalog_role to cdc_pubr;
    grant execute_catalog_role to cdc_pubr;
    grant create sequence to cdc_pubr;
    grant select_catalog_role to cdc_pubr;
    grant execute_catalog_role to cdc_pubr;
    grant select on change_sets to cdc_pubr;
    grant execute on sys.dbms_cdc_publish to cdc_pubr;
    begin
        dbms_streams_auth.grant_admin_privilege(grantee => 'cdc_pubr');
    end;
    /

    -- 添加CDC表的补充日志
    alter table scott.t1 add supplemental log group log_group_t1(a number, b varchar2(20)) always;
    -- 如要捕捉表的所有列,则可用以下语句替代
    alter table scott.t1 add supplemental log data(all) columns;

    7、源表实例化
    conn / as sysdba
    begin
        dbms_capture_adm.prepare_table_instantiation(table_name => 'scott.t1');
    end;
    /

    8、创建变更集
    conn cdc_pubr/cdc_pubr;
    begin
      dbms_cdc_publish.create_change_set(change_set_name    => 'cdc_t1',
                                         description        => 'change set for scott.t1',
                                         change_source_name => 'hotlog_source',
                                         stop_on_ddl        => 'y');
    end;
    /

    9、创建变更表
    conn cdc_pubr/cdc_pubr;
    begin
      dbms_cdc_publish.create_change_table(owner             => 'cdc_pubr',
                                           change_table_name => 'c_t1',
                                           change_set_name   => 'cdc_t1',
                                           source_schema     => 'scott',
                                           source_table      => 't1',
                                           column_type_list  => 'a number, b varchar2(20)',
                                           capture_values    => 'both',
                                           rs_id             => 'y',
                                           row_id            => 'y',
                                           user_id           => 'y',
                                           timestamp         => 'y',
                                           object_id         => 'n',
                                           source_colmap     => 'n',
                                           target_colmap     => 'y',
                                           options_string    => '');
    end;
    /

    10、激活变更集
    conn cdc_pubr/cdc_pubr;
    begin
      dbms_cdc_publish.alter_change_set(change_set_name => 'cdc_t1',
                                        enable_capture  => 'y');
    end;
    /

    dbms_cdc_publish过程的详细解释可参考官方资料:
    https://docs.oracle.com/cd/E11882_01/appdev.112/e40758/d_cdcpub.htm#ARPLS023

    11、创建订阅者并授权
    conn / as sysdba
    create user cdc_subr1 identified by cdc_subr1 default tablespace users;

    grant create table to cdc_subr1;
    grant create session to cdc_subr1;
    grant create view to cdc_subr1;
    grant unlimited tablespace to cdc_subr1;

    conn cdc_pubr/cdc_pubr;
    grant select on cdc_pubr.c_t1 to cdc_subr1;

    12、创建订阅集
    conn cdc_subr1/cdc_subr1
    begin
      dbms_cdc_subscribe.create_subscription(change_set_name   => 'cdc_t1',
                                             description       => 'change data for scott.t1',
                                             subscription_name => 'sub_t1');
    end;
    /

    13、订阅源表及相关字段
    conn cdc_subr1/cdc_subr1
    begin
      dbms_cdc_subscribe.subscribe(subscription_name => 'sub_t1',
                                   source_schema     => 'scott',
                                   source_table      => 't1',
                                   column_list       => 'a, b',
                                   subscriber_view   => 'v_t1');
    end;
    /

    14、激活订阅
    conn cdc_subr1/cdc_subr1
    begin
      dbms_cdc_subscribe.activate_subscription(subscription_name => 'sub_t1');
    end;
    /

    15、扩展订阅窗口,设置订阅窗口的高位边界,以便能看到数据的变更
    conn cdc_subr1/cdc_subr1
    begin
      dbms_cdc_subscribe.extend_window(subscription_name => 'sub_t1');
    end;
    /

    dbms_cdc_subscribe过程的详细解释可参考官方资料:
    https://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_cdcsub.htm#CHEFHFJA

    三、查看订阅内容

    conn cdc_subr1/cdc_subr1
    select * from v_t1;

    因源表scott.t1尚无数据变更,因此该视图无数据。

    源表插入数据
    conn scott/tiger
    insert into t1 values(101, 'liuln');
    commit;

    刷新订阅数据,注意每次查阅前需要这个刷新动作
    conn cdc_subr1/cdc_subr1
    begin
      dbms_cdc_subscribe.extend_window(subscription_name => 'sub_t1');
    end;
    /

    查看订阅视图
    col commit_timestamp$ for a20
    col timestamp$ for a20
    col row_id$ for a20
    col username$ for a10
    select operation$, to_date(commit_timestamp$, 'yyyy-mm-dd hh24:mi:ss') commit_timestamp$, to_date(timestamp$, 'yyyy-mm-dd hh24:mi:ss') timestamp$, row_id$, rsid$, username$, a, b from v_t1;

    OPERATION$ COMMIT_TIMESTAMP$    TIMESTAMP$           ROW_ID$                   RSID$ USERNAME$           A B
    ---------- -------------------- -------------------- -------------------- ---------- ---------- ---------- --------------------
    I          2018-09-17 17:07:47  2018-09-17 17:07:44  AAAWxgAAEAAAAWGAAA            1 SCOTT             101 liuln

    再插入一条数据
    conn scott/tiger
    insert into t1 values(102, 'yaowei');
    commit;

    观察结果,变更数据是累积的
    OP COMMIT_TIMESTAMP$    TIMESTAMP$           ROW_ID$                   RSID$ USERNAME$           A B
    -- -------------------- -------------------- -------------------- ---------- ---------- ---------- --------------------
    I  2018-09-17 17:07:47  2018-09-17 17:07:44  AAAWxgAAEAAAAWGAAA            1 SCOTT             101 liuln
    I  2018-09-17 17:37:18  2018-09-17 17:37:15  AAAWxgAAEAAAAWGAAB            2 SCOTT             102 yaowei

    更新数据
    conn scott/tiger
    update t1 set b = 'liuqy' where a = '102';
    commit;

    观察结果,分行显示了更新前后的旧值和新值
    OP COMMIT_TIMESTAMP$    TIMESTAMP$           ROW_ID$                   RSID$ USERNAME$           A B
    -- -------------------- -------------------- -------------------- ---------- ---------- ---------- --------------------
    I  2018-09-17 17:07:47  2018-09-17 17:07:44  AAAWxgAAEAAAAWGAAA            1 SCOTT             101 liuln
    I  2018-09-17 17:37:18  2018-09-17 17:37:15  AAAWxgAAEAAAAWGAAB            2 SCOTT             102 yaowei
    UO 2018-09-17 17:46:01  2018-09-17 17:46:01  AAAWxgAAEAAAAWGAAB            3 SCOTT             102 yaowei
    UN 2018-09-17 17:46:01  2018-09-17 17:46:01  AAAWxgAAEAAAAWGAAB            3 SCOTT             102 liuqy

    删除数据
    conn scott/tiger
    delete from t1 where a = '101';
    commit;

    观察结果
    OP COMMIT_TIMESTAMP$    TIMESTAMP$           ROW_ID$                   RSID$ USERNAME$           A B
    -- -------------------- -------------------- -------------------- ---------- ---------- ---------- --------------------
    I  2018-09-17 17:07:47  2018-09-17 17:07:44  AAAWxgAAEAAAAWGAAA            1 SCOTT             101 liuln
    I  2018-09-17 17:37:18  2018-09-17 17:37:15  AAAWxgAAEAAAAWGAAB            2 SCOTT             102 yaowei
    UO 2018-09-17 17:46:01  2018-09-17 17:46:01  AAAWxgAAEAAAAWGAAB            3 SCOTT             102 yaowei
    UN 2018-09-17 17:46:01  2018-09-17 17:46:01  AAAWxgAAEAAAAWGAAB            3 SCOTT             102 liuqy
    D  2018-09-17 17:52:03  2018-09-17 17:52:03  AAAWxgAAEAAAAWGAAA            4 SCOTT             101 liuln

    操作中发现,刷新订阅数据的动作每次需要执行两遍才能获取到变更数据。

    四、订阅数据清理

    变更数据提取后如不再需要,可以清除,以腾出空间。
    begin
      dbms_cdc_subscribe.purge_window(subscription_name => 'sub_t1');
    end;
    /

    五、取消订阅

    如果订阅不再需要,可以删除。
    begin
      dbms_cdc_subscribe.drop_subscription(subscription_name => 'sub_t1');
    end;
    /


    来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/28974745/viewspace-2214346/,如需转载,请注明出处,否则将追究法律责任。

    转载于:http://blog.itpub.net/28974745/viewspace-2214346/

    展开全文
  • 各位高手: 在不能写数据库触发器,数据库没有时间戳字段的情况下,Oracle数据库如何查询指定表最近一天或者一个小时的变更记录? 包括新增、修改、删除的数据。
  • Java实时获取oracle变更

    千次阅读 2014-03-27 22:32:27
    在一个基于数据库的“实时系统”里面,“实时”获取数据库变化是非常重要的,本文主要描述通过Oracle中的捕获进程实时获取数据库变化。  背景:   要做一个车辆GPS监控系统,主要分两块:   1.采集。...
    
    在一个基于数据库的“实时系统”里面,“实时”获取数据库变化是非常重要的,本文主要描述通过Oracle中的捕获进程实时获取数据库变化。 
    

    背景:  

           要做一个车辆GPS监控系统,主要分两块: 

        1.采集。由GPS厂商提供实时数据,通过UDP包接收 
        2.展示。前端程序获取到最新GPS数据后,在地图上模拟车辆的运行情况 
           

    备选方案:  

         1.采集程序接收到UDP包并解析后,将数据放入数据库;前端程序轮询数据库以获取最新数据。 
         2.采集程序接收到UDP包并解析后,将数据放入数据库,同时向前端程序发送一条消息,传递最新数据。 

    方案评估:  



        方案1:最简单,最传统;增加不必要的数据库查询,并且非实时,轮询时间间隔不好确定。 

        方案2:可实现“实时”,但增加采集程序职责,采集程序本不知道前端系统的存在。 



    最终方案:  



        最后采取了另一种方案:通过oracle捕获进程捕获数据库变更(采集程序insert或update一条记录时,捕获进程即时获取到该条记录),将变更记录发送到AQ(oracle高级队列,JMS的oracle实现),前端程序只关注AQ,当有新消息到来时,即刻可收到并做相应处理,反映出实时状态。 

        关于捕获进程,请参考 《Streams概述》 《Streams捕获进程》  



    实现:
     



       

    SQL代码  


         创建表空间和用户:  

        

    Sql代码   收藏代码
    1. Create tablespace streams_tbs datafile 'E:\DBSERVER\ORACLE9I\ORADATA\TESTDB\stream_tbs.dbf' size 25M Reuse autoextend on maxsize unlimited;  
    2.   
    3. --修改目标表(要捕获变更的表)追加日志  
    4. ALTER TABLE myoracle.TEST_GPS_STATUS ADD SUPPLEMENTAL LOG GROUP log_group_gpsstatus_pk (DEVICEID) ALWAYS;  
    5.   
    6.   
    7. create user strmadmin identified by strmadmin default tablespace streams_tbs quota unlimited on streams_tbs;  
    8.   
    9.   
    10. grant connect, resource, select_catalog_role to strmadmin;  




    授予相应权限  

    Sql代码   收藏代码
    1. grant execute on dbms_aqadm to strmadmin;  
    2.   
    3. grant execute on dbms_capture_adm to strmadmin;  
    4.   
    5. grant execute on dbms_propagation_adm to strmadmin;  
    6.   
    7. grant execute on dbms_streams_adm to strmadmin;  
    8.   
    9. grant execute on dbms_apply_adm to strmadmin;  
    10.   
    11. grant execute on dbms_flashback to strmadmin;  
    12.   
    13. grant execute on dbms_aq to strmadmin;  
    14.   
    15. grant execute on dbms_aqjms to strmadmin;  
    16.   
    17. grant execute on dbms_aqin to strmadmin;  
    18.   
    19. grant execute on dbms_aqjms_internal to strmadmin;  
    20.    



    执行系统存储过程分配权限  


        
    Sql代码   收藏代码
    1. BEGIN  
    2. DBMS_RULE_ADM.GRANT_SYSTEM_PRIVILEGE(  
    3. privilege => DBMS_RULE_ADM.CREATE_RULE_SET_OBJ,  
    4. grantee => 'strmadmin',  
    5. grant_option => FALSE);  
    6. END;  
    7. /  
    8.   
    9.   
    10.   
    11. BEGIN  
    12. DBMS_RULE_ADM.GRANT_SYSTEM_PRIVILEGE(  
    13. privilege => DBMS_RULE_ADM.CREATE_RULE_OBJ,  
    14. grantee => 'strmadmin',  
    15. grant_option => FALSE);  
    16. END;  
    17. /  
    18.    





    以strmadmin帐户登录oracle  




    创建AQ,类型为JMS消息  



    Sql代码   收藏代码
    1. BEGIN  
    2.    DBMS_AQADM.CREATE_QUEUE_TABLE(  
    3.         Queue_table            => 'gpsstatus_queue_table',  
    4.         Queue_payload_type     => 'SYS.AQ$_JMS_MESSAGE',  
    5.         multiple_consumers  => false,  
    6.         compatible             => '8.1.5');  
    7.    DBMS_AQADM.CREATE_QUEUE(  
    8.       Queue_name          => 'gpsstatus_queue',  
    9.       Queue_table         => 'gpsstatus_queue_table');  
    10.    DBMS_AQADM.START_QUEUE(  
    11.       queue_name         => 'gpsstatus_queue');  
    12. END;  
    13. /  
    14. BEGIN  
    15. DBMS_STREAMS_ADM.SET_UP_QUEUE(  
    16.     queue_table  => 'gps_temp_queue_table',  
    17.     queue_name   => 'gps_temp_queue');  
    18. END;  
    19. /  




    为目标表创建捕获进程  



    Sql代码   收藏代码
    1. BEGIN  
    2. DBMS_STREAMS_ADM.ADD_TABLE_RULES(  
    3. table_name => 'myoracle.TEST_GPS_STATUS',  
    4. streams_type => 'capture',  
    5. streams_name => 'capture_gps',  
    6. queue_name => 'gps_temp_queue',  
    7. include_dml => true,  
    8. include_ddl => false);  
    9. END;  
    10. /  




    初始化scn  


    Sql代码   收藏代码
    1. DECLARE  
    2. iscn NUMBER; -- Variable to hold instantiation SCN value  
    3. BEGIN  
    4. iscn := DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER();  
    5. DBMS_APPLY_ADM.SET_TABLE_INSTANTIATION_SCN(  
    6. source_object_name => 'myoracle.TEST_GPS_STATUS',  
    7. source_database_name => 'TESTdb',  
    8. instantiation_scn => iscn);  
    9. END;  
    10. /  
    11.    



    为消息队列创建代理  



    Sql代码   收藏代码
    1. BEGIN  
    2. DBMS_AQADM.CREATE_AQ_AGENT(  
    3. agent_name => 'gpsstatus_agent');  
    4. DBMS_AQADM.ENABLE_DB_ACCESS(  
    5. agent_name => 'gpsstatus_agent',  
    6. db_username => 'strmadmin');  
    7. END;  
    8. /  
    9. DECLARE  
    10. subscriber SYS.AQ$_AGENT;  
    11. BEGIN  
    12. subscriber := SYS.AQ$_AGENT('gpsstatus_agent'NULLNULL);  
    13. SYS.DBMS_AQADM.ADD_SUBSCRIBER(  
    14. queue_name => 'strmadmin.gpsstatus_queue',  
    15. subscriber => subscriber,  
    16. rule => NULL,  
    17. transformation => NULL);  
    18. END;  
    19. /  




    创建存储过程以决定将哪些信息放到消息队列里面
     




    Sql代码   收藏代码
    1. CREATE OR REPLACE PROCEDURE enq_gps_lcr(in_any IN SYS.ANYDATA) IS  
    2. --agent sys.aq$_agent := sys.aq$_agent('gpsstatus_agent', null, 0);  
    3. message sys.aq$_jms_message;  
    4. enqueue_options dbms_aq.enqueue_options_t;  
    5. message_properties dbms_aq.message_properties_t;  
    6. msgid raw(16);  
    7. lcr SYS.LCR$_ROW_RECORD;  
    8. rc PLS_INTEGER;  
    9. DEVICEID varchar2(11);  
    10. GATHERDATETIME date;  
    11. LONGITUDETYPE char(1);  
    12. LONGITUDEVALUE number ;  
    13. LATITUDETYPE char(1);  
    14. LATITUDEVALUE number ;  
    15. SPEED number ;  
    16. DIRECTION number ;  
    17. BEGIN  
    18. rc := in_any.GETOBJECT(lcr);  
    19. DEVICEID:=lcr.get_value('new','DEVICEID').ACCESSvarchar2();  
    20. GATHERDATETIME := lcr.GET_VALUE('new','GATHERDATETIME').ACCESSdate();  
    21. LONGITUDETYPE := lcr.GET_VALUE('new','LONGITUDETYPE').ACCESSchar();  
    22. LONGITUDEVALUE := lcr.GET_VALUE('new','LONGITUDEVALUE').ACCESSnumber();  
    23. LATITUDETYPE := lcr.GET_VALUE('new','LATITUDETYPE').ACCESSchar();  
    24. LATITUDEVALUE := lcr.GET_VALUE('new','LATITUDEVALUE').ACCESSnumber();  
    25. SPEED := lcr.GET_VALUE('new','SPEED').ACCESSnumber();  
    26. DIRECTION := lcr.GET_VALUE('new','DIRECTION').ACCESSnumber();  
    27. message := sys.aq$_jms_message.construct(1);  
    28. --message.set_replyto(agent);  
    29. message.set_type('');  
    30. message.set_userid('strmadmin');  
    31. message.set_appid('');  
    32. message.set_groupid('');  
    33. message.set_groupseq('');  
    34. message.set_string_property('DEVICEID', DEVICEID);  
    35. message.set_string_property('GATHERDATETIME', to_char(GATHERDATETIME,'yyyy-MM-dd hh24:mi:ss'));  
    36. message.set_string_property('LONGITUDETYPE', LONGITUDETYPE);  
    37. message.set_string_property('LONGITUDEVALUE', to_char(LONGITUDEVALUE) );  
    38. message.set_string_property('LATITUDETYPE', LATITUDETYPE);  
    39. message.set_string_property('LATITUDEVALUE', to_char(LATITUDEVALUE));  
    40. message.set_string_property('SPEED', to_char(SPEED) );  
    41. message.set_string_property('DIRECTION', to_char(DIRECTION) );  
    42. --指定消息生存时间  
    43. message_properties.expiration:=60;  
    44. dbms_aq.enqueue(queue_name => 'strmadmin.gpsstatus_queue',  
    45. enqueue_options => enqueue_options,  
    46. message_properties => message_properties,  
    47. payload => message,  
    48. msgid => msgid);  
    49. COMMIT;  
    50. END;  
    51. /  




    为目标表配置处理器  



    Sql代码   收藏代码
    1. BEGIN  
    2. DBMS_APPLY_ADM.SET_DML_HANDLER(  
    3. object_name => 'myoracle.TEST_GPS_STATUS',  
    4. object_type => 'TABLE',  
    5. operation_name => 'UPDATE',  --可配置为insert,update,delete等  
    6. error_handler => false,  
    7. user_procedure => 'strmadmin.enq_gps_lcr',  
    8. apply_database_link => NULL);  
    9. END;  
    10. /  




    设定参数及启动捕获进程  





    Sql代码   收藏代码
    1. BEGIN  
    2. DBMS_STREAMS_ADM.ADD_TABLE_RULES(  
    3. table_name => 'myoracle.TEST_GPS_STATUS',  
    4. streams_type => 'apply',  
    5. streams_name => 'apply_gps',  
    6. queue_name => 'strmadmin.gps_temp_queue',  
    7. include_dml => true,  
    8. include_ddl => false,  
    9. source_database => 'TESTdb');  
    10. END;  
    11. /  
    12. BEGIN  
    13. DBMS_APPLY_ADM.SET_PARAMETER(  
    14. apply_name => 'apply_gps',  
    15. parameter => 'disable_on_error',  
    16. value => 'n');  
    17. END;  
    18. /  
    19. BEGIN  
    20. DBMS_APPLY_ADM.START_APPLY(  
    21. apply_name => 'apply_gps');  
    22. END;  
    23. /  
    24. BEGIN  
    25. DBMS_CAPTURE_ADM.START_CAPTURE(  
    26. capture_name => 'capture_gps');  
    27. END;  
    28. /  




    至此,捕获进程配置完毕 

    可update一条myoracle.TEST_GPS_STATUS 中的记录,再查询gpsstatus_queue_table中是否有对应的一条记录。如果有,则配置成功。 





    下面是java处理代码,可直接使用JMS接口 

    本例使用oracle提供的API 





    Java代码   收藏代码
    1. QueueConnectionFactory queueConnectionFactory = null;  
    2. QueueConnection queueConnection = null;  
    3. QueueSession queueSession = null;  
    4.   
    5. Queue queue = null;  
    6. QueueReceiver subscriber = null;  
    7. Message message = null;  










    Java代码   收藏代码
    1. log.info("开始连接 ");  
    2. queueConnectionFactory = AQjmsFactory.getQueueConnectionFactory(ip,sid, port, "thin");  
    3. queueConnection = queueConnectionFactory.createQueueConnection(userName, password);  
    4. log.info("创建Queue Connection 成功");  
    5. queueConnection.start();  
    6. log.info("connection started");  
    7. queueSession = queueConnection.createQueueSession(false,  
    8. Session.AUTO_ACKNOWLEDGE);  
    9. .info("Queue session created");  
    10. queue = ((AQjmsSession) queueSession).getQueue(userName, queueName);  
    11. log.info("Queue getted");  
    12. subscriber = queueSession.createReceiver(queue);  
    13. log.info("初始化完成");  




    开始取消息,本例采取while(true)的方式获取消息。当没有消息的时候,线程会一直阻塞,直到有新的消息到来,立即取出。 





        

    Java代码   收藏代码
    1. while (true) {  
    2.          message = subscriber.receive();//receive方法使没有新消息时,线程挂起  
    3.       //do something...  
    4. }  
    5.    







    最后: 



          本文只是试图探求一种比较好的获取实时数据方法,并不适用于所有场合,但在处理实时告警,订单等方面,应该是有一定的用武之地,若结合comet等技术,完全可以实现真正的实时。 
    展开全文
  • 因一条数据异常且不可重现,急求一方法可以查到该记录的所有修改操作。 oracle 开启了审计,但是不会查询,tomcat日志也没有翻到,或者还有什么其他的方法都可以
  • oracle实验记录 (flashback)

    千次阅读 2010-03-25 16:57:00
    简单的flashback记录flashback query~~~~~~~~~`查询遇到指定SCN以来发生变化的block 后进出rollback segment抽取所用undo数据回滚变化利用undoSQL> show parameter undoNAME TYPE VALUE------------------
  •  ORA_ROWSCN伪列是Oracle 10g开始引入的,可以查询表中记录最后变更的SCN。然后通过SCN_TO_TIMESTAMP函数可以将SCN转换为时间戳,从而找到最后DML操作时SCN的对应时间。但是,默认情况下,每行记录的ORA_ROWSCN是...
  • 查询该表近段时间修改的记录: SELECT 被修改表字段,VERSIONS_STARTTIME,VERSIONS_ENDTIME,VERSIONS_OPERATION FROM 表 VERSIONS BETWEEN TIMESTAMP MINVALUE AND MAXVALUE WHERE VERSIONS_STARTTIME IS NOT NULL ...
  • 现有的数据库中有新insert进来的数据,还会有对于已有的数据进行变更的操作。那么这些新增以及变化都要反应到BI系统中。 可以现有的生产数据库的table中没有可以识别变更的时间戳字段。如果对已有的表增加一个...
  • oracle sql方面 (2013-04-28 14:58:21) 转载▼ 标签: sql oracle it 分类:oracle技能 SQL方面: 对字符串的“sum”——在Oracle中自定义聚集函数的例子:如果利用Oracle的自定义功能实现用户自定义的...
  • Oracle12C #3 查看数据修改历史记录

    千次阅读 2020-08-17 11:54:52
    1、查询表指定时间之前的数据记录 SELECT * from [表名] AS OF TIMESTAMP TO_TIMESTAMP('2020-8-6 17:00:00','yyyy-mm-dd hh24:mi:ss'); eg: SELECT * from NEQ_LOT AS OF TIMESTAMP TO_TIMESTAMP('2020-8-6 17:00...
  • 最近接到组里的小朋友问我说,开发给他提的一个问题,...通过Oracle慢sql查询定位到2点左右的慢sql,由于我们系统我设定的snap_id是每小时刷一次,所以昨晚两点的snapid就能获取到,通过snap_id找到2-3点左右的慢sql.
  • ORACLE查询最近修改的记录

    万次阅读 2017-12-28 15:20:37
    SELECT orgId,orgNAME,VERSIONS_STARTTIME,VERSIONS_ENDTIME,VERSIONS_OPERATION  FROM t_sys_org VERSIONS BETWEEN TIMESTAMP MINVALUE AND MAXVALUE WHERE  VERSIONS_STARTTIME IS NOT NULL ORDER BY VERSIONS...
  • ORACLE时间最近的一条数据

    万次阅读 2018-08-07 17:45:29
    在数据变更记录表取所有数据的最新一条记录,resid为数据的id,applyid为数据每次变更的单号,A为数据变更记录表 示例代码如下: select lo2.applyid from A lo2 where not exists (select 1 from A lo where lo....
  • 利用闪回查看oracle记录的历史记录, 通过历史时间:     SELECT * FROM TABLE_NAME AS OF TIMESTAMP SYSDATE - 1 WHERE COL_A = '##';  
  • 但是根据自己查询及向同事确认,在不考虑审计功能的情况下最多就能查询到修改的时间及密码文件的加密串。 --语句1 SELECT name, password_date, password FROM sys.user$, sys.user_history$ WHERE user$.us
  • ORACLE查询表修改时间

    千次阅读 2016-10-11 09:20:10
    1、select uat.table_name from user_...2、select object_name, created,last_ddl_time from user_objects 该SQL可以获得所有用户对象(包括表)的创建和最后修改时间   select uat.table_name as 表名,(selec...
  • ORACLE

    2007-12-21 22:20:00
    § 术语 数据库块(BLOCK) ORACLE 数据库中的最小存储和处理单位,包含块本身的头信息数据或PL/SQL代码。 ORACLE 块的大小是可以在安装时选择“自定义安装”来指定,也可以在CREATE DATABASE创建数据库实例时指定。...
  • Oracle基础之Oracle的体系结构

    千次阅读 2015-10-31 16:43:06
    一、Oracle体系结构概述:  Oracle的体系结构是指数据库的组成、工作过程与原理,以及数据在数据库中的组织与管理机制。要了解Oracle数据库的体系结构,必须理解Oracle系统的重要概念和主要组件。  Oracle系统...
  • 生产环境Oracle RAC扩表空间全记录

    千次阅读 2018-05-22 09:40:33
    最近zabbix告警rac库表空间使用率超过75%需要扩容,本文记录变更操作。1.表空间查看setpages999 setlinesize999 SELECTa.tablespace_name"表空间名称", 100-ROUND((NVL(b.bytes_free,0)/a.bytes_alloc)*100,2)...
  • errors -- 允许的错误记录数,可以用他来控制一条记录都不能错 rows -- 多少条记录提交一次,默认为 64 skip -- 跳过的行数,比如导出的数据文件前面几行是表头或其他描述,skip=1 :表示插入数据时,跳过第一...
  • ORACLE 查看用户密码修改时间

    千次阅读 2014-09-25 21:41:41
    ORACLE 查看用户密码修改时间  1。当前数据库版本为  Java代码  SQL> select * from v$version;    BANNER  ----------------------------------------------------------------  Oracle Database ...
  • 如图: 3:查询每个用户的最后一次修改的记录 语句: SELECT ID,USER_NAME,UPDATE_DATE FROM ( SELECT ID,USER_NAME,UPDATE_DATE, RANK() OVER (PARTITION BY USER_NAME ORDER BY UPDATE_DATE DESC) RANK_NO FROM ...
  • Oracle 作业

    千次阅读 2017-04-21 14:12:16
    Oracle 服务端 定时任务
  • ORACLE查询表最近更改的数据记录

    万次阅读 2012-11-07 05:45:22
    原始数据记录 修改后的数据记录 在这里我们可以看到city字段里分别添加QQQ属性 我们可以通过语句查询该表的修改记录 SELECT OBJECTID,NO_,CITY,VERSIONS_STARTTIME,VERSIONS_ENDTIME,VERSIONS_OPERATION ...
  • thinkphp oracle 时间字段模板显示

    千次阅读 2012-11-16 11:06:27
    java使用时自动记录时间 微秒 会产生 05-NOV-12 01.55.42.000000 PM php 未找到 去除毫秒级函数。 使用str_replace 去除.000000 然后输出。 thinkphp 标签方法 {$list["PPEDT_T_MGCYGL_DATE"]|str_replace=...
  • oracle查询表最后的操作时间

    千次阅读 2019-09-23 05:21:24
    select object_name,created "创建时间",last_ddl_time "最后修改时间"from user_objects where object_name = '你的表名' 或者 select LAST_DDL_TIME from user_objects where object_type='TABLE' and object_...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 20,722
精华内容 8,288
关键字:

oracle记录变更时间