一次备份恢复过程中引发的磁盘空间危机探究
Posted PostgreSQLChina
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一次备份恢复过程中引发的磁盘空间危机探究相关的知识,希望对你有一定的参考价值。
作者:杭州美创科技有限公司
情景再现
在某一次数据库做逻辑备份的时候,恢复阶段,出现了恢复异常的情况,并出现以下报错,提示数据库服务已经关闭了
查看pg进程,发现已经不存在postgres相关数据库进程,确认数据库已关停
查看最新的数据库错误日志
$ tail -50f $PGDATA/log/postgresql-2021-03-30_104942.csv
错误日志显示,NO space left on divice,pg_wal目录下没有空余的设备空间了
查看系统磁盘空间确认磁盘空间信息,确实磁盘空间已经撑满了
从根目录下逐级查看一下哪个目录占用比较大的磁盘空间,排查到pg_wal目录占用了很大的空间
由于在做备份恢复的过程中,有一张表的数据量达到了百万级别,在恢复过程中,wal日志也会不断记录该信息,那么为什么wal日志到了一定量没有被清理掉?便着手排查wal的相关配置。
查看wal日志配置
思考为什么会产生大量的wal日志,查看一下wal日志的目录大小配置参数max_wal_size,可以在postgresql.conf文件或者postgresql.auto.conf文件中查看
$ cat $PGDATA/postgresql.conf | grep max_wal_size
或者
$ cat $PGDATA/postgresql.auto.conf | grep max_wal_size
查看到该配置参数大小设置了1GB,其默认值就是1G
如果由于日志输出率的短期峰值导致超过max_wal_size,不需要的段文件将被移除直到系统回到这个限制以下。低于该限制时,系统会再利用足够的 WAL 文件来覆盖直到下一个检查点之前的需要。
如果开启了归档模式,那么归档成功了,才会被清除,但是如果归档命令是失效的,那么wal目录会一直增长,不会自动删除WAL,会使得此目录被撑爆。
查看归档配置
我们查看一下归档配置
$ cat $PGDATA/postgresql.conf | grep archive
看到相关的归档配置,开启了归档,并且也有相应的归档命令,查看一下是否存在归档
$ ls -l /pgdata/archivedir/
果然,没有这个归档目录,因此归档命令是无效的,也就导致了wal目录会一直增长
具体操作步骤
我们创建该归档目录,并删除一部分数据库日志或者一些不需要的文件来确保能够启动数据库服务
$ mkdir -p /pgda ta/archivedir
$ pg_ctl start
手动执行一下检查点操作
$ psql
postgres# checkpoint;
再查看一下pg_wal目录大小,发现已经清理了堆积的wal日志文件
$ du -sh
289M .
以上是关于一次备份恢复过程中引发的磁盘空间危机探究的主要内容,如果未能解决你的问题,请参考以下文章