1.重建数据目录

1.重建数据目录

我的 PostgreSQL 数据库似乎在一次非正常关机后遭到损坏,现在我不知道如何将其从恢复模式中恢复出来。由于数据库更新频率不高,所以最后一次已知的良好夜间备份应该有数据的最新副本。

跑步

sudo -u postgres pg_restore /path/to/backup.post

只是在控制台上转储一长串 SQL 命令,但没有其他事情发生。

由于怀疑数据损坏,我简单地将整个data_directory(如 中所述/etc/postgresql/9.6/main/postgresql.conf)移动到了不同的路径。现在我想知道如何重新创建数据目录的“原始”版本,然后我可以在其中恢复备份。我重新创建了路径并将其所有者设置为postgres:postgres,但尝试重新启动 PostgreSQL、重新运行pg_restore甚至dpkg_reconfigure似乎都不起作用——目录仍然是空的。

丢弃损坏的 PostgreSQL data_directory、用新的替换它并恢复上次已知的良好备份的正确程序是什么?

操作系统是 Raspbian 9。

答案1

如果不使用pg_restore-d $DATABASE选项,则只会将恢复数据库的命令打印到标准输出,但实际上不会触及任何数据库。

1.重建数据目录

重建数据目录的命令是initdb。完整命令:

sudo -u postgres /usr/lib/postgresql/9.6/bin/initdb $DB_PATH

这是针对 PostgreSQL 9.6 的;对于任何其他版本,您都需要更改路径中的版本号并确保路径initdb仍然正确。

$DB_PATH是您的数据目录的路径。

请参阅手册页以了解更多选项,例如设置不同的语言环境或指定凭据。

在我的例子中,引导数据库因段错误而终止,这表明所涉及的二进制文件(或脚本)损坏。所以我不得不运行

sudo apt-get install --reinstall postgresql postgresql-9.6 postgresql-client postgresql-client-9.6 postgresql-client-common postgresql-common postgresql-contrib-9.6

从头开始重新安装与 PostgreSQL 相关的二进制文件。(如果您不确定要重新安装哪些软件包,请运行dpkg -l | grep postgres并重新安装那里列出的所有内容。)

2. 恢复数据

sudo -u postgres pg_restore -C -c --if-exists -d postgres /path/to/backup.post

-C如果数据库不存在的话,将会创建数据库。

使用 时-Cpostgres可以将其替换为系统上的任何现有数据库;它仅用于初始连接,但不会触及数据库本身。(如果没有-C,则需要输入要还原到的现有数据库。)

-c将在创建任何现有对象(例如数据库、表等)之前将其删除。这可确保生成的数据库准确包含备份中的内容,而不会包含您要恢复到的数据库中的任何残留内容。

--if-exists-c如果某些对象在数据库中尚不存在,则使用时可防止出现(无害但令人困惑的)错误消息。

相关内容