Postgres 与Oracle对比(服务进程崩溃)

在Oracle数据库中,一个服务进程崩溃不会影响到其他服务进程的执行。但在Postgres中,一个服务进程崩溃后, Postmaster进程会终止所有的数据库进程,恢复数据库,然后重新打开数据库。在数据库的日志文件中会出现类似以下的信息:

LOG: terminating any other active server processes
LOG: all server processes terminated; reinitializing
LOG: database system was interrupted at 2008-09-16 22:59:34 PDT
LOG: checkpoint record is at 0/9B72A8
LOG: redo record is at 0/9B72A8; undo record is at 0/0; shutdown TRUE
LOG: next transaction ID: 538; next OID: 17143
LOG: database system was not properly shut down; automatic recovery in progress
LOG: record with zero length at 0/9B72E8
LOG: redo is not required
LOG: database system is ready



Postgres这样做并非是技术上比Oracle差,无法实现Oracle的功能,这只是开发人员选择的一种不同的实现策略。一个服务进程崩溃,基本上都是因为内部数据结构被破坏,导致指针指向了非法的地址,当该地址被访问时,操作系统发出一个SIGSEGV信号终止该进程。 Postgres数据库的多个进程通过共享内存通信,每个服务进程都可以访问和修改核心的数据结构。一个服务进程在崩溃以前可能错误地修改了某些共享的数据结构,其他的服务进程若继续执行,可能使某些数据处于不一致的状态。所以Postgres采取了最保险的实现方式,关闭数据库,恢复后重新打开。

当然对于某些核心的数据结构如锁表等,系统会记下所有服务进程对它们的访问信息,这样在服务进程出错时,可以恢复这些数据结构,这也正是Oracle的实现方式,Postgres虽然也有这些信息,但却选择了保守的实现方式,因为数据库是不可能记下所有的共享的数据结构的访问信息的,那样的话,数据库将无法正常工作。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值