ORACLE的redo文件在不同机器上存储是否使用big-endian还是little-endian的问题

来源:互联网 发布:知党规 行敬畏 编辑:程序博客网 时间:2024/04/30 14:34

在解析ORACLE的dbf文件的时候,发现在不同的机器台上,存储使用的字节序并不一样.


今天看PostgreSQL 9.6.1更新版本发布说明的时候,看到这块有相关的描述:


pg_upgrade在大端机器上的问题


在大端机器(例如许多非Intel CPU架构)上,pg_upgrade不正确地写入可见性映射的字节, 导致 pg_upgrade无法完成。
如果你使用的是big-endian机器(许多非Intel架构都是big-endian) 并且使用pg_upgrade从9.6之前的版本升级, 你应该假定所有的可见性映射都不正确,需要重新生成。 使用 contrib/pg_visibility 的 pg_truncate_visibility_map() 函数截断每个关系的可见性映射就行了。 请阅读更新部分, 查阅文章末尾提到的安装说明, 可以了解相关在PostgreSQL实例上解决此问题的方法。

这个问题只存在于PostgreSQL 9.6.0版本中。


出处http://www.postgres.cn/release/v/30


又在网上找了一些其他例子的说明:


如果我们使用的是一台32位机器。

如果是little endian, 那么x在内存中是之样排列的

      高内存         ---->    +----+----+----+----+    |0x01|0x00|0x00|0x00|    +----+----+----+----+    A    |    &x  所以 (char*)(*x) == 1  


如果是big endian,它将会是这个样子

      高内存         ---->    +----+----+----+----+    |0x00|0x00|0x00|0x01|    +----+----+----+----+    A    |    &x  所以 (char*)(*x) == 0  


#include <stdio.h>  #include <stdint.h>    int is_big_endian(void)  {      union {          uint32_t i;          char c[4];      } e = {0x10000000};            return e.c[0];  }    int main(void)  {      printf("System is %s -endian.\n", is_big_endian() ? "big" : "little");            return 0;  }  


此例子经过在AIX机器和LINUX机器上验证是可行的.

该例子出处 http://blog.csdn.net/robinsongsog/article/details/42320151



上述的两个帖子结合,给出了如何去确定机器上ORACLE的dbf文件是大端字节序还是小端字节序存储的。




0 0
原创粉丝点击