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