[20170611]关于数据块地址的计算.txt

[20170611]关于数据块地址的计算.txt

--//如果数据库出现一些问题,会在alert或者跟踪文件,或者屏幕出现一些错误提示.例如:

ORA-00600: internal error code, arguments: [2662], [3], [392066208], [3], [392066212], [4194825], [], [], [], [], [], []

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.

--//这里第5个参数4194825就是dba也就是数据块地址.
--//实际上简单的计算很简单,32位占4个字节,前10位表示文件号,后22位表示:

SYS@test> select round(&dba/power(2,22),0) file# ,mod(&&dba,power(2,22)) block# from dual ;
old   1: select round(&dba/power(2,22),0) file# ,mod(&&dba,power(2,22)) block# from dual
new   1: select round(4194825/power(2,22),0) file# ,mod(4194825,power(2,22)) block# from dual
     FILE#     BLOCK#
---------- ----------
         1        521

--//我自己常用的脚本:
$ cat dfb10.sql
select
dbms_utility.data_block_address_file(&1) rfile#,
dbms_utility.data_block_address_block(&&1) block#
from dual;

select 'alter system dump datafile '||dbms_utility.data_block_address_file(&1)||' block '||
dbms_utility.data_block_address_block(&&1) ||' ;' text

$ cat dfb16.sql
column text format a60

select
dbms_utility.data_block_address_file(to_number(substr('&&1',3),'xxxxxxxxxxxxxxxx')) rfile#,
dbms_utility.data_block_address_block(to_number(substr('&&1',3),'xxxxxxxxxxxxxxxx')) block#,
'alter system dump datafile '||dbms_utility.data_block_address_file(to_number(substr('&1',3),'xxxxxxxxxxxxxxxx'))||' block '|| dbms_utility.data_block_address_block(to_number(substr('&&1',3),'xxxxxxxxxxxxxxxx')) ||' ;' text
from dual;

--//convert file#,block# 到 dba地址.
$ cat convrdba.sql
select
TO_CHAR (dbms_utility.make_data_block_address(&1,&2), 'xxxxxxxxxxxxx') rdba16,
dbms_utility.make_data_block_address(&&1,&&2) rdba
from dual;

--//还有1种方法就是bbed,直接输入例子:

BBED> set dba 1,521
        DBA             0x00400209 (4194825 1,521)

BBED> set dba 4194825
        DBA             0x00400209 (4194825 1,521)

BBED> set dba 0x00400209
        DBA             0x00400209 (4194825 1,521)

--//下午无聊,想完善以前[20121207]vim中使用bc做10与16进制计算.txt,链接http://blog.itpub.net/267265/viewspace-750731/
--//源代码http://www.vim.org/scripts/script.php?script_id=219,我修改加入10,16进制的计算,
--//作者这么多年2017/04/17 更新.以此为基础加入10,16进制转化,以及dba转化为file#,block#.
--//这次修改代码加入dba的计算.同时修复了windows下的许多问题.

--//做一些简单说明,这个版本仅仅工作在windows版本.bc的安装可以下载UnxUtils.zip包,设置好PATH路径就ok了.
--//我注解 let str = escape (str, '*();&><|^') ,这样运算存在*以及(),不再存在问题.
--//以前旧版本不支持幂运算(^),windows的转化4个^才能正确执行.

--//简单操作:
a3

在数字a3上面输入\10,相当于a3当作16进制数据,给出结果=163.
在数字a3处于选择模式,输入;10,相当于a3当作16进制数据,在提示行上给出答案
(注:windows下要处于可视模式,不能处于选择模式,使用ctrl+g切换)

123
在数字123上面输入\16,相当于123当作10进制数据,给出结果=0x7b.
在数字123处于选择模式,输入;16,相当于123当作10进制数据,在提示行上给出答案

\bx 可以进行行运算
\bc 在提示行输出结果.

;bc 选中文本,然后ctrl+g,输入;bc,在提示行输出结果.

\22
;22

--//参考10,16进制的计算,计算dba转化为file#,block#.
--//做一个操作例子:
4194825 = set dba 1,521
--//打入\22,输出如下:
4194825 = set dba 1,521

==================修改后代码如下:
"" calculate expression entered on command line and give answer, e.g.:
" :Calculate sin (3) + sin (4) ^ 2
command! -nargs=+ Calculate echo " = " . Calculate ("")

