 哈喽!大家好,我是【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等等操作系统上使用,归档后的数据也可以被多种形式的软件读取,使企业更为便利的在网络环境中使用数据

 2.在线日志(pg_wal)

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

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

##切日志的方式

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;

 4.清理归档

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

✨ 4.1 手动清理

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

表示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来优化业务逻辑,提升数据备份安全性以及归档时间弹性。

精彩内容

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: