[20150129]关于取scn号.txt

[20150129]关于取scn号.txt

--SCN有称系统改变号或者系统提交号,在oracle占有重要的位置.可以讲scn无处不在.
--取scn号一般使用查询dbms_flashback.get_system_change_number或者查询视图v$database的current_scn字段.
--两种实际上还是有1点点小区别,通过例子来说明:

SCOTT@test> @ver1

PORT_STRING                    VERSION        BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx            11.2.0.3.0     Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

SCOTT@test> set numw 12
SCOTT@test> select dbms_flashback.get_system_change_number scn from dual;
         SCN
------------
11998658487

SCOTT@test> select current_scn from v$database ;
CURRENT_SCN
------------
11998658489

select current_scn from v$database
union all
select dbms_flashback.get_system_change_number scn from dual;

CURRENT_SCN
------------
11998658549
11998658549

select dbms_flashback.get_system_change_number scn from dual
union all
select current_scn from v$database ;

         SCN
------------
11998658609
11998658610

SCOTT@test> /
         SCN
------------
11998658615
11998658616

-- 可以发现1个小细节,第2种执行方式,后面的值表前面的大1.而第1种的执行两种都是相等的.

select dbms_flashback.get_system_change_number scn1, current_scn from v$database
union all
select current_scn scn1,dbms_flashback.get_system_change_number from v$database;

        SCN1  CURRENT_SCN
------------ ------------
11998659577  11998659577
11998659578  11998659578

--也就是讲通过视图v$database取实际上是当前的scn号+1,而dbms_flashback.get_system_change_number取的是当前的scn号.

--看看mount时候的情况:

SYS@test> select current_scn from v$database ;
CURRENT_SCN
-----------
          0

SYS@test> alter database open read only ;
Database altered.

SYS@test> select dbms_flashback.get_system_change_number  from dual ;
GET_SYSTEM_CHANGE_NUMBER
------------------------
             11998660622

SYS@test> select current_scn from v$database ;
CURRENT_SCN
------------
11998660622

--如果你在10g下测试:
SYS@test> startup  open read only ;
ORACLE instance started.
Total System Global Area    473956352 bytes
Fixed Size                    2084776 bytes
Variable Size               230686808 bytes
Database Buffers            230686720 bytes
Redo Buffers                 10498048 bytes
Database mounted.
Database opened.

SYS@test> @ &r/ver1
PORT_STRING                    VERSION        BANNER
------------------------------ -------------- ----------------------------------------------------------------
x86_64/Linux 2.4.xx            10.2.0.4.0     Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi

SYS@test> select dbms_flashback.get_system_change_number scn from dual;
         SCN
------------
11996045618

SYS@test> select current_scn from v$database ;
CURRENT_SCN
------------
           0

--10g下有点小小的不同,在只读情况下为0,取dbms_flashback.get_system_change_number正常.
--11g下在只读情况下两者相等.

--当然知道这个细节没什么用,用它来提高scn号太慢,不过如果可以使用看看.如果数据库异常崩溃,在使用特殊方法恢复后,会出现数据块
--里面的scn好大于文件头的scn号.这样在访问这些块时,会报错.
ORA-00600: internal error code, arguments: [2662], [0], [897694446], [0], [897695488], [8388697], [], []
--可以参考 http://blog.itpub.net/267265/viewspace-750075/.

--再重复模拟这个错误看看.
SCOTT@test> @ &r/ver1
PORT_STRING                    VERSION        BANNER
------------------------------ -------------- ----------------------------------------------------------------
x86_64/Linux 2.4.xx            10.2.0.4.0     Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi

SCOTT@test>  select ora_rowscn ,rowid ,t2.* from t2;
  ORA_ROWSCN ROWID                    DEPTNO DNAME          LOC
------------ ------------------ ------------ -------------- -------------
11996045788 AAAOQJAAEAAAAGGAAA           10 ACCOUNTING     NEW YORK
11996045788 AAAOQJAAEAAAAGGAAB           20 RESEARCH       DALLAS
11996045788 AAAOQJAAEAAAAGGAAC           30 SALES          CHICAGO
11996045788 AAAOQJAAEAAAAGGAAD           40 OPERATIONS     BOSTON

SCOTT@test> @ &r/lookup_rowid AAAOQJAAEAAAAGGAAA
      OBJECT         FILE        BLOCK          ROW DBA                  TEXT