"" calculate expression from selection, pick a mapping, or use the Leader form
"vnoremap ;bc "ey`>:call CalcLines()
"vnoremap bc "ey`>:callCalcBC(1)
vnoremap ;bc "ey`>:call CalcLines(0)
vnoremap ;10 "ey`>:call CalcLines(10)
vnoremap ;16 "ey`>:call CalcLines(16)
vnoremap ;22 "ey`>:call CalcLines(22)
vnoremap ;32 "ey`>:call CalcLines(32)

"" calculate expression on current line, pick a mapping, or use the Leader
nnoremap  bc "eyy$:call CalcLines(0)
nnoremap   bx A="eyy:call CalcLines(0)
nnoremap   10 A="eyy:call CalcLines(10)
nnoremap   16 A="eyy:call CalcLines(16)
nnoremap   22 A="eyy:call CalcLines(22)
nnoremap   32 A="eyy:call CalcLines(32)

"nnoremap  bc "eyy$:callCalcBC(0)

"" calculate from insertmode
inoremap =: = "eyy:call CalcLines()a

" ---------------------------------------------------------------------
"  Calculate:
"    clean up an expression, pass it to bc, return answer
function! Calculate (s,flag)

    let str = a:s

    " remove newlines and trailing spaces
    let str = substitute (str, "\n",   "", "g")
    let str = substitute (str, '\s*$', "", "g")

    " sub common func names for bc equivalent
    let str = substitute (str, '\csin\s*(',  's (', 'g')
    let str = substitute (str, '\ccos\s*(',  'c (', 'g')
    let str = substitute (str, '\catan\s*(', 'a (', 'g')
    let str = substitute (str, "\cln\s*(",   'l (', 'g')
    let str = substitute (str, '\clog\s*(',  'l (', 'g')
    let str = substitute (str, '\cexp\s*(',  'e (', 'g')

    " alternate exponitiation symbols
    let str = substitute (str, '\*\*', '^', "g")
    let str = substitute (str, '`', '^',    "g")
    let str = substitute (str, '\^', '^^^^',    "g")

    " escape chars for shell
    " let str = escape (str, '*();&><|^')

    let preload = exists ("g:bccalc_preload") ? g:bccalc_preload : ""

    " run bc
    " return str
    " let answer = system ("echo " . str . " \| bc -l " . preload)

    if a:flag == 0
         let answer = system ("echo " . str . " \| bc -l " . preload)
    endif
    if a:flag == 16
         let answer = system ("echo obase=16 ;" . str .  " \| bc -l " . preload)
         let answer = "0x" . tolower ( answer )
    endif
    if a:flag == 10
         let str = toupper ( str )
         let answer = system ("echo ibase=16 ;" . str .  " \| bc -l " . preload)
    endif
    if a:flag == 22
         let answer = system ("echo " . str . "/4194304" . " \| bc " . preload)
         let answer1 = system ("echo " . str . "%4194304" . " \| bc " . preload)
         let answer = " set dba " . answer . "," . answer1
    endif

    if a:flag == 32
         let answer = system ("echo " . str . "/4294967296" . " \| bc " . preload)
         let answer1 = system ("echo " . str . "%4294967296" . " \| bc " . preload)
         let answer = " scn_wrap,scn_base: " . answer . " " . answer1
    endif

    " strip newline
    let answer = substitute (answer, "\n", "", "g")

    " strip trailing 0s in decimals
    let answer = substitute (answer, '\.\(\d*[1-9]\)0\+', '.\1', "")

    return answer
endfunction

" ---------------------------------------------------------------------
" CalcLines:
"
" take expression from lines, either visually selected or the current line,
" pass to calculate function, echo or past answer after '='
function! CalcLines(flag)

    let has_equal = 0

    " remove newlines and trailing spaces
    let @e = substitute (@e, "\n", "",   "g")
    let @e = substitute (@e, '\s*$', "", "g")

    " if we end with an equal, strip, and remember for output
    if @e =~ "=$"
        let @e = substitute (@e, '=$', "", "")
        let has_equal = 1
    endif

    " if there is another equal in the line, assume chained equations, remove
    " leading ones
    let @e = substitute (@e, '^.\+=', '', '')

    let answer = Calculate (@e,a:flag)

    " append answer or echo
    if has_equal == 1
        exec "normal a" . answer
    else
        echo "answer = " . answer
    endif
endfunction

时间: 2024-07-30 10:46:49

[20170611]关于数据块地址的计算.txt的相关文章

Oracle数据块恢复(dbv、BMR)

