我的 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
如果数据库不存在的话,将会创建数据库。
使用 时-C
,postgres
可以将其替换为系统上的任何现有数据库;它仅用于初始连接,但不会触及数据库本身。(如果没有-C
,则需要输入要还原到的现有数据库。)
-c
将在创建任何现有对象(例如数据库、表等)之前将其删除。这可确保生成的数据库准确包含备份中的内容,而不会包含您要恢复到的数据库中的任何残留内容。
--if-exists
-c
如果某些对象在数据库中尚不存在,则使用时可防止出现(无害但令人困惑的)错误消息。