0%

Postgresql-WAL日志

WAL(Write Ahead Log),类似oracle中的redo log,作用是保证数据的一致性和事务的完整性,防止系统崩溃时最近的事务无法恢复;不同点是,可以关闭WAL来提高保存性能,但可用性会降低。

WAL信息一般记录在pg_xlog文件中,默认大小是16M,源码安装时可以更改其大小。这些信息通常是名字类似’000000010000000000000013’这样的文件。

WAL相关的参数:

  • fsync
    控制日志是否先写入磁盘,默认是ON,更新数据吸入磁盘时系统必须等待WAL的写入完成。如果配置为OFF,则不用等待WAL写入,节省时间,提高性能,但也失去了崩溃时恢复的能力。
  • synchronous_commit
    是否等待WAL完成后才返回给用户事务的状态信息,默认为ON。因为只是控制事务的状态反馈,与事务本身无关,不影响数据的一致性。
  • wal_sync_method
    WAL写入磁盘的控制方式,默认值是fsync,可选值有open_datasync,fdatasync,fsync_writethrough,fsync,open_fsync,一般采用默认值即可。
  • full_page_writes
    是否将整个page写入WAL,默认是ON。内存中的整个page中包含更新提交的也包含没有提交的,没有提交的部分如果不写入WAL,介质恢复时会丢失。也就是说postgresql中没有undo文件,也会写入到WAL文件中。但即使不写入未提交部分,影响也不大。
  • wal_buffers
    用于存放WAL数据的内存空间,默认是64K。执行一个大的事务肯定受影响,应该适当增大该参数,但不能超过wal_segment(默认16M)。
  • wal_writer_delay
    WAL writer进程的间歇时间。默认值是200ms。准确的配置应该根据自身系统的运行状况。如果时间过长可能造成WAL buffer的内存不足;反之过小将会引起WAL的不断的写入,对磁盘的IO也是很大考验。
  • commit_delay
    表示一个已经提交的数据在WAL buffer中存放的时间,单位是ms,默认值是0,不用延迟。与wal_writer_delay参数一样,设置的目的只要为了平衡IO和事务提交的影响。IO问题不大的情况下,可以采用默认值。
  • commit_siblings
    控制正在执行事务的的数量和写入WAL的关系,也决定了commit_delay的有效性,默认值是5。即当数据库中正在执行的事务数量大于5时,后续的书屋将等待commit_delay的时间,否则将直接写入WAL。