ORACLE的redo檔案在不同機器上儲存是否使用big-endian還是little-endian的問題
阿新 • • 發佈:2019-02-19
在解析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
此例子經過在AIX機器和LINUX機器上驗證是可行的.#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; }
該例子出處 http://blog.csdn.net/robinsongsog/article/details/42320151
上述的兩個帖子結合,給出瞭如何去確定機器上ORACLE的dbf檔案是大端位元組序還是小端位元組序儲存的。