pgsql的数据可靠性

2023-09-14 16:50:37 浏览数 (1)

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

0 人点赞