news 2026/3/25 17:13:04

pg数据库wal增长过快的处理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
pg数据库wal增长过快的处理

1.关闭归档模式:需重启pg

2.非活跃的复制槽会阻止WAL日志清理。检查复制槽状态:

如果发现active=false的复制槽且delay_size很大,说明该复制槽阻塞了WAL清理。根据业务需求决定是否删除:

处理过程如下:

[root@pg pg_wal]# du -sh *|wc -l
1569
[root@pg pg_wal]# pwd
/opt/pgsql/data/pg_wal
[root@pg pg_wal]# ll |head
total 25776640
-rw------- 1 postgres postgres 16777216 Dec 16 08:48 0000000100000A6E00000003
-rw------- 1 postgres postgres 16777216 Dec 16 08:49 0000000100000A6E00000004
-rw------- 1 postgres postgres 16777216 Dec 16 08:49 0000000100000A6E00000005
-rw------- 1 postgres postgres 16777216 Dec 16 08:49 0000000100000A6E00000006
-rw------- 1 postgres postgres 16777216 Dec 16 08:49 0000000100000A6E00000007
-rw------- 1 postgres postgres 16777216 Dec 16 08:49 0000000100000A6E00000008
-rw------- 1 postgres postgres 16777216 Dec 16 08:49 0000000100000A6E00000009
-rw------- 1 postgres postgres 16777216 Dec 16 08:49 0000000100000A6E0000000A
-rw------- 1 postgres postgres 16777216 Dec 16 08:49 0000000100000A6E0000000B
[root@pg pg_wal]# ls -lt|head
total 25891328
-rw------- 1 postgres postgres 16777216 Dec 16 09:33 0000000100000A740000002E
drwx------ 2 postgres postgres 3764224 Dec 16 09:33 archive_status
-rw------- 1 postgres postgres 16777216 Dec 16 09:33 0000000100000A740000002D
-rw------- 1 postgres postgres 16777216 Dec 16 09:33 0000000100000A740000002C
-rw------- 1 postgres postgres 16777216 Dec 16 09:33 0000000100000A740000002B
-rw------- 1 postgres postgres 16777216 Dec 16 09:33 0000000100000A740000002A
-rw------- 1 postgres postgres 16777216 Dec 16 09:33 0000000100000A7400000029
-rw------- 1 postgres postgres 16777216 Dec 16 09:33 0000000100000A7400000028
-rw------- 1 postgres postgres 16777216 Dec 16 09:33 0000000100000A7400000027
[root@pg pg_wal]# ls -l|head
total 25989632
-rw------- 1 postgres postgres 16777216 Dec 16 08:48 0000000100000A6E00000003
-rw------- 1 postgres postgres 16777216 Dec 16 08:49 0000000100000A6E00000004
-rw------- 1 postgres postgres 16777216 Dec 16 08:49 0000000100000A6E00000005
-rw------- 1 postgres postgres 16777216 Dec 16 08:49 0000000100000A6E00000006
-rw------- 1 postgres postgres 16777216 Dec 16 08:49 0000000100000A6E00000007
-rw------- 1 postgres postgres 16777216 Dec 16 08:49 0000000100000A6E00000008
-rw------- 1 postgres postgres 16777216 Dec 16 08:49 0000000100000A6E00000009
-rw------- 1 postgres postgres 16777216 Dec 16 08:49 0000000100000A6E0000000A
-rw------- 1 postgres postgres 16777216 Dec 16 08:49 0000000100000A6E0000000B
[root@pg pg_wal]# ls|wc -l
1593
[root@pg pg_wal]# ls|wc -l
1594
[root@pg pg_wal]# ls|wc -l
1595
[root@pg pg_wal]# ls|wc -l
1595
[root@pg pg_wal]# ls|wc -l
1595
[root@pg pg_wal]# ls|wc -l
1595
[root@pg pg_wal]# pwd
/opt/pgsql/data/pg_wal
[root@pg pg_wal]# ls|wc -l
1596
[root@pg pg_wal]# su - postgres
Last login: Tue Dec 16 09:31:10 CST 2025 on pts/1
-bash-4.2$ psql
Password for user postgres:
psql (12.2)
Type "help" for help.

