技术文章:PostgreSQL pg_resetwal处理机制
pg_resetwal的参数
ControlFile结构及pg_resetwal参数影响的字段

static struct option long_options[] = { {"commit-timestamp-ids", required_argument, NULL, 'c'}, {"pgdata", required_argument, NULL, 'D'}, {"epoch", required_argument, NULL, 'e'}, {"force", no_argument, NULL, 'f'}, {"next-wal-file", required_argument, NULL, 'l'}, {"multixact-ids", required_argument, NULL, 'm'}, {"dry-run", no_argument, NULL, 'n'}, {"next-oid", required_argument, NULL, 'o'}, {"multixact-offset", required_argument, NULL, 'O'}, {"next-transaction-id", required_argument, NULL, 'x'}, {"wal-segsize", required_argument, NULL, 1}, {NULL, 0, NULL, 0} };
介绍
PG11允许用户在线修改WAL段文件大小。以往版本需要重新编译,并且不同--wal-segsize设置的PG相互不兼容。这个值范围1—1024,为2的平方且单位M。当改变大小时建议和-l参数一起使用,设置下一个WAL文件名,防止重复使用之前的名字。下一个段文件名要比当前已存在的都要大,
该工具会将WAL目录下日志全部删除,并生成一个新WAL段文件。该文件名起名规则:
1、-l指定的段文件名解析出段号minXlogSegNo
2、FindEndOfXLOG扫描WAL目录下所有文件得到最大的文件号:
1)newXlogSegNo为pg_control文件中记录的ckp所属段号
2)若目录下由比这个号大的,则更新newXlogSegNo为该段号
3)该段号转换成WAL长度后,除以新段文件大小得到新段文件段号newXlogSegNo,将之+1作为新段文件的段号
3、原pg_control文件中的ckp作为CHECKPOINT记录写入新段文件里面。该段文件仅写这一个WAL,后面的大小全部清0。
4、新pg_control文件的checkpoint位置为该文件中CHECKPOINT记录位置。
5、这个工具比较危险,慎用。
6、在主备环境中,备机启动不起来,且日志损坏时,主机数据量非常大,全量重新拷贝又耗费时间特别长,此时可以尝试使用这个工具:
1)比较备机和主机的pg_control文件的checkpoint位置,若备机和主机记录的checkpoint位置相等,则可以执行pg_resetwal,这样重新启动后可以正常构建流复制,数据也不会丢
2)若备机的checkpoint小,使用这个pg_control文件进行pg_resetwal可能重启后构建不起来流复制。使用主机的pg_control文件进行pg_resetwal,重启后可构建流复制,但丢数据
3)若备机的checkpoint大,使用这个pg_control文件进行pg_resetwal,可能重启后构建不起来流复制,即使构建起来也丢数据。使用主机的pg_control文件进行pg_resetwal,应该也可以正常。
4)备机的时间线文件需要清理
流程

pg_control文件的更新,然后调用KillExistingXLOG删除pg_wal目录下的所有WAL文件:
while(errno = 0, (xlde = readdir(xldir)) != NULL){ if(IsXLogFileName(xlde->d_name) || IsPartialXLogFileName(xlde->d_name)){ snprintf(path,sizeof(path), "%s/%s", XLOGDIR, xlde->d_name); if(unlink(path) < 0){ pg_log_error("couldnot delete file "%s": %m", path); exit(1); } } }
调用函数KillExistingArchiveStatus删除archive_status目录下.ready,.done和.partial.ready、.partial.done文件:
while(errno = 0, (xlde = readdir(xldir)) != NULL){ if(strspn(xlde->d_name, "0123456789ABCDEF") == XLOG_FNAME_LEN&& (strcmp(xlde->d_name+ XLOG_FNAME_LEN, ".ready") == 0 || strcmp(xlde->d_name + XLOG_FNAME_LEN,".done") == 0 || strcmp(xlde->d_name + XLOG_FNAME_LEN,".partial.ready") == 0 || strcmp(xlde->d_name + XLOG_FNAME_LEN,".partial.done") == 0)) { snprintf(path,sizeof(path), "%s/%s", ARCHSTATDIR, xlde->d_name); if(unlink(path) < 0){ pg_log_error("couldnot delete file "%s": %m", path); exit(1); } } }
最后调用函数WriteEmptyXLOG创建一个新WAL段文件,并仅写入一个checkpoint记录,其中checkpoint记录来自ControlFile结构。
最新活动更多
-
10 阿里AI需要算一笔账了
- 1 GPT-6要来了,但AI行业早不跟 OpenAI玩了
- 2 产业丨算电协同+Token出海,中国电力与算力全球化双引擎
- 3 火爆的“Token经济学”,关乎你的钱包、职场和未来消费 | 人人能懂的产业报告
- 4 资本巨头纷纷抽身,为何中小投资者仍为AI狂热加码?
- 5 大厂财报中的AI图鉴:营收单列、玩杠杆、商业画饼
- 6 从百度到Meta,科技巨头的 AI 组织战,开打了
- 7 2026年3月,国内具身智能机器人企业融资汇总
- 8 华勤财报发布:收入规模破1700亿,利润增长近40%
- 9 宇树科技招股书透视:中外具身智能玩家生存竞速
- 10 大涨30%!智谱 AI 财报出炉:营收暴增132%,API 增长3倍,市值破 4000 亿


分享














发表评论
登录
手机
验证码
手机/邮箱/用户名
密码
立即登录即可访问所有OFweek服务
还不是会员?免费注册
忘记密码其他方式
请输入评论内容...
请输入评论/评论长度6~500个字
暂无评论
暂无评论