一台开发机子上有不少的postgres用户进程,同事问想在不重启机子的状况怎么样批量地删除进程。 sql
首先要说一下的是,postgresql是以进程的方式链接到数据库里面的,因此一般有两种方式删除进程,1是在OS层面,2是在数据库内部 数据库
[root@db1 kenyon]# ps -ef|grep postgres|grep idle postgres 14184 14030 0 10:56 ? 00:00:00 postgres: postgres postgres [local] idle postgres 14206 14030 0 10:56 ? 00:00:00 postgres: postgres postgres [local] idle postgres 14228 14030 0 10:57 ? 00:00:00 postgres: postgres postgres [local] idle postgres 14230 14030 0 10:57 ? 00:00:00 postgres: postgres postgres [local] idle [root@db1 kenyon]# ps -ef|grep postgres|grep idle |awk '{print $2}' | xargs kill [root@db1 kenyon]#su - postgres [postgres@db1 ~]$ psql psql (9.3.2) Type "help" for help. postgres=# select pg_backend_pid(); pg_backend_pid ---------------- 14184 postgres=# \d 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. --进程已经被删除,下面的再次查询已是另一个进程了 postgres=# \d No relations found. postgres=# select pg_backend_pid(); pg_backend_pid ---------------- 14262 (1 row)2、数据库里面删除
--查询进程 postgres=# select datname,pid,usename,application_name,waiting,state,query from pg_stat_activity; datname | pid | usename | application_name | waiting | state | query ----------+-------+----------+-------------------------+---------+---------------------+---------------------------------------------------------------------------------------- postgres | 14337 | postgres | pgAdmin III - ????????? | f | idle | SELECT 1 FROM pg_available_extensions WHERE name='adminpack' postgres | 14339 | postgres | psql | f | active | select pg_sleep(600); postgres | 14341 | postgres | psql | f | idle | postgres | 14343 | postgres | psql | f | idle in transaction | select * from tbl_kenyon limit 2; postgres | 14347 | postgres | psql | f | active | select datname,pid,usename,application_name,waiting,state,query from pg_stat_activity; postgres | 14349 | postgres | psql | f | idle | select pg_backend_pid(); (6 rows)删除进程有两个内置函数
--Session A postgres=# select pg_cancel_backend(14339); pg_cancel_backend ------------------- t (1 row) --状态变成IDLE,说明该进程是空闲状态 postgres=# select datname,pid,usename,application_name,waiting,state,query from pg_stat_activity; datname | pid | usename | application_name | waiting | state | query ----------+-------+----------+-------------------------+---------+---------------------+---------------------------------------------------------------------------------------- postgres | 14337 | postgres | pgAdmin III - ????????? | f | idle | SELECT 1 FROM pg_available_extensions WHERE name='adminpack' postgres | 14339 | postgres | psql | f | idle | select pg_sleep(600); postgres | 14341 | postgres | psql | f | idle | postgres | 14343 | postgres | psql | f | idle in transaction | select * from tbl_kenyon limit 2; postgres | 14347 | postgres | psql | f | active | select datname,pid,usename,application_name,waiting,state,query from pg_stat_activity; postgres | 14349 | postgres | psql | f | idle | select pg_backend_pid(); (6 rows) --Session B,取消查询并尝试取消update操做 postgres=# select pg_backend_pid(); pg_backend_pid ---------------- 14339 (1 row) postgres=# select pg_sleep(600); ERROR: canceling statement due to user request postgres=# begin; BEGIN postgres=# update tbl_kenyon set id=id+1; UPDATE 20 postgres=# --Session A postgres=# select pg_cancel_backend(14339); pg_cancel_backend ------------------- t (1 row) --能够发现状态没有改变 postgres=# select datname,pid,usename,application_name,waiting,state,query from pg_stat_activity; datname | pid | usename | application_name | waiting | state | query ----------+-------+----------+-------------------------+---------+---------------------+---------------------------------------------------------------------------------------- postgres | 14337 | postgres | pgAdmin III - ????????? | f | idle | SELECT 1 FROM pg_available_extensions WHERE name='adminpack' postgres | 14339 | postgres | psql | f | idle in transaction | update tbl_kenyon set id=id+1; postgres | 14341 | postgres | psql | f | idle | postgres | 14343 | postgres | psql | f | idle in transaction | select * from tbl_kenyon limit 2; postgres | 14347 | postgres | psql | f | active | select datname,pid,usename,application_name,waiting,state,query from pg_stat_activity; postgres | 14349 | postgres | psql | f | idle | select pg_backend_pid(); (6 rows) postgres=# select pg_terminate_backend(14339); pg_terminate_backend ---------------------- t (1 row) --进程已经被杀掉了 postgres=# select datname,pid,usename,application_name,waiting,state,query from pg_stat_activity; datname | pid | usename | application_name | waiting | state | query ----------+-------+----------+-------------------------+---------+---------------------+---------------------------------------------------------------------------------------- postgres | 14337 | postgres | pgAdmin III - ????????? | f | idle | SELECT 1 FROM pg_available_extensions WHERE name='adminpack' postgres | 14341 | postgres | psql | f | idle | postgres | 14343 | postgres | psql | f | idle in transaction | select * from tbl_kenyon limit 2; postgres | 14347 | postgres | psql | f | active | select datname,pid,usename,application_name,waiting,state,query from pg_stat_activity; postgres | 14349 | postgres | psql | f | idle | select pg_backend_pid(); (5 rows) --Session B postgres=# select pg_backend_pid(); 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. postgres=# select pg_backend_pid(); pg_backend_pid ---------------- 14365 (1 row)3.批量删除
--也能够本身加条件选择删除 postgres=# select pg_terminate_backend(pid) from pg_stat_activity where pid <> pg_backend_pid() ; pg_terminate_backend ---------------------- t t t t t t (6 rows)3、Kill -9
2013-12-24 13:07:03.963 CST,,,14325,,52b8fbc8.37f5,19,,2013-12-24 11:13:12 CST,,0,LOG,00000,"server process (PID 14549) was terminated by signal 9: Killed","Failed process was running: select pg_backend_pid();",,,,,,,,"" 2013-12-24 13:07:03.964 CST,,,14325,,52b8fbc8.37f5,20,,2013-12-24 11:13:12 CST,,0,LOG,00000,"terminating any other active server processes",,,,,,,,,"" 2013-12-24 13:07:03.966 CST,,,14537,,52b91617.38c9,2,,2013-12-24 13:05:27 CST,1/0,0,WARNING,57P02,"terminating connection because of crash of another server process","The postmaster has commanded this server process to roll back the curr ent transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.","In a moment you should be able to reconnect to the database and repeat your command.",,,,,,,"" 2013-12-24 13:07:03.972 CST,,,14325,,52b8fbc8.37f5,21,,2013-12-24 11:13:12 CST,,0,LOG,00000,"all server processes terminated; reinitializing",,,,,,,,,"" 2013-12-24 13:07:03.990 CST,,,14551,,52b91677.38d7,1,,2013-12-24 13:07:03 CST,,0,LOG,00000,"database system was interrupted; last known up at 2013-12-24 13:05:27 CST",,,,,,,,,"" 2013-12-24 13:07:03.990 CST,,,14551,,52b91677.38d7,2,,2013-12-24 13:07:03 CST,,0,LOG,00000,"database system was not properly shut down; automatic recovery in progress",,,,,,,,,"" 2013-12-24 13:07:04.000 CST,,,14551,,52b91677.38d7,3,,2013-12-24 13:07:03 CST,,0,LOG,00000,"record with zero length at 0/1839858",,,,,,,,,"" 2013-12-24 13:07:04.000 CST,,,14551,,52b91677.38d7,4,,2013-12-24 13:07:03 CST,,0,LOG,00000,"redo is not required",,,,,,,,,"" 2013-12-24 13:07:04.006 CST,,,14325,,52b8fbc8.37f5,22,,2013-12-24 11:13:12 CST,,0,LOG,00000,"database system is ready to accept connections",,,,,,,,,"" 2013-12-24 13:07:04.007 CST,,,14555,,52b91678.38db,1,,2013-12-24 13:07:04 CST,,0,LOG,00000,"autovacuum launcher started",,,,,,,,,"" 2013-12-24 13:07:06.268 CST,,,14557,"",52b9167a.38dd,1,"",2013-12-24 13:07:06 CST,,0,LOG,00000,"connection received: host=[local]",,,,,,,,,""普通的kill pid的输出
2013-12-24 13:09:03.910 CST,"postgres","postgres",14557,"[local]",52b9167a.38dd,3,"idle",2013-12-24 13:07:06 CST,2/0,0,FATAL,57P01,"terminating connection due to administrator command",,,,,,,,,"psql" 2013-12-24 13:09:03.910 CST,"postgres","postgres",14557,"[local]",52b9167a.38dd,4,"idle",2013-12-24 13:07:06 CST,,0,LOG,00000,"disconnection: session time: 0:01:57.642 user=postgres database=postgres host=[local]",,,,,,,,,"psql"
4、总结
删除postgresql的进程使用kill或者pg_terminate_backend()命令,不要使用kill -9 服务器