pg_filenode.map 是一个特殊文件,它将所谓的“映射关系”(即其 filenode 未存储在 pg_class 中的关系)映射到它们的 OID。
pg_filenode.map 在 PostgreSQL 9.0 中添加。
每个数据库有一个 pg_filenode.map 文件,整个集群也有一份。
目前每个 pg_filenode.map 文件大小固定为 512 字节(旨在占用一个标准大小的磁盘扇区)以最大限度地降低更新失败的风险;相应的结构体设计为正好占用 512 字节,最多可包含 62 个条目(MAX_MAPPINGS),每个条目 8 字节。
typedef struct RelMapping
{
Oid mapoid; /* OID of a catalog */
Oid mapfilenode; /* its filenode number */
} RelMapping;
加上文件元数据,总大小达到 512 字节。
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;
更多详细信息,请参见 src/backend/utils/cache/relmapper.c。
变更历史
- PostgreSQL 9.0
- 添加于 (提交 b9b8831a)
示例
数据目录中 pg_filenode.map 文件的分布
postgres:data$ find . -name pg_filenode.map
./global/pg_filenode.map
./base/1/pg_filenode.map
./base/11787/pg_filenode.map
./base/11788/pg_filenode.map
./base/16385/pg_filenode.map
有用链接
- filenode_map_inspect - 一个用于检查 pg_filenode.map 文件内容的扩展
- PostgreSQL 数据恢复 (Dimitri Fontaine) - 提到了恢复损坏的 pg_filenode.map 的可能性
- 使用 pg_hexdump 解码 pg_filenode.map 文件 (pg_filenodemapdata) - 使用 pg_hexdump
