[20150129]关于取scn号.txt

简介: [20150129]关于取scn号.txt --SCN有称系统改变号或者系统提交号,在oracle占有重要的位置.可以讲scn无处不在. --取scn号一般使用查询dbms_flashback.

[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,这样可以正常访问了.

目录
相关文章
|
数据库管理
[20180205]使用bbed相关问题.txt
[20180205]使用bbed相关问题.txt --//上个星期5使用bbed修改块遇到一些问题,做一个记录: 1.环境: SCOTT@book> @ ver1 PORT_STRING                    VERSION       ...
939 0
|
Oracle 关系型数据库 数据库管理
[20171124]bbed的使用问题2.txt
[20171124]bbed的使用问题2.txt --//bbed 是探究oracle数据块的好工具,有时候不用转储,直接可以它看oracle内部块的内部结构. --//在使用中要注意一些问题,昨天又犯类似错误,通过例子来说明: SCOTT@book> select rowid,dept.
1241 0
|
监控 Oracle 关系型数据库
[20171115]redo and commit.txt
[20171115]redo and commit.txt --//参考Jonathan Lewis的https://jonathanlewis.wordpress.com/2011/08/19/redo-2/ --//很早以前的帖子,自己觉得很有意思,重复测试: --//事务已经提交,但是redo log buffer还没有写到磁盘.
1022 0
|
缓存 Oracle 关系型数据库
[20170419]关于块scn号.txt
[20170419]关于块scn号.txt --//数据块里面有许多scn号相关。 --//数据块本身有三处记录的相应的SCN:数据块头的SCN(block scn)、ktbbh结构下的 kscnbas,kscnwrp(cleanout scn)、ITL信息中的...
1006 0
|
监控 Oracle 关系型数据库
[20170308]关于redo dump.txt
[20170308]关于redo dump.txt --//前一阵子在探究是否可以备库的备用日志来恢复主库,当主库在线日志丢失的情况下.遇到一些问题. DUMP OF REDO FROM FILE '/mnt/ramdisk/book/redo01.
693 0
|
监控 Oracle 关系型数据库
[20170203]关于flashback的问题.txt
[20170203]关于flashback的问题.txt --今天生产系统遇到的问题,dataguard机器磁盘空间不足,需要释放磁盘空间,无论如何删除日志,空间回收都是很少.
867 0
|
Oracle 关系型数据库 数据库管理
[20161124]bbed使用问题.txt
[20161124]bbed使用问题.txt --最近一致在使用bbed探究oracle数据库,遇到一些问题做一些记录。 1.环境: SCOTT@book> @ &r/ver1 PORT_STRING                    VERSION  ...
871 0
|
Oracle 关系型数据库 SQL
[20160805]logminer使用问题3.txt
[20160805]logminer使用问题3.txt --前一阵子看itpub有人想通过logminer来抽取归档同步数据库,实际上这个非常不科学,存在一定的风险,我觉得很多情况下会漏掉一些sql --语句,通过例子来说明。
935 0
|
Oracle 关系型数据库 测试技术
[20160805]logminer使用问题1.txt
[20160805]logminer使用问题1.txt --前一阵子看itpub有人想通过logminer来抽取归档同步数据库,实际上这个非常不科学,存在一定的风险,我觉得很多情况下会漏掉一些sql --语句,通过例子来说明。
799 0
|
Oracle 关系型数据库 Linux
[20160803]关于SNAPSHOT CONTROLFILE.txt
[20160803]关于SNAPSHOT CONTROLFILE.txt --当使用rman备份时,rman会建立一个SNAPSHOT CONTROLFILE,具体位置由参数 RMAN> show SNAPSHOT CONTROLFILE NAME  ; ...
838 0

热门文章

最新文章