Gauss 数据库空间不足问题
【摘要】 空间消耗分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)