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

相关推荐
凡人的AI工具箱1 小时前
AI教你学Python 第11天 : 局部变量与全局变量
开发语言·人工智能·后端·python
是店小二呀1 小时前
【C++】C++ STL探索:Priority Queue与仿函数的深入解析
开发语言·c++·后端
canonical_entropy1 小时前
金蝶云苍穹的Extension与Nop平台的Delta的区别
后端·低代码·架构
我叫啥都行2 小时前
计算机基础知识复习9.7
运维·服务器·网络·笔记·后端
无名指的等待7123 小时前
SpringBoot中使用ElasticSearch
java·spring boot·后端
.生产的驴3 小时前
SpringBoot 消息队列RabbitMQ 消费者确认机制 失败重试机制
java·spring boot·分布式·后端·rabbitmq·java-rabbitmq
AskHarries4 小时前
Spring Boot利用dag加速Spring beans初始化
java·spring boot·后端
苹果酱05674 小时前
一文读懂SpringCLoud
java·开发语言·spring boot·后端·中间件
掐指一算乀缺钱5 小时前
SpringBoot 数据库表结构文档生成
java·数据库·spring boot·后端·spring
计算机学姐7 小时前
基于python+django+vue的影视推荐系统
开发语言·vue.js·后端·python·mysql·django·intellij-idea