Postgres使用pg_resetwal命令修改wal日志文件大小的方法

pg_wal日志文件默认大小是16MB,参见参数wal_segment_size
PostgreSQL 11 版本的一个重要调整是支持 initdb 和 pg_resetwal 修改 WAL 文件大小,而 11 版本之前只能在编译安装 PostgreSQL 时设置 WAL 文件大小。参见官方文档https://www.postgresql.org/docs/11/release-11.html

https://www.postgresql.org/docs/11/app-pgresetwal.html
注意事项:While pg_resetwal will set the WAL starting address beyond the latest existing WAL segment file, some segment size changes can cause previous WAL file names to be reused. It is recommended to use -l together with this option to manually set the WAL starting address if WAL file name overlap will cause problems with your archiving strategy.
pg_resetwal本身查看pg_wal中的文件并选择一个超出最新现存文件名的默认-l设置。因此,只有当你知道 WAL 段文件当前不在pg_wal中时,或者当pg_wal的内容完全丢失时,才需要对-l的手工调整,例如一个离线归档中的项。

pg_resetwal的参数–wal-segsize重设日志文件大小的示例

1、关闭数据库
pg_ctl stop -D /XX/YY

2、pg_resetwal --wal-segsize=64 -D /XX/YY
发现 pg_wal 目录中原有的WAL日志被清理,同时生成了大小为64MB新的WAL文件
pg_resetwal必须使用postgres用户来运行, 否则报错如下
pg_resetwal: cannot be executed by “root”
You must run pg_resetwal as the PostgreSQL superuser.

3、启动数据库
pg_ctl start -D /XX/YY有报错,提示 min_wal_size 参数至少需设置成 wal_segment_size 大小为 2 倍。

4、设置postgresql.conf文件中min_wal_size=128

5、启动数据库
pg_ctl start -D /XX/YY

–此种方式修改wal_segment_size后,重启后原来的数据都不会丢失,因为修改前是正常pg_ctl stop关闭的。如果在流复制的主库修改这个参数再重启,主库数据不会丢失,但是会发现流复制不正常了(pg_resetwal加上-l参数比如pg_resetwal --wal-segsize=64 -l 0000000100000000000000YY -D /XX/YY,流复制一样会不正常),此时从库会报错ERROR: requested WAL segment 0000000100000000000000XX has already been removed,且主库也会报错ERROR: requested WAL segment 0000000100000000000000XX has already been removed,当从库关闭后,主库不再这个错,如果从库再开启,从库会继续报这个错,主库也继续跟着报这个错

你可能感兴趣的:(postgres,数据库,dba)