Postgres 資料表檔案儲存位置

2021-09-24 15:46:05 字數 1555 閱讀 5185

背景:前端時間,測試的時候發現資料庫所在的伺服器磁碟佔用量瘋狂的增加。就去檢視了是什麼原因。足夠定位到是資料庫表的問題。問題來了,以前只知道資料庫的表是以檔案的形式存在的。其他都不知道,所以花了很多時間來初步了解。

initdb 的時候會指定乙個 pgdata 目錄,這就是 postgresql 儲存資料的地方。典型的位置是在 /postgres/data a 。pgdata 下面各項儲存的內容大概是:

檔案或目錄名

儲存內容

pg_version

postgresql 例項的版本號如 9.3 之類的

base

每個 database 會在 base 目錄下有乙個子目錄

global

postgres 自己的 meta 資料庫存放的地方(全域性 db)

pg_xlog

wal(write ahead log 預寫式日誌)存放的地方

其他其他不知道幹啥的目錄還有好多

base 目錄是最重要的乙個目錄,放的是每乙個 database 的資料。base 目錄裡的每乙個數字目錄對於乙個 database 的 oid, 可以通過 檢視 pg_database 這張表檢視每乙個 資料庫的 oid 。

可以看到 oid和資料夾的名稱是對應的。

每一張表的資料(大部分)又是放在 base/(oid)/(relfilenode) 這個檔案裡面:

select relname, relowner, relfilenode from pg_class where relowner =10;

--或者可以加入表名稱的過濾

可以知道 pg_statistic 存在 11867 檔案中

當然實際的儲存不會這麼簡單。每一張表的檔案都會有一些附加的儲存檔案,如檔名後加上 _fsm 的是空閒空間對映表 (free space map)。另外 base/(dboid)/(relfilenode) 這個檔案超過 1gb 以後,postgres 會把這個檔案拆分成不超過 1g 的多個檔案,檔案末尾加上 .1 .2 .3 … 做編號。 如 24589 24589.1 24589.2 。據說這是因為某些檔案系統支援的最大檔案大小有限制(如 fat32 只支援最大 4g )的檔案。

postgres匯入表資料

1.psql h localhost d p2pvpn server u openfire 連線某個指定的資料庫 2.copy statsconnection statsnodes,relayconns,directconns,timestamp year month day hour minute...

Postgres儲存樹形資料

碰到乙個樹形資料需要儲存再資料控制,碰到以下兩個問題 為了更加簡單一些,我們將使用一下資料 section a section a.1 section b section b.1 section b.1 section b.1.1當設計自引用表 有時候自己join自己 最簡單明瞭的就是有乙個pare...

MySQL資料表儲存特殊字元

1.應用場景 有時,需要向資料庫中儲存一些特殊字元,需要先進行特殊處理,如轉義處理等,避免資料儲存出錯。2.學習 操作 環境 mysql mariadb 具體版本號沒記住,也是較新的版本 2.1.向資料表中插入如下資料 insert into mc common info path version ...