[20150828]插入commit scn到记录.txt

[20150828]插入commit scn到记录.txt

--昨天看
--链接:http://blog.dbi-services.com/oracle-cdc-for-datawarehouse-dbvisit-replicate-as-an-alternative/
--发现通过使用函数userenv('commitscn'),可以实现在DML记录(插入与修改)时记录提交scn的功能,自己按照例子也做了测试!

1.建立测试环境:

SCOTT@test01p> @ver1
PORT_STRING                    VERSION        BANNER                                                                               CON_ID
------------------------------ -------------- -------------------------------------------------------------------------------- ----------
IBMPC/WIN_NT64-9.1.0           12.1.0.1.0     Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production              0

SCOTT@test01p> create table DEMO (id number, update_scn number, commit_scn number);
Table created.

SCOTT@test01p> select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
                20498673

2.开始测试:

SCOTT@test01p> insert into DEMO values (1,dbms_flashback.get_system_change_number,userenv('commitscn'));
1 row created.

SCOTT@test01p> select * from demo;
        ID UPDATE_SCN COMMIT_SCN
---------- ---------- ----------
         1   20498680   20498680

-- 插入时UPDATE_SCN=COMMIT_SCN.

SCOTT@test01p> select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
                20498693

SCOTT@test01p> commit ;
Commit complete.

SCOTT@test01p> select * from demo;
        ID UPDATE_SCN COMMIT_SCN
---------- ---------- ----------
         1   20498680   20498695
--可以发现commit后,字段commit_scn的信息发生了变化,感觉就像给commit命令加了触发器,修改了提交信息.

SCOTT@test01p> select ora_rowscn,demo.* from demo ;
ORA_ROWSCN         ID UPDATE_SCN COMMIT_SCN
---------- ---------- ---------- ----------
  20498696          1   20498680   20498695

-- 伪列ora_rowscn  与 commit_scn 相差1 .

3.修改记录看看:
SCOTT@test01p> update demo set commit_scn=userenv('commitscn');
1 row updated.

SCOTT@test01p> select ora_rowscn,demo.* from demo ;
ORA_ROWSCN         ID UPDATE_SCN COMMIT_SCN
---------- ---------- ---------- ----------
  20498696          1   20498680   20498827
--commit_scn再次发生了变化.

SCOTT@test01p> rollback ;
Rollback complete.

SCOTT@test01p> select ora_rowscn,demo.* from demo ;
ORA_ROWSCN         ID UPDATE_SCN COMMIT_SCN
---------- ---------- ---------- ----------
  20498696          1   20498680   20498695

--回滚后还原.下面修改并提交看看.

SCOTT@test01p> update demo set commit_scn=userenv('commitscn');
1 row updated.

SCOTT@test01p> commit ;
Commit complete.

SCOTT@test01p> select ora_rowscn,demo.* from demo ;
ORA_ROWSCN         ID UPDATE_SCN COMMIT_SCN
---------- ---------- ---------- ----------
  20498854          1   20498680   20498853

--感觉有点奇怪,oracle内部如何实现这个功能的?

4.使用logminer探究看看.

BEGIN
   DBMS_LOGMNR.START_LOGMNR (
      STARTSCN   => 20498673,
      ENDSCN     => 20498854,
      OPTIONS    =>   DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG
                    + DBMS_LOGMNR.CONTINUOUS_MINE
                    + DBMS_LOGMNR.COMMITTED_DATA_ONLY);
END;
/

SYS@test> column SQL_REDO format a100
SYS@test> select scn,start_scn,commit_scn,seg_owner,operation,sql_redo from  v$logmnr_contents where seg_owner='SCOTT';
       SCN  START_SCN COMMIT_SCN SEG_OWNER  OPERATION    SQL_REDO
---------- ---------- ---------- ---------- ------------ -----------------------------------------------------------------------------------------------
  20498682   20498682   20498696 SCOTT      INSERT       insert into "SCOTT"."DEMO"("ID","UPDATE_SCN","COMMIT_SCN") values ('1','20498680','20498680');
  20498695   20498682   20498696 SCOTT      UNSUPPORTED  Unsupported

--看不到修改语句.没有打开SUPPLEMENTAL LOG DATA;

SYS@test> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
Database altered.

5.重复测试:
SCOTT@test01p> select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
                20535870

SCOTT@test01p> insert into DEMO values (2,dbms_flashback.get_system_change_number,userenv('commitscn'));
1 row created.
               
SCOTT@test01p> select ora_rowscn,demo.* from demo ;
ORA_ROWSCN         ID UPDATE_SCN COMMIT_SCN
---------- ---------- ---------- ----------
  20498854          1   20498680   20498853
  20498682          2   20535883   20535883

SCOTT@test01p> commit ;

Commit complete.

SCOTT@test01p> select ora_rowscn,demo.* from demo ;
ORA_ROWSCN         ID UPDATE_SCN COMMIT_SCN
---------- ---------- ---------- ----------
  20498854          1   20498680   20498853
  20535907          2   20535883   20535906

6.再次使用logminer探究看看.

BEGIN
   DBMS_LOGMNR.START_LOGMNR (
      STARTSCN   => 20535870,
      ENDSCN     => 20535907,
      OPTIONS    =>   DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG
                    + DBMS_LOGMNR.CONTINUOUS_MINE
                    + DBMS_LOGMNR.COMMITTED_DATA_ONLY);
