再论pg归档日志的设置

用过ORACLE的朋友,第一次设置 PG的归档参数,如下:

。。。

wal_level = replica

archive_mode = on

archive_command = 'test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f'

。。。

对于归档,还要用操作系统命令去进行文件的拷贝,而且必须这样,是否感觉BOOK11?

不错,PG确实是这样的实现的,这个参数,是直接从postgres.conf 参数中截取的,样例就是这样。

我们知道,在ORACLE中,只需要设置 log_archive_dest='/u01/app/oracle/archive_log',其他的文件归档,就交由ORACLE去搞定,难到PG不能这样简单实现吗 ?还得让数据库管理员熟悉操作系统命令?

答案是不一定

如果是PG15以前得版本,就必须这样去实现日志得归档,但从PG15开始,PG提供了一个自定义模块:basic_archive,通过这个模块,我们就不用再去写操作系统文件拷贝命令了,也就是不管在什么操作系统下,归档的设置都一样了,具体实现如下:

目录

1.设置参数

2.创建归档目录

3.赋予权限

4.设置标签 --这步可选

5.重启数据库

6.手工日志切换

7.验证文件


1.设置参数

   源码中有样例:

  比如我们这里设置到 

  /u01/app/postgres/archive_log

  那么按以下设置:

 vim $PGDATA/postgresql.conf

...

 archive_command = ''               --这里设置为空,默认为空,不设置即可

 archive_mode = on
 archive_library = 'basic_archive' 
 basic_archive.archive_directory = '/u01/app/postgres/archive_log'
 wal_level = replica

...

2.创建归档目录

 $ mkdir /u01/app/postgres/archive_log

3.赋予权限

 $chown -R postgres:postgres /u01/app/postgres/archive_log

$ chmod -R 775 /u01/app/postgres/archive_log

4.设置标签 --这步可选

如果开启了selinux,才需要,否则,直接跳过

 su - root

# semanage fcontext -a -t postgresql_db_t '/u01/app/postgres/archive_log(/.*)?'

# restorecon -FRv /u01/app/postgres/archive_log

设置后:

5.重启数据库

[postgres@openeuler2403 postgres]$ pg_ctl restart
waiting for server to shut down.... done
server stopped
waiting for server to start.... done
server started

6.手工日志切换

7.验证文件

是否发现在归档日志目录已经自动产生了归档日志了。

好了,PG象ORACLE一样设置归档,就到这里。

如果你还想和我交流,可以按如下方式找到我们。

----------------------------------------------------------------------
微信群:水煮数据库

主要交流日常运维中用到的数据库相关问题,包含但不限于:ORACLE,PG,MYSQL,SQLSERVER,OB,TIDB,达梦,TDSQL,OPENGAUSS,人大金仓,GBASE等等,

加我微信:zq24803366,备注:水煮数据库, 我拉你入群。
----------------------------------------------------------------------

