Focus On Oracle

Installing, Backup & Recovery, Performance Tuning,
Troubleshooting, Upgrading, Patching

Oracle Engineered System


当前位置: 首页 » 技术文章 » Oracle

如何在小端服务器以正常格式查看Oracle数据文件

大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;这和我们的阅读习惯一致。

所谓的大端模式(Big-endian),是指数据的高字节,保存在内存的低地址中,而数据的低字节,保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;


小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。

所谓的小端模式(Little-endian),是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致。


我们知道Linux,Windows(Intel的80x86系列芯片)平台属于小端,AIX、HPUX、 Solaris(Sparc)属于大端。大家可能会有这样的疑问,Oracle数据文件在不同平台上存放的字节序一样吗?会不会是小端服务器以小端的格式存放,大端服务 器以大端的格式存放?其实数据文件中的内容如何存放这取决于应用程序,所以Oracle数据库在不同平台上的数据文件中存放的格式是一样的(假如不一样,跨平台的传输表空间,岂不是很麻烦,传输表空间更改的主要是数据文件的头部,再把对象的数据字典信息导入)。假如用od命令查看,你会发现在小端服务器上,你看到的字节序是反的。在小端上用od查看加上参数conv=swab就可以正常查看块的内容,这个符合我们的阅读习惯,对于在小端服务器上研究的同学可以这样做。请看下面的的测试

[oracle@ora10 ~]$ bbed parfile=10gpar

Password:

BBED: Release 2.0.0.0.0 - Limited Production on Wed Jun 15 00:06:04 2016
Copyright (c) 1982, 2005, Oracle.  All rights reserved.

************* !!! For Oracle Internal Use only !!! ***************
BBED> help
HELP [ <bbed command> | ALL ]

BBED> show all;
        FILE#           1
        BLOCK#          1
        OFFSET          0
        DBA             0x00400001 (4194305 1,1)
        FILENAME        /oradata/ora10/system01.dbf
        BIFILE          bifile.bbd
        LISTFILE        files.txt
        BLOCKSIZE       8192
        MODE            Browse
        EDIT            Unrecoverable
        IBASE           Dec
        OBASE           Dec
        WIDTH           80
        COUNT           512
        LOGFILE         log.bbd
        SPOOL           No

用bbed查看数据文件的第一个块(其实是第二个块,前面还有OS文件头)
BBED> dump /v offset 0 count 64
 File: /oradata/ora10/system01.dbf (1)
 Block: 1       Offsets:    0 to   63  Dba:0x00400001
-------------------------------------------------------
 0ba20000 01004000 00000000 00000104 l .?....@.........
 9c730000 00000000 0001200a 91cf2635 l .s........ ..?&5
 4f524131 30000000 99010000 00f00000 l ORA10........?..
 00200000 01000300 00000000 00000000 l . ..............

 <16 bytes per line>

BBED> exit
在Linux上,通过dd查看块内容,可以看到,字节序和用bbed dump出来的结果不一样
[oracle@ora10 ~]$ dd if=/oradata/ora10/system01.dbf bs=8k skip=1|od -x -N 64
0000000 a20b 0000 0001 0040 0000 0000 0000 0401
0000020 739c 0000 0000 0000 0100 0a20 cf91 3526
0000040 524f 3141 0030 0000 0199 0000 f000 0000
0000060 2000 0000 0001 0003 0000 0000 0000 0000

0000100


通过下面的方法A或方法B都可以实现

A.在Linux上,加上参数conv=swab,把整个文件复制到新的文件,然后通过dd查看块内容,这样再看块内容是不是很完美

[oracle@ora10 ~]$ dd if=/oradata/ora10/system01.dbf of=/oradata/ora10/system01_swab.dbf conv=swab
983056+0 records in
983056+0 records out
503324672 bytes (503 MB) copied, 4.27371 seconds, 118 MB/s
[oracle@ora10 ~]$ dd if=/oradata/ora10/system01_swab.dbf bs=8k skip=1|od -x -N 64
0000000 0ba2 0000 0100 4000 0000 0000 0000 0104
0000020 9c73 0000 0000 0000 0001 200a 91cf 2635
0000040 4f52 4131 3000 0000 9901 0000 00f0 0000
0000060 0020 0000 0100 0300 0000 0000 0000 0000
0000100
[oracle@ora10 ~]$ 


B.在Linux上,我们还可以使用参数conv=swab,然后通过管道用dd和od结合看更好,这样可以不用输出文件,也不会破坏原文件

[oracle@ora10 ~]$ dd if=/oradata/ora10/system01.dbf conv=swab bs=8k skip=1|od -x -N 64

0000000 0ba2 0000 0100 4000 0000 0000 0000 0104
0000020 9c73 0000 0000 0000 0001 200a 91cf 2635
0000040 4f52 4131 3000 0000 9901 0000 00f0 0000
0000060 0020 0000 0100 0300 0000 0000 0000 0000
0000100
[oracle@ora10 ~]$

Reference

http://baike.baidu.com/view/1922338.htm




关键词:dd 

相关文章

如何使用dd备份数据文件头部和ASM磁盘头部
如何在小端服务器以正常格式查看Oracle数据文件
关于dd你需要知道的
Top