------------ ------------ ------------ ------------ -------------------- ----------------------------------------
       58377            4          390            0 4,390                alter system dump datafile 4 block 390 ;

--在只读打开下看scn号:
SYS@test> select dbms_flashback.get_system_change_number scn from dual;
         SCN
------------
11996046173

--假设给数据块的scn增加1e4,11996045788+10000=11996055788.这样增加11996055788-11996046173=9615.

SYS@test> @ &r/10to16 11996045788
10 to 16 HEX   REVERSE16
-------------- -----------------------------------
00002cb0521dc 0xdc2105cb-02000000

SYS@test> @ &r/10to16 11996055788

10 to 16 HEX   REVERSE16
-------------- -----------------------------------
00002cb0548ec 0xec4805cb-02000000

--也就是使用bbed修改 dc21 => ec48.我使用的cpu是intel,小头在前.

BBED> set dba 4,390
        DBA             0x01000186 (16777606 4,390)

BBED> find /x  dc21 top
File: /mnt/ramdisk/test/users01.dbf (4)
Block: 390                                                  Offsets:    8 to 8191                                               Dba:0x01000186
------------------------------------------------------------------------------------------------------------------------------------------------
dc2105cb 02000106 534d0000 01000000 09e40000 db2105cb 02000000 02003200 81010001 02001a00 17020000 c4008000 01032200 04200000 dc2105cb 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00010400 ffff1a00 3c1f221f 221f0000 04003c1f 561f6c1f 801f0000 00000000 00000000
....

BBED> find
File: /mnt/ramdisk/test/users01.dbf (4)
Block: 390                                                  Offsets:   64 to 8191                                               Dba:0x01000186
------------------------------------------------------------------------------------------------------------------------------------------------
dc2105cb 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00010400 ffff1a00 3c1f221f 221f0000 04003c1f 561f6c1f 801f0000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

BBED> find
File: /mnt/ramdisk/test/users01.dbf (4)
Block: 390                                                  Offsets: 8190 to 8191                                               Dba:0x01000186
------------------------------------------------------------------------------------------------------------------------------------------------
dc21

-- 一共3处. 我使用bvi修改,这样简单一些.害怕改错最好做一个冷备份.  390*8192=3194880

#  bvi -b 3194880 -s 8192 /mnt/ramdisk/test/users01.dbf
-- bvi 的一些修改技巧做一些总结: set memmove打开编辑模式.这个应该不常用.检索16进制使用反斜杠\.

BBED> set dba 4,390
        DBA             0x01000186 (16777606 4,390)

BBED> sum
Check value for File 4, Block 390:
current = 0x4d53, required = 0x2463

BBED> sum apply
Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) y
Check value for File 4, Block 390:
current = 0x2463, required = 0x2463

SYS@test> alter system flush BUFFER_CACHE;
System altered.

SYS@test> select * from scott.t2;
select * from scott.t2
*
ERROR at line 1:
ORA-00600: internal error code, arguments: [2662], [2], [3406111582], [2], [3406121196], [16777606], [], []

ORA-600 [2662] [a] [b] {c} [d] [e]
Arg [a] Current SCN WRAP
Arg [b] Current SCN BASE
Arg {c} dependent SCN WRAP
Arg [d] dependent SCN BASE
Arg [e] Where present this is the DBA where the dependent SCN came from.

--最后的参数是dba.
SYS@test> @ &r/dfb10 16777606
      RFILE#       BLOCK#
------------ ------------
           4          390

TEXT
-----------------------------------------
alter system dump datafile 4 block 390 ;

--正好对上.
--相差SCN3406121196-3406111582=9614.相差不是很大.建立脚本.(注意要使用v_$databse)

$  cat f1.sql
declare
m_id number;
begin
  for i in 1 .. 9700 loop
    select current_scn into m_id from v_$database;
  end loop;
end ;
/

SYS@test> select current_scn from v$database ;

CURRENT_SCN
------------
11996055511

SYS@test> @f1.sql

PL/SQL procedure successfully completed.

SYS@test> select * from scott.t2;
      DEPTNO DNAME          LOC
------------ -------------- -------------
          10 ACCOUNTING     NEW YORK
          20 RESEARCH       DALLAS
          30 SALES          CHICAGO
          40 OPERATIONS     BOSTON

--OK,这样可以正常访问了.

时间: 2024-07-30 11:04:08

[20150129]关于取scn号.txt的相关文章

[20170419]关于块scn号.txt

