1. 程式人生 > >ORACLE的redo檔案在不同機器上儲存是否使用big-endian還是little-endian的問題

ORACLE的redo檔案在不同機器上儲存是否使用big-endian還是little-endian的問題

在解析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檔案是大端位元組序還是小端位元組序儲存的。