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