我一直在想,如果sudo reboot
运行 Postgres(即 9.2.4)服务器,是否会导致(或肯定会)数据丢失或其他问题(例如,系统启动时无法重新启动服务器)。或者,是否会reboot
向进程发送适当的信号,使它们能够正常关闭(例如,包括允许事务完成等)。
答案1
如果您的服务器和硬件配置正确,即使您按下重置按钮、拔掉电源线或触发内核恐慌,也不会丢失数据。PostgreSQL 是碰撞安全由于其预写日志功能。
唯一一个对此有大概正确的人是评论中的“Zoredache”。
仅当出现以下情况时,您才会丢失数据:
- 您已通过设置将 PostgreSQL 配置为不崩溃安全
fsync=off
; - 您正在使用的
UNLOGGED
表不具备崩溃安全性(在这种情况下,您只会丢失未记录的表中的数据); - 底层存储系统不安全或不考虑崩溃
fsync
,就像许多廉价的消费级 SSD 一样,它们在没有适当备用电源的情况下将缓存写回易失性缓存;
我对此写了很多文章在几个月前的一篇博客文章中。
即使您使用的是廉价 SSD,通常也不会在突然重启时丢失数据,除非您的系统确实断电。不过,我见过一些系统在重置时对磁盘进行电源循环,如果使用廉价 SSD,这些系统就会丢失数据。
对于 PostgreSQL 来说,“干净”关闭几乎是可选的;突然重启的唯一缺点是数据库可能需要更长的时间才能启动,因为在恢复期间应用预写日志需要时间,并且(根据文档)UNLOGGED
表将被截断。
即使在所谓的“干净”关闭中,大多数 init 脚本也只会等待一段有限的时间让服务器关闭。大多数 init 脚本使用“快速”关闭模式,该模式将中止当前事务、拒绝新会话并快速但干净地关闭服务器。如果时间太长,它们通常会超时并关闭,这实际上依赖于 PostgreSQL 的崩溃安全性。
如果您希望允许当前事务完成,则需要在关闭系统之前手动执行“智能”关闭,或修改 init 脚本以使用它。智能关闭并不总是很有用,因为一个长时间运行或放弃的连接可能会导致整个服务器无限期关闭,使其停留在那里拒绝所有连接。它很有用,可以作为您运行一分钟或在快速关闭之前进行的首次尝试。
碰撞安全不能成为不进行备份和测试的借口。
答案2
它应该正常关闭它和所有正在运行的服务。备份并测试!
答案3
reboot
是正常关机。/reboot -f
是reboot --force
数据杀手。