postgres=# SELECT * FROM pg_stat_archiver;
archived_count | last_archived_wal | last_archived_time | failed_count | last_failed_wal | last_failed_time | stats_r
eset
----------------+--------------------------+-------------------------------+--------------+--------------------------+-------------------------------+-----------------
--------------
1599 | 0000000100000A7400000040 | 2025-12-16 09:35:34.808741+08 | 173 | 0000000100000A6E00000003 | 2025-12-16 08:50:01.139606+08 | 2025-12-16 08:48
:25.828041+08
(1 row)

postgres=# SELECT * FROM pg_stat_activity WHERE state = 'active' AND now() - xact_start > interval '1 hour';
datid | datname | pid | usesysid | usename | application_name | client_addr | client_hostname | client_port | backend_start | xact_start | query_start | state_change
| wait_event_type | wait_event | state | backend_xid | backend_xmin | query | backend_type
-------+---------+-----+----------+---------+------------------+-------------+-----------------+-------------+---------------+------------+-------------+--------------
+-----------------+------------+-------+-------------+--------------+-------+--------------
(0 rows)

postgres=#SELECT slot_name, active, pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_insert_lsn(), restart_lsn)) AS delay_size
postgres-# FROM pg_replication_slots;

slot_name | active | delay_size
---------------+--------+------------
recovery_slot|f|1206GB
(1 row)


postgres=#SELECT pg_drop_replication_slot('recovery_slot');
pg_drop_replication_slot
--------------------------

(1 row)

postgres=# SELECT slot_name, active, pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_insert_lsn(), restart_lsn)) AS delay_size
FROM pg_replication_slots;
slot_name | active | delay_size
-----------+--------+------------
(0 rows)

postgres=# SELECT * FROM pg_stat_archiver;
archived_count | last_archived_wal | last_archived_time | failed_count | last_failed_wal | last_failed_time | stats_r
eset
----------------+--------------------------+-------------------------------+--------------+--------------------------+-------------------------------+-----------------
--------------
1634 | 0000000100000A7400000063 | 2025-12-16 09:38:31.708956+08 | 173 | 0000000100000A6E00000003 | 2025-12-16 08:50:01.139606+08 | 2025-12-16 08:48
:25.828041+08
(1 row)

postgres=# SELECT slot_name, active, pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_insert_lsn(), restart_lsn)) AS delay_size
FROM pg_replication_slots;
slot_name | active | delay_size
-----------+--------+------------
(0 rows)

postgres=# \q
-bash-4.2$ df -hT
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 16G 0 16G 0% /dev
tmpfs tmpfs 16G 5.5M 16G 1% /dev/shm
tmpfs tmpfs 16G 1.6G 15G 11% /run
tmpfs tmpfs 16G 0 16G 0% /sys/fs/cgroup
/dev/mapper/centos-root xfs 1.2T 984G 231G 82% /
/dev/sda1 xfs 1014M 150M 865M 15% /boot
tmpfs tmpfs 3.2G 0 3.2G 0% /run/user/1000
-bash-4.2$ psql
Password for user postgres:
psql (12.2)
Type "help" for help.

postgres=# SELECT pg_size_pretty(SUM(size)) AS total_wal_size FROM pg_ls_waldir();
total_wal_size
----------------
26 GB
(1 row)

postgres=# SELECT pg_size_pretty(SUM(size)) AS total_wal_size FROM pg_ls_waldir();
total_wal_size
----------------
26 GB
(1 row)

postgres=# SELECT name, setting FROM pg_settings WHERE name = 'archive_mode';
name | setting
--------------+---------
archive_mode | on
(1 row)

postgres=# SELECT name, setting FROM pg_settings WHERE name like 'archive%';
name | setting
-------------------------+----------------------------------------------------------------
archive_cleanup_command |
archive_command | test ! -f /opt/pgsql/archive/%f && cp %p /opt/pgsql/archive/%f
archive_mode | on
archive_timeout | 0
(4 rows)

postgres=# alter system set archive_command='';
ALTER SYSTEM
postgres=# alter system set archive_mode=OFF;
ALTER SYSTEM
postgres=# SELECT name, setting FROM pg_settings WHERE name like 'archive%';
name | setting
-------------------------+----------------------------------------------------------------
archive_cleanup_command |
archive_command | test ! -f /opt/pgsql/archive/%f && cp %p /opt/pgsql/archive/%f
archive_mode | on
archive_timeout | 0
(4 rows)

