在PostgreSQL中不开归档?恭喜你!锅你背定了
作者:mmseoamin日期:2024-02-05

📢📢📢📣📣📣

哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10余年DBA及大数据工作经验

一位上进心十足的【大数据领域博主】!😜😜😜

中国DBA联盟(ACDU)成员,目前服务于工业互联网

擅长主流Oracle、MySQL、PG、高斯及Greenplum运维开发,备份恢复,安装迁移,性能优化、故障应急处理等。

✨ 如果有对【数据库】感兴趣的【小可爱】,欢迎关注【IT邦德】💞💞💞

❤️❤️❤️感谢各位大可爱小可爱!❤️❤️❤️

文章目录

    • 📣 1.PG归档优势
    • 📣 2.在线日志(pg_wal)
    • 📣 3.如何开归档
    • 📣 4.清理归档
      • ✨ 4.1 手动清理
      • ✨ 4.2 归档策略脚本
      • 📣 5.总结

        PostgreSQL归档具有安全、高效、可靠的归档能力,并具有跨平台、语言兼容,和社区支持的优势。

        📣 1.PG归档优势

        PostgreSQL归档实现了数据库抽离,提供完善的安全性和保护性,并可提供归档数据的只读性,能有效地避免归档数据造成的服务器资源浪费。另外,PostgreSQL归档具有在原始数据库系统的接口上的便捷性及快速性,归档过程不会出现过多处理延迟,在生产环境来说,这个优势是十分可观的。

        PostgreSQL归档完全兼容多种操作系统,可以在Windows、Mac、Linux、iPhone等等操作系统上使用,归档后的数据也可以被多种形式的软件读取,使企业更为便利的在网络环境中使用数据

        在PostgreSQL中不开归档?恭喜你!锅你背定了,第1张

        📣 2.在线日志(pg_wal)

        在开启归档日志前,我们先聊聊pg_wal日志

        事务日志是数据库的重要组成部分,存储了数据库系统中所有更改和操作的历史,以确保数据库不会因为故障(例如掉电或其他导致服务器崩溃的故障)而丢失数据。在PostgreSQL中,事务日志文件称为Write Ahead Log(以下简称WAL),相当于oracle中的redo日志。

        在PostgreSQL中不开归档?恭喜你!锅你背定了,第2张

        ##切日志的方式
        postgres=# select pg_switch_wal();
         pg_switch_wal 
        ---------------
         0/15679F0
        (1 row)
        ##pg_wal日志的位置
        jmedb=# select * from pg_ls_waldir();
        位置在:cd $PGDATA/pg_wal
        postgres=# select name,setting from pg_settings where name in ('max_wal_size','min_wal_size');
             name     | setting
        --------------+---------
         max_wal_size | 1024
         min_wal_size | 80
         
        如果超过了max_wal_size,那么就会删除不需要的wal。
        如果开启了归档,那么归档成功了,才会被清除,所以这里注意一下,
        如果你开启了归档,但是归档命令是失效的,
        那么wal目录会一直增长,
        不会自动删除WAL,会使得此目录被撑爆。
        postgres=# show archive_timeout;
        在PostgreSQL.conf 文件中的参数archive_timeout,
        如果设置archive_timeout=60s,
        意思是,wal日志60s切换一次,同时会触发日志归档。
        注:尽量不要把archive_timeout设置的很小,
        如果很小,会很消耗归档存储,
        因为强制归档的日志,即使没有写满,
        也会是默认的16M(假设wal日志写满的大小为16M)
        

        📣 3.如何开归档

        ## 查看是否有归档,默认是关闭的
        postgres=# show archive_mode;
         archive_mode
        --------------
         off
        (1 row)
        

        –配置归档

        在数据库服务器上创建该路径

        mkdir -p /postgresql/archive

        chown -R postgres.postgres /postgresql/archive

        –添加开启归档参数

        cat >> /postgresql/pgdata/postgresql.conf <<“EOF”

        wal_level=‘replica’

        archive_mode=‘on’

        archive_command=‘test ! -f /postgresql/archive/%f && cp %p /postgresql/archive/%f’

        restore_command=‘cp /postgresql/archive/%f %p’

        max_wal_senders=10

        wal_keep_size=128M

        wal_sender_timeout=60s

        EOF

        –参数说明

        wal_level:

        默认是replica,这种模式支持复制和wal归档,同时支持备库只读查询。

        minimal:除了实例crash恢复需要的记录,其他不记录,

        logic:在replica的基础上增加一些信息以支持逻辑解码

        archive_command:

        当启用archive_mode时,通过设置archive_command将已完成的WAL段发送到归档存储。

        除了off,disable,还有两种模式:on,always。

        在正常操作期间,两种模式之间没有区别,但是当设置为always的情况下,

        WAL archiver在存档恢复或待机模式下也被启用。

        在always模式下,从归档还原或流式复制流的所有文件都将被归档(再次)。

        archive_mode和archive_command是单独的变量,

        因此可以在不更改存档模式的情况下更改archive_command。

        此参数只能在服务器启动时设置。

        当wal_level设置为minimal时,无法启用archive_mode。

        max_wal_senders:

        指定wal日志发送进程的最大并发连接数

        wal_sender_timeout:

        中断那些停止活动超过指定毫秒数的复制连接

        –重启PG数据库

        pg_ctl restart

        pg_ctl status

        --切换归档
        postgres=# select * from pg_stat_get_archiver();
        postgres=# select pg_switch_wal();
        SELECT * FROM pg_stat_archiver;
        

        在PostgreSQL中不开归档?恭喜你!锅你背定了,第3张

        在PostgreSQL中不开归档?恭喜你!锅你背定了,第4张

        📣 4.清理归档

        如果开启了归档,那么归档成功了,才会被清除,所以这里注意一下,如果你开启了归档,但是归档命令是失效的,那么wal目录会一直增长,不会自动删除WAL,会使得此目录被撑爆。

        ✨ 4.1 手动清理

        1)读取控制文件,找到能清理的xlog范围

        pg_controldata $PGDATA

        在PostgreSQL中不开归档?恭喜你!锅你背定了,第5张

        表示000000010000000000000009之前的文件可以删除

        2)通过pg_archivecleanup清理

        pg_archivecleanup -d $PGDATA/pg_wal 000000010000000000000009

        ✨ 4.2 归档策略脚本

        这次分享的策略是使用一个shell脚本来管理归档:
        在postgres家目录下,分别创建bin,log目录。bin目录存放此脚本,log则记录执行日志
        归档策略是 在/data下的 archivedir中,按日期为名归档日志,保留20天。20天前的自动删除
        archive_command参数的配置为:
        archive_command ='/bin/bash /home/postgres/bin/pg_archive.sh %p %f'
        --脚本内容
        #!/bin/bash
        source /home/postgres/.bash_profile
        DATE=`date +%Y%m%d`
        DIR="/data/archivedir/$DATE"
        BACK="/data/archivedir/"`date -d '-20 day' +%Y%m%d`
        if [ -d "$BACK" ]; then
                  rm -rf $BACK
                  echo "success rm $BACK" > /home/postgres/logs/pg_archive_logs
        else
                echo "the old backup file not exists!" > /home/postgres/logs/pg_archive_logs
        fi
        (test -d $DIR || mkdir -p $DIR) && cp $1 $DIR/$2
        

        📣 5.总结

        PostgreSQL归档具有安全、高效、可靠的归档能力,并具有跨平台、语言兼容,和社区支持的优势,无论是个人开发用户还是企业用户,可以根据自身的需要,合理利用PostgreSQL来优化业务逻辑,提升数据备份安全性以及归档时间弹性。