如何消肿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)。
出于某些培训目的,我想重现一个臃肿的 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)。