DWS常用运维命令集
本章节仅列出DWS集群运维过程中常用的SQL命令,覆盖查看运维状态、应急恢复、业务分析场景,帮助运维人员快速定位和解决问题。其中查看的系统对象可根据实际情况灵活变通,查询返回的具体字段含义,请参考《开发指南》中关于对应系统表、系统视图、系统函数的介绍。
前提条件
正常连接上DWS集群。
查看运维状态类
以下命令用于日常运维巡检,帮助快速了解集群当前运行状态、资源使用情况和潜在瓶颈。建议定期执行以建立基线数据。
- 查看当前业务整体运行情况。
1SELECT 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。
- 查看当前业务整体并发情况。
1SELECT 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行。
- 查看当前集群内部整体等待状态。
1SELECT 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行。
- 查看当前集群资源池业务运行信息(配置资源管控场景)。
1SELECT 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)。
- 查看当前集群动态内存水位。
1SELECT 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:动态内存上限。
- 查看各类线程内存使用情况。
1SELECT 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使用内存。
1SELECT 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使用内存。
1SELECT 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行。
应急恢复类
应急类操作中涉及业务影响的操作均需要和客户确认后实施,禁止自行直接操作。
- 单语句查杀。
1 2
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:强制终止会话(断开连接)。
- 批量拼接查杀语句(仅拼接查杀命令,不执行查杀命令)。
1SELECT '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行。
- 清理空闲连接。
1 2
CLEAN CONNECTION TO ALL FOR DATABASE databasename; SELECT * FROM pgxc_clean_free_conn();
参数说明:
- databasename:替换为实际数据库名称。
- 第一条清理指定数据库的idle空闲连接。
- 第二条清理pooler连接池缓存。
- 修复CCN计数(连接CCN执行)。
1 2
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计数修复。
- 锁定异常用户。
1 2
ALTER USER username ACCOUNT LOCK; ALTER USER username ACCOUNT UNLOCK;
参数说明:username替换为实际数据库用户名。锁定后该用户无法登录数据库,解锁后恢复。
- 业务加入黑名单操作。
1 2 3
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的等待视图。
1SELECT * 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的运行过程信息。
1SELECT * FROM pgxc_wlm_session_statistics WHERE queryid = 实际queryid ;
参数说明:从pgxc_wlm_session_statistics视图查看指定SQL的运行过程统计信息,实际queryid一般通过查看当前业务整体运行情况获取的query_id字段信息。
- 查看历史SQL的运行信息。
1SELECT * FROM pgxc_wlm_session_info WHERE queryid = 实际queryid;
参数说明:从pgxc_wlm_session_info视图查看已结束SQL的历史运行信息,包含执行时长、内存使用等,实际queryid一般通过查看当前业务整体运行情况获取的query_id字段信息。
- 查看单表倾斜信息。
1SELECT * FROM table_distribution('schema_name','table_name');
参数说明:通过table_distribution函数查看指定表在各DN的数据分布情况。请确保schema_name和table_name为实际Schema名和表名。
- 查看单表脏页率信息。
1SELECT 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为实际表名。
- 查看表定义、索引信息。
1SELECT pg_get_tabledef('schema_name.table_name');
参数说明:通过pg_get_tabledef函数获取指定表的完整定义,包含列定义、索引、约束等信息。请确保替换schema_name.table_name为实际表名。
- 查看表大小。
1SELECT pg_size_pretty(pg_table_size('schema_name.table_name'));
参数说明:通过pg_table_size函数获取指定表的物理大小,pg_size_pretty转换为易读格式(如KB、MB、GB)。请确保替换schema_name.table_name为实际表名。
- 查看表的创建、修改和最近一次analyze时间。
1SELECT * FROM pg_object where object_oid='schema_name.table_name'::regclass;
参数说明:从pg_object视图查看表的创建时间、修改时间和最近一次ANALYZE统计信息收集时间。请确保替换schema_name.table_name为实际表名。
- 查看详细脏数据信息。
1 2 3 4 5 6 7
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系统表和系统视图
- 系统函数的详细介绍:函数和操作符
- 处理DWS业务阻塞最佳实践:使用PGXC_STAT_ACTIVITY视图分析正在执行的SQL以处理DWS业务阻塞