概述
近期遇到一个数据目录磁盘使用率突增的问题,分析问题的过程中,查看活动会话发现有一个"create table XXX as"语句在创建新表,怀疑磁盘使用率突增跟该会话有关,那么如何确定新建的表占用了多少磁盘空间呢
现象重现
会话1-使用create table XXX as创建一个大表
postgres=# create unlogged table test_s as select (select num from a limit 1) from generate_series(1,100000000);
复制
会话2-在会话1执行的过程中查看活动会话
postgres=# select pid,xact_start,state,query from pg_stat_activity where state<>'idle' ;
pid | xact_start | state | query
---------+-------------------------------+--------+-------------------------------------------------------------------------------------------------------
2726148 | 2024-08-13 14:44:15.640673+08 | active | create unlogged table test_s as select (select num from a limit 1) from generate_series(1,100000000);
2719775 | 2024-08-13 14:44:43.938851+08 | active | select pid,xact_start,state,query from pg_stat_activity where state<>'idle' ;
(2 rows)
postgres=# select oid,relfilenode from pg_class where relname='test_s';
oid | relfilenode
-----+-------------
(0 rows)
复制
此时pg_class中是查不到该表的,根据活动会话pid使用strace工具查看进程调用信息,找到pwrite64在写41号链接,查看41号链接实际指向的文件就是正在创建的新表数据文件,同时可以看到数据文件大小还在增长
[postgres@mydb1b data]$ strace -tt -p 2726148 ...... 14:44:25.496915 pwrite64(41, "\0\0\0\0\0\0\0\0\0\0\0\0\244\4\270\4\0 \4 \0\0\0\0\350\2370\0\320\2370\0"..., 8192, 461070336) = 8192 14:44:25.496938 pwrite64(41, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 8192, 477847552) = 8192 14:44:25.497005 pread64(38, "\0\0\1\0\0\0\30\0J\2\3\1\16\0\0\0\1\0\0\0\30\0K\2\3\1\16\0\0\0\1\0"..., 8192, 237641728) = 8192 14:44:25.497130 lseek(41, 0, SEEK_END) = 477855744 14:44:25.497178 pwrite64(41, "\0\0\0\0\0\0\0\0\0\0\0\0\244\4\270\4\0 \4 \0\0\0\0\350\2370\0\320\2370\0"..., 8192, 461078528^C) = 8192 strace: Process 2726148 detached [postgres@mydb1b data]$ ls -ltr /proc/2726148/fd/41 lrwx------. 1 postgres postgres 64 8月 13 14:42 /proc/2726148/fd/41 -> /app/pg12/data/base/13672/97399 [postgres@mydb1b data]$ ll /app/pg12/data/base/13672/97399* -rw-------. 1 postgres postgres 1.0G 8月 13 14:44 /app/pg12/data/base/13672/97399 -rw-------. 1 postgres postgres 109M 8月 13 14:44 /app/pg12/data/base/13672/97399.1 -rw-------. 1 postgres postgres 0 8月 13 14:44 /app/pg12/data/base/13672/97399_init [postgres@mydb1b data]$ ll /app/pg12/data/base/13672/97399* -rw-------. 1 postgres postgres 1.0G 8月 13 14:44 /app/pg12/data/base/13672/97399 -rw-------. 1 postgres postgres 182M 8月 13 14:44 /app/pg12/data/base/13672/97399.1 -rw-------. 1 postgres postgres 0 8月 13 14:44 /app/pg12/data/base/13672/97399_init [postgres@mydb1b data]$ ll /app/pg12/data/base/13672/97399* -rw-------. 1 postgres postgres 1.0G 8月 13 14:44 /app/pg12/data/base/13672/97399 -rw-------. 1 postgres postgres 378M 8月 13 14:44 /app/pg12/data/base/13672/97399.1 -rw-------. 1 postgres postgres 0 8月 13 14:44 /app/pg12/data/base/13672/97399_init [postgres@mydb1b data]$
复制
会话2-在会话1执行完成后,查看pg_class->oid为97399,与上边看到的一致
postgres=# select oid,relfilenode from pg_class where relname='test_s';
oid | relfilenode
-------+-------------
97399 | 97399
(1 row)
复制
解决方案
本次问题处理中,通过以上方法定位到是这个会话导致的磁盘突增,确认该会话来源并停止会话后空间即释放。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
PostgreSQL初/中/高级认证考试(3.15)通过考生公示
开源软件联盟PostgreSQL分会
402次阅读
2025-03-20 09:50:36
9.9 分高危漏洞,尽快升级到 pgAdmin 4 v9.2 进行修复
严少安
312次阅读
2025-04-11 10:43:23
3月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
307次阅读
2025-04-15 14:48:05
openHalo问世,全球首款基于PostgreSQL兼容MySQL协议的国产开源数据库
严少安
248次阅读
2025-04-07 12:14:29
IvorySQL 4.4 发布 - 基于 PostgreSQL 17.4,增强平台支持
通讯员
237次阅读
2025-03-20 15:31:04
PG vs MySQL 执行计划解读的异同点
进击的CJR
173次阅读
2025-03-21 10:50:08
postgresql+patroni+etcd高可用安装
necessary
135次阅读
2025-03-28 10:11:23
手把手教你在 openKylin 上部署 IvorySQL 4.4
严少安
131次阅读
2025-03-27 20:41:28
从 Oracle 到 PostgreSQL迁移成本评估揭秘
梧桐
127次阅读
2025-03-27 17:21:42
转发有奖 | PostgreSQL 16 PGCM高级认证课程直播班招生中!
墨天轮小教习
122次阅读
2025-04-14 15:58:34