我已经看到这个答案,How to apply PostgreSQL UNLOGGED feature to an existing table?,它基本上表明将表转换为unlogged的方法是运行:

CREATE UNLOGGED TABLE your_table_unlogged AS SELECT * FROM your_table;

是否仍然如此,因为虽然这是一个明显的工作解决方案,但对于一个大表,可能会有潜在的时间和磁盘空间因素发挥作用。如果是的话,有人能简单地解释一下Postgres的体系结构意味着你需要重写一个完整的表以使它不被标记吗?

最佳答案

更新:在PostgreSQL 9.5+中有ALTER TABLE ... SET LOGGED... SET UNLOGGED
UNLOGGED转换到LOGGED需要将整个表的数据写入xlogs(如果wal_level是>minimal),这样副本就可以得到一个副本。因此它不是免费的,但是仍然值得创建一个未标记的表,填充它,然后设置它的日志,如果您有一堆清理、删除和合并工作要在初始加载后对表进行。
是的,9.4的情况仍然如此。
从logged转换成UNLOGGED在理论上并不困难,但是没有人做过这样的工作。主要的是,必须重新检查所有引用它的约束和类型等,以确保没有从另一个记录表引用到此表。大部分注意力都放在了另一个案例上,所以如果这个特性对你很重要,考虑资助它的开发或者自己参与开发。
对于不参与流式复制或使用UNLOGGED的节点,将archive_command转换为日志可能成为可能。否则就不简单了,因为需要处理这样一个事实:表的数据没有被发送,但它突然发生了变化——复制协议需要进一步增强,以便在继续之前允许表被基本复制。

10-04 10:09