LISTEN & NOTIFY 명령으로 구현하는 비동기식 작업
PostgreSQL LISTEN & NOTIFY SQL 명령어 데이터베이스의 비동기식 처리 이 글은 지극히 응용 프로그램 개발에 관계된 이야기입니다. PostgreSQL을 이용한 이벤트 기반 프로그램을 어떻게 할 것인가에 대한 힌트입니다. 데이터베이스에 새 자료가 등록된 것을 확인하고 싶다면, 전통적으로 주기적으로 해당 테이블의 마지막 자료를 확인하고, 지금까지의 마지막 자료와 방금 조회한 마지막 자료가 다르다면, 새 자료가 등록되었다고 판단합니다. 또한 이 보다 좀 더 세련된 방법으로 해당 테이블에 트리거를 등록해서 새 자료가 입력되면, 알림 테이블에 그 내용을 기록하고, 그 알림 테이블을 ...
[강좌] 2017-05-30 15:09
사용자 정의 집계 함수 만들기
사용자 정의 집계 함수 만들기 1. 왜 집계 함수까지 만들지? sum(), avg() 처럼 여러 자료를 집계 해서 하나의 값으로 표현하는 것을 집계 함수라고 합니다. 요즘 같이 데이터 사이언스 이야기가 자주 등장하는 때에 집계 함수는 아주 중요한 키워드 가운데 하나입니다. 대부분 통계 함수들이죠. 평균, 분산, 표준편차, 왜도, 첨도, ... 이런 여러 통계학에서 사용되는 계산들이 대부분 RDBMS에서는 집계 함수라고 합니다. PostgreSQL은 거의 대부분의 집계 함수를 이미 내장하고 있습니다. 공식 설명서 9.20 에서 이들을 자세히 설명하고 있습니다. 일반적으로 사용자 정의 집계 함수는 그 집계 ...
[강좌] 2017-04-23 01:44
pg_upgrade 명령을 사용할 때 기억해야 할 것들
PostgreSQL 메이져 버전 업그레이드를 해야 할 경우 그 작업 방법은 현재로써는 두 가지 방법 뿐입니다. 하나는 pg_dumpall 명령과 pg_dump 명령을 이용해서 기존 데이터베이스 내용을 모두 SQL 구문으로 덤프 받아서 새 데이터베이스에서 그 덤프한 SQL 구문을 다시 실행하는 방법과, 또 다른 하나는 pg_upgrade 명령을 이용하는 것입니다. pg_upgrade --help 명령을 이용하면 사용법이 나옵니다. 비교적 간단합니다. 또한 -k 옵션을 사용하면 덤프 & 복원 작업보다는 디스크 공간을 적게 사용합니다. 또한 엄청 빠릅니다. 그래서, pg_upgrade 명령을 사용해서, 메이 ...
[강좌] 2017-01-11 02:11
PostgreSQL 9.6 ERROR: snapshot too old
이 오류는 보편적인 업무 환경에서 나타날 수 있는 상황을 설명합니다. 세션A에서 cursor를 쓰기 위해서, begin; declare cur1 cursor for select * from test_table; -- 첫 데이터를 가져오고 fetch first from cur1; -- 그 자료를 업데이트함 update test_table set ..... where pk= 1; 이 상황에서 세션B가 똑 같이 begin; declare cur1 cursor for select * from test_table; -- 첫 데이터를 가져오고 fetch first from cur1; 세션B에서 update 하려고 하는데 ...
[강좌] 2016-10-13 23:14
초간단 postgresql.conf
정말 초간단 postgresql.conf 파일 내용입니다. 이 정도면 단독 운영 서버로 써도 웬만한 환경에서 무난하게 작동할겝니다. listen_addresses = '*' # 로컬 호스트 밖에서의 접속 허용 shared_buffers = 3GB # 물리 메모리 2/3 ~ 1/4 checkpoint_segments = 128 # 2GB redo 로그, 9.4 이하에서 max_wal_size = 2GB # 2GB redo 로그, 9.5 이상에서 ...
[강좌] 2016-08-28 00:41
PostgreSQL •••
0. 들어가며 이 내용은 지난 MySQL Power Group 카페 주관 2016년 2차 기술 세미나에서 발표한 내용 을 정리한 것입니다. 엔지니어 - 개발자, 관리자 - 들을 위한 PostgreSQL의 좋은 점(•), 나쁜 점(•), 이상한 점(•)을 소개합니다. 1. 좋은 점 1.1. BSD 라이선스 PostgreSQL의 사용 허가서 즉 라이선스는 버클리 표준 배포 라이선스에 기초합니다. 이 라이선스의 가장 큰 특징은 소스를 변경하고 그 소스를 숨긴 채 재배포 해도 법적으로 문제가 없다는 점입니다. 이 점에서 자유 소프트웨어 재단(FSF)의 GNU 공중 라이선스(GPL)와 가장 큰 차이점이 있습니 ...
[강좌] 2016-08-22 16:22
PostgreSQL의 사용자 정의 연산자
0. 들어가며 PostgreSQL에서는 C++ 프로그래밍 언어처럼 데이터베이스 사용자가 자신이 쓸 연산자를 직접 만들어 쓸 수 있습니다. 데이터베이스에서 연산자까지 만들어 쓸 필요까지 있겠냐만은, 새로운 연산자가 있으면, 쿼리문 작성이 한결 간편해 집니다. 또한 쿼리문을 눈으로 읽는데도 한결 편해집니다. 물론 이 글에서 이야기하는 부분은 기업 내 표준화 된 자료 설계안에 완벽하게 반할 가능성이 큽니다. 하지만, 유용한 기능이니 특수 상황 - 예, 다른 종류의 데이터베이스에서 PostgreSQL로 데이터베이스를 옮기는 경우 - 에서 잘 쓰면 개발 비용을 많이 줄일 수 있습니다. 1. 연산자 ...
[강좌] 2016-06-22 17:39
PGDay.Seoul 2016 행사 날짜를 골라주세요!
페이스북 PostgreSQL Korea 맴버들과 함께 PGDay.Seoul 2016 행사를 준비하고 있습니다. http://pgday.postgresql.kr/ 페이지에서 행사하기 좋은 날을 골라 주세요. 많은 참여 바랍니다. ...
[새소식] 2016-06-21 17:45
9.5 버전이 나왔습니다.
이번 9.5 버전은 한 해를 넘겼습니다. (그래야지, 그래야 PostgreSQL이지. 크크) 새 버전의 가장 주목 받은 기능은 UPSERT 라고 흔히 말하는 자료 입력 방식의 기능입니다. 유니크 키 기준으로 해당 자료가 중복되어 INSERT 할 수 없다면, UPDATE 구문으로 바꾸어서 기존 자료를 변경하거나 INSERT 작업을 무시하는 기능입니다. 다른 관계형 데이터베이스 시스템에서는 오래전부터 제공하던 기능이었는데, 이제서야 구현되었습니다. 브린(BRIN) 인덱스라는 새로운 인덱스를 제공합니다. 대용량 자료에서 btree 보다 성능이 낫다는 이야기가 있네요. 이는 얼마나 더 나은지, 도입해서 얻는 점, 잃 ...
[새소식] 2016-01-18 17:00
PostgreSQL 장애 대응
PostgreSQL 장애 대응 이 글은 IT 운영 관점에서 본 장애 Incident 대응에 대한 글입니다. IT 운영 업무에서 장애라는 단어는 응용프로그램 개발자들이 생각하는 장애와는 전혀 다른 의미입니다. 극단적으로 이야기하면, 장애가 발생했을 경우 운영자는 그 장애원인을 해결하는 것이 첫번째 일이 아니라, 그 서버를 사용하는 이용자들에게 장애 발생 이전 상태와 같은 서비스를 최대한 빨리 제공하는 것이 첫번째 일입니다. 장애 원인 종류 장애는 단순히 서비스가 정상적이지 않다는 것을 뜻하지만, 그 원인은 IT 전체 환경에 다양하게 걸쳐 있습니다. 하드웨어 장애 영원한 건 절대 없어 특히나 장비는 그렇습 ...
[강좌] 2015-11-28 23:23
PostgreSQL 고가용성
0. 들어가며 데이터베이스 시스템이 장애 없이 잘 사용되고 있다는 지표를 고가용성 High Availability 이라는 용어로 설명 합니다. 예를 들어서 고가용성 99.999 % 라는 말은 1년 가운데, 99.999 %는 서비스 장애가 없음을 말합니다. (1년에 약 5분정도 됩니다.) 이 글은 이 부분에 대한 이야기입니다. 어떻게 하면 데이터베이스 서비스가 1년을 운영하면서 5분 미만의 장애 시간을 유지 할 수 있는지에 대한 답은 의외로 데이터베이스 밖의 문제를 함께 고민해야 합니다. 전력, 네트워크, 하드웨어, OS 등 이 부분의 문제가 모두 위에서 말한 고가용성에 대한 설계가 충실하지 않다면, 데이터 ...
[강좌] 2015-07-25 21:33
jsonb 자료형 다루기
들어가며 인터넷에서 자료를 전달할 때 그 자료 형식을 무엇으로 할 것인가에 대한 수 많은 방법이 등장했고, 앞으로도 등장 할 것이지만, 이 글을 쓰고 있는 현재 대세는 json 형식입니다. 데이터베이스에서 이 형식 그대로 저장하고, 더 나아가 그 자료에 대한 인덱스를 사용할 수 있다면, 응용 프로그램 개발 비용을 현저하게 줄일 수 있을 것입니다. jsonb 자료형이 만들어진 이유는 바로 이 점 때문입니다. PostgreSQL에서는 9.2 버전(2012년)부터 json 자료형을 기본 자료형으로 포함했습니다. 기본 자료형이라고 하는 것은 그 자료형을 사용하는 연산자들을 함께 제공함을 의미합니다. 예를 들어 ...
[강좌] 2015-05-27 02:44
9.4 버전이 나왔습니다.
PostgreSQL 개발 그룹에서는 몇 해 전부터해다마 새로운 메이져 버전을 발표했는데, 올 해도 어떻게든 한 해를 넘기지 않으려고 연말에 발표 했네요. 새로운 기능으로 단연 돋보이는 것은 json 자료 처리 방식입니다. 다음으로 9.3 버전에서 처음 등장한 사용자 정의 백그라운드 프로세스를 다루는 기능이 좀더 다양해졌습니다. 즉, 쿼리 병렬처리를 위한 작업이 한 발 더 나아갑니다. 물론 갈 길이 멀긴 합니다. 9.3 버전에 등장한 materialized view에 대한 기능들도 제법 추가 되었습니다. 또 하나 주목할 기능은 복제에 대한 논리적 디코딩이라는 용어로 트랜잭션 로그를 사용자가 임의로 자기 원하 ...
[새소식] 2014-12-21 01:44
9.3.5 버전이 배포되었습니다.
지난주에 배포되었네요. 멀티 트랜잭션을 사용하는 환경에서 pg_upgrade 명령으로 업그레이드 했을 경우, vacuum 명령이 실패하는 문제점을 수정했습니다. PostgreSQL을 실무에서 사용하면서 이런 상황이 얼마나 빈번하게 발생할지는 모르겠지만, 지난 릴리즈 다음부터 여러 자잔한 문제점들을 수정한 것과 함께 배포되었네요. 눈에 띄는 부분은 gin, gist 인덱스 관련 부분이 많이 수정되었네요. 해당 인덱스를 사용한다면, 업그레이드 하셔야할 듯합니다. 아마, 9.3 버전의 마지막 버전이 될 것 같습니다. ...
[새소식] 2014-07-30 02:12
9.3.4 버전이 배포되었습니다.
지난주에 릴리즈 되었습니다. 9.3.x 버전에서, 대기 서버에서 인덱스 스캔 결과와 시퀀스 스캔 결과가 달리 나오는 버그가 수정된 패치판입니다. 즉, 9.3.3 이하 버전을 스트리밍 복제 방식으로 대기 서버를 운영하고 있었다면, 대기서버를 재구축 해야합니다. 그외 실무에서는 그리 치명적이지 않은 기능 버그 개선들과 성능 개선을 했네요. 자세한 내용은 릴리즈 노트를 참고하세요. 이제 9.3.x 버전은 실무에서 사용해도 되지 않을까싶습니다. ...
[새소식] 2014-03-24 00:40
9.3.3 버전이 배포되었습니다.
참조키 처리 부분에서 문제점이 수정되었네요. 기존 서비스에서 혹 없는 자료를 참조하고 있다고 잘못된 결과를 보여줄 가능성이 있습니다. 참조키를 사용하고 있다면, 참조키를 다시 만드는 작업을 한 번 해 주는 것이 안전할 것같습니다. 테이블 잠근 문제 때문에 참조키를 다시 만들 수 없는 환경이라면, 참조키를 사용하는 테이블과 그 관련 테이블의 자료 정합성을 확인해 봐야할 것 같습니다. (이 이야기는 9.3.x 버전에 한 합니다) wal 처리 부분이 변경되어 기존 대기서버는 새 운영서버의 그것을 수용할 수 없습니다. 트랜잭션 로그 전달 기반 복제를 사용하고 있다면, 대기 서버도 ...
[새소식] 2014-02-21 10:15
홈페이지가 개편 되었습니다.
일주일 정도에 걸쳐 홈페이지를 새롭게 만들었습니다. 전체틀은 기존 것을 그대로 하고, html, css, javascript는 모두 HTML5 기반으로 변경 했으며, 데이터베이스는 Berkeley DB를 이용했습니다. 동적인 자료들 가운데, 핵심 컨텐츠는 php를 이용해서 db에서 뽑아 html로 출력했으며, 그외 자료들은 모두 jquery + json 기반으로 동적 처리해서, 웹서버에서 해야할 할 일을 웹 블로우져쪽에서 하도록 했습니다. 홈페이지 방문객들과의 상호 소통은 무시 했습니다. 라즈베리 파이에서 운영 되다 보니, 방문객이 남긴 자료를 소중하게 지킬 환경을 구축할 수 없었습니다. ...
[새소식] 2014-02-10 14:13
홈페이지 이전 작업 중입니다.
몇년간 홈페이지 운영에 대해 물심양면으로 도와준 기업의 보안정책이 변경 됨에 따라 홈페이지 이전을 준비했습니다. 우여곡절 끝에 집에서 내부 인트라넷용 서버로 쓰고 있는 라즈베리 파이로 옮겨 왔습니다. 다들 잘 아시다시피 라즈베리 파이로 웹 서비스를 운영 하겠다는 것은 많이 느린 서비스를 충분히 참겠다는 것을 의미합니다. 인내심을 키울 만큼 충분히 느릴 것이며, 때때로 홈페이지가 한동안 안열리는 날도 있을 것입니다. 하지만, 어떻게 하면 최적의 서비스를 제공할 것인가에 대해 부단히 노력할 것이며, PostgreSQL에 대한 양질의 한국어 컨텐츠를 제공하겠다는 생각은 홈페이지를 처음 만들 때와 전 ...
[새소식] 2014-02-07 01:39