首页 文章

PostgreSQL中的重型归档日志生成

提问于
浏览
0

我们在 生产环境 服务器中使用PostgreSQL 9.1 . 从过去一个月开始,我们的数据库每天生成近35 GB的存档日志 . 为此,我们监控了存档日志生成时正在运行的所有查询 . 然后我们在整个数据库上运行真空(冻结,分析) . 但它似乎对归档日志生成没有影响 . 我们怀疑有一张 table . 每隔9小时和第39分钟,正在运行相同的删除语句 . 它每次执行时都会删除整个表 . 出于测试目的,我们对语句运行了EXPLAIN(ANALYZE,BUFFERS) . 我们发现read = 576 MB,写入= 328 MB . 但是,在我们的 生产环境 服务器中,shared_buffers = 24 MB . 因此,每次从磁盘到共享缓冲区需要24 MB的数据块 . 然后它将刷新到磁盘,并再次将24 MB的数据块放入共享缓冲区 .

那么,归档日志生成的原因是因为频繁刷新数据块吗?我们是否需要在 生产环境 服务器中增加shared_buffers以摆脱繁重的归档日志生成?在我们的 生产环境 服务器中,work_mem = 1 MB以下是EXPLAIN(ANALYZE,BUFFERS)的输出,供您参考:

QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------------------
 Delete on table_a  (cost=83.35..171.85 rows=2060 width=12) (actual time=11949.929..11949.929 rows=0 loops=1)
   Buffers: shared hit=375963 read=73999 written=42030
   ->  Hash Semi Join  (cost=83.35..171.85 rows=2060 width=12) (actual time=1.028..12.570 rows=2060 loops=1)
         Hash Cond: (public.table_a.id = public.table_a.id)
         Buffers: shared hit=46 read=30 written=18
         ->  Seq Scan on table_a  (cost=0.00..57.60 rows=2060 width=10) (actual time=0.007..5.009 rows=2060 loops=1)
               Buffers: shared hit=7 read=30 written=18
         ->  Hash  (cost=57.60..57.60 rows=2060 width=10) (actual time=0.973..0.973 rows=2060 loops=1)
               Buckets: 1024  Batches: 1  Memory Usage: 89kB
               Buffers: shared hit=37
               ->  Seq Scan on table_a  (cost=0.00..57.60 rows=2060 width=10) (actual time=0.002..0.463 rows=2060 loops=1)
                     Buffers: shared hit=37
 Total runtime: 11950.028 ms

1 回答

  • 0

    https://www.postgresql.org/docs/9.1/static/wal-intro.html

    简而言之,WAL的核心概念是,只有在记录了这些更改之后,即在将描述更改的日志记录刷新到永久存储之后,才必须写入对数据文件(表和索引所在的位置)的更改 . 如果我们遵循此过程,我们不需要在每次事务提交时将数据页刷新到磁盘,因为我们知道如果发生崩溃,我们将能够使用日志恢复数据库:任何尚未应用的更改可以从日志记录中重做数据页面 . (这是前滚恢复,也称为REDO . )

    所以总之 INSERT, UPDATE, DELETE, VACUUM, CLUSTER, ALTER.. SET TABLESPACE (和其他类似的)产生WALs . 随着更多WAL被创建,更多的块被重写 . shared_buffers 不会影响它 .

相关问题