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,当从库关闭后,主库不再这个错,如果从库再开启,从库会继续报这个错,主库也继续跟着报这个错

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在正运行的PostgreSQL的Docker容器中使用pg_rman恢复数据库,您可以按照以下步骤进行操作: 1. 首先,您需要在Docker容器中安装pg_rman工具。可以使用以下命令安装: ```bash docker exec -it <container_name> bash -c "apt-get update && apt-get install -y postgresql-<version>-pg-rman" ``` 其中,`<container_name>`是您要安装pg_rman的容器的名称,`<version>`是您正在使用PostgreSQL版本的数字版本号。 2. 然后,您需要从备份中还原数据库。您可以使用以下命令将备份文件复制到Docker容器中: ```bash docker cp <backup_file> <container_name>:<backup_path> ``` 其中,`<backup_file>`是备份文件的路径和名称,`<container_name>`是您要将备份文件复制到的容器的名称,`<backup_path>`是备份文件在容器中的路径。 3. 接下来,您需要停止PostgreSQL服务器。您可以使用以下命令在Docker容器中停止PostgreSQL服务器: ```bash docker exec -it <container_name> bash -c "pg_ctl stop -D <data_directory>" ``` 其中,`<container_name>`是您要停止PostgreSQL服务器的容器的名称,`<data_directory>`是PostgreSQL服务器数据目录的路径。 4. 然后,您需要使用pg_rman工具恢复数据库。您可以使用以下命令在Docker容器中运行pg_rman: ```bash docker exec -it <container_name> bash -c "pg_rman restore --backup-path=<backup_path> --restore-target=<restore_directory> --quiet" ``` 其中,`<container_name>`是您正在运行pg_rman的容器的名称,`<backup_path>`是备份文件在容器中的路径,`<restore_directory>`是要将数据库恢复到的目录的路径。 5. 最后,您需要启动PostgreSQL服务器。您可以使用以下命令在Docker容器中启动PostgreSQL服务器: ```bash docker exec -it <container_name> bash -c "pg_ctl start -D <data_directory>" ``` 其中,`<container_name>`是您要启动PostgreSQL服务器的容器的名称,`<data_directory>`是PostgreSQL服务器数据目录的路径。 完成以上步骤后,您应该能够在正运行的PostgreSQL的Docker容器中使用pg_rman恢复数据库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值