Oracle数据块恢复(dbv.BMR) 物理坏块和逻辑坏块 Oracle数据文件的坏块可以分为物理坏块和逻辑坏块.物理坏块指的是块格式本身已经损坏,块内的数据没有任何意义.而逻辑坏块,指的是块内的数据在逻辑上存在问题,比如说索引块的索引值没有按从小到大排列导致的逻辑坏块.物理坏块一般是由于内存问题.OS问题.I/O子系统问题或硬件引起的,逻辑坏块一般是有Oracle bug等原因引起的. 各种各样的块损坏通常是通过Oracle的ORA-1578错误报告出来的,详细的损坏描述会在告警日志中打印出

[20150720]为什么8K数据块Hakan Factor=736

[20150720]为什么8K数据块Hakan Factor=736.txt --前几天被别人问及这个问题,还真不好回答. --仔细思考,我觉得与行迁移有关,行迁移发生时,rowid不会变化.数据信息被移动另外的块,在块内保留一个指针. --也就是讲最小这条记录仅仅包含一个rowid指针. --还是通过例子来说明情况: 1.建立测试环境: SCOTT@test> @&r/ver1 PORT_STRING                    VERSION        BANNER ---

【体系结构】Oracle数据块详解

Oracle数据块详解 操作系统块是操作系统读写的最小操作单元,也是操作系统文件的属性之一.当创建一个Oracle数据库时,选择一个基于操作系统块的整数倍大小作为Oracle数据库块的大小.Oracle数据库读写操作则是以Oracle块为最小单位,而非操作系统块. 数据库块也称逻辑块或Oracle块,它对应磁盘上一个或多个物理块,它的大小由初始化参数DB_BLOCK_SIZE决定,可以定义数据块为2K.4K.8K.16K.32K甚至更大,默认Oracle块大小是8K.若一旦设置了Oracle数据

[20160831]关于数据块Checksum.txt

[20160831]关于数据块Checksum.txt --以前我学习bbed时做过一些测试,将'AAAA'替换成'BBBB',你可以发现数据块的Checksum并没有发生变化,当时并没有仔细探究, --现在想起来计算Checksum算法应该相对简单,就是做异或操作. --比如上面的字符'AAAA'如果2个字符按位做异或操作,变成00000000,这个正好巧合,如果修改成'CCCC',做相同的异或操作结果 --也是00000000. --如果按照这个推测修改为'CDCD',这样做异或操作的结果也

[20150929]检查数据块.txt

[20150929]检查数据块.txt --一般检查数据库的块是否存在损坏,使用dbv程序.例子: $ dbv file=/u01/app/oracle11g/oradata/test/system01.dbf DBVERIFY: Release 11.2.0.3.0 - Production on Tue Sep 29 07:48:28 2015 Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserv

[20150522]bbed与数据块检查和.txt

[20150522]bbed与数据块检查和.txt --我现在基本拿bbed学习,基本是拿bbed查看,而使用bvi修改数据.我感觉这种方便1写. --实际上使用bbed的好处就是修改数据块检查和不一致,而使用bbed修改很简单仅仅需要执行sum apply就ok了. --对比dbv与bbed确定检查和位置. 1.建立测试环境: SCOTT@test> @ &r/ver1 PORT_STRING                    VERSION        BANNER -------

[20150527]bbed与数据块检查和2.txt

[20150527]bbed与数据块检查和2.txt http://blog.itpub.net/267265/viewspace-1666781/ --我现在基本拿bbed学习,基本是拿bbed查看,而使用bvi修改数据.我感觉这种方便1写. --实际上使用bbed的好处就是修改数据块检查和不一致,而使用bbed修改很简单仅仅需要执行sum apply就ok了. --对比dbv与bbed确定检查和位置. --实际上既然检查和在16,17字节,只要清零,加上dbv就很容易确定要修改的内容. 1.

[20161123]oracle数据块类型.txt

[20161123]oracle数据块类型.txt --oracle 数据块有许多类型,自己平时很少关注与记忆,自己做一个归纳总结: 1.环境: SCOTT@book> @ &r/ver1 PORT_STRING                    VERSION        BANNER ------------------------------ -------------- ------------------------------------------------------

[20150612]使用bvi查看数据块.txt

[20150612]使用bvi查看数据块.txt --编写一个简单的脚本实现bvi查看数据块,主要我现在喜欢使用bbed查看,而修改选择bvi. --通过例子来说明: SCOTT@test> select rowid,dept.* from dept ; ROWID                    DEPTNO DNAME          LOC ------------------ ------------ -------------- ------------- AABJVUAAEA