[20170419]关于块scn号.txt --//数据块里面有许多scn号相关. --//数据块本身有三处记录的相应的SCN:数据块头的SCN(block scn).ktbbh结构下的 kscnbas,kscnwrp(cleanout scn).ITL信息中的 --//scn/fsc(commit scn 有时候会是control scn),有时候会存在一点点混乱,通过例子说明: 1.环境: SCOTT@book> @ &r/ver1 PORT_STRING                

[20151109]提升scn号11g测试.txt

[20151109]提升scn号11g测试.txt --以前的测试都在10g下进行的,在11.2.0.4下重复测试. 1.测试环境: SCOTT@book> @ &r/ver1 PORT_STRING                    VERSION        BANNER ------------------------------ -------------- ------------------------------------------------------------

[20160406] 恢复until scn NNN.txt

[20160406] 恢复until scn NNN.txt --昨天别人问的问题,如果使用rman恢复,restore database until scn NNN;是恢复到NNN,还是NNN-1. --我个人的理解应该是NNN-1.包括像UNTIL SEQUENCE integer 以及UNTIL TIME xxx;也是少1个或者少1秒. --实际上我以前如果做测试,我自己总是查询误操作的scn,然后仅仅恢复到减去1的scn号.(感觉这样比较保险^_^) until prep.到...为止,

oracle中 SCN号总结 上篇

1.SCN(System Change Number) : SCN是什么? system change number (SCN)是一个非常重要的标记,Oracle使用它来标记数据库在过去时间内的状态和轨迹.Oracle使用SCN来保 存所有变化的轨迹.SCN是一个逻辑时钟来记录数据库事件.它非常的重要,并不是只是为了恢复.SCN的最大值是0xffff.ffffffff.SCN有点类似于sequence,Oracle 在SGA中增加它.当一个事务修改或者插入数据,Oracle首先写入一个新的SCN

写个取硬盘号的注册程序,测试了IDE可以,但串口硬盘不行,能否给点思路,谢谢了

问题描述 用C#写个取硬盘号的注册程序,测试了IDE可以,但串口硬盘不行,能否给点思路,谢谢了 解决方案 解决方案二:协议?还是什么?关注,没有做过这么深奥的cs解决方案三:程序咋写的?通过ManagementClass读取的吗?解决方案四:没做过,关注,帮顶解决方案五:当取不到硬盘序列号时,就取主板或者CPU的吧..解决方案六:[DllImport("Kernel32.dll",CharSet=CharSet.Auto,SetLastError=true)]privateextern

oracle中scn号是commit之后产生的,还是commit之前产生的?

问题描述 oracle中scn号是commit之后产生的,还是commit之前产生的? 如果是commit之后产生的,那么在commit之前scn都没有,还怎么用比较scn号大小的方法来实现读一致性呢? 假设scn号是在commit之后产生的,在判断读一致性时是根据scn号的大小去控制的,比如事务开始时最大的scn号是1000,当读到此事务开始之后有人修改过但未提交的数据时,比如这次修改的scn是1001,系统一看比事务开始时最大的scn号1000还大,就直接去undo中读取被修改之前的数据来保

oracle中 SCN号总结 下篇

重新创建的可以自动进行完全恢复(By biti)示例例子背景:oracle 8iwindows采用rman做热备,在备份期间,做不少事务,同时做alter system checkpoint.RMAN> run {2> allocate channel c1 type disk;3> backup database filesperset 3 format 'e:/full_%p_%t.bak';4> }(这里需要一提的是,在这个备份角本里面我们加了filesperset 3.这样

[20170515]检查数据库scn脚本.txt

[20170515]检查数据库scn脚本.txt --//简单写一个脚本检查数据库各个scn的大小: column TABLESPACE_NAME format a20 SELECT b.file#       ,b.name       ,c.STATUS       ,c.FUZZY       ,a.checkpoint_change# "数据库记录的scn"       ,b.checkpoint_change# "控制文件记录的开始scn"       ,

[20170622]bc与取模运算.txt

[20170622]bc与取模运算.txt --//前一阵子在使用bc做取模运算.发现一个奇怪的问题.开始以为是使用mod(受oracle的影响). --//查手册才发现%. --//例子如下: $ bc -v bc 1.06 Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc. $ bc -q 9%4 1 9%5 4 --//很明显以上结果是正确的,但是如果加参数-l. -l, --mathlib =>  De