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