我在通过 psql 连接到数据库时遇到问题。我收到此错误:
postgres@server:/var/lib/pgsql # psql -d aisgdmp2
psql: error: FATAL: database "aisgdmp2" does not exist
DETAIL: The database subdirectory "pg_tblspc/16385/PG_13_202007201/16386" is missing.
postgres@server:/var/lib/pgsql #
但是当我连接到 posgtres 并列出数据库时,aisgdmp2 数据库存在......
postgres@server:/var/lib/pgsql # psql
psql (13.5)
postgres=# \l
DB list
Name | Owner | Code | Collation | CType | Privileges
-----------+----------+----------+-------------+-------------+-----------------------
aisgdmp2 | aisg | UTF8 | cs_CZ.UTF-8 | cs_CZ.UTF-8 | =Tc/aisg +
| | | | | aisg=CTc/aisg
postgres | postgres | UTF8 | cs_CZ.UTF-8 | cs_CZ.UTF-8 |
template0 | postgres | UTF8 | cs_CZ.UTF-8 | cs_CZ.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | cs_CZ.UTF-8 | cs_CZ.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
(4 rows)
postgres=#
知道问题出在哪里吗?该数据库过去一直在运行,但过去两个月一直处于停机状态。
重要的错误是:
要修复缺少表空间的现有数据库,您可能需要从转储文件中恢复数据库。行业标准术语称为数据库备份。PostgreSQL 将其称为转储文件。
为避免丢失其中的内容,您可以在别处安装另一个 Postgres 实例并创建一个同名数据库,然后使用第一个链接从坏数据库的转储文件中恢复它作为测试,直到成功为止。或者使用第二个链接恢复一个与转储文件不同名称的数据库。
看看这些:
https://helicaltech.com/solve-pg_tblspc-problem-postgres/
https://stackoverflow.com/questions/19223522/how-to-restore-postgres-database-into-another-database-name
检查表空间目录应位于何处:
或通过
pg_tblspc
目录中的符号链接:之后检查此文件系统是否已挂载,目录是否存在且不为空。分区可能由于某种原因没有自动挂载(例如,
fstab
根本没有添加或更改了块设备的名称)。修复错误后,数据可能再次可用 - 自 postgresql 启动以来,表空间中的数据在数据库关闭时处于一致状态。但如果表空间丢失,那么所有数据也将丢失。