zoukankan      html  css  js  c++  java
  • oracle-闪回技术2

    闪回版本查询,用到了附加日志

    闪回事务查询

    http://blog.csdn.net/laoshangxyc/article/details/12405459  这个博客的备份与恢复可以参考

    ###################################

    http://blog.itpub.net/18922393/viewspace-697625/

    附加日志(supplemental log)可以指示数据库在日志中添加额外信息到日志流中,
    以支持基于日志的工具,如逻辑standby、streams、GoldenGate、LogMiner。
    可以在数据库和表上设置。

    #################################

    1.数据库级设置,分两类:
    1.1最小附加日志(minimal supplemental logging):
    DATA选项启用最小附加日志。启用最小日志可以确保LogMiner
    (或其他任何基于LogMiner的产品)可以支持行链接、簇表、索引组织表等。
    语法如下:
    alter database {add|drop} supplemental log data;

    1.2标识键日志(identification key logging):
    DATA(all,primary key,unique,foreign key) columns选项启用最小日志及列数据日志。
    在源库日志为变化来源同步其他数据库的情况下,比如逻辑备用数据库,
    受影响的数据行必须以列数据标识(而不是rowid),必须启用此种附加日志。
    语法如下:
    alter database {add|drop} supplemental log {data(all,primary key,unique,foreign key) columns};

    1.3缺省情况下,Oracle不启用以上任何附加日志。当使用ALL,PRIMARY,UNIQUE或FOREIGN附加日志时最小补全日志默认开启(即检查结果为IMPLICIT)。
    在删除所有导致IMPLICIT最小化附加日志的附加日志后,最小化附加日志变为NO。

    ###############################

    2,表级附加日志设置,分两类
    2.1,可以通过以下语句设置命名日志组:

    语法:
    alter table table_name
    add supplemental log group group_a(column_a [no log],column_b,...) [always];

    NO LOG选项用于指定在日志中排除哪些列。在命名日志组中,至少存在一个无”NO LOG“的定长列。
    比如,对LONG列使用 no log选项,可以在更改LONG列时,记录其他列的内容(LONG列本身不能存在日志里)。

    ALWAYS选项, 在更新时,日志组中的所有列都会记录在日志中。这就是所谓的”无条件“日志组,有时也叫”always log group“。
    如果不指定该选项,只有在日志组中的任何列被修改时,所有列才会出现在日志中。
    这就是所谓的”有条件“日志组。

    说明:同一列可以在多个日志组中存在,但日志中只记录一次;
    同一列在“无条件”与“有条件”日志组中存在时,该列将“无条件”记录。

    2.2,可以通过以下语句设置所有列或主键/外键/唯一键组合日志组:

    语法:
    alter table table_name
    add supplemental log data(all,primary key,unique,foreign key) columns;

    Oracle将生成无条件或有条件日志组。对于无条件日志组,日志中将记录该日志组中的所有列;
    对于有条件日志组,只有日志组中的列有变化时,才会记录日志组中的所有列。

    如果指定“ALL”列,日志中将包含所有最大大小固定长度的列。这种日志是系统创建的无条件日志组。
    如果指定“PRIMARY KEY”列,只要有更新,组成主键的所有列都会记录在日志中。这种日志是系统创建的无条件日志组。Oracle使用如下顺序确定附加记录哪些列:
    *组成主键的列(主键有效,或rely且非DISABLED or INITIALLY DEFERRED状态)
    *最小的、至少有一个非空列的唯一索引
    *记录所有标量列
    如果指定“UNIQUE”列,如果任何组成唯一键或位图索引的列被修改,组成该唯一键或位图索引的其他列都会记录在日志中。这种日志是系统创建的有条件日志组。
    如果指定“FOREIGN KEY”列,如果任何组成外键的列被修改,组成该外键的其他列都会记录在日志中。这种日志是系统创建的有条件日志组。


    2.3表级测试
    drop table test;
    create table test(x int,y int);

    --增加附加日志
    alter table test
    add supplemental log data(all,primary key,unique,foreign key) columns;

    select * from dba_log_groups;
    OWNER LOG_GROUP_NAME TABLE_NAME LOG_GROUP_TYPE ALWAYS GENERATED
    SYS SYS_C0037555 TEST ALL COLUMN LOGGING ALWAYS GENERATED NAME
    SYS SYS_C0037556 TEST PRIMARY KEY LOGGING ALWAYS GENERATED NAME
    SYS SYS_C0037557 TEST UNIQUE KEY LOGGING CONDITIONAL GENERATED NAME
    SYS SYS_C0037558 TEST FOREIGN KEY LOGGING CONDITIONAL GENERATED NAME

    select * from dba_log_group_columns;
    no row selected

    --删除附加日志
    alter table test
    drop supplemental log data(all,primary key,unique,foreign key) columns;

    select * from dba_log_groups;
    no row selected

    select * from dba_log_group_columns;
    no row selected

    --增加命名附加日志
    alter table test
    add supplemental log group group_a(x,y);

    select * from dba_log_groups;
    OWNER LOG_GROUP_NAME TABLE_NAME LOG_GROUP_TYPE ALWAYS GENERATED
    SYS GROUP_A TEST USER LOG GROUP CONDITIONAL USER NAME

    select * from dba_log_group_columns;
    OWNER LOG_GROUP_NAME TABLE_NAME COLUMN_NAME POSITION LOGGING_PROPERTY
    SYS GROUP_A TEST X 1 LOG
    SYS GROUP_A TEST Y 2 LOG

    --删除命名附加日志
    alter table test
    drop supplemental log group group_a;

    ###############################

    语句汇总

    alter database add supplemental log data;
    alter database add supplemental log data (all) columns;
    alter database add supplemental log data (primary key) columns;
    alter database add supplemental log data (foreign key) columns;
    alter database add supplemental log data (unique) columns;
    alter database add supplemental log data for procedural replication;

    丢弃时有先后顺序的,最后才能丢弃log data,其它没有次序。
    alter database drop supplemental log data (all) columns;
    alter database drop supplemental log data (primary key) columns;
    alter database drop supplemental log data (foreign key) columns;
    alter database drop supplemental log data (unique) columns;
    alter database drop supplemental log data for procedural replication;
    alter database drop supplemental log data;

    查询开关是否打开
    select Supplemental_Log_Data_Min min1,Supplemental_Log_Data_All all1,
    Supplemental_Log_Data_Pk pk,Supplemental_Log_Data_Fk fk,
    Supplemental_Log_Data_Ui ui,Supplemental_Log_Data_Pl pl
    from v$database;

    ###################################

    日志输出

    tail -f /u01/app/oracle/diag/rdbms/kyc/kyc/trace/alert_kk.log

    Fri Apr 28 18:05:54 2017
    alter database add supplemental log data
    SUPLOG: Previous supplemental logging attributes at scn = 996039
    SUPLOG:  minimal = OFF, primary key = OFF
    SUPLOG:  unique = OFF, foreign key = OFF, all column = OFF
    SUPLOG:  procedural replication = OFF
    SUPLOG: New supplemental logging attributes at scn = 996039
    SUPLOG:  minimal = ON, primary key = OFF
    SUPLOG:  unique = OFF, foreign key = OFF, all column = OFF
    SUPLOG:  procedural replication = OFF
    Completed: alter database add supplemental log data
    alter database add supplemental log data (primary key) columns
    SUPLOG: Previous supplemental logging attributes at scn = 996049
    SUPLOG:  minimal = ON, primary key = OFF
    SUPLOG:  unique = OFF, foreign key = OFF, all column = OFF
    SUPLOG:  procedural replication = OFF
    SUPLOG: New supplemental logging attributes at scn = 996049
    SUPLOG:  minimal = ON, primary key = ON
    SUPLOG:  unique = OFF, foreign key = OFF, all column = OFF
    SUPLOG:  procedural replication = OFF
    Completed: alter database add supplemental log data (primary key) columns

    ######################################

    Fri Apr 28 15:13:50 2017
    ALTER DATABASE   MOUNT
    Successful mount of redo thread 1, with mount id 119196142
    Database mounted in Exclusive Mode
    Lost write protection disabled
    Completed: ALTER DATABASE   MOUNT
    Fri Apr 28 15:14:09 2017
    alter database archivelog
    Completed: alter database archivelog
    Fri Apr 28 15:16:59 2017
    alter database flashback on
    Starting background process RVWR
    Fri Apr 28 15:16:59 2017
    RVWR started with pid=22, OS id=3403
    Allocated 8388608 bytes in shared pool for flashback generation buffer
    Flashback Database Enabled at SCN 991029
    Completed: alter database flashback on

    #################################

    http://blog.csdn.net/laoshangxyc/article/details/12405459

    Flashback Version Query 闪回版本查询
    使用Flashback Version Query 返回在指定时间间隔或SCN间隔内的所有版本,一次commit命令就会创建一个版本。
    语法如下:
    SELECT .....FROM tablename VERSIONS {BETWEEN {SCN | TIMESTAMP} start AND end}
    --start,end可以是时间也可以是scn


    --可以看出,一次commit是一个版本,当前版本的versions_endscn和versions_endtime值为空,旧版本则有值。
    Flashback Transaction Query闪回事务查询
    Flashback Transaction Query实际上是查询的数据字典flashback_transaction_query。可以根据flashback_transaction_query 的undo_sql列值返回数据以前版本。


    --使用闪回事务查询前,必须启用重做日志流的其他日志记录,重做日志流与Log Miner使用的数据相同,只是接口不同。

    select Supplemental_Log_Data_Min min1,Supplemental_Log_Data_All all1,
    Supplemental_Log_Data_Pk pk,Supplemental_Log_Data_Fk fk,
    Supplemental_Log_Data_Ui ui,Supplemental_Log_Data_Pl pl
    from v$database;

    --开启日志
    alter database add supplemental log data;
    alter database add supplemental log data (primary key) columns;

    --更改值
    select * from e1;
    update e1 set name='uuu' where name='ni';
    commit;
    update e1 set name='ooo' where name='uuu';
    commit;

    --查询事务id,下面全是版本查询伪列

    Flashback Version Query伪列说明
    versions_start{scn|time}  版本开始的scn或时间戳
    versions_end{scn|time}  版本结束scn或时间戳,如果有值表明此行后面被更改过是旧版本,如果为null,则说明行版本是当前版本或行被删除(即versions_operation值为D)。
    versions_xid 创建行版本的事务ID
    versions_operation  在行上执行的操作(I=插入,D=删除,U=更新)


    select versions_startscn,versions_starttime,
    versions_endscn,versions_endtime,
    versions_xid,versions_operation
    from e1 versions between timestamp
    to_timestamp('2017-04-28 18:09:58','YYYY-MM-DD HH24:MI:SS')
    and
    to_timestamp('2017-04-28 18:14:58','YYYY-MM-DD HH24:MI:SS');


    --模糊查询
    select * from flashback_transaction_query
    where logon_user!='SYS' and table_name not like '%$';
    --查询undo sql
    select start_scn,commit_scn,logon_user,operation,table_name,undo_sql
    from flashback_transaction_query
    where xid=hextoraw('09000F0098030000');
    --返回上一个版本

    ################################

    案例

    先查询状态,并配置一些功能

    select Supplemental_Log_Data_Min min1,Supplemental_Log_Data_All all1,
    Supplemental_Log_Data_Pk pk,Supplemental_Log_Data_Fk fk,
    Supplemental_Log_Data_Ui ui,Supplemental_Log_Data_Pl pl
    from v$database;

    alter database add supplemental log data;
    alter database add supplemental log data (primary key) columns;


    select name,value/60/60 minutes_retained
    from v$parameter
    where name='undo_retention';
    alter system set undo_retention=86400;

    再做更新


    select * from e1;
    update e1 set name='iii';

    select versions_startscn,versions_starttime,
    versions_endscn,versions_endtime,
    versions_xid,versions_operation
    from e1 versions between timestamp
    to_timestamp('2017-04-28 18:59:58','YYYY-MM-DD HH24:MI:SS')
    and
    to_timestamp('2017-04-28 19:23:58','YYYY-MM-DD HH24:MI:SS');

    04000700C4020000


    select start_scn,commit_scn,logon_user,operation,table_name,undo_sql
    from flashback_transaction_query
    where xid=hextoraw('04000700C4020000');


    update "TEST"."E1" set "NAME" = 'aaa' where ROWID = 'AAARPdAAFAAAAJLAAM';
    update "TEST"."E1" set "NAME" = 'ccc' where ROWID = 'AAARPdAAFAAAAJLAAL';
    update "TEST"."E1" set "NAME" = 'ccc' where ROWID = 'AAARPdAAFAAAAJLAAK';
    update "TEST"."E1" set "NAME" = 'ooo' where ROWID = 'AAARPdAAFAAAAJLAAJ';
    update "TEST"."E1" set "NAME" = 'ooo' where ROWID = 'AAARPdAAFAAAAJLAAI';
    update "TEST"."E1" set "NAME" = 'ooo' where ROWID = 'AAARPdAAFAAAAJLAAH';
    update "TEST"."E1" set "NAME" = 'qqq' where ROWID = 'AAARPdAAFAAAAJLAAG';

    #################################

  • 相关阅读:
    COCOS2D-X中UI动画导致闪退与UI动画浅析
    使用cocos2d-x3.4结合cocos2.1.5制作小游戏《亲亲小熊》
    algorithm 学习之 for_each
    cocos2dx 3.2 Touch Listen和menu回调实现截屏
    Lua 中string.gsub(sourceString, pattern, replacementString) 返回值有两个
    python 装饰器模式 我的理解
    Https SSL Knowledge & how to get a self-signed certificate on ubuntu.
    公钥和私钥的理解
    Openwrt UCI 快捷切换SS 配置
    iptables ipset 实用命令
  • 原文地址:https://www.cnblogs.com/createyuan/p/6782768.html
Copyright © 2011-2022 走看看