如何消肿pg_wal?

How to bloat pg_wal?

出于某些培训目的,我想重现一个臃肿的 pg_wal 目录,以便我可以展示 Postgres 由于磁盘不足 space 关闭时发生的情况的示例].

到目前为止,我已尝试向 psql 提供以下 bash 脚本的输出:

#!/bin/sh
        
for i in {1..100}; do
   echo "create table temp_$i (id text);" >> bloat_wals.sql
   for j in {1..1000}; do
      echo "insert into temp_$i values('`cat /dev/urandom | tr -dc '[:alpha:]' | fold -w ${1:-20} | head -n 1`');" >> bloat_wals.sql
   done
   echo "drop table temp_$i;" >> bloat_wals.sql
done

生成以下 sql 文件 bloat_wals.sql :

create table temp_1 (id text);
insert into temp_1 values('KRzMmncvZzjZlbLTNtQd');
insert into temp_1 values('haXsbsFOUfavkUNeLTSP');
insert into temp_1 values('LYVhfMlWRnfVnhPIvYtb');
...
drop table temp_1;
create table temp_2 (id text);
insert into temp_2 values('qKqRjlCqUddycHENZrQJ');
insert into temp_2 values('SeztNglqJQfWICoyZeCs');
insert into temp_2 values('cgKVcTteWGZXWEHrqTqa');
drop table temp_2;
create table temp_3 (id text);
insert into temp_3 values('OPuidYENyZWfIlsehSvS');
insert into temp_3 values('ZYakjYKzkbwAkjBksKBi');
insert into temp_3 values('oUUBHKMZQeMQejJyvaZL');
...
insert into temp_100 values('SeztNglqJQfWICoyZeCs');
insert into temp_100 values('cgKVcTteWGZXWEHrqTqa');
drop table temp_100;

但这并没有显着增加 pg_wal 目录的大小。

通过阅读 Postgres wal 配置文档,看起来可以使用以下 parameters/functions 来实现此目的:

 - checkpoint_timeout
 - max_wal_size
 - pg_switch_wal ()
 - archive_command=/bin/true

请告诉我膨胀 pg_wal 目录的最简单方法是什么?我正在使用原始数据库,因此欢迎提出任何建议。

最简单的方法是以注定会失败的方式配置 WAL 归档:

archive_mode = on
archive_command = '/bin/false'

然后重启PostgreSQL并生成WAL。

除了生成大量 WAL,您还可以调用 pg_switch_wal() 函数,该函数将切换到下一个 WAL 段(这样就好像已经写入了 16MB 的 WAL)。