postgres=# \q
-bash-4.2$ cd /opt/pgsql/data/
-bash-4.2$ cp postgresql.conf postgresql.conf.20251216
-bash-4.2$ grep archive postgresql.conf
archive_mode = on # enables archiving; off, on, or always
archive_command = 'test ! -f /opt/pgsql/archive/%f && cp %p /opt/pgsql/archive/%f' # command to use to archive a logfile segment
# placeholders: %p = path of file to archive
# e.g. 'test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f'
#archive_timeout = 0 # force a logfile segment switch after this
#restore_command = '' # command to use to restore an archived logfile segment
# e.g. 'cp /mnt/server/archivedir/%f %p'
#archive_cleanup_command = '' # command to execute at every restartpoint
#max_standby_archive_delay = 30s # max delay before canceling queries
# when reading WAL from archive;
-bash-4.2$ ll /opt/pgsql/archive
total 32768
-rw------- 1 postgres postgres 16777216 Dec 16 09:40 0000000100000A7400000070
-rw------- 1 postgres postgres 16777216 Dec 16 09:43 0000000100000A7400000071
-bash-4.2$ vi postgresql.conf
wal_level = logical # minimal, replica, or logical
# (change requires restart)
#fsync = on # flush data to disk for crash safety
# (turning this off can cause
# unrecoverable data corruption)
#synchronous_commit = on # synchronization level;
# off, local, remote_write, remote_apply, or on
#wal_sync_method = fsync # the default is the first option
# supported by the operating system:
# open_datasync
# fdatasync (default on Linux)
# fsync
# fsync_writethrough
# open_sync
#full_page_writes = on # recover from partial page writes
#wal_compression = off # enable compression of full-page writes
#wal_log_hints = off # also do full page writes of non-critical updates
# (change requires restart)
#wal_init_zero = on # zero-fill new WAL files
#wal_recycle = on # recycle WAL files
#wal_buffers = -1 # min 32kB, -1 sets based on shared_buffers
# (change requires restart)
#wal_writer_delay = 200ms # 1-10000 milliseconds
#wal_writer_flush_after = 1MB # measured in pages, 0 disables

#commit_delay = 0 # range 0-100000, in microseconds
#commit_siblings = 5 # range 1-1000

# - Checkpoints -

#checkpoint_timeout = 5min # range 30s-1d
max_wal_size = 1GB
#min_wal_size = 80MB
#checkpoint_completion_target = 0.5 # checkpoint target duration, 0.0 - 1.0
#checkpoint_flush_after = 256kB # measured in pages, 0 disables
#checkpoint_warning = 30s # 0 disables

# - Archiving -

archive_mode = off # enables archiving; off, on, or always
archive_command = '' # (change requires restart)
#archive_command = 'test ! -f /opt/pgsql/archive/%f && cp %p /opt/pgsql/archive/%f' # command to use to archive a logfile segment
# placeholders: %p = path of file to archive
# %f = file name only
# e.g. 'test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f'
#archive_timeout = 0 # force a logfile segment switch after this
# number of seconds; 0 disables

# - Archive Recovery -

# These are only used in recovery mode.

#restore_command = '' # command to use to restore an archived logfile segment
# placeholders: %p = path of file to restore
# %f = file name only
# e.g. 'cp /mnt/server/archivedir/%f %p'
# (change requires restart)
#archive_cleanup_command = '' # command to execute at every restartpoint
#recovery_end_command = '' # command to execute at completion of recovery

# - Recovery Target -

# Set these only when performing a targeted recovery.
"postgresql.conf" 754L, 26874C written
-bash-4.2$ grep archive postgresql.conf
archive_mode = off # enables archiving; off, on, or always
archive_command = '' # (change requires restart)
#archive_command = 'test ! -f /opt/pgsql/archive/%f && cp %p /opt/pgsql/archive/%f' # command to use to archive a logfile segment
# placeholders: %p = path of file to archive
# e.g. 'test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f'
#archive_timeout = 0 # force a logfile segment switch after this
#restore_command = '' # command to use to restore an archived logfile segment
# e.g. 'cp /mnt/server/archivedir/%f %p'
#archive_cleanup_command = '' # command to execute at every restartpoint
#max_standby_archive_delay = 30s # max delay before canceling queries
# when reading WAL from archive;
-bash-4.2$ ll postgresql*
-rw------- 1 postgres postgres 221 Dec 16 09:44 postgresql.auto.conf
-rw------- 1 postgres postgres 26874 Dec 16 09:46 postgresql.conf
-rw------- 1 postgres postgres 26852 Dec 16 09:45 postgresql.conf.20251216
-bash-4.2$ more postgresql.auto.conf
# Do not edit this file manually!
# It will be overwritten by the ALTER SYSTEM command.
max_connections = '1000'
search_path = '"$user", public, mt, zdmh, yjya, ghkt, tjgx, zxkt'
archive_command = ''
archive_mode = 'off'

