pg_basebackup和pg_dump命令都是PostgreSQL中常用的备份工具,但它们备份数据的方式和一致性时间点存在显著性差异。本文就用实例给大家分享一下这个差异。
首先创建测试表并插入测试数据:
create table test (id int primary key,t text);insert into test select generate_series(1,30000000),md5(random()::text);create table t1 (id int primary key,t text,method text);insert into t1 values (1,'zqcs','pg_basebackup') ,(2,'zqcs','pg_dump');
此时t1表数据如下:
postgres=# select * from t1;id | t | method----+---------+---------------1 | csudata | pg_basebackup2 | zqcs | pg_dump
pg_basebackup工具备份
pg_basebackup -h 127.0.0.1 -p 5432 -U postgres -D data/basebackup/ -Fp -Xs -v -P
在备份的过程中对数据库进行写操作:
update t1 set t = 'csudata' where id = 1;
pg_ctl start -D data/basebackup/ -o '-p 5433'
postgres=# select * from t1;id | t | method----+---------+---------------2 | zqcs | pg_dump1 | csudata | pg_basebackup
示例:
pg_basebackup -h 127.0.0.1 -p 5432 -U postgres -D data/basebackup-notcommit/ -Fp -Xs -v -P
begin;update t1 set t = 'csudata-notcommit' where id = 1;
postgres=# select * from t1;id | t | method----+---------+---------------2 | zqcs | pg_dump1 | csudata | pg_basebackup
pg_dump工具备份
pg_dump -h 127.0.0.1 -p 5432 -U postgres -d postgres -f postgres_dump.sql
update t1 set t = 'csudata' where id = 2;
psql -p 5434 -f postgres_dump.sql
postgres=# select * from t1;id | t | method----+---------+---------------2 | zqcs | pg_dump1 | csudata | pg_basebackup
原因分析:
出现上述数据一致性的差异的原因如下:
pg_basebackup 工具会复制整个数据目录,包括表空间、配置文件等,并且在备份过程中会记录和复制所有的WAL文件,以确保备份数据的一致性。这意味着 pg_basebackup 的备份数据不仅包括备份开始时的状态,还包括备份期间的所有更改,即pg_basebackup备份数据的一致性时间点是备份结束的时候。
而pg_dump 工具则是导出数据库中的所有对象(如表、视图、函数等)及其数据,并生成一个包含创建这些对象和插入数据的SQL脚本。这种备份方式基于备份开始时的事务快照,因此它反映的是备份开始时的数据状态,即pg_dump备份数据的一致性时间点是备份开始的时候。
点击关注乘数科技
扫码添加乘数小助手微信号
邀您进入《PostgreSQL修炼之道:从小工到专家》
读者技术交流群

文章转载自中启乘数,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




