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

bash 复制代码
作者:IT邦德
中国DBA联盟(ACDU)成员,10余年DBA工作经验
擅长主流数据Oracle、MySQL、PG、openGauss运维
备份恢复,安装迁移,性能优化、故障应急处理等

可提供技术业务:
1.DB故障处理/疑难杂症远程支援
2.Mysql/PG/Oracle/openGauss
数据库部署及数仓搭建

公众号:IT邦德
•••

@TOC

前言

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


1.PG归档优势

PostgreSQL归档实现了数据库抽离,提供完善的安全性和保护性,并可提供归档数据的只读性,能有效地避免归档数据造成的服务器资源浪费。另外,PostgreSQL归档具有在原始数据库系统的接口上的便捷性及快速性,归档过程不会出现过多处理延迟,在生产环境来说,这个优势是十分可观的。
PostgreSQL归档完全兼容多种操作系统,可以在Windows、Mac、Linux、iPhone等等操作系统上使用,归档后的数据也可以被多种形式的软件读取,使企业更为便利的在网络环境中使用数据

2.在线日志(pg_wal)

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

sql 复制代码
##切日志的方式
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.如何开归档

ini 复制代码
## 查看是否有归档,默认是关闭的
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 手动清理

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

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

bash 复制代码
2)通过pg_archivecleanup清理
pg_archivecleanup -d $PGDATA/pg_wal 000000010000000000000009

4.2 归档策略脚本

bash 复制代码
这次分享的策略是使用一个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来优化业务逻辑,提升数据备份安全性以及归档时间弹性。

相关推荐
why1514 小时前
腾讯(QQ浏览器)后端开发
开发语言·后端·golang
浪裡遊4 小时前
跨域问题(Cross-Origin Problem)
linux·前端·vue.js·后端·https·sprint
声声codeGrandMaster4 小时前
django之优化分页功能(利用参数共存及封装来实现)
数据库·后端·python·django
呼Lu噜5 小时前
WPF-遵循MVVM框架创建图表的显示【保姆级】
前端·后端·wpf
bing_1585 小时前
为什么选择 Spring Boot? 它是如何简化单个微服务的创建、配置和部署的?
spring boot·后端·微服务
学c真好玩5 小时前
Django创建的应用目录详细解释以及如何操作数据库自动创建表
后端·python·django
Asthenia04125 小时前
GenericObjectPool——重用你的对象
后端
Piper蛋窝5 小时前
Go 1.18 相比 Go 1.17 有哪些值得注意的改动?
后端
excel5 小时前
招幕技术人员
前端·javascript·后端
盖世英雄酱581366 小时前
什么是MCP
后端·程序员