-bash-4.2$ psql
Password for user postgres:
psql (12.2)
Type "help" for help.

postgres=# SHOW archive_command;
archive_command
----------------------------------------------------------------
test ! -f /opt/pgsql/archive/%f && cp %p /opt/pgsql/archive/%f
(1 row)

postgres=# SHOW archive_mode;
archive_mode
--------------
on
(1 row)

postgres=#

-bash-4.2$ pwd
/opt/pgsql/data
-bash-4.2$ du -sh pg_wal
1013M pg_wal
-bash-4.2$ psql
Password for user postgres:
psql (12.2)
Type "help" for help.

postgres=# SELECT pg_size_pretty(SUM(size)) AS total_wal_size FROM pg_ls_waldir();
total_wal_size
----------------
1008 MB
(1 row)

postgres=#

-bash-4.2$ ll pg_wal|wc -l
65

相关参考:

"/opt/pgsql/data/pg_w..."点击查看元宝的回答
https://yb.tencent.com/s/xl7VZQUqwXRd

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/21 1:53:02

协作机器人刚上岗就下线?安全专利漏查,百万投入泡汤

某制造企业为提升产线效率,花400万研发的轻型协作机器人,刚在车间试生产一周就被责令停工。原因是竞品投诉其“力反馈安全联锁系统”侵犯核心专利,而当地监管部门核查后发现,机器人碰撞缓冲的“压力阈值设定”“紧急停机响应逻辑”…

作者头像 李华
网站建设 2026/3/25 12:44:56

D3.js数据标签防重叠5步实战教程:从入门到精通

D3.js数据标签防重叠5步实战教程:从入门到精通 【免费下载链接】d3 Bring data to life with SVG, Canvas and HTML. :bar_chart::chart_with_upwards_trend::tada: 项目地址: https://gitcode.com/gh_mirrors/d3/d3 D3.js作为业界领先的数据可视化库&#x…

作者头像 李华
网站建设 2026/3/25 6:07:50

类,对象基础概念 var与dynamic对比 字典基础用法 冒泡与选择排序

面向对象编程核心概念总结一、类 vs 对象概念说明类比类 (Class)蓝图/模板,定义属性和方法建筑设计图纸对象 (Object)类的实例,有具体数据按图纸建好的房子实例化从类创建对象的过程按图纸施工csharp// 定义类(蓝图) public class…

作者头像 李华
网站建设 2026/3/21 8:10:08

点赞之交,朋友圈里的“虚情”与“假意”

点击文末“阅读原文”即可参与节目互动剪辑、音频 / 卷圈 运营 / SandLiu 卷圈 监制 / 姝琦 封面 / 姝琦Midjourney 产品统筹 / bobo 场地支持 / 声湃轩北京录音间在这个“点赞”即“已阅”的时代,我们的朋友圈究竟是生活的记录册,还是精心修饰的橱窗…

作者头像 李华
网站建设 2026/3/25 2:21:58

GAIA基准实战指南:构建智能助手评估体系的完整方案

GAIA基准实战指南:构建智能助手评估体系的完整方案 【免费下载链接】agents-course This repository contains the Hugging Face Agents Course. 项目地址: https://gitcode.com/GitHub_Trending/ag/agents-course 面对市场上琳琅满目的AI助手,你…

作者头像 李华
网站建设 2026/3/24 22:07:19

好用的安全帽撞击体验机构

好用的安全帽撞击体验机构引言在建筑施工等行业中,安全帽的重要性不言而喻。而安全帽撞击体验能够让从业者更直观地感受安全帽的防护作用,从而提高安全意识。市场上也出现了不少提供安全帽撞击体验服务的机构,筑小安便是其中好用且可靠的一家…

作者头像 李华