
# 集群报错内存溢出
#### 问题现象
查看日志提示：
```
[ERROR] Mpp task queryDataAnalyseById or updateDataAnalyseHistoryEndTimesAndResult fail, dataAnalyseId:17615 org.postgresql.util.PSQLException: ERROR: memory is temporarily unavailable
sql：vacuum full dws_customer_360.t_user_resource;
```
#### 原因分析
存在部分SQL语句使用内存资源过多，造成内存资源耗尽，其余语句执行作业时无法分配到内存，从而提示内存不足。
#### 处理方法
1. 调整业务执行时间窗，与高并发执行业务的时间错峰执行。
2. 查询当前集群的内存使用情况，找到内存使用过高的语句并及时终止，释放资源之后集群内存就会恢复。具体的操作步骤如下：
- **8.1.1及之前集群版本连接数据库后执行以下步骤：**
1. 执行以下语句查询当前集群的内存使用情况，观察是否有实例的dynamic_used_memory已经大于或者接近于该实例的max_dynamic_memory，出现上述报错，一般为dynamic_used_memory达到上限。 
   ```
   SELECT * FROM pgxc_total_memory_detail;
   ```
   
   
2. 开启topsql的情况下，使用实时topsql查询正在执行的高内存query语句，根据结果中的max_peak_memory以及memory_skew_percent值，较大的值就是消耗内存较多的语句。
   
   ```
   SELECT nodename,pid,dbname,username,application_name,min_peak_memory,max_peak_memory,average_peak_memory,memory_skew_percent,substr(query,0,50) as query FROM pgxc_wlm_session_statistics;
   ```
   
   
3. 根据[步骤2]查询的会话信息，通过执行pg_terminate_backend函数结束相应会话，即可恢复内存。恢复后可根据实际业务情况重新优化该SQL语句。
   
   ```
   SELECT pg_terminate_backend(pid);
   ```
   
   
- **8.1.2及以上集群版本支持控制台查看，在实时查询监控页面执行以下步骤：**
![](https://support.huaweicloud.com/trouble-dws/public_sys-resources/notice_3.0-zh-cn.png)
- 实时查询仅8.1.2及以上集群版本支持。
- 启动实时查询功能需要在"监控设置\>监控采集"页面打开"实时查询监控"指标项。
 
1. 登录[DWS控制台](https://console.huaweicloud.com/dws)，在"集群列表"页面，找到需要查看监控的集群，在集群所在行的"操作"列，单击"监控面板"，系统将显示数据库监控页面。
2. 在左侧导航栏选择"监控 \> 实时查询"，进入实时查询监控页面。
3. 根据选择的指定时间段浏览集群中正在运行的所有查询信息。
4. 单击指定实时查询监控的会话查询ID，进入该会话ID的实时查询的详情页面，在详情页面中会展示当前监控的详细内容。例如用户名称、数据库名称、执行时间、查询语句、查询状态、排队状态、dn最小内存峰值、dn最大内存峰值、dn每秒最大io峰值、dn每秒最小io峰值和内存使用平均值等信息。 
   根据"dn最大内存峰值"和"内存使用平均值"查询结果，值较大的就是消耗内存较多的语句。
   ![](https://support.huaweicloud.com/trouble-dws/figure/zh-cn_image_0000001380083104.png "点击放大")
   
   
5. 如果已确认所查询的占用内存高的语句需要被终止，勾选指定的查询ID后，单击"终止查询"按钮，终止查询。 
   如果设置了细粒度权限控制功能，只有配置了操作权限的用户才能使用终止查询按钮。只读权限用户登录后终止查询按钮为灰色。
   ![](https://support.huaweicloud.com/trouble-dws/figure/zh-cn_image_0000001379916576.png "点击放大")
   
   
 
