http://postgresdba.com 에서 이벤트가 있어 그곳에 쓴 글을 정리 해서 다시 올립니다.
1. 서버 로그를 한달치만 보관하기
postgresql.conf 파일에서
log_destination = 'stderr'
logging_collector = on
log_filename = 'postgresql-%d.log'
log_truncate_on_rotation = on
log_rotation_age = 1d
log_rotation_size = 0
수정
2. 데이터베이스 서버가 운영중인지를 확인 하는 쿼리
select txid_current()
3. lock에 구애받지 않고 테이블 크기 구하기
psql -t -c "select '\! echo -n ' || oid::regclass || ' \" \" && du -s ' || current_setting('data_directory') || '/' || pg_relation_filepath(oid::regclass) from pg_class where relkind = 'r'" | psql
pg_table_size(), pg_relation_size() 함수는 해당 테이블이 잠겼을 때 풀릴 때까지 기다립니다.
이 부분에 대한 피해가는 방법입니다.
pg_class에서 대상을 어떻게 구하느냐에 따라 쿼리가 약간씩 바뀌겠지요.
4. pg_stat_activity.application_name 칼럼을 사용하세요 네번째팁
해당 칼럼 값은
set application_name = '프로그램이름'
형태로 지정합니다.
응용 프로그램에서 데이터베이스를 사용하기전 이 작업을 해 두면
데이터베이스 관리자가 참 편해집니다.
5. 개발 언어별 prepared statement 특성
python이나, php 에서는 이 api를 사용하면 바로 서버측에서 해당 쿼리의 실행계획까지 짜여진 정보가 저장 되지만,
java jdbc에서는 그렇지 않습니다.
많은 java 개발자들이 이 부분을 놓치고 있답니다.
무조건 서버측 prepared statement 기능을 사용하려면,
jdbc connection url에서 query string값으로 prepareThreshold=1 로 지정해 주어야 합니다.
jdbc:postgresql://host:port/database?prepareThreshold=1
형태가 되겠지요.
db pool을 사용하고, 쿼리 패턴이 일정하다면, 이 설정이 꽤 도움이 될듯합니다. 특히나 게임서버나, 기타 미들웨어 서버를 만드는 경우에.
6. stats_temp_directory 변경
이 환경 설정 값의 디렉토리에 데이터베이스 실행중에 발생하는 각종 정보들이 저장되고 이것이 통계수집기 프로세스가 주기적으로 pg_stat* 각종 뷰의 정보로 사용됩니다. 그래서, 이 디렉토리에 있는 파일들(9.2 이하에서는 하나, 9.3 이상에서는 데이터베이스별로)은 자료조작 작업이 빈번하게 일어나는 만큼 빈번하게 변경됩니다. 문제는 데이터베이스의 서버가 바쁠 때 이 통계작업을 포기한다는 것입니다. 이 때 서버 로그 메시지는 경고로 "pgstat wait timeout" 이런 메시지가 보입니다.
이 부분을 피하는 방법으로 이 디렉토리를 OS의 공유 메모리 영역으로 지정하는 것입니다. 물론 OS가 리부팅되면 모두 초기화 되겠지요.
stats_temp_directory = '/dev/shm' 이런형태가 됩니다.
7. 트랜잭션 로그 아카이빙 압축하기
archive_command = 'gzip -c %p > /archive_dir/%f.gz'
restore_command = 'gzip -dc /archive_dir/%f.gz > %p'
당연한 기법이겠지만, 아주 유용하게 쓰입니다. 물론 disk sync, 작업 도중 오류에 대한 예외처리를 고려하면 좀 더 복잡해지겠지만.
|