删除wal文件后如何解决postgresql问题?

Sin*_*ina 6 postgresql backup checkpoint postgresql-9.1 write-ahead-logging

我在我的 postgresql 配置上打开了 archive_mode 以测试备份服务器。由于 wal 文件占用了大量磁盘空间,因此在测试后我将其关闭并删除了 wal 文件。当我尝试重新启动 postgresql 时,出现以下错误。

 root@hooshang:/etc/postgresql/9.1/main# /etc/init.d/postgresql restart
 * Restarting PostgreSQL 9.1 database server
 * The PostgreSQL server failed to start. Please check the log output:
 2014-10-16 13:15:28 IRST LOG:  database system was shut down at 2014-10-15 15:51:53 IRST
 2014-10-16 13:15:28 IRST LOG:  could not open file "pg_xlog/00000001000007DC00000037" (log file 2012, segment 55): No such file or directory
 2014-10-16 13:15:28 IRST LOG:  invalid primary checkpoint record
 2014-10-16 13:15:28 IRST LOG:  could not open file "pg_xlog/00000001000007DC00000029" (log file 2012, segment 41): No such file or directory
 2014-10-16 13:15:28 IRST LOG:  invalid secondary checkpoint record
 2014-10-16 13:15:28 IRST PANIC:  could not locate a valid checkpoint record
 2014-10-16 13:15:28 IRST LOG:  startup process (PID 17467) was terminated by signal 6: Aborted
 2014-10-16 13:15:28 IRST LOG:  aborting startup due to startup process failure
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?

Cra*_*ger 19

您通过手动删除数据目录中的文件损坏了数据库。切勿手动从数据目录中删除文件。

安全删除 WAL

如果你想删除 WAL,要么让服务器CHECKPOINT及时执行,要么使用pg_archivecleanup. 请注意,服务器会自动移除不再需要的 WAL,除非:

  • archive_mode已开启,但archive_command失败,因此服务器会不断重试存档尝试,直到成功或管理员干预;
  • 它仍然保存在 wal_keep_segments
  • (在 9.4 中)复制槽仍然需要它。

如果这些都不适用,a CHECKPOINT(自动或通过 SQL 手动发出)将删除当前不需要的所有 WAL。所以你不必手动删除它。

在不寻常的情况下,您可能需要使用pg_archivecleanup,例如在归档长时间失败后由于 WAL 累积而耗尽磁盘空间。你可能决定接受你必须重新创建你的副本,因为丢弃了它们仍然需要的 WAL 并pg_archivecleanup用来释放空间来让主节点运行。

但是您永远不应该手动删除 WAL 段。

使用存档的 WAL 进行恢复

如果您将存档的 WAL 保存在其他地方,您可能只能将文件复制回pg_xlog,或者创建一个recovery.conf带有 a的文件restore_command。有关详细信息,请参阅有关 PITR 和日志传送的手册。

在没有归档 WAL 的情况下恢复

如果您在其他地方没有这些 WAL 文件的副本,并且您有最近的备份,则应该从备份中恢复,因为您损坏了数据库。

如果您没有备份,请按照损坏 wiki 页面中的说明进行操作,并且只有在您制作了数据库当前状态的完整副本后,作为最后的手段,才可以使用pg_resetxlog丢弃事务日志并强制数据库从不完整的交易开始。

你必须然后pg_dump数据库,停止它,initdb一个新的,并恢复到它。千万不能继续使用您损坏的数据库。永远不要继续使用你用过的数据库pg_resetxlog,除非万不得已,否则不要使用它。