# DWS常用运维命令集
本章节仅列出DWS集群运维过程中常用的SQL命令，覆盖**查看运维状态、应急恢复、业务分析** 场景，帮助运维人员快速定位和解决问题。其中查看的系统对象可根据实际情况灵活变通，查询返回的具体字段含义，请参考[《开发指南》](https://support.huaweicloud.com/devg-dws/dws_04_0559.html)中关于对应系统表、系统视图、系统函数的介绍。
#### 前提条件
正常连接上DWS集群。
#### 查看运维状态类
以下命令用于日常运维巡检，帮助快速了解集群当前运行状态、资源使用情况和潜在瓶颈。建议定期执行以建立基线数据。
- **查看当前业务整体运行情况。**
  ```
  SELECT coorname, usename, client_addr, sysdate-query_start AS duration, state, enqueue,waiting, pid, query_id, substr(query,1,60) FROM pgxc_stat_activity WHERE usename != 'Ruby' AND usename != 'omm' AND state = 'active' ORDER BY duration DESC;
  ```
  参数说明：该查询从pgxc_stat_activity视图获取所有活跃会话信息（排除了Ruby和omm内部账户的会话），按执行时长（duration字段表示SQL已执行时长）降序排列，快速定位耗时长的SQL。
  
- **查看当前业务整体并发情况。**
  ```
  SELECT usename,coorname,enqueue,state,count(*) FROM pgxc_stat_activity WHERE usename <> 'omm' AND usename <> 'Ruby' GROUP BY 1,2,3,4 ORDER BY 4,5 DESC LIMIT 30;
  ```
  参数说明：按用户名、CN名、排队状态和会话状态分组统计会话数量，了解并发分布，结果限制30行。
  

- **查看当前集群内部整体等待状态。**
  ```
  SELECT wait_status,wait_event,count(*) AS cnt FROM pgxc_thread_wait_status WHERE wait_status <> 'wait cmd' AND wait_status <> 'synchronize quit' AND wait_status <> 'none' AND wait_status <> 'wait stream task' GROUP BY 1,2 ORDER BY 3 DESC LIMIT 50;
  ```
  参数说明：从pgxc_thread_wait_status视图获取集群各节点线程等待状态，排除了正常的空闲等待状态（wait cmd、synchronize quit、none、wait stream task），结果限制50行。
  

- **查看当前集群资源池业务运行信息（配置资源管控场景）。**
  ```
  SELECT s.resource_pool AS rpname, count(1) AS session_cnt,sum(CASE WHEN a.state = 'active' THEN 1 ELSE 0 END) AS active_cnt,sum(CASE WHEN s.enqueue ='global' THEN 1 ELSE 0 END) AS global_wait,sum(CASE WHEN s.lane = 'fast' AND s.status = 'running' THEN 1 ELSE 0 END) AS fast_run,sum(CASE WHEN s.lane = 'fast' AND s.status = 'pending' AND s.enqueue NOT IN ('global','none') THEN 1 ELSE 0 END) AS fast_wait,sum(CASE WHEN s.lane = 'slow' AND s.status = 'running' THEN 1 ELSE 0 END) AS slow_run,sum(CASE WHEN s.lane = 'slow' AND s.status = 'pending' AND s.enqueue NOT IN ('global','none') THEN 1 ELSE 0 END) AS slow_wait,sum(CASE WHEN s.status = 'running' THEN s.statement_mem ELSE 0 END) AS est_mem FROM pg_catalog.pgxc_session_wlmstat s,pg_catalog.pgxc_stat_activity a WHERE s.threadid=a.pid(+) AND s.attribute != 'internal' AND s.resource_pool != 'root' GROUP BY 1;
  ```
  参数说明：从pgxc_session_wlmstat和pgxc_stat_activity关联查询，统计各资源池的会话数、活跃数、全局等待数、快/慢车道运行和等待数、预估内存使用量。
  - s.threadid=a.pid(+)：外连接，保留所有wlmstat记录。
  
  - lane字段区分快车道（fast）和慢车道（slow）。
   

- **查看当前集群动态内存水位。**
  ```
  SELECT a.nodename,a.memorymbytes AS dynamic_used_memory,b.memorymbytes AS max_dynamic_memory, dynamic_used_memory/max_dynamic_memory*100 AS used_rate  FROM pgxc_total_memory_detail a JOIN pgxc_total_memory_detail b ON a.nodename=b.nodename  WHERE a.memorytype = 'dynamic_used_memory' AND b.memorytype = 'max_dynamic_memory' ORDER BY a.memorymbytes DESC;
  ```
  参数说明：从pgxc_total_memory_detail视图获取各节点动态内存使用量和上限，计算使用率。按使用量降序排列，快速定位内存高水位节点。
  - dynamic_used_memory：已使用动态内存。
  
  - max_dynamic_memory：动态内存上限。
   
- **查看各类线程内存使用情况** **。**
  ```
  SELECT b.state, sum(totalsize) AS totalsize, sum(freesize) AS freesize, sum(usedsize) AS usedsize FROM pv_session_memory_detail a , pg_stat_activity b WHERE split_part(a.sessid,'.',2) = b.pid GROUP BY b.state ORDER BY totalsize DESC LIMIT 20;
  ```
  参数说明：从[查看当前集群动态内存水位]查询到动态内存高水位的CN/DN节点，通过连接该节点查询。查询过程中关联pv_session_memory_detail和pg_stat_activity查询，按会话状态分组统计内存使用，按总内存降序排列，限制20行。
  

- **查看当前实例每个session使用内存** **。**
  ```
  SELECT split_part(pv_session_memory_detail.sessid,'.',2) pid,pg_size_pretty(sum(totalsize)) total_size,count(*) context_count FROM pv_session_memory_detail GROUP BY pid ORDER BY sum(totalsize) DESC;
  ```
  参数说明：从[查看当前集群动态内存水位]查询到动态内存高水位的CN/DN节点，通过连接该节点查询。查询过程中按会话PID分组统计内存总大小和上下文数量，使用pg_size_pretty函数转换为易读格式。
  
- **查看当前实例每个SQL使用内存** **。**
  ```
  SELECT sessid, contextname, level,parent, pg_size_pretty(totalsize) AS total ,pg_size_pretty(freesize) AS freesize, pg_size_pretty(usedsize) AS usedsize, datname,query_id, query FROM pv_session_memory_detail a , pg_stat_activity b WHERE split_part(a.sessid,'.',2) = b.pid ORDER BY totalsize DESC LIMIT 100;
  ```
  参数说明：从[查看当前集群动态内存水位]查询到动态内存高水位的CN/DN节点，通过连接该节点查询。查询过程中关联pv_session_memory_detail和pg_stat_activity，查看每个SQL的内存上下文详情，包含会话ID、上下文名、层级、内存大小等，限制100行。
  
#### 应急恢复类
![](https://support.huaweicloud.com/mgtg-dws/public_sys-resources/caution_3.0-zh-cn.png)
应急类操作中涉及业务影响的操作均需要和客户确认后实施，**禁止自行直接操作**。
- **单语句查杀** **。**
  ```
  EXECUTE DIRECT ON(cn_name) 'SELECT pg_cancel_backend(被查杀语句pid)';
  EXECUTE DIRECT ON(cn_name) 'SELECT pg_terminate_backend(被查杀语句pid)';
  ```
  参数说明：
  - cn_name：目标CN节点名称，可通过[查看当前业务整体运行情况]的coorname字段获取。
  
  - 被查杀语句pid：待终止会话的PID，通过[查看当前业务整体运行情况]的pid字段获取。
  
  - pg_cancel_backend：取消正在执行的查询（会话保持连接）。
  
  - pg_terminate_backend：强制终止会话（断开连接）。
   

- **批量拼接查杀语句（仅拼接查杀命令，不执行查杀命令）。**
  ```
  SELECT 'execute direct on(' || coorname || ') ''select pg_terminate_backend(' || pid || ')'';',sysdate-query_start AS dur, substr(query,1,60) FROM pgxc_stat_activity WHERE usename != 'omm' AND usename != 'Ruby' AND state = 'active' ORDER BY dur DESC LIMIT 30;
  ```
  参数说明：查询所有活跃会话并拼接生成EXECUTE DIRECT终止语句，用户可审查后选择执行。结果按执行时长降序排列，限制30行。
  

- **清理空闲连接。**
  ```
  CLEAN CONNECTION TO ALL FOR DATABASE databasename;
  SELECT * FROM pgxc_clean_free_conn();
  ```
  参数说明：
  - *databasename*：替换为实际数据库名称。
  
  - 第一条清理指定数据库的idle空闲连接。
  
  - 第二条清理pooler连接池缓存。
   

- **修复CCN计数（连接CCN执行）。**
  ```
  SELECT * FROM pg_stat_get_workload_struct_info();
  SELECT gs_wlm_node_recover(true);
  ```
  参数说明：
  - pg_stat_get_workload_struct_info()：查看当前CCN的负载管理结构信息。
  
  - gs_wlm_node_recover(true)：触发CCN计数修复。
   
- **锁定异常用户。**
  ```
  ALTER USER username ACCOUNT LOCK;
  ALTER USER username ACCOUNT UNLOCK;
  ```
  参数说明：*username*替换为实际数据库用户名。锁定后该用户无法登录数据库，解锁后恢复。
  

- **业务加入黑名单操作。**
  ```
  SELECT * FROM gs_append_blocklist(unique_sql_id);
  SELECT * FROM gs_blocklist_query;
  SELECT gs_remove_blocklist(unique_sql_id);
  ```
  参数说明：
  - *unique_sql_id*：SQL唯一标识，可通过pgxc_stat_activity的query_id字段或WLM视图获取。
  
  - gs_append_blocklist：将指定SQL加入黑名单。
  
  - gs_blocklist_query：查询现有黑名单。
  
  - gs_remove_blocklist：将指定SQL移出黑名单。
   
 #### 业务分析类
以下命令用于深入分析特定SQL或表的运行情况，包括等待事件、运行统计、数据倾斜、脏页率、表定义等，辅助问题定位和性能优化。
- **查看正在执行SQL的等待视图** **。**
  ```
  SELECT * FROM pgxc_thread_wait_status WHERE query_id = 实际queryid ORDER BY node_name,wait_status,wait_event;
  ```
  参数说明：从pgxc_thread_wait_status视图查看指定SQL在各节点的等待事件，按节点名、等待状态和等待事件排序，*实际queryid* 一般通过[查看当前业务整体运行情况]获取的query_id字段信息。
  

- **查看正在运行SQL的运行过程信息** **。**
  ```
  SELECT * FROM pgxc_wlm_session_statistics WHERE queryid = 实际queryid ;
  ```
  参数说明：从pgxc_wlm_session_statistics视图查看指定SQL的运行过程统计信息，*实际queryid* 一般通过[查看当前业务整体运行情况]获取的query_id字段信息。
  

- **查看历史SQL的运行信息** **。**
  ```
  SELECT * FROM pgxc_wlm_session_info WHERE queryid = 实际queryid;
  ```
  参数说明：从pgxc_wlm_session_info视图查看已结束SQL的历史运行信息，包含执行时长、内存使用等，*实际queryid* 一般通过[查看当前业务整体运行情况]获取的query_id字段信息。
  
- **查看单表倾斜信息。**
  ```
  SELECT * FROM table_distribution('schema_name','table_name');
  ```
  参数说明：通过table_distribution函数查看指定表在各DN的数据分布情况。请确保schema_name和table_name为实际Schema名和表名。
  

- **查看单表脏页率信息。**
  ```
  SELECT c.oid AS relid, n.nspname AS schemaname, c.relname, pg_stat_get_tuples_inserted(c.oid) AS n_tup_ins, pg_stat_get_tuples_updated(c.oid) AS n_tup_upd, pg_stat_get_tuples_deleted(c.oid) AS n_tup_del, pg_stat_get_live_tuples(c.oid) AS n_live_tup, pg_stat_get_dead_tuples(c.oid) AS n_dead_tup, CAST( (n_dead_tup / (n_live_tup + n_dead_tup + 0.0001) * 100) AS numeric(5,2)) AS dirty_page_rate FROM pg_class c LEFT JOIN pg_namespace n ON n.oid = c.relnamespace WHERE c.oid = 'schema_name.table_name'::regclass::oid;
  ```
  参数说明：关联pg_class和pg_namespace，统计表的插入、更新、删除元组数，计算脏页率（dirty_page_rate），脏页率超过20%建议执行VACUUM清理。请确保替换schema_name.table_name为实际表名。
  

- **查看表定义、索引信息。**
  ```
  SELECT pg_get_tabledef('schema_name.table_name');
  ```
  参数说明：通过pg_get_tabledef函数获取指定表的完整定义，包含列定义、索引、约束等信息。请确保替换schema_name.table_name为实际表名。
  
- **查看表大小。**
  ```
  SELECT pg_size_pretty(pg_table_size('schema_name.table_name'));
  ```
  参数说明：通过pg_table_size函数获取指定表的物理大小，pg_size_pretty转换为易读格式（如KB、MB、GB）。请确保替换schema_name.table_name为实际表名。
  
- **查看表的创建、修改和最近一次analyze时间。**
  ```
  SELECT * FROM pg_object where object_oid='schema_name.table_name'::regclass;
  ```
  参数说明：从pg_object视图查看表的创建时间、修改时间和最近一次ANALYZE统计信息收集时间。请确保替换schema_name.table_name为实际表名。
  
- **查看详细脏数据信息。**
  ```
  START TRANSACTION READ ONLY;
  SET enable_show_any_tuples = true;
  SET enable_indexscan = off;
  SET enable_bitmapscan = off;
  SELECT ctid,xmin,xmax,pgxc_is_committed(xmin),pgxc_is_committed(xmax),oid,* FROM schema_name.table_name;
  SELECT xmin,xmax,ctid, * FROM pgxc_node;
  ROLLBACK;
  ```
  参数说明：以上操作使用只读事务查看表数据，执行完成后通过ROLLBACK回滚，不会修改数据。请确保替换schema_name.table_name为实际表名。
  - SET enable_show_any_tuples = true：显示所有元组（含死元组）。
  
  - xmin/xmax：事务ID，用于判断元组的事务状态。
  
  - pgxc_is_committed()：判断事务是否已提交。
   
 
#### 相关文档
- 如需了解查询返回字段的详细含义，请参见系统表和系统视图的详细介绍：[DWS系统表和系统视图](https://support.huaweicloud.com/devg-dws/dws_04_0559.html)
- 系统函数的详细介绍：[函数和操作符](https://support.huaweicloud.com/sqlreference-dws/dws_06_0027.html)
- 处理DWS业务阻塞最佳实践：[使用PGXC_STAT_ACTIVITY视图分析正在执行的SQL以处理DWS业务阻塞](https://support.huaweicloud.com/bestpractice-dws/dws_05_0057.html)
 
