【问题标题】:PostgreSQL-Data FilePostgreSQL-数据文件
【发布时间】:2016-12-14 10:43:27
【问题描述】:

PostgreSQL 中哪个进程写入数据文件?

postgreSQL 中的数据文件是什么?

注意:在 postgreSQL-9.5 上执行插入/更新/删除操作。我想验证哪个进程正在磁盘上执行提交,即数据文件。使用 WAL 和数据文件。

【问题讨论】:

  • 目前,我通过 jmeter.checkpoint_completion_target=0.3 , checkpoint_timeout=30s 触发大量查询,每次查询之间保持 30 秒的延迟,以便检查数据文件上的数据刷新。
  • 对于具体的提交,执行提交的后端是写入标记事务为已提交的 WAL 记录,然后更新PGPROC 以设置共享内存状态。但是该事务完成的工作的其他部分可以由 bgwriter 编写,更改可以稍后由检查点应用到堆,等等。

标签: database postgresql rails-postgresql postgresql-9.5


【解决方案1】:

PostgreSQL 数据库集群的数据文件位于数据目录的data 子目录下。它们由三个进程编写:

  • 后台写入器进程将脏块从缓冲区写回磁盘,以确保有足够的干净块。

  • 检查点进程在特定时间(检查点)将所有个脏块写入磁盘以提供崩溃的起点恢复。

  • 后端进程(服务于客户端连接的进程)仅在后台写入器无法跟上并且没有足够的可用块可用时将数据写入磁盘。

位于pg_xlog预写日志 或WAL 是完全不同的东西。它由紧接在COMMIT 之前的后端进程写入,以确保在崩溃的情况下恢复事务所需的信息安全地写入磁盘。位于pg_clog提交日志 也是如此,它包含事务是否已提交或回滚的信息。

数据可以在COMMIT之前写入数据文件,但只有在事务提交时才可见。

值得一提的是,不仅DML语句会导致数据块被弄脏:

  • 后台进程“autovacuum”定期扫描表和索引并删除未使用的条目。

  • 第一个读取新写入数据的进程会在提交日志中查找提交信息,并在元组中写入一个提示位,这样以后的读者就不必这样做了再次工作。

【讨论】:

  • 是的。 TL;DR 是“大多数 PostgreSQL 进程写入数据目录中的文件。每个表是一个或多个文件,还有其他特殊文件。除 .conf 文件外,切勿修改数据目录中的任何内容”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-16
  • 2019-10-05
  • 2016-03-19
  • 2016-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多