macOS Sonoma 14.2.1 (23C71),刚刚更新至 14.5 (23F79)
故事
周末,我有一个 Python 脚本 (norgis ALKIS-Import) 将大量数据导入我的 Postgres 数据库。今天我回来时,数据库仍在运行,但我无法访问它。我收到此错误消息:"base/5/2703": No such file or directory
。重新启动 Mac 后,它不再启动。
备份
我有一个带有 RAID 10 的直接附加存储,我使用 rsync shell 脚本和 LaunchAgents 进行每日和每月备份。它只是将 var-16 文件夹复制到大存储。我尝试启动每一个每日备份 (7) 和每月备份,但它们都出现相同的错误。我还有一个几周前的备份,但我遇到了同样的错误。我简直无法解释为什么我的所有备份都在我未触碰任何备份的情况下被损坏了。
我尝试过的方法
- 我在同一台 Mac 上创建了一个新的 Postgres 服务器并且它运行良好。
- 我在另一台 Mac 上运行了服务器(它存储在外部 SSD 上),但仍然收到相同的错误消息。
这是启动服务器后,postgresql.log文件中的日志输出。
2024-07-22 14:29:58.728 CEST [9382] LOG: listening on IPv6 address "::", port 5432
2024-07-22 14:29:58.728 CEST [9382] LOG: listening on IPv4 address "0.0.0.0", port 5432
2024-07-22 14:29:58.729 CEST [9382] LOG: listening on Unix socket "/tmp/.s.PGSQL.5432"
2024-07-22 14:29:58.744 CEST [9382] LOG: could not open directory "pg_tblspc/.DS_Store/PG_16_202307071/pgsql_tmp": Not a directory
2024-07-22 14:29:58.744 CEST [9382] LOG: could not open directory "pg_tblspc/.DS_Store/PG_16_202307071": Not a directory
2024-07-22 14:29:58.745 CEST [9385] LOG: database system was interrupted while in recovery at 2024-07-22 14:23:35 CEST
2024-07-22 14:29:58.745 CEST [9385] HINT: This probably means that some data is corrupted and you will have to use the last backup for recovery.
2024-07-22 14:30:03.952 CEST [9385] LOG: database system was not properly shut down; automatic recovery in progress
2024-07-22 14:30:03.966 CEST [9385] FATAL: could not open directory "pg_tblspc/.DS_Store/PG_16_202307071": Not a directory
2024-07-22 14:30:03.967 CEST [9382] LOG: startup process (PID 9385) exited with exit code 1
2024-07-22 14:30:03.967 CEST [9382] LOG: aborting startup due to startup process failure
2024-07-22 14:30:03.967 CEST [9382] LOG: database system is shut down
我也不明白为什么它要在 .DS_Store 目录中执行某些操作。这些不是由 macOS 制作和使用的吗?
编辑
如果有人知道为什么我的所有备份也都损坏了,请回答。.DS_Stores 来自哪里,为什么 postgres 会尝试对 .DS_Store 文件执行某些操作?谢谢!
因此,我的日志中目录中的某些目录/文件出现错误
pg_tblspc
:我刚刚从正常运行的服务器复制了这个文件夹并将其替换到故障服务器上。我认为发生这种情况是因为 macOS 在该文件夹中创建了一些 .DS_Store 文件。
现在它又启动并工作了!!:)
请告诉我,在进行此类“备份”时,您是否关闭了数据库(或将其置于“备份模式”)。如果您不这样做,那么您从正在运行的数据库下复制的任何内容都可能毫无用处。
请记住,PostgreSQL 所做的大部分工作都发生在正在运行的进程的内存中。您的数据只会在“某个时间”后写入磁盘,并且可以写入数据文件的任何部分。如果您的 rsync 正在读取文件,而 PostgreSQL 选择将数据写入该文件的开头,那么您的“备份”将丢失该数据。
建议:使用数据库工具执行数据库作业。