在gp中取消或者中断某个用户的超长时间或者SQL存在问题的会话。假设无法拥有超级用户将无法运行该类操作。

 

首先我们创建两个用户t1、t2,而且使用t1登录到数据库。

[gpadmin@wx60 ~]$ psql gtlions
psql (8.2.15)
Type "help" for help. gtlions=# select version();
version
------------------------------------------------------------------------------------------------------------------------------------------------------
PostgreSQL 8.2.15 (Greenplum Database 4.2.7.2 build 1) on x86_64-unknown-linux-gnu, compiled by GCC gcc (GCC) 4.4.2 compiled on Feb 25 2014 18:05:04
(1 row) gtlions=# \du
List of roles
Role name | Attributes | Member of
-----------+-----------------------------------+-----------
gpadmin | Superuser, Create role, Create DB | gtlions=# \dn
List of schemas
Name | Owner
--------------------+---------
gp_toolkit | gpadmin
information_schema | gpadmin
pg_aoseg | gpadmin
pg_bitmapindex | gpadmin
pg_catalog | gpadmin
pg_toast | gpadmin
public | gpadmin
(7 rows) gtlions=# create user t1 ;
NOTICE: resource queue required -- using default resource queue "pg_default"
CREATE ROLE
gtlions=# create user t2;
NOTICE: resource queue required -- using default resource queue "pg_default"
CREATE ROLE
gtlions=# \c gtlions t1
You are now connected to database "gtlions" as user "t1".

接下来我们使用用户t2登录到数据库。检查当前会话并尝试取消或者中断用户t1的会话。

[gpadmin@wx60 ~]$ psql -U t2 gtlions
psql (8.2.15)
Type "help" for help. gtlions=> select * from pg_stat_activity ;
datid | datname | procpid | sess_id | usesysid | usename | current_query | waiting | query_start | backend_start
| client_addr | client_port | application_name | xact_start
-------+---------+---------+---------+----------+---------+----------------------------------+---------+-------------------------------+-------------------------------
+-------------+-------------+------------------+-------------------------------
16992 | gtlions | 3395 | 13 | 25881 | t2 | select * from pg_stat_activity ; | f | 2014-10-11 09:25:56.197394+08 | 2014-10-11 09:25:43.293684+08
| | -1 | psql | 2014-10-11 09:25:56.197394+08
16992 | gtlions | 3384 | 12 | 25880 | t1 | <insufficient privilege> | | |
| | | psql |
(2 rows) gtlions=> select pg_cancel_backend(3384);
ERROR: must be superuser to signal other server processes
gtlions=>

会发现非超级用户无法运行取消或者中断其它用户的会话操作。

 

解决的方法是自己定义一个函数,并授权给t2用户运行权限。这样就能够实现上述操作了。

create or replace function session_mgr(procpid integer, opertype character)
returns boolean
as
$BODY$
declare
ret boolean;
begin
if opertype = 'c' then
ret := (select pg_catalog.pg_cancel_backend(procpid));
elsif opertype = 'k' then
ret := (select pg_catalog.pg_terminate_backend(procpid));
end if;
return ret;
end;
$BODY$
LANGUAGE plpgsql security definer; gtlions=# grant execute on function session_mgr(integer, character) to t2;
GRANT
gtlions=# \c gtlions t1
You are now connected to database "gtlions" as user "t1".
gtlions=>

接着使用用户t2进行相关操作。

