Redrock Postgres 文档
主页 切换暗/亮/自动模式 切换暗/亮/自动模式 切换暗/亮/自动模式 返回首页
编辑页面

会话中止后,会出现残留的表文件吗?

问题描述

在我们创建表或者数据库的过程中,因为数据库立即停止或者某些原因发生宕机,此时正在连接的会话被中止,数据库重新启动后会出现残留的表文件吗?

问题解答

会话中止后,不会出现残留的表文件。

Redrock Postgres 在创建表文件或者数据目录时,会记录撤消日志,当正在连接的会话因为某些原因被中止后,数据库重新启动后会检查这些异常中止的事务。数据库会回滚这些异常中止的事务,根据记录的撤消日志清理残留的表文件和目录。

问题验证

下面我们启动一个事务块,在事务中创建一个表t,插入一些数据。

BEGIN;

CREATE TABLE t (id integer, name text);

INSERT INTO t (id, name)
  SELECT i, repeat('Pg', 32)
    FROM generate_series(1, 1000000) AS s(i);

让我们查看下表文件的路径。

SELECT pg_relation_filepath('t');
 pg_relation_filepath 
----------------------
 base/11779/16390

让我们立即停止数据库,模拟数据库异常宕机的故障,再重新启动数据库服务:

$ pg_ctl stop --mode=immediate
$ pg_ctl start

数据库重新启动后,回滚了异常中止的事务,根据事务记录的撤消日志清理了残留的表文件。(注意:事务回滚的时候不会立即清理残留的表文件,表文件的实际清理操作是在检查点的过程中完成的)

$ ls data/base/11779/16390
ls: cannot access data/base/11779/16390: No such file or directory