PostgreSQL 프로세스를 Kill 하면 발생하는 일
PostgreSQL 은 프로세스 복제 모델로 동작합니다. 접속을 하면 Postmaster 라 불리는 부모프로세스를 복제해서 접속을 하고 쿼리를 처리하도록 합니다. 그런데 데이터베이스를 운영하다보면 불필요한 쿼리를 없앤다고 운영체제에서 kill 명령어를 이용하는 경우가 있습니다.
결론부터 말하면 절대로 해서는 안되는 일 입니다. 이렇게하게되면 PostgreSQL은 다음과같이 모든 프로세스를 죽이고 서버를 재시작합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
2015-09-22 11:01:35 KST [6129-2] LOG: server process (PID 6345) was terminated by signal 9: Killed 2015-09-22 11:01:35 KST [6129-3] LOG: terminating any other active server processes 2015-09-22 11:01:35 KST [6135-2] WARNING: terminating connection because of crash of another server process 2015-09-22 11:01:35 KST [6135-3] DETAIL: The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory. 2015-09-22 11:01:35 KST [6135-4] HINT: In a moment you should be able to reconnect to the database and repeat your command. 2015-09-22 11:01:35 KST [6129-4] LOG: all server processes terminated; reinitializing 2015-09-22 11:01:35 KST [6536-1] LOG: database system was interrupted; last known up at 2015-09-22 10:57:06 KST 2015-09-22 11:01:35 KST [6536-2] DEBUG: checkpoint record is at 0/176D910 2015-09-22 11:01:35 KST [6536-3] DEBUG: redo record is at 0/176D910; shutdown TRUE 2015-09-22 11:01:35 KST [6536-4] DEBUG: next transaction ID: 0/725; next OID: 16387 2015-09-22 11:01:35 KST [6536-5] DEBUG: next MultiXactId: 1; next MultiXactOffset: 0 2015-09-22 11:01:35 KST [6536-6] DEBUG: oldest unfrozen transaction ID: 711, in database 1 2015-09-22 11:01:35 KST [6536-7] DEBUG: transaction ID wrap limit is 2147484358, limited by database with OID 1 2015-09-22 11:01:35 KST [6536-8] LOG: database system was not properly shut down; automatic recovery in progress 2015-09-22 11:01:35 KST [6536-9] DEBUG: resetting unlogged relations: cleanup 1 init 0 2015-09-22 11:01:35 KST [6536-10] LOG: record with zero length at 0/176D970 2015-09-22 11:01:35 KST [6536-11] LOG: redo is not required 2015-09-22 11:01:35 KST [6536-12] DEBUG: resetting unlogged relations: cleanup 0 init 1 2015-09-22 11:01:35 KST [6536-13] LOG: checkpoint starting: end-of-recovery immediate 2015-09-22 11:01:35 KST [6536-14] LOG: checkpoint complete: wrote 0 buffers (0.0%); 0 transaction log file(s) added, 0 removed, 0 recycled; write=0.000 s, sync=0.000 s, total=0.003 s; sync files=0, longest=0.000 s, average=0.000 s 2015-09-22 11:01:35 KST [6540-1] LOG: autovacuum launcher started 2015-09-22 11:01:35 KST [6129-5] LOG: database system is ready to accept connections |
클라이언트와 접속중인 프로세스라서 kill -9를 해도 상관이 없다고 하겠지만 전혀 그렇지 않습니다. 위의 경우에는 데이터가 아무것도 없어서 금방 재시작이 되었지만 아주 바쁜 서버의 경우에, 다시 말해서 트랜잭션이 많은 서버에서는 재시작하는데도 상당히 오랜시간이 걸릴 수 있습니다.
만약 꼭 쿼리를 죽여야겠다고 한다면 psql 명령어로 PostgreSQL에 접속한 후에 pg_terminate_pid 함수를 이용해서 해야 합니다. 이 함수로 인해서 프로세스가 죽더라도 서버가 재시작되는 일은 거의 없습니다.