暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Mogdb - 对于drop table语句导致系统句柄无法释放测试

由迪 2024-01-25
115

原作者:赵安琪

测试说明

本测试用于检验Mogdb对于Drop table等DDL操作后,是否存在数据库应用程序长期占据系统句柄,导致无法释放空间的情况。

测试环境

系统版本: Linux 7.8
数据库版本: Mogdb 5.0.1

测试过程

1、建立数据表,并查看表对应的oid,relnodeoid

create table t1 (id int,remark1 varchar,remark2 varchar,remark3 varchar);

insert into t1 select generate_series(1,32000000),md5(random()::text),md5(random()::text),md5(random()::text);

select pg_size_pretty(pg_relation_size('t1'));

图片.png

select pg_relation_filepath('t1');
select relname,oid,relfilenode from pg_class where relname='t1';

图片.png

2、对表进行DML/DDL操作,模拟生产环境

delete from t1 where id <= 16000000;

vacuum full t1;

analyze t1;

SELECT relname,n_live_tup,n_dead_tup,last_analyze,last_autoanalyze FROM pg_stat_user_tables WHERE relname='t1';

select pg_relation_filepath('t1');
select relname,oid,relfilenode from pg_class where relname='t1';

图片.png

ls -ltr $PGDATA/base/16133/16497

图片.png

3、开启事务,删除表,并跟踪文件删除情况

begin;
drop table t1;

图片.png

select pid,datname,usename,query,state from pg_stat_activity where query like 'drop table%';

图片.png

ls -ltr  /dbdata/mogdb/data/base/16133/16497*
lsof -l /dbdata/mogdb/data/base/ |grep deleted

图片.png

4、事务提交,观察文件系统对应的数据文件删除情况

commit;

图片.png

ls -ltr  /dbdata/mogdb/data/base/16133/16497*
lsof -l /dbdata/mogdb/data/base/ |grep deleted

图片.png

总结及拾遗

Mogdb在drop object未提交的情况下,并不会主动删除对象,该数据对象会上锁,并等待事务提交或回滚。在提交后,该对象会调用系统函数,有系统负责将该对象映射的数据文件删除,过程中不会出现长时间数据库应用阻塞数据文件删除现象的出现。

句柄简析:

在发生IO读写前,程序会触发调用操作系统函数并将需要操作的文件名传递给内核,该函数取回一个内部指针,这个指针就是文件句柄(file handle)。系统将所有的文件句柄组成一个链表(可以简单的理解为一个系统内部的索引),每个句柄文件是组成链表的因子,在发生IO调用时,系统内核会利用链表高效的管理所有需要进行IO的文件。可以说所有的IO调用,都需要通过句柄文件完成的。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论