[gpadmin@wx60 ~]$ psql -U t2 gtlions
psql (8.2.15)
Type "help" for help. gtlions=> select * from pg_stat_activity ;
datid | datname | procpid | sess_id | usesysid | usename | current_query | waiting | query_start | backend_start
| client_addr | client_port | application_name | xact_start
-------+---------+---------+---------+----------+---------+----------------------------------+---------+-------------------------------+-------------------------------
+-------------+-------------+----------------------------+-------------------------------
16992 | gtlions | 4034 | 19 | 25881 | t2 | select * from pg_stat_activity ; | f | 2014-10-11 09:48:53.767859+08 | 2014-10-11 09:48:51.285594+08
| | -1 | psql | 2014-10-11 09:48:53.767859+08
16992 | gtlions | 3678 | 15 | 10 | gpadmin | <insufficient privilege> | | |
| | | pgAdmin III - ????? ? ??? |
16992 | gtlions | 3704 | 16 | 10 | gpadmin | <insufficient privilege> | | |
| | | pgAdmin III - ? ? ?????? ? ? ?? |
16992 | gtlions | 4023 | 18 | 25880 | t1 | <insufficient privilege> | | |
| | | psql |
(4 rows)
gtlions=> select session_mgr(4023,'c');
session_mgr
-------------
t
(1 row) gtlions=> select * from pg_stat_activity ;
datid | datname | procpid | sess_id | usesysid | usename | current_query | waiting | query_start | backend_start
| client_addr | client_port | application_name | xact_start
-------+---------+---------+---------+----------+---------+----------------------------------+---------+-------------------------------+-------------------------------
+-------------+-------------+----------------------------+-------------------------------
16992 | gtlions | 4034 | 19 | 25881 | t2 | select * from pg_stat_activity ; | f | 2014-10-11 09:52:03.279186+08 | 2014-10-11 09:48:51.285594+08
| | -1 | psql | 2014-10-11 09:52:03.279186+08
16992 | gtlions | 4065 | 20 | 10 | gpadmin | <insufficient privilege> | | |
| | | pgAdmin III - ? ? ??? ?? ??? ? ? |
16992 | gtlions | 3678 | 15 | 10 | gpadmin | <insufficient privilege> | | |
| | | pgAdmin III - ?????? ??? |
16992 | gtlions | 3704 | 16 | 10 | gpadmin | <insufficient privilege> | | |
| | | pgAdmin III - ??? ?? ?? ??? ?? |
16992 | gtlions | 4023 | 18 | 25880 | t1 | <insufficient privilege> | | |
| | | psql |
(5 rows) gtlions=> select session_mgr(4023,'k');
session_mgr
-------------
t
(1 row) gtlions=> select * from pg_stat_activity ;
datid | datname | procpid | sess_id | usesysid | usename | current_query | waiting | query_start | backend_start
| client_addr | client_port | application_name | xact_start
-------+---------+---------+---------+----------+---------+----------------------------------+---------+-------------------------------+-------------------------------
+-------------+-------------+----------------------------+-------------------------------
16992 | gtlions | 4034 | 19 | 25881 | t2 | select * from pg_stat_activity ; | f | 2014-10-11 09:52:28.473137+08 | 2014-10-11 09:48:51.285594+08
| | -1 | psql | 2014-10-11 09:52:28.473137+08
16992 | gtlions | 4065 | 20 | 10 | gpadmin | <insufficient privilege> | | |
| | | pgAdmin III - ? ??? ? ? ?????? |
16992 | gtlions | 3678 | 15 | 10 | gpadmin | <insufficient privilege> | | |
| | | pgAdmin III - ? ? ? ??? ?? ? |
16992 | gtlions | 3704 | 16 | 10 | gpadmin | <insufficient privilege> | | |
| | | pgAdmin III - ? ??????????? |
16992 | gtlions | 4189 | 21 | 25880 | t1 | <insufficient privilege> | | |
| | | psql |
(5 rows) gtlions=>

最后检查下t1当前进程。

gtlions=> select version();
FATAL: terminating connection due to administrator command
server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
The connection to the server was lost. Attempting reset: Succeeded.

-EOF-

