暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

pg_dump和pg_basebackup备份的数据一致性时间点差异

中启乘数 2024-10-21
219

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_basebackup
      2 | 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_basebackup备份完成后,启动该备份数据库实例:
            pg_ctl start -D data/basebackup/ -o '-p 5433'
            进入数据库内查询测试表数据,查询结果显示在执行pg_basebackup备份数据时进行的写操作会记录在备份里的WAL日志里,恢复时会应用到数据文件里。
              postgres=# select * from t1;
              id | t | method
              ----+---------+---------------
              2 | zqcs | pg_dump
              1 | csudata | pg_basebackup
              值得注意的是当写操作未提交时,虽然写操作会记录在WAL日志中,但在恢复时不会被应用到数据文件。

              示例:

                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;
                  份恢复后,查询t1表:
                    postgres=# select * from t1;
                    id | t | method
                    ----+---------+---------------
                    2 | zqcs | pg_dump
                    1 | 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;
                        另起一个数据库实例使用5434端口,把postgresql_dump.sql导入该数据库实例
                          psql -p 5434 -f postgres_dump.sql
                          查看t1表,查询结果显示在执行pg_dump备份数据时进行的写操作不会记录在备份里。
                            postgres=# select * from t1;
                            id | t | method
                            ----+---------+---------------
                            2 | zqcs | pg_dump
                            1 | csudata | pg_basebackup


                            原因分析:

                            出现上述数据一致性的差异的原因如下:

                            pg_basebackup 工具会复制整个数据目录,包括表空间、配置文件等,并且在备份过程中会记录和复制所有的WAL文件,以确保备份数据的一致性。这意味着 pg_basebackup 的备份数据不仅包括备份开始时的状态,还包括备份期间的所有更改,即pg_basebackup备份数据的一致性时间点是备份结束的时候。

                            而pg_dump 工具则是导出数据库中的所有对象(如表、视图、函数等)及其数据,并生成一个包含创建这些对象和插入数据的SQL脚本。这种备份方式基于备份开始时的事务快照,因此它反映的是备份开始时的数据状态,即pg_dump备份数据的一致性时间点是备份开始的时候

                            点击关注乘数科技

                            扫码添加乘数小助手微信号

                            邀您进入《PostgreSQL修炼之道:从小工到专家》

                            读者技术交流群

                             

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

                            评论