标签
PostgreSQL , Linux , 对象 , inode 限制 , 目录数限制
背景
PostgreSQL 里面创建的表,序列,索引,物化视图等带有存储的对象,每个对象的数据文件都是独立的,较依赖文件系统的管理能力。并不像Oracle那样把对象放到表空间中管理,表空间又由若干的数据文件组成。(ASM的话则接管更多的操作。)
所以,当创建了很多个有实际存储的对象时,文件数就会很多:
通常一个表包含数据文件(若干,单个默认1G),fsm文件一个, vm文件一个,如果是unlogged table则还有_init文件一个。
文件数过多,可能触发文件系统的一些限制。
ext4_dx_add_entry: Directory index full!
举例
某个系统,在创建新的对象时,报这样的错误。
ERROR: could not create file "base/16392/166637613": No space left on device
digoal=# do language plpgsql $$
declare
begin
for i in 1..1000 loop
execute 'create table test'||i||'(id int primary key, c1 int unique, c2 int unique)';
end loop;
end;
$$;
ERROR: 53100: could not create file "base/16392/166691646": No space left on device
CONTEXT: SQL statement "create table test43(id int primary key, c1 int unique, c2 int unique)"
PL/pgSQL function inline_code_block line 5 at EXECUTE statement
LOCATION: mdcreate, md.c:304
报错的PG源码文件如下