Postgres 是否会在长时间内写入未更新文件系统时间戳的表?

Postgres 是否会在长时间内写入未更新文件系统时间戳的表?

我正在运行 Postgres 9.6,并偶尔通过停止集群并rsync在文件级别使用来备份它。有一天,我意识到一些旧的、已经备份的表文件仍然具有与源中相同的文件大小和时间戳,但rsync尝试备份它们,因为这些文件的内容没有改变。重要的是要注意,关于源中的时间戳,文件几天甚至几周都没有改变。rsync使用校验和并计算相关文件的 MD5 哈希值也会显示不同的哈希值。以下是一个例子:

备份:

a1171645dc187c498ce05a25b0e5157f  2613.13

-rw------- 12 109 119 1073741824 May 21 04:58 2613.13

生产:

f02c1c2724714af2c5c08f8b67ab0f11  2613.13

-rw------- 1 postgres postgres 1073741824 Mai 21 04:58 2613.13

大小和时间戳完全相同的文件,但内容实际上不同。使用rsync校验和后,备份中的文件仍然具有相同的大小和时间戳,但内容是新的,因为这次计算出的哈希值与生产中的相同。

该文件属于pg_largeobject该表,并且该表包含大量数据,因此命名了后缀。序列中的大多数文件都有像上面那样的旧时间戳,超过几天没有任何写入,并且并非全部备份,并且具有与我的备份相同的 MD5 哈希值。只有少数文件偶尔会有所不同,就像示例中的文件一样。

从以下非常旧的数据文件来看,大多数在几天/几周内都没有变化,例如 2613.13由于不同的校验和而被转移,而2613.10没有:

-rw------- 1 postgres postgres 1073741824 Jun  4 04:40 2613
-rw------- 1 postgres postgres 1073741824 Mai 21 04:42 2613.1
-rw------- 1 postgres postgres 1073741824 Mai 21 04:56 2613.10
-rw------- 1 postgres postgres 1073741824 Mai 21 04:57 2613.11
-rw------- 1 postgres postgres 1073741824 Mai 21 04:57 2613.12
-rw------- 1 postgres postgres 1073741824 Mai 21 04:58 2613.13
-rw------- 1 postgres postgres 1073741824 Mai 21 04:59 2613.14
-rw------- 1 postgres postgres 1073741824 Mai 28 04:40 2613.15
-rw------- 1 postgres postgres  686645248 Jun  4 04:42 2613.16
-rw------- 1 postgres postgres 1073741824 Mai 21 04:44 2613.2
-rw------- 1 postgres postgres 1073741824 Mai 21 04:46 2613.3
-rw------- 1 postgres postgres 1073741824 Mai 21 04:47 2613.4
-rw------- 1 postgres postgres 1073741824 Mai 21 04:49 2613.5
-rw------- 1 postgres postgres 1073741824 Mai 21 04:50 2613.6
-rw------- 1 postgres postgres 1073741824 Mai 21 04:52 2613.7
-rw------- 1 postgres postgres 1073741824 Mai 21 04:53 2613.8
-rw------- 1 postgres postgres 1073741824 Jun  4 04:40 2613.9
-rw------- 1 postgres postgres    4407296 Jun  4 04:42 2613_fsm
-rw------- 1 postgres postgres     548864 Jun  4 04:42 2613_vm

由于pg_largeobject我们实际上偶尔会从数据库中删除大型对象,因此 Postgres 完全可以重复使用现有文件,这符合预期。但我的所有测试都表明,在写入期间,这些文件的时间戳实际上已更新,并没有保留或重置太多过去的内容。我们使用的文件系统是 ext4,因此一般来说时间戳不会有问题。

这让我感到疑惑:如果 Postgres 没有将时间戳重置为过去或由于某种原因以某种方式冻结它们,这听起来就像是我的备份中的数据损坏。

那么,Postgres 中是否有这样的功能,在不改变文件系统中文件时间戳的情况下写入数据?

由于没有得到回复,我向Postgres 邮件列表也一样。

答案1

这可能不是 Postgres 的功能,而是文件系统的“noatime”挂载选项,通常用于提高磁盘性能。

相关内容