非super user管理会话的更多相关文章

  1. Shiro经过Redis管理会话实现集群(转载)

    原文:http://www.myexception.cn/software-architecture-design/1815507.html Shiro通过Redis管理会话实现集群 写在前面 1.在 ...

  2. spring security 管理会话 多个用户不可以使用同一个账号登录系统

    多个用户不能使用同一个账号同时登陆系统. 1. 添加监听器 在web.xml中添加一个监听器,这个监听器会在session创建和销毁的时候通知Spring Security. <listener ...

  3. iOS非ARC内存管理摘要 - 实践型

    关于ios内存管理.在开发过程中,内存管理很重要,我简单说明一下. 1.正确用法 UIView *v = [[UIView alloc] init]; //分配后引用计数为1 [self.view a ...

  4. IT兄弟连 JavaWeb教程 Servlet 状态管理 会话跟踪

    HTTP协议是无状态的,我们的客户端与服务器的每一次请求与响应,我们服务器都没有记忆能力将客户端与服务器的多次交互数据进行存储与管理共有两种技术实现: ●  基于客户端实现:Cookie,将状态保存在 ...

  5. Supervisor安装与配置(非守护进程管理工具)

    http://blog.csdn.net/xyang81/article/details/51555473

  6. MySql(二)_NHibernateHelper管理会话工厂

    1.定义接口的好处: (1) 清楚的看到里面有哪些方法: ( 2 )  可以更换实现类:Nhibernate实现件可以更换: Manger文件夹(另外两个是Model.Mappings文件夹) 首先M ...

  7. OWASP WEB会话管理备忘单 阅读笔记

    https://www.owasp.org/index.php/Session_Management_Cheat_Sheet#Session_ID_Properties 会话简介 HTTP是一种无状态 ...

  8. 不要使用 JWT 进行会话管理

    英文原文地址:Stop using JWT for sessions 最近我发现越来越多的人推荐使用 JWT 来在 Web 应用中管理会话(Session),这是一个非常非常糟糕的主意,在这篇文章中我 ...

  9. Servlet会话管理一(URL重写和表单隐藏域)

    会话可以简单的理解为客户端用户打开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器的整个过程称为一个会话.即一个客户端用户和服务器端进行通讯的过程,也是客户端和服务器端之间的数据传 ...

随机推荐

  1. hdu 2147 kiki&#39;s game, 入门基础博弈

    博弈的一些概念: 必败点(P点) : 前一个选手(Previous player)将取胜的位置称为必败点. 必胜点(N点) : 下一个选手(Next player)将取胜的位置称为必胜点. 必败(必胜 ...

  2. 配置druid内置的log实现

    Druid不依赖任何的log组件,但支持多种log组件,会根据检测当前环境,选择一种合适的log实现. log的优先顺序 log4j -> log4j2 -> slf4j -> co ...

  3. 执行计划解读 简朝阳 (Sky Jian) and 那蓝蓝海

    http://greemranqq.iteye.com/blog/2072878 http://www.mysqlab.net/ http://www.mysqlpub.com/ http://blo ...

  4. 代码规范审查 – Sonar分析项目

    Sonar搭建成功之后,就可以通过简单的CMD指令进行项目分析,此篇主要介绍使用Sonar来分析.net项目. 扫描步骤: a.    打开CMD,切换到指定的项目根目录,和.sln同级目录即可(此处 ...

  5. apache kafka监控系列-KafkaOffsetMonitor(转)

    原文链接:apache kafka监控系列-KafkaOffsetMonitor 概览 最 近kafka server消息服务上线了,基于jmx指标参数也写到zabbix中了,但总觉得缺少点什么东西, ...

  6. oracle汉字转拼音

    CREATE OR REPLACE FUNCTION F_PINYIN(P_NAME IN VARCHAR2) RETURN VARCHAR2 AS V_COMPARE VARCHAR2(100); ...

  7. iOS:分组的表格视图UITableView,可以折叠和展开

    虽然表格视图可以分组,但是如果分组后,每一行的内容太多,往后翻看起来比较的麻烦.为了解决这个麻烦,可以将分组的行折叠和展开.折叠时,行内容就会隐藏起来:展开时,行内容就会显示出来. 折叠时: 展开后: ...

  8. go语言基础之导入包的常用方法

    1.导入包 示例: 法一 package main //导入包,必须使用,否则编译不过 import "fmt" import "os" func main() ...

  9. Kubenertes资源分配之Request和Limit解析

    收录待用,修改转载已取得腾讯云授权 Kubernetes是一个容器集群管理平台,Kubernetes需要统计整体平台的资源使用情况,合理地将资源分配给容器使用,并且要保证容器生命周期内有足够的资源来保 ...

  10. Sqlserver 使用CTE如何按子查询排序?

    需求:查出最近有更改的客户信息(按最后更改时间排序,来自SystemLog表LogDateTime字段) 说明: Customer:客户信息表SystemLog:系统日志表,记录所有表信息的增,删,改 ...