通过Hologres的Query管理可以查询SQL的运行信息,设置Query运行的超时时间,更好的管理SQL,防止发生死锁。
select * from pg_stat_activity ;
pg_stat_activity视图的参数说明:
wait_event
将标识等待的锁的类型。active
,将会显示当前正在执行的查询。在所有其他状态下,显示上一个被执行的查询。可以通过HoloWeb可视化查看活跃Query,并进行管理。
Superuser可以查看所有用户的SQL运行信息,RAM用户只能查看自己的SQL运行信息。
1.可以通过如下语句查看当前实例内用户的SQL运行信息。
SELECT datname::text,usename,query,pid::text,state FROM pg_stat_activity;
2.可以执行如下语句查看当前正在运行的SQL信息。
SELECT datname::text,usename,query,pid::text,state
FROM pg_stat_activity
WHERE state != 'idle' ;
3.可以执行以下语句查看当前实例正在运行且耗时较长的SQL信息。
SELECT current_timestamp - query_start as runtime, datname::text, usename, query, pid::text
FROM pg_stat_activity
WHERE state != 'idle'
order by 1 desc;
4.终止Query
如果当前存在不符合预期的Query,可以根据实际情况通过如下命令进行终止。
取消当前连接上的Query。
select pg_cancel_backend(<pid>);
批量取消Query。
SELECT pg_cancel_backend(pid)
,query
,datname::text
,usename
,application_name
,client_addr
,client_port
,backend_start
,state
FROM pg_stat_activity
WHERE length(query) > 0
AND pid != pg_backend_pid()
AND backend_type = 'client backend'
AND application_name != 'hologres'
AND usename != 'holo_admin'
AND query not like '%pg_cancel_backend%';
-- session 级别修改(要修改超时时间的SQL语句一起执行方可生效)
set statement_timeout = <time>;
-- db 级别修改
alter database dbname set statement_timeout=<time>;
time超时时间取值范围为0~2147483647ms,单位默认为ms(当time后加单位时需要使用单引号,否则会报错)。当前默认超时时间为8小时。
示例如下:
设置超时时间为10min,其中具体时间带单位,10min需要整体添加单引号。
set statement_timeout = '10min' ;
select * from tablename;
设置超时时间为5000ms。
set statement_timeout = 5000 ;
select * from tablename;
设置db超时时间为10min。
alter database dbname set statement_timeout='10min';
查询设置是否生效:
show statement_timeout;
参数idle_in_transaction_session_timeout描述了事务进入idle状态后的超时行为,如果不设置参数值,默认不会做事务超时的释放,容易发生事务不释放,导致查询被锁死的情况。
当Query执行产生死锁时,需要设置超时时间。例如如下代码,未执行commit
,开启了一个事务,但是没有提交,会造成事务泄漏,进而引发数据库级别的死锁,影响服务正常使用。
begin;
select * from t;
当出现这种死锁场景时,可以通过设置idle_in_transaction_session_timeout超时时间来解决。当一个带事务的空闲连接超过idle_in_transaction_session_timeout设置的时间还未提交或者回滚事务,系统将自动根据超时时间回滚事务,并关闭连接。
--session修改空闲事务超时时间
set idle_in_transaction_session_timeout=<time>;
--DB级别修改空闲事务超时时间
alter database db_name set idle_in_transaction_session_timeout=<time>;
time超时时间取值范围为0~2147483647ms,单位默认为ms(当time后加单位时需要使用单引号,否则会报错)。在Hologres V0.10及以下版本,默认值为0,即不会自动清理;在Hologres V1.1版本,默认值为10分钟,超过10分钟后将会回滚事务。
不建议超时时间设置过短,如果过短容易错误回滚正在使用中的事务。
设置超时时间为300000ms。
--session修改空闲事务超时时间
set idle_in_transaction_session_timeout=300000;
--DB级别修改空闲事务超时时间
alter database db_name set idle_in_transaction_session_timeout=300000;
查询设置是否生效:
show idle_in_transaction_session_timeout;
参考文献:https://help.aliyun.com/document_detail/263548.html