在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虽然也有这些信息,但却选择了保守的实现方式,因为数据库是不可能记下所有的共享的数据结构的访问信息的,那样的话,数据库将无法正常工作。
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虽然也有这些信息,但却选择了保守的实现方式,因为数据库是不可能记下所有的共享的数据结构的访问信息的,那样的话,数据库将无法正常工作。