關於PostgreSQL的系統資訊函式的OID

T1YSL發表於2023-01-31

一、自帶的OID的相關指令碼

在PostgreSQL的安裝包的src/include/catalog目錄下,有著兩個指令碼,unused_oids和 duplicate_oids。透過這兩個可執行指令碼,可以檢視當前原始碼包配置裡的符合要求的OID。unused_oids可以檢視若根據當前原始碼包初始化產生的資料庫,在系統表中未被使用的OID,duplicate_oids可以找到在系統表重複定義的OID。

1675049517793.png

當我們執行unused_oids指令碼的時候,就會出現類似如下的顯示, 可以獲取到這個PostgreSQL 尚未使用的 OID 列表。 假設當你想建立一個系統資訊函式 的時候,你需要生成不會產生任何衝突的 OID 。這個時候使用這個指令碼是很方便的,官方推薦的範圍是8000到9999,如果增加的補丁佔用的OID相互衝突了,那麼可能就會產生相關問題,此時另一個指令碼duplicate_oids的意義也就出現了。

1675049709768.png

對於每個具有任何手動建立的初始資料(有些沒有)的目錄都有一個相應的.dat檔案,其中包含其以可編輯格式的初始資料 。這些.dat檔案裡都包含 Perl 資料結構文字 。這些文字被求值以生成記憶體中的資料結構。當用上邊的方法獲取了可使用的OID後,就可以在此類.dat檔案裡定義函式初始資料的格式以及其OID了。

1675051923429.png

二、測試

如下我們做個測試

透過上邊指令碼我們已經能夠看到111這個OID是沒有被使用的。

而我們查詢原本資料庫裡的pg_backend_pid 函式,其對應的OID為2026 ,我們接下來對此係統內建函式的OID進行修改。

1675056781468.png

直接檢視src/include/catalog下的pg_proc.dat裡。資料庫裡的系統表裡關於pg_backend_pid 的OID和其是能對應上的。

1675056831316.png

此時我們修改此條記錄,將2026修改為111。並且儲存退出。

重新編譯,並且initdb到一個新的路徑。啟動資料庫

[xmaster@mogdb-kernel-0005 postgresql-14.1]$ ./configure --prefix=/home/xmaster/pg_oids
[xmaster@mogdb-kernel-0005 postgresql-14.1]$ make -j 24 
[xmaster@mogdb-kernel-0005 postgresql-14.1]$ make install -j 24
[xmaster@mogdb-kernel-0005 postgresql-14.1]$ cd /home/xmaster/pg_oids/bin
[xmaster@mogdb-kernel-0005 bin]$ ./initdb -D /data/ysl_oids/data
修改完埠後,啟動資料庫
[xmaster@mogdb-kernel-0005 bin]$ pg_ctl start -D /data/ysl_oids/data/

此時,pg_backend_pid 這個函式的OID已經被改成了我定義的111。

1675057231955.png

然後再檢視我初始化使用的安裝包的裡的unused_oids指令碼,發現2026已經成為未被使用的狀態,而111已經從這個結果裡消失了。因為pg_proc.dat檔案裡我進行了修改。

1675057358582.png

此篇雖然是修改了已經內建的函式的OID,但是同樣的,想建立新內建函式的時候,宣告並定義新增函式後,也可以用這個方式給函式分配對應的OID。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69990629/viewspace-2933374/,如需轉載,請註明出處,否則將追究法律責任。

相關文章