pgsql目前是最大的开源数据库,集成了mysql与mongodb的特性,并且可以实现数据零丢失,支持同步复制,异步复制,延迟复制,兼容多种数据类型json,数组,以及自定义函数等。
一. pgsql存储过程
》1. 数据块写入buffer_pool,用户执行insert,update,delete等语句时,数据更改不会立即刷新到磁盘
》2. buffer_pool预写到WAL日志,WAL日志类似于ORACLE REDO日志保证数据的一致和完整性,以追加的形式记录数据的更改
》3. WAL日志通过fsync和checkpoint,刷新到磁盘,checkpoint会以backend进程形式,将buffer_pool中的脏数据写入磁盘。
二. 如何保证数据的可靠性
pgsql的数据页大小是8K,linux文件系统页大小是4K或8K(getconf PAGE_SIZE查询),数据页大小是8K,磁盘扇区是512B,因此在数据页并发写入磁盘时每个io由于写入扇区不同,可能因为传输或硬件故障等原因导致写入失败,一部分写入,一部分未写入;
针对对数据可靠性要求较高的环境,可以通过full_page_writes和check_sum配置来保证数据的可靠性
full_page_writes:全页写,在最近一次checkpoint时会将WAL日志的数据页进行整页拷贝,这样即使在数据缺失、系统崩溃时,也可以通过WAL日志来进行完整数据页的恢复
check_sum:数据块的校验功能,对数据页进行复制,在buffer_pool进入前后会进行check sum计算,写入内存时会进行check sum并与数据页进行比对,刷盘时也会进行check_sum,其目的是保证数据的完整,一致性。
三. 如何设置check_sum
1. 在数据库初始化时
initdb -k
2. 利用pg_checksums
pg_ctl stop -D /home/pgdata #关闭服务
pg_checksums -e -P -D /home/pgdata