允许将未记录的表更改为记录的表 GSoC 2014

来自 PostgreSQL wiki
跳转到导航跳转到搜索

介绍

该项目将允许更改未记录的表(不生成事务日志)及其依赖项为记录的表,换句话说,一个在 WAL 文件中记录更改的常规表,以及从记录的表更改为未记录的表。为了实现这一点,我们将引入以下 SQL 语法

ALTER TABLE name SET LOGGED; ALTER TABLE name SET UNLOGGED;

对 PostgreSQL 社区的益处

未记录的表功能是在 9.1 版本中引入的,与常规表(记录的表)相比,它提供了更好的写入性能,但不是崩溃安全的。如果服务器崩溃,它们的内容将自动丢弃(清除)。此外,它们的内容不会传播到备用服务器。

将未记录的表转换为记录的表将允许我们拥有两全其美;我们可以将大量数据(ETL 脚本)加载到未记录的表中以获得更好的性能,然后将其更改为记录的表以提供持久性。

附加目标

该项目的主要目标是允许将表从未记录的表更改为记录的表,以及从记录的表更改为未记录的表,但根据社区的建议,我们将扩展此提议以实现更多相关目标。

  • 允许在记录的表上使用未记录的索引
    • ALTER INDEX name SET { UNLOGGED | LOGGED }
  • 在 wal_level = minimal 时,实现“ALTER TABLE name SET LOGGED”而不重写整个表。
  • 允许未记录的物化视图
    • ALTER MATERIALIZED VIEW name SET { UNLOGGED | LOGGED }

交付成果

该项目到最后只有一个交付成果。交付成果将是实现将未记录的表转换为记录的表,以及将记录的表转换为未记录的表的例程,使用与vacuum full相同的算法,只是它将为新的relfilenode设置不同的relpersistence

提出的解决方案已经与 PostgreSQL 社区进行了讨论。[[1]]

项目时间表

截止 5 月 19 日

  • 为项目创建一个网站([[2]])
  • 为项目创建一个公共仓库([[3]])
    • WIP 补丁在 [4]
  • 阅读社区关于该项目已有的讨论 ([[5]])
  • 如 pgsql-hackers 邮件列表中已经讨论的那样,此功能将类似于“vacuum full”进行实现,只是它将为新的“relfilenode”设置不同的“relpersistence”。
  • 了解一些 PostgreSQL 内部机制
    • 语法 (src/backend/parser/gram.y)
    • vacuum full (src/backend/commands/[vacuum.c | cluster.c])
  • 与社区讨论附加目标

5 月 19 日 - 6 月 23 日

  • 第一个原型的实现
    • 更改 PostgreSQL 语法以支持“ALTER TABLE … SET LOGGED”
    • 实现或调整例程以将“未记录的”表更改为“记录的”(类似于“vacuum full”)
  • 编写文档和测试用例
  • 将第一个原型提交到 2014/06 的 commitfest([[6]])

6 月 23 日 - 6 月 27 日

  • 导师审核正在进行的工作

6 月 27 日 - 8 月 18 日

  • 根据 2014/06 的 commitfest 期间社区的反馈进行调整
  • 第二个原型的实现
    • 更改 PostgreSQL 语法以支持“ALTER TABLE … SET UNLOGGED”
  • 提交到 2014/09 的 commitfest 以进行最终评估,并可能被提交到 9.5 版本(网页尚未创建)

8 月 18 日 - 8 月 22 日

  • 根据 2014/09 的 commitfest 期间社区的反馈进行调整
  • 最终导师审核

关于提案人

Fabrízio de Royes Mello

  • 电子邮件:fabriziomello at gmail dot com
  • Twitter:@fabriziomello
  • GitHub [7]
  • LinkedIn [8]

目前,我帮助个人和团队充分利用关系型数据库,特别是 PostgreSQL,帮助团队设计数据库结构(建模)、构建物理架构(数据库模式)、编程(过程语言)、SQL(使用、调优、最佳实践)、优化和生产环境中实例的编排。我为巴西 PostgreSQL 社区 (www.postgresql.org.br) 做志愿者工作,支持邮件列表、组织活动 (pgbr.postgresql.org.br) 和一些管理任务。我还帮助 PostgreSQL 全球开发组 (PGDG) 实现一些功能和审核补丁 (git.postgresql.org)。