<think>好的,我现在需要帮助用户找到PostgreSQL归档日志存放目录的位置,并了解相关的配置参数archive_command和wal_archive。用户之前的问题是关于pg_wal目录的位置和与PgArch进程的关系,现在进一步询问归档日志的存储位置。首先,我要回顾之前的回答,确保信息的一致性。 根据之前的回答,pg_wal目录存储的是当前的WAL文件,而归档日志的位置其实是通过archive_command参数指定的外部存储路径。用户可能混淆了pg_wal和归档目录,需要明确区分这两者。用户提供的引用中提到了archive_command和清理归档日志的方法,这些信息需要整合进来。 首先,归档日志的存放目录并不是PostgreSQL直接管理的内部目录,而是由archive_command中的命令决定的。比如,如果archive_command是复制到/mnt/backups/wal,那么归档日志就存放在那里。需要明确告诉用户这一点,并给出示例。 其次,用户可能想知道如何配置archive_command参数,以及相关的参数如wal_level和archive_mode是否已经正确设置。需要分步骤说明如何检查和配置这些参数,包括修改postgresql.conf文件、重启数据库等步骤。 另外,用户提到了wal_archive,但PostgreSQL中并没有这个参数,可能是一个笔误,需要指出正确的参数是archive_command,并解释其作用。同时,引用中的archive_cleanup_command和pg_archivecleanup工具也需要提及,说明如何清理归档日志,避免空间不足的问题。 还要考虑用户可能遇到的常见问题,比如配置错误导致归档失败,或者如何验证归档是否正常工作。需要提供检查日志的方法,如查看PostgreSQL日志文件,使用pg_stat_archiver视图等。 最后,生成的相关问题需要与主题相关,帮助用户深入理解,比如如何验证归档配置、处理归档失败、与pg_basebackup结合使用等。确保问题覆盖用户可能感兴趣的方面,并参考之前的回答结构,保持一致性。</think>### PostgreSQL归档日志存储位置详解 --- #### 一、归档目录的核心配置逻辑 PostgreSQL归档日志存储位置**完全由`archive_command`参数定义**,其本质是通过操作系统命令将WAL文件传输到目标位置。与`pg_wal`目录(当前活跃WAL文件存储)不同,归档日志目录是**完全自定义的外部存储路径**。 --- #### 二、核心参数解析 1. **`archive_command`(关键配置)** - **功能**:定义将WAL文件复制到归档目录的Shell命令 - **配置示例**: ```bash # 本地目录归档(生产环境不建议) archive_command = 'cp %p /mnt/backups/wal/%f' # 云端存储归档(推荐方案) archive_command = 'aws s3 cp %p s3://bucket-name/wal_archive/%f' ``` - `%p`:当前WAL文件路径(如`/var/lib/pgsql/12/data/pg_wal/0000000100000001000000AB`) - `%f`:仅WAL文件名(如`0000000100000001000000AB`) 2. **`archive_mode`(前置条件)** - **作用**:启用归档功能(必须设置为`on`) - **典型配置**: ```bash archive_mode = on # 主库必须启用 wal_level = replica # 最低要求级别(9.6+版本) ``` --- #### 三、定位归档目录的完整流程 1. **检查当前配置** ```sql -- 查看所有归档相关参数 SELECT name, setting FROM pg_settings WHERE name IN ('archive_mode','archive_command','wal_level'); ``` **输出示例**: ``` name | setting ----------------+---------------------------------------- archive_mode | on archive_command| cp %p /archive/wal/%f wal_level | replica ``` 2. **解析路径规则** - 若`archive_command`使用绝对路径(如`/archive/wal/%f`),则归档目录为`/archive/wal` - 若使用相对路径,需结合命令执行环境判断(建议始终使用绝对路径) 3. **动态验证方法** ```bash # 手动触发WAL换并观察归档过程 psql -c "SELECT pg_switch_wal()" tail -f /var/log/postgresql/postgresql-12-main.log | grep archive ``` **典型日志输出**: ``` LOG: archived log "0000000100000001000000AB" to "/archive/wal/0000000100000001000000AB" ``` --- #### 四、生产环境最佳实践 1. **存储方案选择** | 存储类型 | 适用场景 | 配置示例 | |----------------|---------------------------------|-----------------------------------| | 网络附加存储(NAS) | 混合云架构 | `archive_command = 'cp %p /nas/wal_archive/%f'` | | 对象存储(S3) | 云原生环境 | `archive_command = 'rclone copy %p s3:bucket/wal/%f'` | | 本地SSD阵列 | 低延迟金融系统 | `archive_command = 'rsync %p /ssd_array/archive/%f'` | 2. **空间管理策略** - **自动清理**:通过`archive_cleanup_command`配置(需与`pg_archivecleanup`工具配合) ```bash archive_cleanup_command = 'pg_archivecleanup /archive/wal %r' # 保留最新可恢复点 ``` - **手动清理**:确保无备库需要旧归档后删除 ```bash pg_archivecleanup /archive/wal 0000000100000001000000AB.00000028.backup ``` --- #### 五、故障排查指南 1. **常见错误场景** ```log ERROR: archive command failed with exit code 1 DETAIL: The failed archive command was: cp pg_wal/0000000100000001000000AB /archive/wal/0000000100000001000000AB ``` **排查步骤**: - 检查目标目录权限:`ls -ld /archive/wal`(需postgres用户有写权限) - 验证命令可执行性:手动执行`cp`命令测试 - 查看存储空间:`df -h /archive` 2. **监控指标** ```sql -- 检查积压的未归档文件 SELECT COUNT(*) FROM pg_ls_dir('pg_wal/archive_status') WHERE filename LIKE '%.ready'; -- 查看归档延迟 SELECT pg_wal_lsn_diff(pg_current_wal_lsn(), last_archived_lsn) AS bytes_behind, now() - last_archive_time AS time_behind FROM pg_stat_archiver; ``` --- ### 相关问题 1. 如何验证PostgreSQL的WAL归档配置是否真正生效? 2. 当`archive_command`连续失败时,如何防止`pg_wal`目录被占满? 3. PostgreSQL归档日志如何与`pg_basebackup`配合实现时间点恢复(PITR)? 4. 在Kubernetes环境中如何安全配置PostgreSQL的WAL归档存储?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值