<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
今天在網上看到有人問誤刪pg_filenode.map該如何恢復或者重建,解決這個問題前我們先來了解下pg_filenode.map檔案。
對於PostgreSQL中的每張表在磁碟上都有與之相關的檔案,而這些檔案的名字便是relfilenode,我們可以通過pg_class的relfilenode欄位去查詢。
但是有一部分特殊的表我們會發現其對應的該欄位為0,官方檔案的解釋為:0表示這是一個“對映”關係,其磁碟檔名取決於低層狀態。那麼哪些表的relfilenode欄位會是0呢?這些relfilenode為0的表對應的檔案又該如何去查詢呢?
我們都知道對於一張普通表,其relfilenode和oid預設是一樣的,例如:
bill=# create table t(id int); CREATE TABLE bill=# select oid,relname,relfilenode from pg_class where relname = 't'; oid | relname | relfilenode -------+---------+------------- 24919 | t | 24919 (1 row)
但是當我們對該表進行了例如vacuum full、truncate之類的操作後,那麼relfilenode便會發生變化:
bill=# vacuum FULL t; VACUUM bill=# select oid,relname,relfilenode from pg_class where relname = 't'; oid | relname | relfilenode -------+---------+------------- 24919 | t | 24922 (1 row)
那麼我們再來看看那些relfilenode為0的表:
bill=# select oid, relname, relfilenode,reltablespace bill-# from pg_class bill-# where relfilenode = 0 and relkind = 'r' bill-# order by reltablespace; oid | relname | relfilenode | reltablespace ------+-----------------------+-------------+--------------- 1247 | pg_type | 0 | 0 1249 | pg_attribute | 0 | 0 1255 | pg_proc | 0 | 0 1259 | pg_class | 0 | 0 3592 | pg_shseclabel | 0 | 1664 1262 | pg_database | 0 | 1664 2964 | pg_db_role_setting | 0 | 1664 1213 | pg_tablespace | 0 | 1664 1261 | pg_auth_members | 0 | 1664 1214 | pg_shdepend | 0 | 1664 2396 | pg_shdescription | 0 | 1664 1260 | pg_authid | 0 | 1664 6100 | pg_subscription | 0 | 1664 6000 | pg_replication_origin | 0 | 1664 (14 rows)
這些表通過reltablespace欄位我們也可以發現分為兩類:一類是pg_type、pg_attribute、pg_proc和pg_class,它們是非共用的表,在核心中我們稱為Nail表。而另一類則是reltablespace為1664的,即在pg_global表空間裡的共用表。
而為什麼這些系統表的relfilenode為0呢?因為對於這種存取十分頻繁的系統表,我們不希望每次都是從一些其它的系統表去查詢,這樣效能便會非常低,它們便是通過pg_filenode.map檔案去進行管理的。
在pg_filenode.map檔案中,將這些系統表的oid與relfileno做對映,而這個檔案的大小為512,剛好是一個OS disk sector的大小。同時PG做了對齊處理,在原始碼上用RelMapFile結構體與之對應。結構體大小為:628+44=496+16=512。也就是說這個檔案最多存放62條系統catalog表的記錄。
由於這個檔案的重要性,剛好與disk sector大小對齊,減少檔案crash的機率。
typedef struct RelMapping { Oid mapoid; /* OID of a catalog */ Oid mapfilenode; /* its filenode number */ } RelMapping; typedef struct RelMapFile { int32 magic; /* always RELMAPPER_FILEMAGIC */ int32 num_mappings; /* number of valid RelMapping entries */ RelMapping mappings[MAX_MAPPINGS]; pg_crc32c crc; /* CRC of all above */ int32 pad; /* to make the struct size be 512 exactly */ } RelMapFile;
接著我們來具體看看這個檔案裡面存放的內容是什麼樣的:
如上圖所示,可以將該檔案分為四個部分。
第一部分:2717 0059,表示檔案頭魔法資料字。
#define RELMAPPER_FILEMAGIC0x592717/* version ID value */
第二部分:0011 0000,表示檔案中包含的對映物件數。我們可以通過以下SQL驗證:
剛好是17行資料,和前面0011一致。
bill=# select relname,relfilenode from pg_class where pg_relation_filepath(oid) like 'base/16385/%' and relfilenode = 0; relname | relfilenode -----------------------------------+------------- pg_toast_1255 | 0 pg_toast_1255_index | 0 pg_proc_oid_index | 0 pg_proc_proname_args_nsp_index | 0 pg_type_oid_index | 0 pg_type_typname_nsp_index | 0 pg_attribute_relid_attnam_index | 0 pg_attribute_relid_attnum_index | 0 pg_class_oid_index | 0 pg_class_relname_nsp_index | 0 pg_class_tblspc_relfilenode_index | 0 pg_attribute | 0 pg_proc | 0 pg_type | 0 pg_toast_1247 | 0 pg_toast_1247_index | 0 pg_class | 0 (17 rows)
第三部分:04eb 0000 4095 0000,這一類便是實際的對映關係04eb即物件的oid,4095表示物件的relfilenode。
第四部分:ebfa f3a4,檔案尾的校驗值,通過crc32演演算法對檔名計算得出:
/* verify the CRC */
INIT_CRC32C(crc);
COMP_CRC32C(crc, (char *) map, offsetof(RelMapFile, crc));
FIN_CRC32C(crc);
if (!EQ_CRC32C(crc, map->crc))
ereport(FATAL,
(errmsg(“relation mapping file “%s” contains incorrect checksum”,
mapfilename)));
介紹完pg_filenode.map檔案我們來回答前面的問題,如果誤刪了該檔案怎麼辦呢?
如果該檔案某個資料庫下的該檔案刪除,那麼該庫便無法連線:
pg14@vm-192-168-204-153-> psql bill bill
psql: error: connection to server on socket “/home/pg14/pgdata/.s.PGSQL.2022” failed: FATAL: could not open file “base/16385/pg_filenode.map”: No such file or directory
但是不會影響其它庫的連線:
pg14@vm-192-168-204-153-> psql postgres
psql (14.1)
Type “help” for help.
postgres=#
而如果global目錄下的該檔案誤刪,那麼所有庫均無法連線:
pg14@vm-192-168-204-153-> psql postgres
psql: error: connection to server on socket “/home/pg14/pgdata/.s.PGSQL.2022” failed: FATAL: could not open file “global/pg_filenode.map”: No such file or directory
pg14@vm-192-168-204-153-> psql bill
psql: error: connection to server on socket “/home/pg14/pgdata/.s.PGSQL.2022” failed: FATAL: could not open file “global/pg_filenode.map”: No such file or directory
因此我們可以知道,當pg_filenode.map檔案損壞或者被誤刪後,那麼至少對應的庫肯定是連線不上了,那麼我們也沒辦法手工去建立該檔案了。
不過一般來說大部分庫的這個檔案都是一樣的,很少會去對該檔案進行修改,除非你對這些系統表進行了vacuum full之類的操作。而如果你真的不幸該庫做過類似操作那該怎麼辦呢?只好先從其它庫拷貝一個檔案過來,然後pg_filedump本庫的pg_class的資料檔案看看相應的系統表的資訊,然後要注意,不要去直接修改pg_filenode.map檔案,而是要去修改資料檔案的檔名,讓其滿足pg_filenode.map中的對映關係。
為什麼呢?我們前面說過該檔案尾部有一個根據檔名進行計算的校驗值,如果直接修改pg_filenode.map檔案的話,則會提示校驗值不對:
psql: error: connection to server on socket “/home/pg14/pgdata/.s.PGSQL.2022” failed: FATAL: relation mapping file “base/16385/pg_filenode.map” contains incorrect checksum
總結:
誤刪pg_filenode.map怎麼辦?首先運氣好的話從別的庫拷貝一個該檔案,如果可用的話就可以直接使用。
而如果你的庫上該檔案中的系統表做過vacuum full之類的操作,那麼便需要通過類似pg_filedump的方式去pg_class的資料檔案中獲取相關的資訊,然後手動修改相關資料檔名讓其滿足pg_filenode.map中的對映關係。
當然該方法會很麻煩,所以還是要注意千萬別誤刪了你的pg_filenode.map!
到此這篇關於PostgreSQL pg_filenode.map檔案介紹的文章就介紹到這了,更多相關PostgreSQL pg_filenode.map內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45