PostgreSQL中的 .ready 和 .done 文件有什么作用?

翻译自:https://www.dbi-services.com/blog/__trashed-3/

2021年2月7日 丹尼尔·韦斯特曼(Daniel Westermann


当您在生产环境中运行 PostgreSQL 工作负载时,必须有一个备份(backup)和还原(restore)实施方案。即使对于开发实例,对于开发人员而言,也应该有一个经过充分测试的备份和还原步骤,因为开发实例(Development Instances)对于开发人员来说就像生产一样。社区版 PostgreSQL 附带了 pg_basebackup,以帮助您创建一个完全一致的 PostgreSQL 集群备份。如果您希望能够进行时间点恢复(PITR),则需要归档 WAL 段,以便稍后可以从基础备份中进行回滚。WAL 段存储在 pg_wal 目录中,但如果您仔细查看此目录,您会看到更多内容(如果您启用了归档)。

如果查看一个新初始化的 PostgreSQL 集群,pg_wal 的内容如下所示:

  
  
  
  1. postgres@debian11:/home/postgres/ [pgdev] ls -la $PGDATA/pg_wal

  2. total 16396

  3. drwx------ 3 postgres postgres 4096 Jul 4 11:47 .

  4. drwx------ 20 postgres postgres 4096 Jul 4 11:47 ..

  5. -rw------- 1 postgres postgres 16777216 Jul 4 11:52 000000010000000000000001

  6. drwx------ 2 postgres postgres 4096 Jul 4 11:47 archive_status

在这里有一个 WAL 段和一个名为“archive_status”的目录,目前是空的:

  
  
  
  1. postgres@debian11:/home/postgres/ [pgdev] ls -la $PGDATA/pg_wal/archive_status/

  2. total 8

  3. drwx------ 2 postgres postgres 4096 Jul 4 11:47 .

  4. drwx------ 3 postgres postgres 4096 Jul 4 11:47 ..

要查看此目录中发生的情况,我们需要启用归档,并告诉 PostgreSQL 在需要归档 WAL 段时要执行什么操作:

  
  
  
  1. postgres@debian11:/home/postgres/ [pgdev] mkdir /tmp/archived_wal

  2. postgres@debian11:/home/postgres/ [pgdev] psql -c "alter system set archive_mode='on'" postgres

  3. ALTER SYSTEM

  4. postgres@debian11:/home/postgres/ [pgdev] psql -c "alter system set archive_command='test ! -f /tmp/archived_wal/%f && cp %p /tmp/archived_wal/%f'" postgres

  5. ALTER SYSTEM

当然,您不应该将归档目录设置为 /tmp,也不应该使用 cp,因为这不能保证归档的段实际上已写入磁盘。在本文的范围内,这样做是可以接受的。<br />更改归档命令(archive_command)可以在线完成,但启用或禁用归档(archive_mode)需要重新启动:

  
  
  
  1. postgres@debian11:/home/postgres/ [pgdev] pg_ctl restart

让我们看看如果我们强制归档当前段会发生什么:

  
  
  
  1. postgres@debian11:/home/postgres/ [pgdev] psql -c "select pg_switch_wal()" postgres

  2. pg_switch_wal

  3. ---------------

  4. 0/167AF68

  5. (1 row)

  6. postgres@debian11:/home/postgres/ [pgdev] ls -la /tmp/archived_wal/

  7. total 16392

  8. drwxr-xr-x 2 postgres postgres 4096 Jul 4 12:08 .

  9. drwxrwxrwt 10 root root 4096 Jul 4 12:07 ..

  10. -rw------- 1 postgres postgres 16777216 Jul 4 12:08 000000010000000000000001

正如预期的那样,我们在归档命令中指定的目录中看到了已归档的段。此外,PostgreSQL还在pg_walarchive_status目录中生成了一个“.done”文件:

  
  
  
  1. postgres@debian11:/home/postgres/ [pgdev] ls -la $PGDATA/pg_wal/archive_status/

  2. total 8

  3. drwx------ 2 postgres postgres 4096 Jul 4 12:08 .

  4. drwx------ 3 postgres postgres 4096 Jul 4 12:08 ..

  5. -rw------- 1 postgres postgres 0 Jul 4 12:08 000000010000000000000001.done

因此,每当成功归档一个段时,您都会得到相应的“.done”文件。那么什么时候会看到“.ready”文件呢?答案很简单:当相反的情况发生时,即出现了某种原因导致段的归档失败:

  
  
  
  1. postgres@debian11:/home/postgres/ [pgdev] psql -c "alter system set archive_command='/bin/false'" postgres

  2. ALTER SYSTEM

  3. postgres@debian11:/home/postgres/ [pgdev] psql -c "select pg_reload_conf()";

  4. pg_reload_conf

  5. ----------------

  6. t

  7. (1 row)

  8. postgres@debian11:/home/postgres/ [pgdev] psql -c "select pg_switch_wal()" postgres

  9. pg_switch_wal

  10. ---------------

  11. 0/2000160

  12. (1 row)

  13. postgres@debian11:/home/postgres/ [pgdev] ls -la $PGDATA/pg_wal/archive_status/

  14. total 8

  15. drwx------ 2 postgres postgres 4096 Jul 4 12:13 .

  16. drwx------ 3 postgres postgres 4096 Jul 4 12:12 ..

  17. -rw------- 1 postgres postgres 0 Jul 4 12:13 000000010000000000000002.ready

此文件将一直存在,直到再次成功归档:

  
  
  
  1. postgres@debian11:/home/postgres/ [pgdev] psql -c "alter system set archive_command='test ! -f /tmp/archived_wal/%f && cp %p /tmp/archived_wal/%f'" postgres

  2. ALTER SYSTEM

  3. postgres@debian11:/home/postgres/ [pgdev] psql -c "select pg_reload_conf()";

  4. pg_reload_conf

  5. ----------------

  6. t

  7. (1 row)

  8. postgres@debian11:/home/postgres/ [pgdev] ls -la $PGDATA/pg_wal/archive_status/

  9. total 8

  10. drwx------ 2 postgres postgres 4096 Jul 4 12:15 .

  11. drwx------ 3 postgres postgres 4096 Jul 4 12:12 ..

  12. -rw------- 1 postgres postgres 0 Jul 4 12:13 000000010000000000000002.done

当您看到许多“.ready”文件时,这可能意味着您的归档命令当前正在失败,或者系统负载过高,无法跟上归档的速度。


本文分享自微信公众号 - 开源软件联盟PostgreSQL分会(kaiyuanlianmeng)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部