探索数据库真空清理的谜团

主要观点:

  • 要理解VACUUM及其影响,需先了解数据在磁盘上的存储方式,重点关注Postgres
  • 数据库中的元组(tuple)是表的行版本和索引条目,由头(header)和数据(data)组成,页面(page)是固定大小的存储单元,包含头、元组指针数组、空闲空间等。
  • PostgresTOAST技术用于存储超过 8KiB 的元组,较大列会存储在单独的表中。
  • Postgres中有两种VACUUM操作,VACUUM基本形式仅删除表中的死元组版本,不回收空间;VACUUM FULL更激进,会删除死元组并回收空间,是阻塞操作。
  • VACUUM过程分为多个阶段,包括堆扫描、索引清理、堆清理和堆截断等。
  • 普通VACUUM操作在堆截断阶段会获取ACCESS EXCLUSIVE锁,可通过设置vacuum_truncate参数等方式避免或处理。

关键信息:

  • Postgres中单个页面大小为 8KiB,包含多种元素。
  • 元组的t_xmin是插入事务,t_xmax是更新或删除事务。
  • 可通过pageinspect扩展查看数据库页面,heap_page_items函数查看页面项。
  • TOAST表用于存储大元组,有对应的主表和pg_toast表。
  • VACUUM FULL会回收死元组空间,普通VACUUM不回收。
  • VACUUM各阶段的作用及ACCESS EXCLUSIVE锁的获取情况和处理方式。

重要细节:

  • 展示了创建表、插入数据、更新和删除数据后页面项的变化及VACUUM操作的效果。
  • 提供了用于识别大元组、获取表oid等的查询语句及相关示例。
  • 提及在有运行作业可能大量更新或删除行时,应禁用VACUUM中的TRUNCATE选项以避免影响生产流量。
阅读 7
0 条评论