Gauss 数据库空间不足问题

举报
张谱继 发表于 2024/05/23 12:12:47 2024/05/23
【摘要】 空间消耗分3块:数据文件、WAL日志、临时文件1、数据文件:正常数据库表空间使用情况,如果要计算表空间使用率。表空间使用率=PG_TABLESPACE_SIZE/表空间所在目录的磁盘大小--表空间使用情况select spcname as tablespace, datname, pg_size_pretty(pg_database_size(datname)) as db_size, pg...

空间消耗分3块:数据文件、WAL日志、临时文件

1、数据文件:正常数据库表空间使用情况,如果要计算表空间使用率。表空间使用率=PG_TABLESPACE_SIZE/表空间所在目录的磁盘大小

--表空间使用情况
select
	spcname as tablespace,
	datname,
	pg_size_pretty(pg_database_size(datname)) as db_size,
	pg_size_pretty(pg_tablespace_size(spcname)) as tablespace_size,
	round(100 * pg_database_size(datname) / pg_tablespace_size(spcname), 2) as pct_used
from
	pg_database
full join pg_tablespace on
	pg_database.dattablespace = pg_tablespace.oid
--具体的大表
--有root等大权限
select
	table_schema || '.' || table_name as table_full_name,
	pg_size_pretty(pg_total_relation_size('"' || table_schema || '"."' || table_name || '"') )as size
from
	information_schema.tables
order by
	pg_total_relation_size('"' || table_schema || '"."' || table_name || '"') desc;
--或
select
	schemaname || '.' || tablename as table_full_name,
	pg_size_pretty(pg_total_relation_size('"' || schemaname || '"."' || tablename || '"') )as size
from
	pg_tables
order by
	pg_total_relation_size('"' || schemaname || '"."' || tablename || '"') desc;
--大表清理策略,
--delete操作后的空间暂时不会释放,只有执行vacuum full ‘table_name’(该操作会锁表)后删除的空间才会真正释放
--如果发现不需要的表或数据,可以通过truncate table 或是drop table 清理掉不需要的数据,直接释放表空间。

2、WAL日志情况:主要是用于备份库,其他同步工具,往往是容易突增的点

--查看wal日志大小
select
	round(sum(size)/ 1024 / 1024 / 1024, 2) "GB"
from
	pg_ls_waldir();

--查找具体延迟大的复制槽:注意:gs_roach_full和gs_roach_inc分别用于全备和差备,restart_lsn固定为FFFFFFFF,请无视;其他物理复制槽(slot_type=physical)如果出现非常大的WAL堆积(比如100GB以上)请联系DBA
select
	pg_size_pretty(pg_xlog_location_diff(pg_current_xlog_location(),restart_lsn)),
	*
from
	pg_replication_slots
where
	pg_size_pretty(pg_xlog_location_diff(pg_current_xlog_location(),restart_lsn)) > 0
order by
	pg_size_pretty(pg_xlog_location_diff(pg_current_xlog_location(),restart_lsn));

--确认复制槽不需要保留的情况下,可以删除失效的复制槽
select pg_drop_replication_slot('复制槽名')
--对于WAL堆积严重的活动的复制槽(active为true),无法直接drop,可以找到对应的复制连接先杀掉,再drop复制槽(杀会话和drop复制槽是高危操作,请谨慎使用)。

--3.220版本执行以下SQL,找到对应pid和sessionid(根据slot_name区分)
select t.slot_name,a.* from pg_stat_activity a join gs_get_parallel_decode_thread_info() t on(a.pid=t.thread_id)
where t.thread_type='sender'

--2.7版本执行以下SQL,找到对应pid和sessionid(可能有多个,无法精确匹配。可根据usename和client_addr缩小范围)
select * from pg_stat_activity where state<>'idle' and length(query)=0 and client_addr is not null

--再根据pid和sessionid杀会话
select pg_terminate_session(pid,sessionid)

--杀会话后立刻删除复制槽
select pg_drop_replication_slot('复制槽名')

3、临时文件

-- pg_ls_tmpdir – 此函数在 RDS for PostgreSQL 13 及更高版本中提供,可让用户了解当前临时文件使用情况。完成的查询不会出现在该函数的结果中。
select
	round(sum(size)/ 1024 / 1024 / 1024, 2) "GB"
from
	pg_ls_tmpdir();

--文件名包括生成了临时文件的会话的处理 ID(PID)。更高级的查询(如以下示例所示)对每个 PID 的临时文件执行总和。
select
	replace(left(name, strpos(name, '.')-1), 'pgsql_tmp', '') as pid,
	count(*),
	sum(size)
from
	pg_ls_tmpdir()
group by
	pid;
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。