[Postgres, Greenplum] 현재 수행중인 query 조회하고 강제 종료 (kill) 하는 방법
Greenplum and PostgreSQL Database 2019. 11. 28. 00:17DB에서 데이터처리나 분석을 하다보면 실수를 한다든지, 데이터 크기가 너무 크다든지, index가 안걸려있는 상태에서 join을 하려고 했다든지, cross join이 되어 연산량이 기하급수적으로 늘었다든지, 여러가지 이유로 수행시간이 너무 오래걸리는 경우가 생길 수 있습니다. 이럴 경우 강제로 돌아가고 있는 쿼리를 강제 종료 (kill active query) 시켜야 하는 상황이 생길 수 있습니다.
이번 포스팅에서는 PostgreSQL DB, Greenplum DB 이용 시에 터미널에서 psql 로
(1) 터미널 창에서 psql 실행하여
(2) 현재 수행되고 있는 쿼리(current active query)를 조회하고,
(3) 특정 쿼리를 강제 종료 (kill a specific query) 시키는 방법
을 소개하겠습니다.
(1) 먼저, 터미널을 열고 $ psql postgres 을 입력해서 psql 을 사용할 수 있는 환경으로 들어갑니다.
psql (11.5) Type "help" for help. postgres=#
|
호스트 이름, DB 이름, 사용자 ID, Password 입력은 아래 psql을 참고하세요.
$ psql -h host_name -d db_name -u user_id $ Password ********
|
(2) 터미널에서 psql 로 pg_stat_activity 테이블에서 아래의 조회 쿼리를 사용하여 현재 Postgres에서 수행 중인 쿼리(active query)를 조회해보겠습니다.
select pid, now() - query_start as "runtime", usename, datname, state, query
from pg_stat_activity
where now() - query_start > '2 minutes'::interval and state = 'active'
order by runtime desc;
위의 쿼리로 조회를 해서 강제 종료시키고자 하는 쿼리의 'pid' 를 확인합니다. 아래의 예의 경우 pid = 4941 이네요.
postgres=# postgres=# select pid, now() - query_start as "runtime", usename, datname, state, query from pg_stat_activity where now() - query_start > '2 minutes'::interval and state = 'active' order by runtime desc;
pid | runtime | usename | datname | state | query ------+-----------------+----------+----------+--------+---------------------------------------- 4941 | 00:34:00.595933 | ihongdon | postgres | active | + | | | | DROP TABLE IF EXISTS my_table; + | | | | CREATE TABLE my_table AS ( + | | | | SELECT + | | | | a.* + | | | | , b.age + | | | | , b.pch_amt + | | | | , b.pch_cnt + | | | | , b.age + | | | | FROM + | | | | cust_master AS a + | | | | LEFT OUTER JOIN cust_pch AS b + | | | | ON a.cust_id = b.cust_id + | | | | ); + | | | | (1 row) postgres=#
|
(3) SELECT pg_terminate_backend(put your pid) 로 강제 종료 시키고자 하는 쿼리의 pid 를 지정해주어서 kill 시킵니다.
postgres=# SELECT pg_terminate_backend(4941); pg_terminate_backend ---------------------- t (1 row) postgres=# postgres=#
|
-----------------[ Greenplum DB (GPDB) 알아두면 요긴한 팁 ] -------------------------
- Greenplum DB(GPDB)도 현재 수행 중이 쿼리 조회하고 강제 종료하는 방법 (Postgres와 동일)
-- ssh로 GPDB 접속 > ssh gpadmin@xxx.xxx.xxx.xxx -- 현재 수행중인 쿼리 강제 종료
|
- GPDB에서 Segment 확인하는 방법
> select gp_segment_id, count(*) from mytable group by gp_segment_id;
|
- GPDB master, Segment 확인
> select * from pg_catalog.gp_segment_configration;
|
- GPDB, Postgres DB 칼럼 이름 및 데이터 유형 확인 (column name and data type)
select column_name, data_type from information_schema.columns
|
- gpperfrom db 에 접속하여 system history 테이블 조회하는 방법 (병렬처리 확인)
select ctime, hostname, avg(cpu_user + cpu_sys) cpu, avg(mem_actual_used/1024/1024/1024) memogy_gigabyte, avg(dist_rb_rate/1024/1024) dist_rb_megabyte, avg(disk_wb_rate/1024/1024) disk_wb_megabyte, avg(net_rb_rate/1024/1024) net_rb_megabyte, avg(net_wb_rate/1024/1024) net_wb_megabyte from system_hitory where ctime between '2019-01-01 12:00:00' and '2019-01-01 23:59:59' and hostname not in ('dev1.gphd.local', 'dev2.gphd.local') group by ctime, hostname order by 1, 2 asc
|
- PostgreSQL DB 서버 시작, 종료 (How to Start and Stop PostgreSQL Database Server)
-- Mac OS 에서 Homebrew 사용하여 PostgreSQL 시작 (Start PostgreSQL using Homebrew on Mac OS) $ brew services start postgresql -- Mac OS 에서 Homebrew 사용하여 PostgreSQL 종료 (Stop PostgreSQL using Homebrew on Mac OS) $ brew services stop postgresql
|
- Windows OS (명령 프롬프트 창에서 command 실행)
-- Windows OS 에서 PostgreSQL 시작 (Start PostgreSQL on Windows OS) $ pg_ctl -D "C:\Program Files\PostgreSQL\9.6\data" start -- Windows OS 에서 PostgreSQL 종료 (Stop PostgreSQL on Windows OS) $ pg_ctl -D "C:\Program Files\PostgreSQL\9.6\data" stop |
- 웹브라우저에서 GPDB Command Center 접속하는 방법
http://localhost:28080/main/querymonitor/hostmetrics
|
GPDB를 UI 상에서 편리하게 모니터링 하고 관리할 수 있게 해주는 GPDB Command Center 에 대한 자세한 설명은 gpcc.docs.pivotal.io 를 참고하세요.
[ Pivotal Greenplum Command Center Images ((https://gpcc.docs.pivotal.io/600/welcome.html) ]
많은 도움이 되었기를 바랍니다.