预备知识:
之前提到输入insert语句后数据是不会直接刷入存储文件的(等待大概10-15分钟);
对于这种现象是由于在执行insert的语句的时候,postgres会先将数据写入到日志(1),然后把事务标记为完成(2)。最后将数据被写到表中(3);
这种设计是由于postgres稳定行决定的。不至于一些脏数据导致postgres奔溃,例如:直接对数据文件进行读写的话,如果此时因为某些原因数据只有部分入库,postgres如何对这部分数据进行处理。所以引入了日志(xlog)即使数据库奔溃,也可以通过xlog对数据进行对比修正或是复原。当然如果先写日志和缓存将他们和直接文件存储IO操作分离,也可以提高运行效率;
回到主题,那我们如何快速将数据刷入存储文件?现在已经知道执行insert语句xlog是实时改变的;那么如何清理xlog,清理掉的xlog是否可以认为已经完成xlog到存储文件对比同步呢?这里就使用到了CHECKPOINT(检查点)让xlog生成新的文件,让老的xlog“失效”(也就是可以被清理掉);以这种方式来观察最后是否执行checkpoint命令,数据就被刷入存储中
开始测试:
1.查看文件修改时间

2.执行insert语句和checkpoint;


3.查看存储文件修改时间:

后续问题:
1.未执行checkpoint的情况数据刷入存储的过程如何?等待10到15分钟postgres做了什么?
参考资料:
PostgreSQL Replication之第二章 理解PostgreSQL的事务日志
网友评论