[postgres]启用归档模式
前言
默认情况下,postgres未开启归档模式。当重做日志被写满时,之前的重做日志信息将被覆盖,这就可能导致重做日志信息的丢失。为了保证所有的重做日志不被覆盖,生产环境下一般启用归档模式。当重做日志被写满,pg先产生归档日志文件以备份重做日志,然后再覆盖重做日志文件。
配置步骤
- 在psql中查看当前的归档模式。默认为
off
,也就是未开启归档模式。
show archive_mode;
- 创建归档日志目录。个人习惯在数据目录下创建,可根据实际需求修改。
mkdir -p /home/postgres/apps/pgsql/data/archivelog
- 修改postgresql.conf文件
# 开启归档模式
archive_mode = on
# 配置归档命令
archive_command = 'log_dt=$(date +%Y%m%d);log_dir="/home/postgres/apps/pgsql/data/archivelog/${log_dt}";(test -d ${log_dir} || mkdir -p ${log_dir}) && cp %p ${log_dir}/%f'
- 重启postgres
pg_ctl restart -D /home/postgres/apps/pgsql/data/
- 使用psql登录控制台确认
-- 查看归档模式, 此时应该为on
show archive_mode;
-- 查看预写日志列表
select * from pg_ls_waldir() order by modification desc;
-- 手动切换日志
checkpoint; -- 触发一个完全检查点, 以及将内存中的脏数据写入数据文件
select pg_switch_wal();
- 查看归档文件
/home/postgres/apps/pgsql/data/archivelog
自动清理归档日志文件的shell脚本
虽然都是写shell脚本,但有两种配置自动执行的方式。一种是写在postgresql.conf中的archive_command中,每次创建归档日志的时候调用。另一种是搭配crontab。crontab方式跟配置archive_command方式差不多,只不过省去传参,直接配置crontab定时删除即可。以下为配置archive_command的步骤。
脚本内容
#!/bin/bash
set -u
archivelog_dir="/home/postgres/apps/pgsql/data/archivelog"
if [ -d "${archivelog_dir}/$1" ]; then
mkdir -p "${archivelog_dir}/$1"
fi
cp --preserve=timestamps $2 ${archivelog_dir}/$1
find ${archivelog_dir}/* -type f -mtime +7 | xargs rm -f
修改postgresql.conf文件
archive_command = 'bash /home/postgres/scripts/clean_archivelog.sh %f %p'
参考
- 赵渝强《PostgreSQL数据库实战派》
本文来自博客园,作者:花酒锄作田,转载请注明原文链接:https://www.cnblogs.com/XY-Heruo/p/17991002