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