广告
返回顶部
首页 > 资讯 > 前端开发 > node.js >PostgreSQL pg_filenode.map文件介绍
  • 677
分享到

PostgreSQL pg_filenode.map文件介绍

2024-04-02 19:04:59 677人浏览 薄情痞子
摘要

今天在网上看到有人问误删pg_filenode.map该如何恢复或者重建,解决这个问题前我们先来了解下pg_filenode.map文件。 对于postgresql中的每张表在磁盘上

今天在网上看到有人问误删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			mapfilenode;	
} RelMapping;
typedef struct RelMapFile
{
	int32		magic;			
	int32		num_mappings;	
	RelMapping	mappings[MAX_MAPPINGS];
	pg_crc32c	crc;			
	int32		pad;			
} RelMapFile;

接着我们来具体看看这个文件里面存放的内容是什么样的:

如上图所示,可以将该文件分为四个部分。

第一部分:2717 0059,表示文件头魔法数据字。

#define RELMAPPER_FILEMAGIC0x592717

第二部分: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算法对文件名计算得出:

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内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: PostgreSQL pg_filenode.map文件介绍

本文链接: https://www.lsjlt.com/news/167719.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • PostgreSQL pg_filenode.map文件介绍
    今天在网上看到有人问误删pg_filenode.map该如何恢复或者重建,解决这个问题前我们先来了解下pg_filenode.map文件。 对于PostgreSQL中的每张表在磁盘上都有与之相关的文件,而这些文件的名字便...
    99+
    2022-09-16
  • PostgreSQL pg_filenode.map文件介绍
    今天在网上看到有人问误删pg_filenode.map该如何恢复或者重建,解决这个问题前我们先来了解下pg_filenode.map文件。 对于PostgreSQL中的每张表在磁盘上...
    99+
    2022-11-13
  • postgresql——运算符介绍
    postgresql的内部运算符很丰富,主要有四大类,分别是:算术运算符、比较运算符、逻辑运算符、位操作运算符。如下:①:算术运算符: 用于各类数值运算,包括加(+)减(-) 乘(*)除(/)求余...
    99+
    2022-10-18
  • postgresql——数学函数介绍
    1、数学函数   数学函数主要用来处理数值数据,主要的数学函数有:绝对值函数、三角函数(包括正弦函数、正切函数、余切函数等)、对数函数、随机数函数等。在有错误产生时,数学函数会返回空值n...
    99+
    2022-10-18
  • Linux文件系统介绍
    一、简介 文件系统就是分区或磁盘上的所有文件的逻辑集合。 文件系统不仅包含着文件中的数据而且还有文件系统的结构,所有linux 用户和程序看到的文件、目录、软连接及文件保护信息等都存储在其中。 不同L...
    99+
    2022-06-05
    Linux 文件系统
  • Pythonwheel文件详细介绍
    目录1. wheel介绍2. wheel的类型3. 创建wheel4. 导入使用wheel1. wheel介绍 .whl文件(WHL file)也称为轮子(wheel),这是用于py...
    99+
    2022-11-11
  • Dockerfile文件详细介绍
    目录一. dockerfile的介绍1.1 关于dockerfile1.2 dockerfile文件的组成部分1.3 dockerfile的执行二. docker bulid 命令的...
    99+
    2023-05-15
    Dockerfile文件详解 Dockerfile文件
  • AndroidTextView文本控件介绍
    目录讲解基础属性介绍后台调用总结讲解         TextView作为Android最基础也是最常...
    99+
    2022-11-12
  • SQLServer中的文件和文件组介绍
    文件和文件组简介 在SQL Server中,数据库在硬盘上的存储方式和普通文件在Windows中的存储方式没有什么不同,仅仅是几个文件而已。SQL Server通过管理逻辑上的文件组...
    99+
    2022-11-13
  • PostgreSQL中的数组简单介绍
    本篇内容介绍了“PostgreSQL中的数组简单介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!假设你在...
    99+
    2022-10-18
  • AnalyticDB for PostgreSQL 6.0 新特性介绍
    阿里云 AnalyticDB for PostgreSQL 为采用MPP架构的分布式集群数据库,完备支持SQL 2003,部分兼容Oracle语法,支持PL/SQL存储过程,触发器,支持标准数据库事务ACID。ADB PG通过行存储、列存储...
    99+
    2023-06-03
  • ubuntu安装postgresql和用法介绍
    这篇文章主要介绍“ubuntu安装postgresql和用法介绍”,在日常操作中,相信很多人在ubuntu安装postgresql和用法介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”ubuntu安装pos...
    99+
    2023-06-13
  • Android init.rc文件简单介绍
    Android init.rc文件简单介绍 init.rc脚本是由Android中linux的第一个用户级进程init进行解析的。 init.rc 文件并不是普通的配置文件,而...
    99+
    2022-06-06
    init Android
  • 文件传输协议介绍
    文件传输协议介绍文件传输协议是一种极为普遍的档案分享服务,让你可以将你的档案从储存装置传送到ASUSTOR NAS。ASUSTOR NAS 所支援的文件传输协议可分为:CIFS (网络文件共享系统)通常是指 SMB,SAMBA 或 Wind...
    99+
    2023-06-03
  • PostgreSQL工具pgAdmin的介绍及使用
    目录1. pgAdmin的介绍2. pgAdmin的使用1. pgAdmin的介绍 pgAdmin 4是一款专门针对PostgreSQL数据库的客户端管理软件,该版本在pgAdmin 3的基础上做了较大的架构变化,由之前...
    99+
    2022-07-14
    pgAdmin使用
  • PostgreSQL生成列实现过程介绍
    目录示例Stored vs Virtual限制说明PostgreSQL中生成列是从其他列计算而来的特殊列。生成列与普通列不同,不是固定的值,而是又引用表中其他列的表达式决定的。生成列在SQL标准(ISO/IEC 9075...
    99+
    2023-01-12
    PostgreSQL生成列 PostgreSQL生成的列
  • zabbix配置文件作用介绍
    一、配置文件类型 zabbix_server配置文件:zabbix_server.conf zabbix_proxy配置文件:zabbix_proxy.conf zabbix-agentd配置文件:zabb...
    99+
    2022-10-18
  • Linux文件管理方法介绍
    文件简介 用户通过Shell与linux内核交互。Shell是一个命令行解释工具(是一个软件),它将用户输入的命令转换为内核能够理解的语言(命令)。Linux下,很多工作都是通过命令完成的,学好Linux,首先要掌握常用...
    99+
    2022-06-05
    Linux 文件管理
  • C#文件路径Path类介绍
    Path类 以帮助在程序中管理文件和目录路径。 Path类位于System.IO命名空间,是一个静态类,可以用来操作路径的每一个字段,如驱动器盘符、目录名、文件名、文件扩展名和分隔符...
    99+
    2022-11-13
  • ASP.NETCore中的静态文件介绍
    静态文件(HTML,CSS,图片和Javascript之类的资源)会被ASP.NET Core应用直接提供给客户端。 静态文件通常位于网站根目录(web root) <cont...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作