END;
/

SYS@test> select scn,start_scn,commit_scn,seg_owner,operation,sql_redo from  v$logmnr_contents where seg_owner='SCOTT';
       SCN  START_SCN COMMIT_SCN SEG_OWNER  OPERATION  SQL_REDO
---------- ---------- ---------- ---------- ---------- ------------------------------------------------------------------------------------------------------------------------
  20535883   20535883   20535907 SCOTT      INSERT     insert into "SCOTT"."DEMO"("ID","UPDATE_SCN","COMMIT_SCN") values ('2','20535883','20535883');
  20535906   20535883   20535907 SCOTT      UPDATE     update "SCOTT"."DEMO" set "COMMIT_SCN" = '20535906' where "COMMIT_SCN" = '20535883' and ROWID = 'AAAYBeAAJAAAAC+AAA';

--确实可以看到在提交时有一个修改commit_scn的语句.

时间: 2024-10-17 17:01:00

[20150828]插入commit scn到记录.txt的相关文章

[20121019]8k数据块到底能放多少行记录.txt

[20121019]8k数据块到底能放多少行记录.txt 前一阵子聚会,被问及一个8k数据块能够放多少行记录,我记得以前piner的书提高过,73X条. 实际上表sys.tab$的spare1字段保存的Hakan Factor,即该表数据块的最大行号,各种数据块的大小不同, spare1的缺省值也不一样. _______________________________ 块大小  最大行数每块(spare1)   _______________________________ 2K      17

Oracle 11g r2物化视图日志新增的COMMIT SCN语句概述

在11.2中,物化视图日志也新增了一些功能,对于本地物化视图而言,现在可以利用COMMIT SCN来替代以前版本中的TIMESTAMP方式来进行刷新. 看一个简单的例子: SQL> SELECT * FROM V$VERSION; BANNER -------------------------------------------------------------------------------- Oracle Database11gEnterprise Edition Release11

oracle基于COMMIT SCN的物化视图日志快速刷新的方法

11.2中物化视图日志可以指定COMMIT SCN,这时物化视图刷新就不需要时间戳了,这篇简单描述Oracle是如何实现通过COMMIT SCN来进行刷新的. 建立一个测试环境: SQL> SELECT * FROM V$VERSION; BANNER -------------------------------------------------------------------------------- Oracle Database11gEnterprise Edition Relea

mysql(表:InnoDB,无索引),批量插入50万条记录后,越来越慢。

问题描述 mysql(表:InnoDB,无索引),批量插入50万条记录后,越来越慢. 插入10000条,已用时0秒 插入20000条,已用时2秒 插入30000条,已用时3秒 插入40000条,已用时3秒 插入50000条,已用时4秒 插入60000条,已用时5秒 插入70000条,已用时6秒 插入80000条,已用时7秒 插入90000条,已用时8秒 插入100000条,已用时9秒 插入110000条,已用时11秒 插入120000条,已用时12秒 插入130000条,已用时13秒 插入140

[20170412]bbed隐藏数据记录.txt

[20170412]bbed隐藏数据记录.txt --上午做了bbed恢复修改记录(不等长)的情况,http://blog.itpub.net/267265/viewspace-2137082/ --下午做一个隐藏数据记录的情况,实际上这样做有点多余,就是删除命令,看看bbed是否可以完成. 1.环境: SCOTT@book> @ &r/ver1 PORT_STRING                    VERSION        BANNER --------------------

[20160526]bbed修复删除记录.txt

[20160526]bbed修复删除记录.txt --以前也做过,链接: http://blog.itpub.net/267265/viewspace-745944/ --自己当时完全是依葫芦画瓢,许多东西理解不深刻,重新做一次. 1.环境: 1.环境: SCOTT@book> @ &r/ver1 PORT_STRING                    VERSION        BANNER ------------------------------ --------------

[20121214]数据库错误记录.txt

[20121214]数据库错误记录.txt --自己参照许多文档,写了一个检测数据库错误的例子:--以sys用户登录,建立表CREATE TABLE SYS.ERROR_LOG(  IP_ADDRESS       VARCHAR2(30 BYTE),  USERNAME         VARCHAR2(30 BYTE),  INSTANCE_NUMBER  NUMBER(2),  THEDATE          DATE,  ERRORMSG         VARCHAR2(4000 B

Goldengate:ERROR 180 encountered commit SCN that is not greater than the highest SCN already processed

How to recover from Extract ERROR 180 encountered commit SCN that is not greater than the highest SCN already processed This is the summary of Metalink Doc:987379.1 This error occurs in an Oracle RAC environment after a transaction is written to the

[20150917]恢复使用scn比time更好.txt

[20150917]恢复使用scn比time更好.txt --oracle 提供一个函数SCN_TO_TIMESTAMP将scn转换成时间,但是这个存在一个精度问题,误差大约是3秒. --转换实际上通过sys.SMON_SCN_TIME表. --正是这样误差,一些恢复或者回滚到特定的时间点,使用scn更加准确.通过例子来说明问题. 1.检查测试环境: SCOTT@test> @ver1 PORT_STRING                    VERSION        BANNER --