Docker를 이용해 PostgreSQL 설치

Docker를 이용해 PostgreSQL 설치


도커가 설치 되어 있는 상태에서 아래의 명령으로 설치 해줍니다.

우선 컨테이너를 PostgreSQL 공식 도커 허브에서 내려 받습니다.

# docker pull postgres:9.6.11
그리고 도커를 실행 해줍니다.

# docker run \
-e PGDATA=/data/pgdata \
--volume /home/postgres/pgdata:/data \
-e POSTGRES_INITDB_ARGS="--data-checksums -E utf8 --no-locale" \
--name postgres96 \
--publish 5432:5432 \
postgres:9.6.11

PGDATA는 도커안에서 postgresql 의 클러스터가 생성되는 경로입니다.


--volume $A:$B


$A - 실제 OS의 클러스터 데이터가 올라가는 경로

$B - 컨테이너 안에 생성되는 경로


이걸 잡아줘야 DB 생성 후 설정파일을 수정하기 쉽습니다.

더 다양한 옵션을 줘서 바로 DB를 생성 할 수도 있습니다.


그리고 docker run 으로 생성하고 나면 로그화면에서 빠져 나오지 않을 겁니다. 그냥 ctrl+c 로 중지하고,

# docker ps -a

로 ID를 확인한 후에

# docker start <ID>
해주시면 됩니다.



PostgreSQL 시간 조회



현재 시간 조회
 postgres=# select now();
현재 타임존 조회
 postgres=# show timezone;
타임존 변경 방법
 postgres=# SET TIME ZONE 'Asia/Seoul';
시스템 일자
 postgres=# select current_date, current_time, timeofday();
postgres=# select now(), current_timestamp, timestamp 'now';
년도 추출
 postgres=# select date_part('year', current_timestamp);
월 추출
 postgres=# select date_part('month', current_timestamp);
일 추출
 postgres=# select date_part('day', current_timestamp);
분 추출
postgres=# select date_part('minute', current_timestamp);
초 추출
 postgres=# select date_part('second', current_timestamp);
요일/일차 추출
 postgres=# select extract('dow' from timestamp '2013-07-30 20:38:40');    -- 일요일(0), 토요일(6)
result: 5
 postgres=# select extract('isodow' from timestamp '2013-07-30 20:38:40'); -- 월요일(1), 일요일(7)
result: 5
 postgres=# select extract('doy' from timestamp '2013-07-30 20:38:40');


PostgreSQL 주기적인 유지관리 Vacuuming



주기적인 유지관리 Vacuuming

Vacuum 기초

 - PostgreSQL의 Vacuum 명령은 다음과 같은 이유로 각 테이블마다 정기적으로 프로세스 해야합니다.

 a. 업데이트 또는 삭제된 행이 점유한 디스크 공간의 복구 또는 재사용.
 b. PostgreSQL 쿼리 플래너가 사용하는 데이터 통계 업데이트 (DB통계정보)
 c. 인덱스 전용 스캔 속도를 높이는 가시도 맵(visibility map) 업데이트
 d. 트랜잭션 ID 랩어라운드 또는 multixact ID 랩어라운드에 의한 아주 오래된 데이터가 손실되지 않도록 보호
 
 Vacuum에는 두가지 변이인 표준 Vacuum과 Vacuum Full이 있습니다. Vacuum Full은 디스크 공간을 더 많이 회수하는 대신 실행이 느립니다. 또한, 표준형 Vacuum은 데이터베이스 작업과 병렬로 실행할 수 있습니다. (Vacuum 진행중에 DDL (alter) 명령은 안되나 DML (select,insert,delete,update) 명령은 정상 작동함)
 Vacuum Full 작업은 작업중인 테이블에 대해 배타적 잠금이 필수이므로, 테이블의 다른 작업과 병렬로 사용할 수 없습니다.
 Vacuum은 상당한 I/O 트래픽이 발생되며, 다른 활성 세션의 성능을 저하시키는 원인이 됩니다.
 
1) 디스크 공간 복구

 - PostgreSQL에서 행의 UPDATE 또는 DELETE는 행의 오래된 버전을 즉각 제거하지 않습니다. 이러한 접근법은 MVCC의 장점을 누리기 위한것으로, 다른 트랜잭션에서 계속 확인될 가능성이 있을 경우에는 행 버전을 삭제해서는 안됩니다. 그러나 오래되었거나 삭제된 행 버전은 트랜잭션 대상이 아니기 때문에 Vacuum으로 회수 가능합니다.
 - 표준형 Vacuum은 테이블과 인덱스에서 Deed row 버전을 삭제하고, 나중에 재사용할 수 있도록 가용 공간으로 표시합니다. 하지만 테이블에 쓸수 있는 공간이 있는 경우는 오래된 공간을 반환하지 않습니다.
 - Vacuum Full은 Dead space가 일절 없도록 모든 공간을 반환합며, 테이블을 새버전으로 작성함으로 테이블이 최소화되지만, 시간이 오래걸리는 단점이 있습니다.
 - 일상적인 Vacuuming의 목표는 Vacuum Full이 불필요 하도록 표준형 Vacuum을 충분히 실행하는 것입니다. autovacuum데몬은 이와 같은 방식을 작동 되며, 사실상 Vacuum Full을 절대 수행하지 않습니다.
 
2) 실행 계획 통계 업데이트

 - PostgreSQL 쿼리 플래너는 쿼리에 대해 괜찮은 플랜을 생성하기 위해, 테이블 내용에 대한 통계정보에 의존합니다. 이러한 통계는 자체적으로 호출하거나 Vacuum에서 옵션으로 처리하거나 ANALYZE 명령으로 생성됩니다.
 - autovacuum 데몬이 활성화 되면 테이블 내용이 바뀔때마다 ANALYZE 명령이 자동으로 실행됩니다. 업데이트가 빈번하더라도, 데이터의 통계적 분포가 많이 바뀌지 않을때는 통계를 업데이트를 할 필요가 없습니다.

3) visibility map 업데이트

 - Vacuum은 모든 활성 트랜잭션에 보이는 것으로 알려진 튜플만 포함된 페이지를 추적하기 위하여 각 테이블에 대한 visibility map을 관리합니다.
 - 첫번째 목적은 Vacuum 자체는 cleanup 할 것이 없으므로 다음 실행에서 해당 페이지를 스킵합니다.
 - 두번째 목적은 기저 테이블을 참조하지 않고 인덱스만 이용하여 PostgreSQL이 일부 쿼리에 응답할 수 있게 합니다. 테이블을 참조 하지 않고 인덱스만 스캔하는 경우 visibility map을 먼저 확인하기 때문에 페이지에 튜플이 보이는 경우 heep fetch를 스킵할 수 있습니다. 거대 데이터 세트에서는 visibility map이 디스크 액세스를 막을 수 있는 가장 확실한 방법입니다. visibility map은 heep 보다 훨씬 작기때문에 heep이 매우 클 경우에도 쉽게 캐쉬 됩니다.

4) 트랜잭션 ID 랩어라운드 실패 방지

 - PostgreSQL의 MVCC 트랜잭션 시멘틱은 트랜잭션 ID(XID) 번호의 비교 가능 여부에 달려있습니다. 트랜잭션 ID의 크기는 제한되어 있으므로(32비트) 장시간 (40억 트랜잭션 이상) 동안 실행되는 클러스터는 트랜잭션 ID 랩어라운드가 발생합니다. XID 카운트가 0으로 랩어라운드 되고 과거에 있었던 모든 트랜잭션이 미래에 나타나게 됩니다. 즉 데이터의 소실이 발생합니다. 이 것을 피하려면 피하려면 20억 트랜잭션마다 모든 데이터베이스의 모든 케이블을 Vacuum해야 합니다.
 - 주기적으로 Vacuuming으로 문제가 해결되는 이유는 이 행이 과거에 커밋된 트랜잭션에 의해 삽입되었고 삽입 트랜잭션의 결과로 MVCC 관점으로 부터 현재와 미래 트랜잭션에서 모두 보이는 것이 확실하도록 Vacuum이 행에 동결 표시를 한다는 것입니다.
 
5) Multixact 및 랩어라운드

 - Multixact ID는 복수 트랜잭션에 의한 행 잠금을 지원할 때 사용됩니다.
 - Vacuum 테이블 스캔 중에, 테이블 부분적으로 또는 전체적으로 vacuum_multixact_freeze_min_age보다 오래된 multixact ID는 서로 다른 값으로 교체되는데, 이 값은 0, 단일 트랜잭션ID 또는 신규 multixact ID일 수 있습니다. 테이블 별로 pg_class.relminmxid는 해당 테이블에 계속 나타날 가능성이 있고 가장 오래된 multixact ID를 저장합니다. 이 값이 vacuum_multixact_freeze_min_age보다 오래된 경우 전체 테이블 스캔이 강제됩니다.
 - 전체 테이블 Vacuum 스캔은 사용된 멤버 저장소 공간이 할당된 저장소 공간의 50%를 초과 할 경우 multixact 연령이 가장 오래된 것을 시작으로 모든 테이블에 대해 순처적으로 일어납니다.
 
6) Autovacuum 데몬
 
 - Autovacuum 데몬의 목적은 Vacuum과 ANALYZE 명령의 실행을 자동화하는 것입니다.
 - autovacuum이 활성화 되면 다수의 튜플이 삽입, 업데이트 또는 삭제된 테이블을 검사합니다. 이 검사는 통계 수집 기능을 사용합니다. 따라서 track_counts가 true로 설정되지 않으면 사용할 수 없습니다.
 

PostgreSQL 테이블스페이스 및 오브젝트 사용량 확인



PostgreSQL 테이블스페이스 및 오브젝트 사용량 확인

 - 테이블스페이스 총량

  postgres=# select spcname, pg_size_pretty(pg_tablespace_size(spcname)) from pg_tablespace;


 - Table Size (Index 미포함)

 postgres=# select pg_relation_size('TableName');


 - Table Size (Index 포함) 

 postgres=# select pg_total_relation_size('TableName');


 - Index size

 postgres=# select pg_relation_size('IndexName');

 

 - Total Size ( 데이터 + 인덱스)

 postgres=# select pg_total_relation_size('TableName');


 ※ 단위적용 - pg_size_pretty()


 - DB Size

 postgres=# select pg_size_pretty(pg_database_size('DBName'));

PostgreSQL 백업 및 복원



PostgreSQL 백업 및 복원


 - PostgreSQL 데이터를 백업하는 3가지 방법

 

 1. SQL 덤프

 2. 파일 시스템 레벨 백업

 3. 연속 아카이빙


 

1. SQL 덤프


pg_dump 사용


 덤프 백업


 $ pg_dump dbname > outfile


 - pg_dump 는 최신 버전에서 다시 로드 할 수 있습니다.

 - 32bit -> 64bit 서버로 이동할 수 있는 유일한 방법입니다.

 - 한번에 하나의 데이터베이스만 백업 가능합니다.


 덤프 복원


 $ psql dbname < infile


 - 새로운 환경에서 복원하게 되면 dbname 부분의 들어가는 데이터베이스가 자동으로 생성 되지 않기 때문에, 미리 사용자가 같은 이름의 데이터베이스를 생성 해줘야 합니다.

 - SQL 덤프를 복원하기 전에 덤프된 데이터베이스의 개체를 소유하고 있거나 개체에 대한 권한이 부여된 모든 사용자가 이미 존재해야 합니다.

 - 덤프 복원은 에러가 나도 계속 진행하기 때문에 --set ON_ERROR_STOP=on 옵션을 주면 에러 발생시 psql을 종료하게 할 수 있습니다.

 - pg_dump로 생성된 덤프는 template0에 상대적입니다. 이것은 template1을 통해 추가된 언어, 프로시저 등도 pg_dump에 의해 덤프된다는 것을 의미합니다. 결과적으로 복원시, 커스터마이즈된 template1을 사용하는 경우 template0으로부터 비어있는 데이터베이스를 생성해야 합니다. 

 - 파이프에 쓰거나, 파이프에서 읽어 오는 pg_dump 및 psql의 기능은 데이터베이스를 특정 서버에서 다른 서버로 직접 덤프를 가능하게 합니다.


 $ pg_dump -h host1 dbname | psql -h host2 dbname



pg_dumpall 사용


 - pg_dump는 한 번에 하나의 데이터베이스만 덤프하며, role 또는 테이블스페이스에 대한 정보는 덤프하지 않습니다. 


 백업

 

 $ pg_dumpall > outfile


 복원


 $ psql -f infile postgres


 - 실제로 시작한 기존 데이터베이스 이름을 지정할 수 있지만 비어있는 클러스터로 로딩한 경우 postgres를 일반적으로 사용해야 합니다.

 - 클러스터 차원의 데이터는 pg_dumpall --globals-only 옵션을 사용하여 단독 덤프가 가능합니다.



거대 데이터베이스 처리


 - 일부 운영체제는 거대 pg_dump 출력 파일을 생성할 때 최대 파일 크기 제한이 있습니다. pg_dump는 표준 출력으로 사용할 수 있어, 유닉스 툴로 이런 문제의 가능성을 피할 수 있습니다.


 ◆ 압축 덤프 사용

  

  gzip을 이용한 덤프

  $ pg_dump dbnam | gzip > filename.gz


  리로드

  $ gunzip -c filename.gz | psql dbname


 ◆ split 사용

  

  1GB 단위로 분할 백업

  $ pg_dump dbname | split -b 1024m - filename


  리로드

  $ cat filename* | psql dbname


 ◆ pg_dump의 커스텀 덤프 형식 사용

  

  - 설치된 zlib 압축 라이르러리를 사용하여 PostgreSQL을 시스템에서 빌드한 경우 출력 파일에 쓸 때 커스텀 덤프 형식이 데이터를 압축합니다.

 - 덤프파일 크기는 gzip과 비슷하지만 테이블을 선택적으로 복원할 수 있다는 장점이 있습니다.


  백업

  $ pg_dump -Fc dbname > filename


  복원 : psql이 아닌 pg_restore를 이용해 복원합니다.

  $ pg_restore -d dbname filename


 ◆ pg_dump의 병렬 덤프 기능 사용


  - 거대 데이터베이스의 덤프 속도를 높이기 위하여 병렬 모드를 사용할 수 있습니다.

  - 병렬 덤프는 "디렉토리" 아카이브 형식에 대해서만 지원합니다.

 

 백업

 $ pg_dump -j <number> -F d -f out.dir dbname


 복원

 pg_resote -j 를 이용하여 복원 할 수 있습니다.




2. 파일 시스템 레벨 백업


 - 시스템 레벨에서 백업을 하는 것인데, 정상적인 백업을 위해서는 반드시 DB를 shutdown 해야 합니다. 복원도 마찬가지.


 tar -cf backup.tar /usr/local/pgsql/data


 - 파일 시스템 백업은 전체 데이터베이스 클러스터의 완전한 백업 및 복원에 대해서만 동작합니다.



 

3. 연속 아카이빙 및 PITR


 - PostgreSQL은 클러스터의 데이터 디렉토리의 pg_xlog/ 서브 디렉토리에 WAL를 항상 유지관리합니다. 이 로그에는 데이터 파일에서 일어난 모든 변경 내용이 기록 됩니다.

 - 복구가 필요한 경우, 파일 시스템 백업을 복원한 이후, 백업된 WAL 파일로부터 리플레이로 시스템을 현재 상태로 불러옵니다. (오라클 Hot backup 복원 후 archive 적용하는 것과 비슷한 개념입니다.)

 - 일반 파일 시스템 백업과 마찬가지로, 전체 데이터베이스 클러스터 복원만 지원합니다.


 베이스 백업


 - pg_base 를 이용한 백업

 

 1) WAL 아카이빙이 활성화 되어 있는지 확인한다.

 2) 슈퍼유저로 데이터베이스에 연결하고 다음 명령을 실행한다.

   SELECT pg_start_backup('label');

   여기서 label은 백업 작업의 식별을 위한 string이다.

   기본적으로 pg_start_backup은 완료 되는데 체크포인트를 수행하기 때문에 시간이 오래걸린다.

   백업을 가능한 빨리 시작하고 싶다면, 다음을 사용하는 것이 좋다.

   SELECT pg_start_backup('label',ture);

   체크포인트를 강제한다.

 3) tar 또는 cpio 같은 편리한 파일 시스템 백업툴을 사용하여 백업을 수행한다.

 4) 슈퍼유저로 데이터베이스에 접속후에 명령을 실행한다.

   SELECT pg_stop_backup();

 5) 백업을 아카이브 하는 중에 WAL 세그먼트가 활성화 되면 백업이 끝이 난다.

 

 ※ 오라클 Hot backup과 동일한 개념으로 보면 됩니다.


 연속 아카이브 백업을 사용한 복구


 1) 서버가 실행중인 경우 서버를 중지한다.

 2) 공간에 여유가 잇는 경우 필요할 때를 대비하여 전체 클러스터 데이터 디렉토리와 테이블스페이스를 임시 위치에 복사한다. 시스템 다운 정에 아카이브되지 않은 로그가 포함되었을 수 있는 클러스터의 pg_xlog 서브디렉토리의 내용을 최소한이라도 따로 저장해두어야 한다.

 3) 사용 중인 클러스터 데이터 디렉토리 아래 및 데이블스페이스의 root 디렉토리 아래의 모든 기본 파일 및 서브 디렉토리를 삭제한다.

 4) 데이터베이스 파일을 파일 시스템 백업으로 부터 복원한다. 올바른 소유권 확인 및 pg_tblspc의 심볼릭 링크가 바른지 확인.

 5) pg_xlog/ 밑에 오래된 파일 시스템 백업에서 온 로그를 삭제한다.

 6) pg_xlog/ 2단계에서 저장된 아카이브되지 않은 WAL 세그먼트 파일이 있을 경우 pg_xlog/에 복사한다.

 7) 클러스터 데이터 디렉토리에서 복구 명령 파일 recovery.conf를 생성한다. pg_hba.conf를 수정하여 복구하는 동안 접속을 막는다.

 8) 서버를 시작한다. 서버가 복구모드로 들어가고 아카이브된 WAL 파일을 통해 읽기가 진행 된다. 복구가 완료 되면 recovery.conf의 이름을 recovey.done 으로 변경하고 다시 복구 모드로 들어가지 않게 바꿔준다.

 9) 데이터베이스의 내용을 확인하고 pg_hba.conf 를 복원하여 사용자 연결을 확인한다.


※ recovery.conf


 예제 파일. /usr/pgsql-9.6/share/recovery.conf.sample을 이용하여 만들수 있다.


 아카이브 복구 설정


 restore_command (string)

  - WAL 파일 시리즈의 아카이브된 세그먼트의 검색을 실행하는 로컬 쉘 명령.

  - 아카이브 복구에 필요하지만 스트리밍 복제의 경우는 옵션.

  - string의 %f 는 아카이브에서 검색할 파일 이름으로 교체되고, %p 는 서버의 복사 대상 경로로 교체된다.

 

    restore_command = 'cp /data/pgsql/archvie/%f "%p"'


 archive_cleanup_command (string)

  -모든 restartingpoint에서 실행되는 쉘 명령을 지정한다.

  - 스탠바이 서버에서 더 이상 필요로 하지 않는 오래된 아카이브 WAL 파일을 클린업하는 메카니즘을 제공하는 것.

  - %r 은 마지막 유효 재시작 지점이 있는 파일의 이름으로 교체된다.

  

   archive_cleanup_command = 'pg_archivecleanup /data/pgsql/archive %r'


 recovery_end_command (string)

  - 복구 종료 시에 한 번만 실행되는 쉘 명령을 지정한다. 이 매개변수는 옵션이다.


복구 타깃 설정


recovery_target = 'immediate'

  - 온라인 백업에서 복원하는 경우 이것은 백업이 종료된 지점을 의미한다.

  - 현재 다른 매개변수는 없다.


recovery_target_name (string)

  - 이 매개변수는 지명된 복원 지점(pg_create_restore_point()를 사용하여 생성)을 복구가 진행되는 지점으로 지정.


recovery_target_time (timestamp)

  - 이 매개변수는 타임스탬프를 복구가 진행되는 지점으로 지정한다.

  - 정밀한 정지 지점은 recovery_target_inclusive의 영향도 받는다


recovery_target_xid (string)

  - 트랜잭션 ID를 복구가 진행되는 지점으로 지정한다.

  - 복구되는 트랜잭션은 지정된 것 이전에 커밋된 트랜잭션이다.


다음 옵션은 복구 타깃을 추가로 지정하며, 타깃에 도달 했을때, 발생하는 것에 영향을 끼친다.


recovery_target_inclusive (boolean)

  - 지정된 복구 타깃 직후에 중지 할 것인지, 직전에 중지 할 것인지 지정한다.

  - 기본값은 ture.


recovery_target_timeline (string)

  - 특정한 타임라인으로의 복구를 지정한다.

  - 기본값은 베이스 백업을 가져왔을 때 현재였던 동일한 타임라인을 따라 복구하는 것이다.

  - 이것을 lastest로 설정하면 아카이브의 최신 타임라인으로 복구 되며, 스탠바이 서버에 유용하다.

 







PostgreSQL 로컬라이제이션



PostgreSQL 로컬라이제이션


 - 로케일 지원은 initdb를 이용해 클러스터를 구성하면 자동으로 초기화 됩니다. 

 - 특별히 옵션을 넣지 않으면 en_US.UTF8로 설정이 됩니다.

 

 LC_COLLATE

 String 정렬 순서

 LC_CTYPE

 문자 분류 (어떤글자인지, 대문자도 동일한지)

 LC_MESSAGES

 메세지 언어

 LC_MONETARY

 통화 형식

 LC_NUMERIC

 숫자 형식

 LC_TIME

 날짜 및 시간 형식


 예)

 로케일을 한국으로 설정하되 통화 형식은 달러를 쓴다면,

 initdb --locale=ko_KR --lc-monetary=en_US 로 클러스터를 구성하면 됩니다.


 - 시스템에 로케일 지원이 안되는 것처럼 하고 싶으면 특수한 로케일 이름인 C 또는 동등하게 POSIX를 사용해야 합니다.

 - 일부 로케일 카테고리는 데이터베이스가 생성될 때 고정된 값이어야 합니다. 

 - 서로 다른 데이터베이스에 대해 서로 다른 설정을 사용할 수는 있지만, 데이터베이스가 생성된 다음에는 설정을 변경 할 수 없습니다.

 - 인덱스 정렬 순서에 영향을 미치므로 고정된 상태로 유지되어야 하며, 데이터베이스 운영 중 변경하면 인덱스 손상이 발생합니다.

 - initdb 에서 선택된 값은 postgresql.conf에 작성되어 서버 시작시 기본값으로 사용됩니다. 이 값을 postgresql.conf에서 제거하면 서버가 실행 환경에서 설정을 상속 받습니다.

 - 리눅스가 처음부터 ko_KR.UTF8로 설정 되어 있다먼, initdb 시 옵션을 넣지 않아도 ko_KR.UTF8로 설정됩니다.



※ 로케일 설정은 다음과 같은 SQL 기능에 영향을 줍니다.


 1. order by를 사용한 쿼리에서 정령 순서 또는 텍스트 데이터에서 표준 비교 연산자

 2. upper 및 lower, initcap 함수

 3. 패턴 일치 연산자 (LIKE, SIMILAR TO 및 POSIX 스타일 정규식). 대소문자 비 구분 일치 및 문자 클래스 정규식에 의한 문자 분류에 모두 영향을 미치는 로케일.

 4. TO_CHAR 계열 함수

 5. LIKE 절을 사용한 인덱스 사용 능력


 - PostgreSQL에서 C 또는 POSIX가 아닌 다른 로케일을 사용할 때의 단점은 성능입니다. 문자 처리가 느려지고 LIKE에서 사용 되는 일반 인덱스를 사용하지 못합니다. 이러한 이유로, 실제로 필요한 경우에만 로케일을 사용해야 합니다.


※ 이미 클러스터를 구성해서 운영중인데 다른 언어셋이 필요하다면, create database 명령에서 로케일 옵션을 변경해서 생성 할 수 있습니다.


postgres=# create database test_kr

with

template=template0

encoding='EUC_KR'

LC_COLLATE='POSIX'

LC_CTYPE='ko_KR.euckr'

tablespace=test_kr

connection limit=999;

CREATE DATABASE

postgres=# \l

                                  List of databases

   Name    |   Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   

-----------+-----------+----------+-------------+-------------+-----------------------

 postgres  | postgres  | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 

 template0 | postgres  | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +

           |           |          |             |             | postgres=CTc/postgres

 template1 | postgres  | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +

           |           |          |             |             | postgres=CTc/postgres

 test_kr   | postgres  | EUC_KR   | C           | ko_KR.euckr | 

 testdb    | test_user | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 

(5 rows)



 - C가 아닌 로케일 하에서 LIKE 절을 사용한 인덱스를 PostgreSQL이 이용하려면 몇 가지 커스텀 연산자 클래스가 존재해야 합니다. 이것은 로케일 비교 규칙은 무시하면서 엄격한 문자별 비교를 수행하는 인덱스의 생성을 허용합니다. 다른 방법은 C 콜레이션을 사용하여 인덱스를 생성하는 것입니다.

PostgreSQL 데이터베이스 Role



PostgreSQL 데이터베이스 Role


 - PostgreSQL은 role 이라는 개념을 사용하여 데이터베이스 액세스 권한을 관리합니다.

 - role의 개념은 "사용자" 및 "그룹"의 개념을 포함합니다.

 - 데이터베이스 role은 운영체제 사용자와는 다른 개념입니다.

 - 특정 데이터베이스 연결에 사용할 role 이름은 애플리케이션 특정 방식의 연결 요청을 초기화하는 클라이언트에 의해 표시됩니다. 예를들면, psql 프로그램은 -U 옵션을 사용하여 연결한 role을 표시합니다. 다수의 애플리케이션이 기본적으로 현재 운영체제 시스템 사용자의 이름을 가정합니다. (createuser 및 psql 포함) 따라서 role 및 운영체제 사용자 간에 네이밍 연관성을 유지하는 것이 편리합니다.

 - 오라클 처럼 user와 role이 분리된 개념이 아니라, user=role 느낌으로 사용됩니다. 



role 생성


postgres=#CREATE ROLE [name];


role 삭제


postgres=# DROP ROLE [name];


role 확인


postgres=# \du

postgres=# select rolname from pg_roles;




※ role  속성


 - 로그인 권한 :

 postgres=# CREATE ROLE [name] LOGIN;

 postgres=# CREATE ROLE [name];


 Login 속성이 있는 role은 "데이터베이스 사용자"와 동일한 것으로 간주 될 수 있습니다.

 CREATE USER는 디폴트로 LOGIN 권한을 준다는 접에서 CREATE ROLE과 다릅니다.


 - 슈퍼유저:

 postgres=# CREATE ROLE [name] SUPERUSER;


 데이터베이스 슈퍼유저는 로그인 권한을 제외한 모든 권한 검사를 건너뜁니다. 

 아무에게나 슈퍼유저 권한을 주는 것은 위험합니다.


 - 데이터베이스 생성:

 postgres=# CREATE ROLE [name] CREATEDB;


 - role 생성:

 postgres=# CREATE ROLE [name] CREATEROLE;


 role을 추가적으로 생성하려면 권한이 명시적으로 role에 주어져야 합니다.

 CREATEROLE 권한이 있는 role은 다른 role을 변경, 삭제할 수 있으며, 멤버십을 부여 또는 취소할 수 있습니다.

 단 슈퍼유저의 role은 수정 불가.


 - 복제 초기화:

 postgres=# CREATE ROLE [name] REPLICATION LOGIN;


 streaming replication을 초기화하려면 필요한 권한입니다.

 해당 role은 항상 LOGIN 권한을 같이 가지고 있어야 합니다.


 - 패스워드:

 postgres=# CREATE ROLE [name] PASSWORD 'string';


 패스워드는 데이터베이스에 연결할 때 사용자가 패스워드를 입력해야 하는 클라이언트 인증 방법인 경우에만 중요합니다.

 password 및 md5 인증방법은 패스워드를 이용합니다.

 


 - role의 속성은 ALTER ROLE 명령으로 수정할 수 있습니다.



role 멤버십


 - 권한 관리의 편의상 사용자를 그룹으로 묶는 것이 편리할 수 있습니다. 이렇게 하면 권한을 그룹단위로 부여하거나 취소할 수 있습니다. PostgreSQL에서 이것은 그룹을 나타내는 role을 생성한 다음, 그룹 role의 멤버십을 개별 사용자 role에 부여하면 됩니다.

 - 그룹 role을 설정 하려면 먼저 role을 생성해야 합니다.

 - 그룹 role이 존재하는 경우 grant 및 revoke 명령을 사용하여 멤버를 추가 및 삭제할 수 있습니다.


 쉽게 설명하자면 아래와 같습니다.


 두개의 role을 만들어 봅니다.

 postgres=# CREATE ROLE user01 login;

 postgres=# CREATE ROLE admin;

 postgres=# GRANT admin to user01;

 postgres=# ALTER role admin WITH createdb createrole;


 user01을 이용해서 로그인은 가능하지만, admin으로는 로그인이 되지 않습니다.

 

 postgres@psql-db01:/usr/local/pgsql/data]$ psql -d postgres -U admin

 psql: FATAL:  role "admin" is not permitted to log in

 

 postgres@psql-db01:/usr/local/pgsql/data]$ psql -d postgres -U user01

 psql (9.6.11)

 Type "help" for help. 

 

 postgres=>


 user01은 로그인은 가능하지만 권한이 없기 때문에 create database 명령은 사용할 수 없습니다.

 

 postgres=> create database test02;

 ERROR:  permission denied to create database

 postgres=>

 

 

 user01은 슈퍼유저가 아니기 때문에 postgres에 롤로 전환할 수 없습니다.


 postgres=> set role postgres;

 ERROR:  permission denied to set role "postgres"



 하지만 admin에 속해 있기 때문에 admin으로 전환은 가능합니다.

 admin으로 전환해서 create database 명령을 사용 가합니다.


 postgres=> set role admin;

 SET

 postgres=> create database test03;

 CREATE DATABASE

 

 이렇게 여러가지 role을 만들어서 멤버십을 통해 다양하게 활용할 수 있습니다.

 

 role 간에 전환은 set role [name]; 명령으로 합니다.

 

 처음에 접속한 role로 돌아가려면


 set role [처음 접속한 role name];

 set role none;

 reset role;


 셋중 하나로 원상 복구가 됩니다.

 oracle로 치면 SQL> 안에서 conn 명령으로 유저가 이동하는것과 비슷한데, 허용된 멤버십 안에서 이동이 가능한 것 입니다.




 

'Database > PostgreSQL' 카테고리의 다른 글

PostgreSQL 백업 및 복원  (0) 2019.01.01
PostgreSQL 로컬라이제이션  (0) 2019.01.01
PostgreSQL 데이터베이스 Role  (0) 2019.01.01
PostgreSQL 아카이브 모드  (0) 2019.01.01
PostgreSQL 커널 리소스 관리  (0) 2019.01.01
PostgreSQL 모니터링  (0) 2018.12.31

PostgreSQL 아카이브 모드



PostgreSQL 아카이브 모드 (Archive Mode)



- PostgreSQL에서 아카이브 모드를 이해하기전에 WAL을 자세히 알고 넘어가야 할 필요가 있습니다. 

- WAL (Write-Ahead Logging)은 데이터 무결성을 보장하는 표준 방법입니다.

- WAL의 중심개념은 변경 내용을 설명하는 로그 레코드를 영구적 저장소에 먼저 기록한 후에 데이터 파일의 변경 내용을 작성한 다는 것입니다. (오라클의 redo-archive와 비슷한 역할)

- 충돌 발생시 로그를 사용하여 데이터베이스를 복구 할 수 있으므로 트랜잭션 커밋마다 데이터 페이지를 디스크에 쓸 필요가 없습니다. 데이터 페이지에 적용되지 않은 변경 내용은 로그 레코드에서 실행 취소가 가능합니다. (이것은 roll-forward 복구 이며, REDO라고도 합니다.)

- 로그 파일은 순차적으로 작성되며, 로그 파일 동기화 비용은 데이터 페이지 쓰기 비용보다 훨씩 적습니다. 

- 서버가 소규모 도시 트랜잭션을 다수 처리하는 경우 로그 파일의 fsync 하나로 여러가지 트랜잭션을 충분히 커밋할 수 있습니다.

- 온라인 백업 및 PIT(point-in-time) 복구를 지원 가능하게 합니다.




 ※ $PGDATA 밑에 있는 postgresql.conf 파일안의 파라미터 값 수정하여 설정 가능합니다.


 ◆ wal_level (enum)

 - wal_level은 WAL에 기록되는 정보의 양을 결정합니다. 기본값은 충돌 또는 즉시 셧다운으로부터 복구하기 위해 필요한 정보만 기록하는 minimal 입니다.

  

  minimal : 기본값

  archive : WAL 아카이브에 필요한 로깅만 추가. 

  hot_standby : 대기 서버에서 읽기전용 쿼리에 필요한 정보를 추가.


 ◆ archive_mode (boolean)

  -archive_mode를 사용하는것으로 설정하면 완료된 WAL 세그먼트가 archive_command 설정에 의하 아카이브 저장소로 전달 됩니다. archive_mode 및 archive_command는 별개의 변수이므로 아카이빙 모드를 해지하지 않고도 archive_command를 변경할 수 있습니다. 이 매개변수는 서버 시작 시 설정됩니다. wal_level이 minimal로 설정된 경우 archive_mode를 사용 할 수 없습니다.

 

 ◆ archive_command (string)

  - 완료된 WAL 파일 세그먼트를 아카이브하기 위해 실행하는 로컬 쉘 명령입니다.

  - String : %p 아카이브할 파일의 경로명으로 대체

             %f 파일명으로만 대체


 ◆ archive_timeout (integer)

  - archive_command는 완료된 WAL 세그먼트를 호출합니다. 그러므로 서버에는 WAL 트래픽이 발생되지 않아서 트랜잭션이 완료되는 시간과 아카이브 저장소에서 안전하게 기록 되는 사이에 긴 지연시간이 발생 할 수 있습니다. 데이터가 아카이브되지 않은 채로 방치되지 않게 하기 위해 서버가 새 WAL 세그먼트 파일로 주기적으로 전환되도록 archive_timeout을 설정할 수 있습니다. 

 - archive_timeout을 매우 짧게 설정하는 것은 저장소를 부풀게 함므로 현명하지 못하며, 1~2분정도로 설정하는 것이 좋습니다.




※ 실제로 설정 해보기


$ vi postgresql.conf


wal_level = archive

archive_mode = on

archive_command = 'cp %p /data/pgsql/archive/arch_%f.arc'

archvie_timeout = 120


:wq!


postgres@psql-db01:/usr/local/pgsql/data]$ pg_ctl stop

waiting for server to shut down.... done

server stopped

[1]+  Done                    postgres -D /usr/local/pgsql/data > /var/postgresql/log/postgresql.log 2>&1  (wd: /var/postgresql/log)

(wd now: /usr/local/pgsql/data)

postgres@psql-db01:/usr/local/pgsql/data]$ postgres -D /usr/local/pgsql/data >/var/postgresql/log/postgresql.log 2>&1 &

[1] 52044

$



※ 아카이브 모드 확인하기


postgres=# select * from pg_settings

           where name in ('archive_mode', 'archive_command', 'archive_timeout', 'wal_level');

postgres=# show wal_level;

postgres=# show archive_mode;

postgres=# show archive_command;



로그 스위치


pg_switch_xlog() / pg_xlogfile_name / pg_xlogfile_name_offset



pg_switch_xlog() - 현재 사용중인 로그 파일을 아카이빙하고 새로운 파일로 스위칭 함.


postgres=# select pg_switch_xlog();

 pg_switch_xlog 

----------------

 0/70000B0

(1 row)


pg_xlogfile_name / pg_xlogfile_name_offset - 아카이빙 된 파일명 출력


postgres=# select pg_xlogfile_name('0/3000078'), pg_xlogfile_name_offset('0/3000078');

     pg_xlogfile_name     |    pg_xlogfile_name_offset     

--------------------------+--------------------------------

 000000010000000000000003 | (000000010000000000000003,120)

(1 row)



현재 사용중인 로그 확인


pg_current_xlog_locatioin() : 현재 사용중인 로그 출력


postgres=# select pg_current_xlog_location();

 pg_current_xlog_location 

--------------------------

 0/41000060

(1 row)




'Database > PostgreSQL' 카테고리의 다른 글

PostgreSQL 로컬라이제이션  (0) 2019.01.01
PostgreSQL 데이터베이스 Role  (0) 2019.01.01
PostgreSQL 아카이브 모드  (0) 2019.01.01
PostgreSQL 커널 리소스 관리  (0) 2019.01.01
PostgreSQL 모니터링  (0) 2018.12.31
PostgreSQL 점검  (0) 2018.12.31

PostgreSQL 커널 리소스 관리



공유 메모리 및 세마포어


 - 공유 메모리 및 세마포어는 통칭 "System V IPC"라고 합니다. 윈도우 외에, PostgreSQL이 이러한 기능에 대한 자체적인 구현을 제공하는 경우 PostgreSQL을 실행하기 위해 이러한 기능이 요구됩니다.


 - PostgreSQL은 서버 사본별로 System V 공유 메모리 수 바이트가 필요합니다. (64비트 플랫폼의 경우 보통 48바이트)


 - 서버 사본은 다수 실행 중이거나 다른 애플리케이션도 System V 공유 메모리를 사용중인 경우 바이트 단위의 공유 메모리 최대 크기인 SHMMAX를 늘려야 하거나 시스템 차원(system-wide)의 System V 공유 메모리인 SHMALL을 늘려야 할 수 있습니다. SHMALL은 여러 시스템에서 바이트 단위가 아니라 페이지 단위로 처리된다는 점에 유의해야 합니다.


 - PostgreSQL은 16개 한 세트로, 허용된 연결당 (max_connections) 및 autovacuum worker 프로세스당(autovacuum_max_workers) 1개의 세마포어를 사용합니다. 시스템에서 세마포어 최대 수는 SEMMNS에 의해 설정되며, 따라서 최소한 max_connection + autovacuum_max_workers + 각각 허용된 16개의 연결에 1추가 + worker여야 합니다. 각각의 세트마다 다른 애플리케이션에서 사용되는 세마포어 세트와의 충돌을 감지하기 위한 "매직 넘버"가 17번째 세마포어에 포함되어 있습니다.


 ceil((max_connection + autovacuum_max_workers +4)/16)*17외 다른 애플리케이션의 여유분.




리눅스에서의 세마포어


 - 최대 세그먼트 크기 기본값은 32MB 이며, 최대 총 크기 기본값은 2097152 페이지 입니다. "huge page"를 이용한 특수 커널 구성일 때 외에는 페이지는 거의 항상 4096바이트 입니다. (확인하려면 getconf PAGE_SIZE 사용).


 - 공유 메모리 크기설정은 sysctl 인터페이스를 통해 변경이 가능합니다. 예를 들어, 16GB를 허용하려면 다음과 같이 합니다.


 # sysctl -w kernel.shmmax=17179869184

 # sysctl -w kernem.shmall=4194304


 또한, /etc/sysctl.conf 파일에서 리부팅 사이에서도 이 설정을 보존할 수 있습니다. 



'Database > PostgreSQL' 카테고리의 다른 글

PostgreSQL 데이터베이스 Role  (0) 2019.01.01
PostgreSQL 아카이브 모드  (0) 2019.01.01
PostgreSQL 커널 리소스 관리  (0) 2019.01.01
PostgreSQL 모니터링  (0) 2018.12.31
PostgreSQL 점검  (0) 2018.12.31
PostgreSQL 권한 부여 및 해제  (0) 2018.12.31

PostgreSQL 모니터링



PostgreSQL 모니터링


pg_catalog : tables, views, functions, indexes, fdw, trigger, constraints, rules, users, groups 등등 정보 저장

pg_attribute : 테이블 및 다른 pg_class object columns에 대한 정보 저장

pg_index : 인덱스에 대한 정보 저장

pg_depend : object dependent에 대한 정보

pg_rewrite : 테이블 및 view 에 대한 rules 정보 

pg_constraint : 테이블에 constraint 정보 

pg_stat_statements : db에서 수행된 쿼리에 대한 통계 정보

pg_buffercache : cache에 대한 deeper 한 정보

information_schema : 메타 정보를 담고 있는 view



1. 접속된 사용자 확인


SELECT datname, usename, client_addr, client_port, application_name FROM pg_stat_activity;


5초 간격으로 위에 SQL를 수행 => \watch 5



2. Active 세션 확인


SELECT datname, usename, state, query FROM pg_stat_activity WHERE state = 'active';


* 세션에 대한 detail한 분석은 pg_stat_statement 설치 (real-time performance for query)



3. long 실행 쿼리 확인


SELECT

    current_timestamp - query_start AS runtime,

    datname, usename, query

FROM pg_stat_activity 

WHERE state = 'active' ORDER BY 1 DESC;



1분 이상 실행되는 쿼리 확인


SELECT

    current_timestamp - query_start AS runtime,

    datname, usename, query

FROM pg_stat_activity

WHERE state = 'active'

    AND current_timestamp - query_start > '1 min'

ORDER BY 1 DESC;



4. query를 process title에 보이도록 설정 (postgresql.conf)


  update_process_title = on



5. wait 또는 blocking 되는 세션 확인


SELECT datname, usename, query FROM pg_stat_activity WHERE waiting = true;




6. query block user 찾기


SELECT

    w.query AS waiting_query,

    w.pid AS waiting_pid,

    w.usename AS waiting_user,

    l.query AS locking_query,

    l.pid AS locking_pid,

    l.usename AS locking_user,

    t.schemaname || '.' || t.relname AS tablename

 FROM pg_stat_activity w

       JOIN pg_locks l1 ON w.pid = l1.pid AND NOT l1.granted

       JOIN pg_locks l2 ON l1.relation = l2.relation AND l2.granted

       JOIN pg_stat_activity l ON l2.pid = l.pid

       JOIN pg_stat_user_tables t ON l1.relation = t.relid

 WHERE w.waiting;



7. kill session


  postgresql에 세션 kill 아래 3가지 순서로 차례로 진행하면 됨 (1이 안되면 2, 2 안되면 3)


  1) pg_cancel_backend(pid)          -- current query kill and not disconnect

  2) pg_terminate_backend(pid)        -- connection disconnect. 

  3) kill -9 process



  10분동안 유휴 상태인 세션 kill


  SELECT pg_terminate_backend(pid) FROM pg_stat_activity

  WHERE state = 'idle in transaction' AND current_timestamp - query_start > '10 min';



  현재 세션을 제외한 모든 세션 kill.


  SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = current_database() AND pid <> pg_backend_pid();



  작업을 위해 해당 데이터베이스 접속을 막음.


  UPDATE pg_database set datallowconn = 'false' WHERE datname = 'database to drop';



8. long 쿼리 수행시 timeout 설정


set statement_timeout to '10 s'


select ~~ from ~ : long query..



9.  2pc 사용시 lock 확인 


SELECT t.schemaname || '.' || t.relname AS tablename,

       l.pid, l.granted

       FROM pg_locks l JOIN pg_stat_user_tables t

       ON l.relation = t.relid;


아래 결과중 pid가 표시 되지 않는 부분


 tablename | pid | granted 

-----------+-----+---------

 test1     |     | t

 test1     | 111 | f


 

10. 테이블 사용량 확인


초기 사용량 저장


CREATE TEMPORARY TABLE tmp1_201512 AS  SELECT * FROM pg_stat_user_tables;




현시점 사용량이 비교하여 수치가 달라진 테이블 출력 


SELECT * FROM pg_stat_user_tables n

  JOIN tmp1_201512 t

    ON n.relid=t.relid

   AND (n.seq_scan,n.idx_scan,n.n_tup_ins,n.n_tup_upd,n.n_tup_del)

    <> (t.seq_scan,t.idx_scan,t.n_tup_ins,t.n_tup_upd,t.n_tup_del);



기존 통계 데이터 초기화


SELECT pg_stat_reset();



테이블 정보를 snapshot 생성 (cron 또는 pg_agent, bgworker 활용)


INSERT INTO stat1_201512

SELECT current_timestamp AS snaptime, * FROM pg_stat_user_tables;




11. 테이블 마지막 사용 일자 확인


-- 아래 function 수행


do $$

         PERFORM table_file_access_info('test1', 'test');

$$  -- output이 없음



select table_file_access_info('test1', 'test');


-- 일자 확인 function 생성


CREATE OR REPLACE FUNCTION table_file_access_info(

   IN schemaname text, IN tablename text,

   OUT last_access timestamp with time zone,

   OUT last_change timestamp with time zone

   ) LANGUAGE plpgsql AS $func$

DECLARE

    tabledir text;

    filenode text;

BEGIN

    SELECT regexp_replace(

        current_setting('data_directory') || '/' || pg_relation_filepath(c.oid),

        pg_relation_filenode(c.oid) || '$', ''),

        pg_relation_filenode(c.oid)

      INTO tabledir, filenode

      FROM pg_class c

      JOIN pg_namespace ns

        ON c.relnamespace = ns.oid

       AND c.relname = tablename

       AND ns.nspname = schemaname;

    RAISE NOTICE 'tabledir: % - filenode: %', tabledir, filenode;

    -- find latest access and modification times over all segments

    SELECT max((pg_stat_file(tabledir || filename)).access),

           max((pg_stat_file(tabledir || filename)).modification)

      INTO last_access, last_change

      FROM pg_ls_dir(tabledir) AS filename

      -- only use files matching <basefilename>[.segmentnumber]

     WHERE filename ~ ('^' || filenode || '([.]?[0-9]+)?$');

END;

$func$;




12. TEMP 데이터 사용률 확인


1) 별도 temporary 테이블스페이스 사용 확인


 SELECT current_setting('temp_tablespaces');  -- 결과가 없으면 default tablespace 사용



2) 1의 결과가 나오면 다음 SQL를 사용하여 사용량 확인


WITH temporary_tablespaces AS (

  SELECT unnest(string_to_array(

    current_setting('temp_tablespaces'), ',')

  ) AS temp_tablespace

)   

SELECT tt.temp_tablespace,

  pg_tablespace_location(t.oid) AS location,

  -- t.spclocation AS location, -- for 9.0 and 9.1 users

  pg_tablespace_size(t.oid) AS size

FROM temporary_tablespaces tt

JOIN pg_tablespace t ON t.spcname = tt.temp_tablespace

  ORDER BY 1;


3) 1의 결과가 안나오면 다음과 같은 방법으로 사용량 확인


  SELECT current_setting('data_directory') || '$PG_HOME/base/pgsql_tmp'

  SELECT datname, temp_files, temp_bytes, stats_reset

  FROM pg_stat_database;



4) 기타 방법


- 실제 파일이 있는 디렉토리를 du -sk 로 확인

- pg_tablespace_location(oid), pg_tablespace_size(oid), pg_tablespace_size(name)함수로 확인



5) 템프 파일 사용량 로깅 


   conf파일에  log_temp_files = 0 or 특정값으로 설정하면 해당 값을 넘어갈때 postgresql log 파일에 로깅됨

   템프 파일 사용량이 증가하면 work_mem값을 크게 설정하여 메모리 사용하도록 유도..




13. Slow query 분석  


     postgresql에 pg_stat_statements 모듈 설치 (create extension pg_stat_statements)

     (해당 모듈 load를 위해 shared_preload_libraries = 'pg_stat_statements' 설정)


     1)  analyze    : db 전체 성능 향상을 위해 해당 명령어 수행 

         (모든 테이블에 통계 정보 Update 및 데이터 정리 작업 수행)


     2) 1번 수행후 별 다른 개선사항이 없으면

        \x

        select * from pg_stat_statements 수행후 결과중 shared_blks_hit 및 shared_blks_read 


        항목 확인


       SELECT pg_relation_size(relid) AS tablesize,schemaname,relname,n_live_tup

       FROM pg_stat_user_tables WHERE relname = 'album';


        n_live_tup 대비 tablesize가 너무 크면 가비지 데이터가 정리가 안된 상황 


        (vacuum 기준 확인 필요)


    3) slow query 자동 실행 계획 log print


        load 'auto_explain'


        (해당 모듈 load를 위해 shared_preload_libraries = 'auto_explain' 설정)


        SET auto_explain.log_min_duration = '5s';    (5초 이상 소요 되는 sql)

        SET auto_explain.log_analyze = true;

        SELECT count(*) FROM pg_class, pg_index

        WHERE oid = indrelid AND indisunique;        -- log 파일에 실행계획이 남음.


        (pg_stat_plans설치 : https://github.com/2ndQuadrant/pg_stat_plans)




14. 버그 분석


     반복적이고 재현 되는 문제에 대해서 pg_dump로 dump file 생성

     pageinspect 패키지로 해당 테이블 데이터 분석



     아래 사이트에서 해당 문제를 찾아보고 해당 문제에 대해서 질의함


     http://wiki.postgresql.org/wiki/Guide_to_reporting_problems


     http://wiki.postgresql.org/wiki/SlowQueryQuestions


     


15. postgresql 로그 관리


     rsyslog 및 logrotate 툴을 사용하여 postgresql log 주기적으로 정리 작업

     (postgresql에 log rotation은  postgresql.conf 파일에  log_rotation_age를 설정)

      => 분석은 pgBadger를 사용하여 분석 


     * postgresql.conf 파일에 로그 정보 출력과 관련된 설정 정보를 설정




16.  쿼리 성능 분석


     위에 pg_stat_statements 설치 되어 있는 상태에서


     1) 자주 호출 되는 SQL 순으로 확인


       SELECT query FROM pg_stat_statements ORDER BY calls DESC;


    2) 평균 수행 시간이 높은 순으로 확인


       SELECT query, total_time/calls AS avg, calls FROM pg_stat_statements 

       ORDER BY 2 DESC;

    


     * SQL에 대한 통계 정보를 초기화 하기 위해서 


     select pg_stat_statements_reset() 호출




17. 명령어 (/h, /?) 수행시 내부 쿼리 확인방법


    \set ECHO_HIDDEN

    \z test


    SELECT * FROM information_schema.views where table_schema IN ('pg_catlog', 'information_schema');   -- 내부 view 확인


    select 'account'::regclass::oid;  -- oid 조회


    select '17260'::regclass::text;



    -- stat 정보 table 및 view 확인


    SELECT relname, case relkind when 'r' then 'table'  WHEN 'v' THEN 'VIEW' END as type FROM pg_class WHERE relname like 'pg_sta%' AND relkind IN ('r','v');




18. 현재 파라미터 셋팅 내용 확인 및 변경


    select current_setting('work_mem');

    show work_mem;


    select set_config('work_mem', '8 MB', true);  --> 로컬 파타미터 값 설정 (false : global 설정)

    select set_config('shared_buffers', '1 GB', false);


    alter system set configuration_parameter { to | = } { value | 'value' | default }


    alter system reset configuration_parameter


    alter system reset all


    SELECT name, current_setting(name), source FROM pg_settings WHERE source IN ('configuration file');



19. 데이터 사용량 확인


    1) 데이터베이스 사용량 확인

 

   SELECT pg_database.datname, pg_size_pretty(pg_database_size(pg_database.datname)) AS size       FROM pg_database;

 

   select oid from pg_database;


   du -h /data_dir/base/oid



    2) 테이블 사용량 확인


    SELECT tablename, pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) FROM        pg_tables WHERE schemaname = 'car_portal_app' LIMIT 2;


    


   3) 인덱스 사용량 확인


     SELECT indexrelid::regclass,  pg_size_pretty(pg_relation_size(indexrelid::regclass))  FROM       pg_index WHERE indexrelid::regclass::text like 'car_portal_app.%' limit 2;




20. Object 사용여부 확인


     사용하지 않은 테이블 2개 출력


     SELECT relname FROM pg_stat_user_tables WHERE n_live_tup= 0 limit 2;

  

     SELECT schemaname, tablename, attname FROM pg_stats WHERE null_frac= 1 

        and schemaname NOT IN ('pg_catalog', 'information_schema') limit 1;



     인덱스가 사용되는지 확인


     SELECT schemaname, relname, indexrelname FROM pg_stat_user_indexes s 

       JOIN pg_index i ON s.indexrelid = i.indexrelid WHERE idx_scan=0 AND NOT indisunique 

       AND NOT indisprimary;



    foreign key 확인


    SELECT * FROM pg_constraint WHERE contype = 'f';




    인덱스 중복 확인 SQL


    WITH index_info AS

      (SELECT pg_get_indexdef(indexrelid) AS index_def, 

       indexrelid::regclass index_name , 

       indrelid::regclass table_name, 

       array_agg(attname) AS index_att

       FROM pg_index i 

       JOIN pg_attribute a ON i.indexrelid = a.attrelid

       GROUP BY pg_get_indexdef(indexrelid), indrelid,  indexrelid

       )

     SELECT DISTINCT

     CASE WHEN a.index_name > b.index_name THEN a.index_def ELSE b.index_def END AS index_def,

     CASE WHEN a.index_name > b.index_name THEN a.index_name ELSE b.index_name END AS index_name,

       CASE WHEN a.index_name > b.index_name THEN b.index_def ELSE a.index_def END AS overlap_index_def,

     CASE WHEN a.index_name > b.index_name THEN b.index_def ELSE a.index_def END AS overlap_index_name, a.table_name

     FROM

     index_info a INNER JOIN index_info b ON (a.index_name != b.index_name 

     AND a.table_name = b.table_name AND a.index_att && b.index_att );



PK 및 Unique 인덱스를 가지고 있지 않은 테이블 확인


SELECT table_catalog, table_schema, table_name

FROM

  information_schema.tables

WHERE

  table_schema NOT IN ('information_schema', 'pg_catalog')

EXCEPT

SELECT

  table_catalog, table_schema, table_name

FROM

  information_schema.table_constraints

WHERE

  constraint_type IN ('PRIMARY KEY', 'UNIQUE') AND

  table_schema NOT IN ('information_schema', 'pg_catalog');



중복된 키를 테이블에서 삭제.


with should_not_delete as (

  SELECT min(ctid) FROM duplicate group by f1, f2

) DELETE FROM duplicate WHERE ctid NOT IN (SELECT min FROM should_not_delete);


CREATE TABLE <tmp> AS SELECT DISTINCT * FROM <orig_tbl>;


DROP TABLE <orig_tbl>;


ALTER TABLE <tmp> RENAME TO <orig_tbl>;


DELETE FROM dup_table a USING dup_table b

WHERE a.tt1 = b.tt1 AND ... AND b.attn= b.attn

AND a.pk < p.pk.




21. 데이터베이스 lock 관리


lock를 가지고 있는 쿼리 확인


\x


SELECT

  lock1.pid as locked_pid,

  stat1.usename as locked_user,

  stat1.query as locked_statement,

  stat1.state as state,

  stat2.query as locking_statement,

  stat2.state as state,

  now() - stat1.query_start as locking_duration,

  lock2.pid as locking_pid,

  stat2.usename as locking_user

FROM pg_catalog.pg_locks lock1

     JOIN pg_catalog.pg_stat_activity stat1 on lock1.pid = stat1.pid

     JOIN pg_catalog.pg_locks lock2 on

  (lock1.locktype,lock1.database,lock1.relation, lock1.page,lock1.tuple,lock1.virtualxid, lock1.transactionid,lock1.classid,lock1.objid, lock1.objsubid) IS NOT DISTINCT FROM

        (lock2.locktype,lock2.DATABASE, lock2.relation,lock2.page, lock2.tuple,lock2.virtualxid, lock2.transactionid,lock2.classid, lock2.objid,lock2.objsubid)

     JOIN pg_catalog.pg_stat_activity stat2 on lock2.pid = stat2.pid

WHERE NOT lock1.granted AND lock2.granted;



22. 메모리 설정


  1) shared buffers (shared_buffers, default 32MB) : 전체 메모리에 25% 설정

  2) working memory (work_mem, default 1MB) : work_mem * 전체 커넥션수

  3) checkpoint_segments : 값을 높이면 쓰기 성능이 좋아지고, 낮추면 복구 시간이 빨라짐.

  4) effective_cache_size : disk caching, 전체에 50 ~ 70%

  5) random_page_cost (default 4.0) : ssd, san 3, 1.5 ~ 2.5 


'Database > PostgreSQL' 카테고리의 다른 글

PostgreSQL 아카이브 모드  (0) 2019.01.01
PostgreSQL 커널 리소스 관리  (0) 2019.01.01
PostgreSQL 모니터링  (0) 2018.12.31
PostgreSQL 점검  (0) 2018.12.31
PostgreSQL 권한 부여 및 해제  (0) 2018.12.31
PostgreSQL 유저 생성  (0) 2018.12.28

PostgreSQL 점검

PostgreSQL 점검



1. 실시간 쿼리 점검


 postgres=# select * from pg_stat_activity;


 현재 DB에서 돌고 있는 전체적인 쿼리 및 접속정보등을 확인할 수 있습니다.


 xbackend_min 


 pg_stat_activity의 컬럼 중에 가장 중요한 정보는 xbackend_min 입니다. 

 이 값이 있는 쿼리는 현재 해당 쿼리 작업을 처리해야 진행된다는 의미입니다. 따라서 현재 xbackend_min이 있는 쿼리 중에서   현재 진행이 되지 않고 있는 쿼리가 있다면 앞의 쿼리 때문에 다음 쿼리가 진행되지 않는 경우를 의미하죠. 이런 경우는 앞에서   update 문 때문에 해당 row의 lock이 결린 경우가 대표적으로 나타납니다. 물론 update가 완료되어 lock이 금방 풀리면 해당   값이 금방 없어지기도 하죠.




2. 현재 테이블에 Lock을 확인하는 쿼리


SELECT t.relname,

       l.locktype,

       page,

       virtualtransaction,

       pid,

       mode,

       granted

  FROM pg_locks l,

       pg_stat_all_tables t

  WHERE l.relation = t.relid

  ORDER BY relation ASC;


 이 쿼리는 현재 테이블에 lock을 확인할 수 있는 쿼리 입니다. 일반적으로 어지간한 lock은 괜찮지만, RowExclusiveLock 같은 것이 검색된다면 해당 테이블에 접근하는 Row에 update등이 현재 지연되어 다른 쿼리에도 영향을 미친다고 판단하시면 됩니다.




3. 해당 작업을 Kill 하는 쿼리


PostgreSQL은 위에서 검색된 pid를 죽일 수 있습니다. 두가지 방법이 있죠.


select pg_cancel_backend(4678249);


SELECT pg_terminate_backend(32519) FROM pg_stat_activity ;


pg_cancel_backend는 해당 PID만 중지시키려고 하고, pg_terminate_backend는 해당 PID와 연계된 모든 상위 Query Process를 모두 중지시킵니다. 따라서 pg_cancel_backend로 해당 작업이 중지되는지 먼저 확인해 보고, 그래도 중지되지 않는다면 pg_terminate_backend를 수행해 보시면 됩니다.




4. 해당 작업들의 주의점


위의 모니터링 쿼리 및 작업을 Kill하는 쿼리도 사실 Transaction을 탈 수 있습니다. 따라서 Rollack, Commit이 되는 DB도구를 활용하시거나, 터미널에서 transaction으로 처리하시고, 이상없는지 확인하신 다음 Commit을 하시는 것이 DB를 안전하게 사용하시고, 데이터를 잘 관리할 수 있는 방법이라고 할 수 있습니다.

'Database > PostgreSQL' 카테고리의 다른 글

PostgreSQL 커널 리소스 관리  (0) 2019.01.01
PostgreSQL 모니터링  (0) 2018.12.31
PostgreSQL 점검  (0) 2018.12.31
PostgreSQL 권한 부여 및 해제  (0) 2018.12.31
PostgreSQL 유저 생성  (0) 2018.12.28
PostgreSQL 스키마 생성  (0) 2018.12.28

PostgreSQL 권한 부여 및 해제

Grant & Revoke



Grant - user,group 혹은 모든 user들에게 해당 객체에 대한 사용권한을 승인합니다.


Synopsis :

 

GRANT privilege [,...] ON object [,...]

    TO { PUBLIC | GROUP group | username}


privilege

SELECT : 특정 TABLE/VIEW 의 column에 대한 access 을 승인

INSERT : 특정 TABLE의 모든 column 에 데이타의 삽입에 대한 권한 승인

UPDTAE : 특정 TABLE의 모든 column 의 갱신에 대한 권한 승인

DELETE : 특정 TABLE 의 row 의 삭제에 대한 권한 승인

RULE : 특정 TABLE/VIEW에 대한 rule 을 정의하는 권한에 대한 승인

ALL : 모든 권한을 승인한다.


object

 access 를 승인하는 객체의 이름으로서 다음과 같은 객체들이 있다.


Table

Sequence

View

Index


PUBLIC

 모든 유저를 승인


GROUP group

 사용 권한을 획득할 group을 지정, group 을 명시적으로 생성되어져 있어야 함.


username

 사용권한을 획득할 사용자명. PUBLIC 은 모든 유저에 대해서 적용된다.



Notes

psql 에서 "\z" 를 사용하여 존재하는 객체에 대한 permission 등을 참조할 수 있다.


permission 정보의 형식


username=arwR : 유저에게 승인된 사용권한

group gname=arwR : GROUP 에게 승인된 사용권한 

=arwR : 모든 유저에게 승인된 사용권한


a : INSERT privilege

r : SELECT privilege

w : UPDATE/DELETE privilege

R : RULE privilege

arwR : ALL privilege



예)

postgres=# GRANT INSERT ON imsi_table TO PUBLIC;

postgres=# GRANT ALL ON imsi_table TO test_user;




Revoke - user,group 혹은 모든 user로부터 객체에 대한 사용권한을 무효화합니다.


Synopsis :

 

REVOKE privilege [,...]

    ON object [,...]

    FROM { PUBLIC | GROUP gname | username }


privilege

 SELECT ,INSERT ,UPDATE, DELETE, RULE, ALL


object

 적용될 수 있는 객체 : table, view, sequence, index


group

 privilege 를 취소할 그룹명


username


PUBLIC



예)

postgres=# REVOKE INSERT ON imsi_table FROM PUBLIC;

'Database > PostgreSQL' 카테고리의 다른 글

PostgreSQL 모니터링  (0) 2018.12.31
PostgreSQL 점검  (0) 2018.12.31
PostgreSQL 권한 부여 및 해제  (0) 2018.12.31
PostgreSQL 유저 생성  (0) 2018.12.28
PostgreSQL 스키마 생성  (0) 2018.12.28
PostgreSQL Tablespace 생성  (0) 2018.12.27

PostgreSQL 유저 생성

유저 생성


 - DATABASE에서 USER는 DATABASE를 사용하는 주체로서 OS를 운영하는 USER와는 분리되어 있습니다. USER는 소유하고 있는 DATABASE안에 있는 OBJECT의 권한을 변경하고 제어할 수 있습니다.


 - 유저를 생성하기 위해서는 먼저 DATABASE에서 SUPERUSER권한을 가지고 있어야 합니다. PostgreSQL에 SUPERUSER의 default 계정은 postgres입니다.



유저 조회


postgres=# SELECT * FROM PG_SHADOW;


or


postgres=# \du



 - \du를 입력하면 USER들이 가지고 있는 ROLE들을 확인 할 수 있습니다. SUPERUSER인 postgres는 SUPERUSER, CREATE ROLE, CREATE DB, REPLICATION기능을 가지고 있습니다.


SUPERUSER : USER들을 생성하고 권한을 부여해 주는 USER

CREATE ROLE : USER가 새로운 ROLE을 정의하는 기능을 생성

CREATE DB : USER가 DB를 생성하는 권한을 부여하는 기능

REPLICATION : USER가 DB를 실시간으로 복사하는 기능



Synopsis :


CREATE USER username [[ WITH ] option [ ... ]]

where option can be:



SUPERUSER  | NOSUPERUSER   - 해당 USER를 SUPERUSER권한을 주는 것입니다. 

                             따로 지정하지 않을 경우 DEFAULT값으로 NOSUPERUSER가 됩니다.

CREATEDB   | NOCREATEDB    - DATABASE를 생성하는 권한을 정의합니다. 

                             CREATEDB를 선택할 경우 USER는 DATABASE를 생성할 권한이 부여됩니다. 

                             NOCREATEDB를 선택할 경우 USER는 DATABASE를 생성할 권한이 거부됩니다. 

       따로 정의 되어있지 않을 경우 NOCREATEDB값이 default 설정되어 있습니다.

CREATEUSER | NOCREATEUSER  - 스스로 새로운 유저를 생성하는 권한을 부여하는 것을 정의합니다.

                             CREATEUSER를 선택할 경우 USER를 생성할 수 있는 권한이 부여됩니다.

                             NOCREATEUSER를 선택할 경우 USER를 생성할 권한이 거부됩니다.

INHERIT    | NOINHERIT    - DATABASE의 권한을 다른 구성원들에게 상속하는 역할을 합니다.

                             따로 정의 되어있지 않을 경우 INHERIT 값이 default값으로 설정 되어 있습니다.

LOGIN      | NOLIGIN    - USER가 LOGIN을 하는 역할을 부여합니다.

CONNECTION LIMIT connlimit - 로그인 할 때 동시연결을 지원 하는 기능으로 default값으로 -1(제한없음)로 

                             설정 되어 있습니다.

[ENCRYPTED | UNCRYPTED ] PASSWORD 'password' - ‘password’를 입력하고 인증이 필요 없는 경우 옵션을 생                                                 략이 가능합니다.



생성 예제


postgres=# create user TEST_USER with password 'test01';


'Database > PostgreSQL' 카테고리의 다른 글

PostgreSQL 점검  (0) 2018.12.31
PostgreSQL 권한 부여 및 해제  (0) 2018.12.31
PostgreSQL 유저 생성  (0) 2018.12.28
PostgreSQL 스키마 생성  (0) 2018.12.28
PostgreSQL Tablespace 생성  (0) 2018.12.27
PostgreSQL DB 생성 및 삭제  (0) 2018.12.27

PostgreSQL 스키마 생성

SCHEMA 생성


 - SCHEMA는 Object들의 논리적 집합체 입니다. 

 - TABLE, VIEW, SEQUENCE, SYNONYM, DOMIAN, FUNCTION 등으로 구성되어 있습니다.

 - SCHEMA를 사용하는 이유는 논리적 집합체를 만들어서 관리의 편의성을 높이고, 여러 USER들 간의 간섭 없이 접속 할 수 있게 합니다.



Synopsis :


1. CREATE SCHEMA schema_name [ AUTHORIZATION user_name ] [ schema_element [ ... ] ]

2. CREATE SCHEMA AUTHORIZATION user_name [3. schema_element [ ... ] ]

4. CREATE SCHEMA IF NOT EXISTS schema_name [ AUTHORIZATION user_name ]

5. CREATE SCHEMA IF NOT EXISTS AUTHORIZATION user_name


1. CREATE SCHEMA ‘schemaname’을 입력하여 SCHEMA를 생성합니다. 이름을 입력하지 않을 경우 USER의 이름이 SCHEMA이름으로 사용됩니다. (단 Pg_로 시작하는 이름은 스키마로 불가능 합니다.)


2. AUTHORIZATION ‘username’ 스키마를 소유한 USER의 이름을 입력합니다. 이를 생략할 경우 접속되어 있던 USER가 

default값으로 저장되고 SUPERUSER만이 다른 USER가 소유한 SCHEMA를 만들 수 있습니다.


3. schema_element [...]을 입력하여 SCHEMA 내에서 객체를 정의하는 SQL문을 작성합니다. CREATE TABLE, CREATE VIEW, CREATE INDEX, CREATE SEQUENCE, CREATE TRIGGER, GRANT등이 포함될 수 있습니다.


4. CREATE SCHEMA IF NOT EXISTS ‘schema_name’ 을 입력하면 특정 이름이 SCHEMA에 없을 경우 그 SCHEMA를 생성합니다.


5. CREATE SCHEMA IF NOT EXISTS AUTHORIZATION ‘user_name’ 은 USER가 소유한 SCHEMA가 존재하지 않을 때 SCHEMA를 생성합니다.




SCHEMA 생성 예제


postgres=# CREATE SCHEMA test01 AUTHORIZATION test_user;


postgres=# GRANT ALL ON SCHEMA test01 TO test_user;



- 오라클에서 SCHEMA = USER의 개념으로 하나의 User가 하나의 Schema를 소유합니다. 히지만 Postgres나 Mysql 같은 DB에서는 User와 Schema 는 분리된 개념이며,하나의 유저가 여러개의 스키마를 소유 할 수도 있습니다.



PostgreSQL Tablespace 생성

Tablespace


- 데이터베이스에서 Tablespace는 오라클과 PostgreSQL에서만 존재하는 개념입니다.

- 테이블스페이스가 존재 함으로 각 schema의 오브젝트 관리가 용이해지며, 데이터파일 관리 및 용량 관리에 있어서, 또는 성능 관리에 있어서 효과적인 관리가 가능해 집니다.


- 테이블 스페이스 확인


postgres=# select * from pg_tablespace;

  spcname   | spcowner | spcacl | spcoptions 

------------+----------+--------+------------

 pg_default |       10 |        | 

 pg_global  |       10 |        | 

(2 rows)


postgres=# \db

       List of tablespaces

    Name    |  Owner   | Location 

------------+----------+----------

 pg_default | postgres | 

 pg_global  | postgres | 

(2 rows)


postgres=# \db+

                                  List of tablespaces

    Name    |  Owner   | Location | Access privileges | Options |  Size  | Description 

------------+----------+----------+-------------------+---------+--------+-------------

 pg_default | postgres |          |                   |         | 29 MB  | 

 pg_global  | postgres |          |                   |         | 497 kB | 

(2 rows)


postgres=# 


- 특별히 유저나 스키마에 테이블 스페이스를 지정하지 않고 pg_default 테이블스페이스를 이용 할 수 있습니다.

- 해당 디렉토리는 postgres의 권한을 가지고 있어야 합니다.



테이블스페이스 생성


Synopsis :

CREATE TABLESPACE tablespace_name

    [ OWNER { new_owner | CURRENT_USER | SESSION_USER } ]

    LOCATION ’directory’

    [ WITH ( tablespace_option = value [, ... ] ) ]



생성 예제


postgres@pgsqldb:~]$ psql -d postgres -U postgres

psql (9.6.11)

Type "help" for help.

postgres=# CREATE TABLESPACE mydb01 LOCATION '/postgresql/tbs';

CREATE TABLESPACE

postgres=#



Tablespace 조회


postgres=# \db

           List of tablespaces

    Name    |  Owner   |    Location     

------------+----------+-----------------

 mydb01     | postgres | /postgresql/tbs

 pg_default | postgres | 

 pg_global  | postgres | 

(3 rows)


postgres=# select * from pg_tablespace;

  spcname   | spcowner | spcacl | spcoptions 

------------+----------+--------+------------

 pg_default |       10 |        | 

 pg_global  |       10 |        | 

 mydb01     |       10 |        | 

(3 rows)


postgres=# \q

postgres@pgsqldb:~]$ ls -l /postgresql/tbs/

total 0

drwx------ 2 postgres postgres 6 Dec 27 14:03 PG_9.6_201608131

postgres@pgsqldb:~]$ ls -l $PGDATA/pg_tblspc

total 0

lrwxrwxrwx 1 postgres postgres 15 Dec 27 14:03 16392 -> /postgresql/tbs

postgres@pgsqldb:~]$ 


- tablespace owner를 지정해서 생성 할 수도 있습니다.




- 경로를 지정하여 테이블스페이스를 생성하면, $PGDATA/pg_tblspc 밑에 OID로 심볼릭 링크가 생성됩니다.

- 실제 파일은 경로에 있고, 클러스터 홈 밑에 pg_tblspc에 링크가 생성되어 DB에 정보를 전달하는것 입니다.



Tablesapce 이름 변경


postgres=# ALTER TABLESPACE mydb RENAME TO mydb01;



Tablespace Owner 변경


postgres=# ALTER TABLESPACE mydb01 OWNER TO POSTGRES;

PostgreSQL DB 생성 및 삭제

PostgreSQL을 관리하거나 운영하는 방법은 크게 두가지로 분류 할 수 있습니다.


- 터미널을 이용한 커맨드라인 사용

- pgadmin을 이용한 GUI 사용



DB생성


Synopsis :

CREATE DATABASE name

[ [ WITH ] [ OWNER [=] user_name ]

        [ TEMPLATE [=] template ]

        [ ENCODING [=] encoding ]

        [ LC_COLLATE [=] lc_collate ]

        [ LC_CTYPE [=] lc_ctype ]

        [ TABLESPACE [=] tablespace_name ]

        [ ALLOW_CONNECTIONS [=] allowconn ]

        [ CONNECTION LIMIT [=] connlimit ] ]

        [ IS_TEMPLATE [=] istemplate ]


터미널에서 su - postgres 계정 접속 후에


$ createdb mydb


간단하게 만들수 있습니다.

그리고 psql 명령으로 접속 할 수 있습니다.


$ psql mydb

psql (9.6.11)

Type "help" for help.


mydb=#


이렇게 나오면 DB에 접속이 된것입니다.



DB에서 빠져나가려면 \q 하면 OS로 돌아갑니다.



이 방법 말고도 postgres db에 접속해서 생성하는 방법이 있습니다.


$ psql -d postgres -U postgres

psql (9.6.11)

Type "help" for help.


postgres=# create database mydb2;

CREATE DATABASE

postgres=#


오라클에 비하면 너무나 간단한 DB 생성 방법입니다.



반대로 DB를 삭제하려면


$ dropdb mydb


또는


postgres=# drop database mydb2;


이렇게 하시면 됩니다.



Database 목록 확인


\l


명령으로 데이터베이스 리스트를 확인 할 수 있습니다.


postgres-# \l

                                  List of databases

   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   

-----------+----------+----------+-------------+-------------+-----------------------

 mydb      | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 

 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 

 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +

           |          |          |             |             | postgres=CTc/postgres

 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +

           |          |          |             |             | postgres=CTc/postgres

(4 rows)



'Database > PostgreSQL' 카테고리의 다른 글

PostgreSQL 스키마 생성  (0) 2018.12.28
PostgreSQL Tablespace 생성  (0) 2018.12.27
PostgreSQL DB 생성 및 삭제  (0) 2018.12.27
CentOS 7 에서 방화벽에 PostgreSQL 리스너 포트 등록하기  (0) 2018.12.27
초간단 postgresql.conf 설정  (0) 2018.12.27
pg_hba.conf  (0) 2018.12.27

CentOS 7 에서 방화벽에 PostgreSQL 리스너 포트 등록하기

접근제어


- PostgreSQL은 pg_hba.conf를 통해 접근제어를 할 수 있으나, 성능상의 이슈로 인해 OS단이나 방화벽 장비, 보안장비에서 제어하는 것을 추천 한다고 했습니다.


- CentOS 7 에서는 새로나온 Firewalld 와 기존의 iptables 모두 사용 가능 합니다.



firewalld 의 설정



# firewall-cmd --permanent --zone=trusted --add-source=<Client IP address>/32


# firewall-cmd --permanent --zone=trusted --add-port=5432/tcp


# firewall-cmd --reload



iptables 설정


# iptables -A INPUT -p tcp -s 0/0 --sport 1024:65535 -d <Server IP address> --dport 5432 -m state --state NEW,ESTABLISHED -j ACCEPT


# iptables -A OUTPUT -p tcp -s <Server IP address> --sport 5432 -d 0/0 --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT




'Database > PostgreSQL' 카테고리의 다른 글

PostgreSQL Tablespace 생성  (0) 2018.12.27
PostgreSQL DB 생성 및 삭제  (0) 2018.12.27
CentOS 7 에서 방화벽에 PostgreSQL 리스너 포트 등록하기  (0) 2018.12.27
초간단 postgresql.conf 설정  (0) 2018.12.27
pg_hba.conf  (0) 2018.12.27
Linux에 Postgres 9.6 버전 설치  (0) 2018.12.25

초간단 postgresql.conf 설정

postgresql.conf


 - PostgreSQL의 환경변수를 지정해주는 설정파일. 오라클의 파라미터 파일과 비슷한 역할을 합니다.


postgres.conf 파일 안에는 다양하고 많은 설정 값들이 있는데, 아래의 설정 값 정도만 설정하면 싱글 DB를 운영하는데 있어 크게 문제될 사항은 없습니다.



listen_addresses = '*'                       # 로컬 호스트 밖에서의 접속 허용

shared_buffers = 3GB                         # 물리 메모리  2/3 ~ 1/4

checkpoint_segments = 128                    # 2GB redo 로그, 9.4 이하에서

max_wal_size = 2GB                           # 2GB redo 로그, 9.5 이상에서

min_wal_size = 2GB                           # 2GB redo 로그, 9.5 이상에서

wal_level = logical                          # 일단 최대 자세하게

archive_mode = on                            # 아카이빙 기능은 켜두고,

archive_command = 'true'                     # 아카이빙을 임시로 사용 안함

log_destination = 'stderr'                   # pg_log 에 로그 남김

logging_collector = on                       # 자체 로그 프로세스 사용

log_line_prefix = '%t %u@%r/%d(%c 또는 %p)'   # 좀 더 자세히

stats_temp_directory = '/run/shm'            # 실시간 통계 정보는 공유 메모리로

effective_cache_size = 4GB                   # 물리 메모리 1/2 , 9.4 이하



- 더 자세한 설정 값들에 대해서는 나중에 따로 정리 하도록 하겠습니다.

'Database > PostgreSQL' 카테고리의 다른 글

PostgreSQL DB 생성 및 삭제  (0) 2018.12.27
CentOS 7 에서 방화벽에 PostgreSQL 리스너 포트 등록하기  (0) 2018.12.27
초간단 postgresql.conf 설정  (0) 2018.12.27
pg_hba.conf  (0) 2018.12.27
Linux에 Postgres 9.6 버전 설치  (0) 2018.12.25
PostgreSQL의 기본 개념  (0) 2018.12.12

pg_hba.conf

pg_hba.conf



- PostgreSQL의 인증관련 설정 파일 ( HBA : host-based authentication 호스트 기반의 인증 약어 )


1) $PGDATA 에 존재. (클러스터홈)

2) PostgreSQL의 pg_hba.conf 파일을 통해 외부접근에 대한 처리는 되도록 배재하는것이 좋습니다.

   pg_hba.conf 설정을 통하여 외부접근을 하게 되면, PostgreSQL 인증체크처리 부하가 발생하여 전체적인 성능에 부하가 걸릴 수 있기 때문에, OS단의 iptables에서 통제 하거나, 그 앞단에서 방화벽, 보안장비에서 통제하는 편이 좋습니다.

3) 설정은 간단하며, 접근 Host나 Host의 데이터 전송방식과 암호화 전송방식에 대한 설정을 가지고 있습니다.

4) 실제적인 계정에 대한 정보는 PostgreSQL의 카탈로그 테이블인 pg_user에서 관리하기 때문에 계정 권한, 패스워드 변경 등의 작업은 실시간 적용이 가능하나, 클라이언트의 접근 방식이나, 암호 전달 방식은 pg_ctl reload 또는, pg_ctl restart 명령을 통해 pg_hba.conf를 다시 로드해야 합니다. restart는 불편함이 있지만, 불법 접근에 대한 처리에 있어 빠른 응답으로 PostgreSQL 서버 부담을 줄이고, 최대한 성능을 끌어내기 위해 채택한 방법입니다.



- pg_hba.conf 내용



# TYPE  DATABASE        USER            ADDRESS                 METHOD

# IPv4 local connections:

host    all             all             127.0.0.1/32            md5

# IPv6 local connections:

host    all             all             ::1/128                 md5

# Allow replication connections from localhost, by a user with the

# replication privilege.

#host    replication     enterprisedb        127.0.0.1/32            md5

#host    replication     enterprisedb        ::1/128                 md5




- 환경설정



1. Host Type


Host Type은 접근자의 접근위치와 통신의 암호화 관련 설정입니다.

local, host, hostssl, hostnossl을 지원합니다.

 

local은 자칫 localhost로 생각할 수 있겠지만, local은 Unix Domain Socket을 통한 접속에 해당되는 것으로 다소 햇갈릴수 있으니 주의 하시기 바랍니다.

 

hostssl은 ssl인증서를 통한 암호화 통신만 지원하며 localhost, 127.0.0.1식의 즉 TCP/IP접속에 해당된다.

hostnossl은 ssl접속은 불가능하며, TCP/IP통신을 지원합니다.

 

host나 hostssl로 설정한 상태에서 SSL기능을 사용하시려면 Postgres컴파일시 --with-openssl옵션을 주어야 하며, postgresql.conf에 ssl=true로 설정을 해주셔야만 합니다.

 

 

2. Database Name


특정한 디비에 대한 접속을 제한할 수 있으며 ,(콤마)로 여러 개의 DB로 접근 제어가 가능합니다.  모든 DB에 대한 접근을 풀려면 all로 설정하시면 됩니다. 만약에 설정할 DB가 수십개라면 기재하기 불편하실경우 @dblist.txt 식으로 설정하고 dblist.txt을 PGDATA로 설정한 폴더의 안에 넣어 두시면됩니다.

 


3. User Name


계정설정으로 ,(콤마)구분으로 할 수 있으며, Database의 @파일명 식으로 따로 파일을 만들어서 처리하실수도 있습니다. PostgreSQL의 계정 그룹 카탈로그 테이블인 pg_group 또는 create_group 명령으로 그룹을 만들어 계정들은 하위(SYSID)에 묶어두었을때는 +(플러스) 키를 붙인 그룹명으로 설정하면 해당 그룹에 대한 모든 접근이 가능해집니다.

 


4. CIDR-ADDRESS or IP-Mask


IPv4 CIDR구분으로 해당 C Class에 대해 모두 접근처리를 할 경우는 : xxx.xxx.xxx.0/24

해당 IP에 대한 접근처리를 할 경우는 : xxx.xxx.xxx.xxx/32

 


5. Authentication Method


이 부분은 실제적인 계정의 패스워드에 대한 서버로의 전송을 어떻게 할 것인가를 정하는 것입니다.

PostgreSQL Server와 Client와의 접속에는 처음 Client가 접속을 하게 되면 pg_hba.conf에 대해 검색해서 해당 접속에 대한 접근허용을 확인하고 확인이 되면 이 Auth.Method에 설정된 암호화 방식으로 패스워드를 전송하라고 응답메시지를 보내고 다시 Client가 Server로 로그인을 하게 되는 방식입니다.


trust : 패스워드 없이 접근 가능

reject : 거부

md5 : 패스워드를 md5로 암호화해서 전송

crypt : crypt로 암호화 해서 전송 Postgres 7.2이후부터는 사용 안함. (이전버전설정 호환용)

password : text로 패스워드를 전송하는 것.

krb4, krb5 : KerberOS V4, 5를 지원한다.

ident : 접속 ClientOS User이름을 확인하는 방법?

pam : PAM(Pluggable Authentication Modules)서비스를 사용한 인증




- 설정 예제



# 로컬 시스템상의 모든 유저가 임의의 데이터베이스에 

# 임의의 데이터베이스 유저명으로 Unix 도메인 소켓을 사용해 접속하는 것을 허가 

# (로컬 접속에서는 디폴트). 

# TYPE    DATABASE    USER        CIDR-ADDRESS          METHOD 

  local   all         all                               trust 



# 로컬 loopback의 TCP/IP 접속을 사용하는 것은 위와 같다. 

# TYPE    DATABASE    USER        CIDR-ADDRESS          METHOD 

  host    all         all         127.0.0.1/32          trust    



# 분리된 netmask 열을 사용하고 있는 것을 제외하고 위와 같다. 

# TYPE    DATABASE    USER        IP-ADDRESS    IP-MASK            METHOD 

  host    all         all         127.0.0.1     255.255.255.255    trust 



# IP주소 192.168. 93. x를 가지는 모든 호스트의 모든 유저가, 

# ident가 그 접속에 대해 보고하는 것과 같은 유저명(전형적으로는 Unix 유저명)으로 

# 데이터베이스 "postgres"에 접속하는 것을 허가. 

# TYPE    DATABASE    USER        CIDR-ADDRESS          METHOD 

  host    postgres    all         192.168.93.0/24       ident sameuser 



# 유저의 패스워드가 올바르게 입력되었을 경우, 

# 호스트 192.168. 12.10부터의 유저가 데이터베이스 "postgres"에 접속하는 것을 허가 

# TYPE    DATABASE    USER        CIDR-ADDRESS          METHOD 

  host    postgres    all         192.168.12.10/32      md5 



# 선행하는 "host"행이 없으면, 이 2행에 의해 192.168. 54.1으로 접속 시도는 

# 모두 거부(이 항목이 최초로 일치되기 때문에). 

# 다만, 인터넷상의 다른 모든 장소로부터의 Kerberos 5 접속은 허가. 

# 제로 마스크는, 호스트 IP주소의 비트를 고려하지 않고 

# 어느 호스트라도 조합할 수 있는 것을 의미합니다. 

# TYPE    DATABASE    USER        CIDR-ADDRESS          METHOD 

  host    all         all         192.168.54.1/32       reject 

  host    all         all         0.0.0.0/0             krb5 

 


# 192.168. x.x 호스트로부터의 유저가, ident 검사를 통과하는 경우, 

# 어느 데이터베이스라도 접속을 허가. 만약, 예를 들면, ident가 "bryanh"라고 인정해 

# "bryanh"가 PostgreSQL의 유저 "guest1"로서 

# 접속 요구를 내는 경우, "bryanh"는 "guest1"로 접속이 허가된다고 합니다. 

# 맵 "omicron"에 대한 기재사항이 pg_ident.conf에 있으면 접속을 허가. 

# TYPE    DATABASE    USER        CIDR-ADDRESS          METHOD 

  host    all         all         192.168.0.0/16        ident omicron 



# 로컬 접속에 대해서, 이하의 단 3행 밖에 기재가 없는 경우, 로컬 유저는 

# 자신의 데이터베이스(데이터베이스 유저명과 같은 이름의 데이터베이스)에게만 접속 허가. 

# 다만 관리자와 롤 "support"의 멤버는 모든 데이터베이스에 접속 가능. 

# $PGDATA/admins 파일은 관리자의 리스트를 포함한다. 

# 모든 경우에 패스워드가 필요. 

# TYPE    DATABASE    USER        CIDR-ADDRESS          METHOD 

  local  sameuser      all                              md5 

  local  all           @admins                          md5 

  local  all           +support                         md5 



# 위의 마지막 2행은 1개의 행으로 정리하는 것이 가능. 

  local  all           @admins,+support                 md5 


# 데이터베이스의 열에는 리스트나 파일명도 사용할 수 있지만, 그룹은 사용할 수 없다. 

  local  db1,db2,@demodbs  all                          md5 



'Database > PostgreSQL' 카테고리의 다른 글

CentOS 7 에서 방화벽에 PostgreSQL 리스너 포트 등록하기  (0) 2018.12.27
초간단 postgresql.conf 설정  (0) 2018.12.27
pg_hba.conf  (0) 2018.12.27
Linux에 Postgres 9.6 버전 설치  (0) 2018.12.25
PostgreSQL의 기본 개념  (0) 2018.12.12
pgadmin4 설치  (0) 2018.12.03

Linux에 Postgres 9.6 버전 설치

PostgreSQL 9.6 설치


현재 가장 많이 사용하는 버전이 9.6버전이기 때문이기도 하고, Postgres가 성능적인 부분에서 많은 발전을 이뤄낸 버전이기도 하기 때문에 9.6버전의 설치하는 법을 안내 해보고자 합니다.


기존의 run 파일을 올려서 설치하는 방식이 아닌, PostgreSQL 홈페이지에서 yum repo를 제공하고 있으며, 누구나 쉽게 설치를 할 수 있으나, 처음부터 yum으로 설치 하게 되면, 설치 기본 경로라던가 엔진의 경로, datafile의 경로등 자신이 원하는 대로 설치가 용이 하지않고 나중에 수정해주는 작업은 매우 번거롭기도 하기 때문에 설치 단계에서부터 원하는 입맛대로 설치를 위한 방법을 알아보도록 하겠습니다.



CentOS 7 64bit 설치


PostgreSQL DB는 일반적으로 같은 오픈소스 OS인 CentOS를 많이 이용합니다.

psql을 사용하는 이유는 명백히 단가 절감을 위함인데, 라이센스 비용이 들어가는 OS, 즉, 윈도우나 유닉스에 설치하는 것은 그 의미가 퇴색된다고 봅니다. 그래서 CentOS 7 버전에 PostgreSQL을 설치합니다.



CentOS의 설치는 간단합니다. 오라클 설치 때와는 확연히 다르게, 미니멀 설치를 합니다.

설치를 하면서 중요한 부분입니다. 


Compatibility Library, Development Tools


두 패키지는 추가로 설치하도록 합니다. gcc나 openssh 등 기본적으로 개발자들이나 운영하는데 있어 추가적인 무언가 하기위해 필요한 기본적인 것들이 많이 들어있습니다.


그리고 설치가 완료 되면 yum으로 추가적인 것들을 설치 해줍니다.


# yum -y install net-tools elinks wget bind-utils vim sysstat


서버 네트워크를 Bonding 한다거나, 그 밖의 다른 설정이 필요하다면 다른 패키지들을 충분히 설치합니다.



그룹 및 유저 추가


yum으로 postgresql를 설치하면 기본적으로 postgres 그룹과 postgres 유저를 설치해줍니다.

유저 홈은 /var/lib/pgsql 으로 설정이 되고, 데이터의 기본 경로는 /var/lib/pgsql/9.6/data 밑으로 가게됩니다.

이게 참 애매한 부분이 있기도 하고 운영하는데 불편하기도 하고 해서 그룹과 유저를 기본적으로 세팅을 해놓고 시작을 해보겠습니다.


# groupadd -g 26 postgres


# useradd -u 26 -g postgres -d /home/postgres postgres


# passwd postgres


# su - postgres



프로파일 설정


$ vi .bash_profile


# .bash_profile


# Get the aliases and functions

if [ -f ~/.bashrc ]; then

        . ~/.bashrc

fi


# User specific environment and startup programs


PATH=$PATH:$HOME/.local/bin:$HOME/bin


export PATH


[ -f /etc/profile ] && source /etc/profile

PGDATA=/usr/local/pgsql/data              <----- 데이터가 설치될 경로입니다.

export PGDATA

# If you want to customize your settings,

# Use the file below. This is not overridden

# by the RPMS.

[ -f /var/lib/pgsql/.pgsql_profile ] && source /var/lib/pgsql/.pgsql_profile


export PS1="\[\e[36;1m\]\u@\[\e[32;1m\]\h:\[\e[31;1m\]\w]$ \[\e[0m\]"

export TERM=linux


PATH=$PATH:$HOME/bin:/usr/pgsql-9.6/bin

export PATH


alias vi='vim $*'


:wq!



유저가 보기도 좋고 관리도 편하게 세팅이 됩니다.



PostgreSQL 설치


데이터를 설치할 경로, 로그를 쌓을 경로를 만들어주고 권한을 부여합니다. 데이터 경로나, 로그의 경로는 다르게 지정을 해도 됩니다. 스스로가 관리하기 편한 경로에 지정 해주는것이 좋습니다. /usr/local/pgsql/data 이 경로는 이전 버전에서 사용하던 경로 입니다. 예를 들면 /app/db/pgsql/data 이렇게 설치를 하고, /app/db/pgsql/diag/log 라는 경로를 만들어 로그를 쌓고 싶다면, 만들어주면 됩니다. DB 관리의 용이함을 위해 data 파티션을 따로 지정해준다거나 하는 것도 좋습니다. 


저는 usr과 var의 의미를 살리기 위해 저는 아래와 같이 설정하고 설치를 진행합니다.

 


# mkdir -p /usr/local/pgsql/data

# chown -R postgres:postgres /usr/local/pgsql


# mkdir -p /var/postgresql/log

# chown -R postgres:postgres /var/postgresql


yum을 이용해 설치


# yum -y install https://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-7-x86_64/pgdg-centos96-9.6-3.noarch.rpm

# yum -y install postgresql96 postgresql96-server


설치가 끝났습니다.

너무 간단하죠? 오라클에 비하면 할게 없습니다.



클러스터 초기화


PostgreSQL에서 클러스터란 database 집합체를 뜻한다고 설명한 적이 있습니다. 클러스터를 초기화 해야만 Database를 사용 할 수 있습니다. initdb 명령은 클러스터를 생성하거나 초기화 하는데 사용됩니다.


$ initdb -D /usr/local/pgsql/data



서버 실행


클러스터가 초기화 되면 Database를 시작 할 수 있습니다. PostgreSQL의 기본이 되는 postgres, template0, template1을 시작하는 것 입니다. 


$ pg_ctl start -D /usr/local/pgsql/data -l /var/postgresql/log/postgresql.log


서버를 실행하는 명령은 pg_ctl 뿐만 아니라 다른 명령도 있습니다.


$ postgres -D /usr/local/pgsql/data


이렇게만 실행해도 서버가 시작됩니다. postgresql의 공식 메뉴얼에는 백그라운드로 실행시키는 것은 권장하고 있습니다.


$ postgres -D /usr/local/pgsql/data >/var/postgresql/log/postgresql.log 2>&1 &


pg_ctl 명령으로는 백그라운드로 실행해도 포그라운드로 나오는데, 이건 좀 더 체크를 해볼 필요가 있을것 같습니다.


OS에서 Jobs를 확인해보면 백그라운드에서 실행중임을 알수 있습니다.


$ jobs

[1]+  Running                 postgres -D /usr/local/pgsql/data > /var/postgresql/log/postgresql.log 2>&1 &




설치 확인


$ psql -d postgres -U postgres


접속을 하면 sql 프롬프트가 나옵니다.


postgres=# 

postgres=# \l

                                  List of databases

   Name    |   Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   

-----------+-----------+----------+-------------+-------------+-----------------------

 postgres  | postgres  | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 

 template0 | postgres  | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +

           |           |          |             |             | postgres=CTc/postgres

 template1 | postgres  | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +

(3 rows)


클러스터를 구성하는 3개의 DB가 시작된 것을 볼 수 있습니다.


postgres=# \q


하면 OS로 나갈 수 있습니다.

이 것으로 설치 및 확인은 완료 되었습니다.





'Database > PostgreSQL' 카테고리의 다른 글

초간단 postgresql.conf 설정  (0) 2018.12.27
pg_hba.conf  (0) 2018.12.27
Linux에 Postgres 9.6 버전 설치  (0) 2018.12.25
PostgreSQL의 기본 개념  (0) 2018.12.12
pgadmin4 설치  (0) 2018.12.03
PostgreSQL 11 설치  (0) 2018.12.03

PostgreSQL의 기본 개념

PostgreSQL의 기본개념


 오라클과 psql의 차이점 때문에 용어 선택에서 상당히 헷갈리는 부분이 존재합니다.



1) 용어 차이

 

- 오라클은 DB 엔진이 올라간 후, 인스턴스를 생성하면서 데이터베이스가 생성됩니다. 즉, 오라클에서는 하나의 인스턴스가 하나의 DB를 나타냅니다. 하나의 데이터베이스 엔진으로 여러개의 인스턴스를 생성하면 하나의 서버에 여러개의 DB를 생성 할 수 있습니다. 인스턴스 = DB의 개념이지만, RAC 환경에서는 다수의 인스턴스가 하나의 DB를 이루는 경우도 있습니다. 


- PostgreSQL에서 인스턴스란, 서버 단위의 개념입니다. 서버 단일 인스턴스라고 부르는 PostgreSQL의 인스턴스는 서버 = 인스턴스 개념입니다. 


- 오라클에서 클러스터는 RAC 환경의 공유 노드 개념입니다. 하나의 스토리지를 바라보는 여러대의 노드, 오라클 클러스터웨어인 grid instructure 를 통한 active-active의 환경을 조성하고 클러스터웨어를 통해 이루어진 공유 노드를 클러스터라고 합니다. 


- Psql에서의 클러스터는 Psql DB 집합체를 이야기 합니다. PostgreSQL은 처음 DB를 설치하면 기본적으로 설치되는 DB가 있는데, postgres database, template0, template1 생성하는데, 이 3가지의 DB 집합체를 클러스터라고 합니다.



2) 데이터베이스 구조


- PostgreSQL의 물리적 구조는 매우 단순합니다.

- Shared Memory, 적은 수의 백그라운드 프로세스, 데이터 파일로 구성되어 있습니다.



2-1) Shared Memory


2-1-1) Shared Buffer


 - Shared Buffer의 목적은 DISK I/O를 최소화 하는 것입니다.

 - 그러기 위해서는 아래 항목을 만족해야 합니다.


  ● 매우 큰 버퍼를 빠르게 엑세스해야 한다. (수백GB 단위)

  ● 많은 사용자가 동시에 접근할 때 경합을 최소화해야 한다.

  ● 자주 사용되는 블록은 최대한 오랫동안 버퍼 내에 있어야 한다.


2-1-2) WAL 버퍼


 - WAL 버퍼는 데이터베이스의 변경 사항은 잠시 저장하는 버퍼입니다.

 - WAL 버퍼 내에 저장된 내용은 정해진 시점에서 WAL 파일로 기록됩니다.

 - 백업 및 복구 관점에서 WAL 파일은 매우 중요하고, 오라클에서 Redo의 개념과 비슷한 부분이 있습니다.



2-2) 프로세스 유형


 - Postmaster (Daemon) 프로세스

 - Background 프로세스

 - Backend 프로세스

 - Client 프로세스


2-2-1) Postmaster 프로세스


 - PostgreSQL를 구동 할 때 가장 먼저 시작되는 프로세스 입니다.

 - 초기 기동시 복구 작업, Shared Memory 초기화 작업, 백그라운드 프로세스 구동작업을 수행합니다

 - 클라이언트 프로세스의 접속 요청이 있을 때 Backend 프로세스를 생성합니다.


2-2-2) Background 프로세스


 - Autovacuum launcher를 제외하면, 오라클과 비슷한 백그라운드 프로세스들이 존재합니다.


 ● logger : 에러메세지를 로그 파일에 기록한다.

 ● checkpointer : 체크포인트 발생시, dirty 버퍼를 파일에 기록한다.

 ● writer : 주기적으로 dirty 버퍼를 파일에 기록한다.

 ● wal writer : WAL버퍼 내용을 WAL 파일에 기록한다.

 ● autovacuum launcher : Vacuum이 필요한 시점에 autovacuum worker를 fork 한다.

 ● archiver : Archive Log 모드일 때, WAL 파일을 지정된 디렉토리에 복사한다.

 ● stats collector : 세션 수행 정보 (pg_stat_activity)와 테이블 사용 통계 정보 (pg_stat_all_tables)와 같은 DBMS 사용 통계 정보를 수집한다.


2-2-3) Backend 프로세스


 - Backend 프로세스의 최대 개수는 max_connections 파라미터로 설정 가능하며, 기본값은 100입니다.

 - Backend 프로세스는 사용자 프로세스의 쿼리 요청을 수행한 후, 결과를 전송하는 역할을 수행합니다.

 - 쿼리 수행에 몇가지 메모리 구조가 필요한데, 이 것을 통칭해서 로컬 메모리라고 합니다.

 

 - 로컬 메모리 관련 주요 파라미터


 ◈ work_mem 파라미터

  - 정렬 작업, Bitmap 작업, 해시 조인과 Merge조인 작업시에 사용되는 공간. 기본값은 4MB

 

 ◈ maintenance_work_mem 파라미터

  - Vacuum 및 create index 작업 시에 사용되는 공간. 기본값은 64MB


 ◈ temp_buffers 파라미터

  - Temporary 테이블을 저장하기 위한 공간. 기본값은 8MB



 



'Database > PostgreSQL' 카테고리의 다른 글

pg_hba.conf  (0) 2018.12.27
Linux에 Postgres 9.6 버전 설치  (0) 2018.12.25
PostgreSQL의 기본 개념  (0) 2018.12.12
pgadmin4 설치  (0) 2018.12.03
PostgreSQL 11 설치  (0) 2018.12.03
PostgreSQL 백업 및 복구  (0) 2018.11.24

pgadmin4 설치

pgadmin 은 웹에서 postgresql을 관리 해줄수 있게 해주는 관리 툴입니다.

오라클 EM 같은거라고 보시면 됩니다.



SELINUX 해제


setenforce 0

sed -i 's/^SELINUX=.*/SELINUX=permissive/g' /etc/selinux/config



Yum으로 pgadmin 설치


# yum install  https://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-7-x86_64/pgdg-redhat96-9.6-3.noarch.rpm -y

# yum install epel-release


# yum install pgadmin4



pgadmin4 환경설정


# vi /usr/lib/python2.7/site-packages/pgadmin4-web/config_distro.py

LOG_FILE = '/var/log/pgadmin4/pgadmin4.log'

SQLITE_PATH = '/var/lib/pgadmin4/pgadmin4.db'

SESSION_DB_PATH = '/var/lib/pgadmin4/sessions'

STORAGE_DIR = '/var/lib/pgadmin4/storage'



# python /usr/lib/python2.7/site-packages/pgadmin4-web/setup.py

NOTE: Configuring authentication for SERVER mode.


Enter the email address and password to use for the initial pgAdmin user account:


Email address: <이메일 주소>

Password: <패스워드>

Retype password: <패스워드 확인>

pgAdmin 4 - Application Initialisation

======================================



# mkdir -p /var/lib/pgadmin4/

# mkdir -p /var/log/pgadmin4/


# chown -R apache:apache /var/lib/pgadmin4

# chown -R apache:apache /var/log/pgadmin4


# chcon -R -t httpd_sys_content_rw_t "/var/log/pgadmin4/"

# chcon -R -t httpd_sys_content_rw_t "/var/lib/pgadmin4/"




virtual host 만들기


# vi /etc/httpd/conf.d/pgadmin4.conf


<VirtualHost *>

    ServerName 192.168.0.9/pgadmin


    WSGIDaemonProcess pgadmin processes=1 threads=25

    WSGIScriptAlias / /usr/lib/python2.7/site-packages/pgadmin4-web/pgAdmin4.wsgi

 

    <Directory "/usr/lib/python2.7/site-packages/pgadmin4-web/">

        WSGIProcessGroup pgadmin

        WSGIApplicationGroup %{GLOBAL}

        Require all granted

    </Directory>

</VirtualHost>



# apachectl configtest

Syntax OK



# systemctl restart httpd


# setsebool -P httpd_can_network_connect 1


# firewall-cmd --permanent --add-service=http

# firewall-cmd --reload

success



웹 브라우저에서 192.168.0.9/pgadmin 으로 접속해보면 아래와 같은 화면이 나오고 위에서 입력한 메일 주소로 로그인이 가능합니다.




'Database > PostgreSQL' 카테고리의 다른 글

Linux에 Postgres 9.6 버전 설치  (0) 2018.12.25
PostgreSQL의 기본 개념  (0) 2018.12.12
pgadmin4 설치  (0) 2018.12.03
PostgreSQL 11 설치  (0) 2018.12.03
PostgreSQL 백업 및 복구  (0) 2018.11.24
PostgreSQL 소스 코드로 설치  (0) 2018.04.03

PostgreSQL 11 설치

Linux Cent OS 7.5 x64


PostgreSQL 11



우선 yum repository를 설치합니다. 


# yum install https://download.postgresql.org/pub/repos/yum/11/redhat/rhel-7-x86_64/pgdg-centos11-11-2.noarch.rpm



그 후에 yum으로 postgresql을 설치 합니다.


# yum -y install postgresql11-server postgresql11



설치하고 나면 postgres 라는 계정이 생성됩니다.


# su - postgres

-bash-4.2$


프로토콜이 보기 불편하니 변경해줍니다.


$ vi .bash_profile


export PS1="[\u@\h:\w]\\$ "   

추가


root에서 DB를 서비스에 init 합니다.


[root@psql-db ~]# /usr/pgsql-11/bin/postgresql-11-setup initdb

Initializing database ... OK


systemctl 로 DB를 구동하고, 서버 실행시 자동 실행되게 등록해줍니다.


[root@psql-db ~]# systemctl start postgresql-11

[root@psql-db ~]# systemctl enable postgresql-11

Created symlink from /etc/systemd/system/multi-user.target.wants/postgresql-11.service to /usr/lib/systemd/system/postgresql-11.service.

[root@psql-db ~]#


방화벽에 PostgreSQL을 차단하지 않게 정책을 추가해줍니다.


[root@psql-db ~]# firewall-cmd --add-service=postgresql --permanent

success

[root@psql-db ~]# firewall-cmd --reload

success

[root@psql-db ~]#



PostgreSQL의 conf 파일은 /var/lib/pgsql/11/data/postgresql.conf 있습니다.


vi로 열어서 listener  설정을 해줍니다.



listen_addresses = '192.168.0.9'



remote 접속 허용 설정을 해줍니다.


[root@psql-db ~]# vi /var/lib/pgsql/11/data/pg_hba.conf


# Accept from anywhere  (아무나 다)

host all all 0.0.0.0/0 md5


or


# Accept from trusted subnet (특정 대역대만)

host all all 192.168.18.0/24 md5



예>


# IPv4 local connections:

host    all             all             0.0.0.0/0               md5

#host    all             all             127.0.0.1/32            ident


Postgres 재구동


# systemctl restart postgresql-11



TEST 유저와 TEST DB를 만들고 접속 해봅니다.


[postgres@psql-db:~]$ createuser test_user

[postgres@psql-db:~]$ createdb test_db -O test_user

[postgres@psql-db:~]$ psql -c "alter user test_user with password 'test'"


권한을 주기위해 admin 유저로 접속을 합니다. postgres/postgres


[postgres@psql-db:~]$ psql -U postgres -d postgres

psql (9.2.24, server 11.1)

WARNING: psql version 9.2, server version 11.0.

         Some psql features might not work.

Type "help" for help.


postgres=# 

postgres=# 

postgres=# grant all privileges on database test_db to test_user;

GRANT

postgres=# \q


터미널에서 TEST DB에 접속


[postgres@psql-db:~]$ psql -U test_user -h 192.168.0.9 -d test_db

psql (9.2.24, server 11.1)

WARNING: psql version 9.2, server version 11.0.

         Some psql features might not work.

Type "help" for help.


test_db=>


설치가 완료 되었습니다.

'Database > PostgreSQL' 카테고리의 다른 글

PostgreSQL의 기본 개념  (0) 2018.12.12
pgadmin4 설치  (0) 2018.12.03
PostgreSQL 11 설치  (0) 2018.12.03
PostgreSQL 백업 및 복구  (0) 2018.11.24
PostgreSQL 소스 코드로 설치  (0) 2018.04.03
PostgreSQL 버그 리포팅 가이드 라인  (0) 2018.04.03

PostgreSQL 백업 및 복구

DATABASE 및 TABLE 백업 / 복구



백업


superuser 계정으로 접속



문법>


pg_dump [DATABASE명] -t [TABLE명] > [저장 될 DUMP FILE명]



예)


[postgres@test data]$ pg_dump pgsqldb -t tb_test > PGSQL_tb_test_20090830.dump

[postgres@test data]$



복구


superuser 계정으로 접속



문법>


psql -f [FILE명] [DATABASE명]



예)

[postgres@test data]$ psql -f PGSQL_tb_test_20090830.dump pgsqldb

SET

SET

SET

SET

SET

SET

SET

SET

CREATE TABLE

ALTER TABLE

[postgres@test data]$




전체 DATABASE 백업 / 복구



백업


superuser 계정으로 접속



문법>


pg_dumpall > [저장 될 DUMP FILE명]



예)


[postgres@test data]$ pg_dumpall > PGSQL_all_20090830.dump

[postgres@test data]$



복구


superuser 계정으로 접속



문법>


psql -f [FILE명] template1




예)


[postgres@test data]$ psql -f PGSQL_all_20090830.dump template1

SET

SET

SET

CREATE TABLE

ALTER TABLE

...

[postgres@test data]$



백업 스크립트


#!/bin/bash

#This script creates backup of your postgresql databases,

#you can select databases you want/dont want,

#script will send e-mail to you when needed.


#I need user and password

export PGUSER=postgres

export PGPASSWORD=


DBNAME=abcd


#Where should i save pg dump-s?

TARGET=/mnt/seeme


#Give pg_dump location

PGDUMP=/usr/lib/postgresql/9.3/bin/pg_dump

#Give me psql location

PSQL=/usr/lib/postgresql/9.3/bin/psql

#Give me psql connection port

PORT=5432


BEFOREDATE=$(date '+%Y-%m-%d' -d '10 day ago')

rm -rf $TARGET/abcd-$BEFOREDATE.sql


$PGDUMP -h 127.0.0.1 -p $PORT -U $PGUSER -d $DBNAME -f $TARGET/abcd-`date +%Y-%m-%d`.sql

'Database > PostgreSQL' 카테고리의 다른 글

pgadmin4 설치  (0) 2018.12.03
PostgreSQL 11 설치  (0) 2018.12.03
PostgreSQL 백업 및 복구  (0) 2018.11.24
PostgreSQL 소스 코드로 설치  (0) 2018.04.03
PostgreSQL 버그 리포팅 가이드 라인  (0) 2018.04.03
PostgresSQL 이란?  (0) 2018.04.03

PostgreSQL 소스 코드로 설치

전에 리눅스에서 YUM을 이용해 프리패키지 배포를 이용한 설치하는 법을 포스팅을 한 적이 있다.


http://db.necoaki.net/194?category=736270


PostgreSQL은 모든 Unix에서 동작하며, Windows에서도 동작한다.



소스 코드로 설치


./configure make

su

make install adduser postgres

mkdir /usr/local/pgsql/data

chown postgres /usr/local/pgsql/data su - postgres

/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data

/usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data >logfile 2>&1 &

/usr/local/pgsql/bin/createdb test

/usr/local/pgsql/bin/psql test



요구 사항


● GNU make 버전 3.80 이상

 - 다른 Make 프로그램이나 3.80 버전 이하에서는 동작하지 않는다.

● ISO/ANSI C 컴파일러 필요.

● GNU Readline library가 기본적으로 사용된다. 

 - 간단히 말하면 프롬프트 내에서 vi 처럼 쓸수 있다는 이야기다. 유용하기 떄문에 강력히 권장된다.

 - 사용하지 않으려면 --without-readline 옵션을 configure로 주면 된다.

 - 또한, libedit 라이브러리를 사용할 수도 있다.

● zlib 압축 라이브러리가 기본적으로 사용된다.

 - 이것을 사용하지 않으려면 --without-zlib 옵션을 configure로 설정하면 된다.

 - zlib을 사용하지 않을 경우 pg_dump 및 pg_resotre에서 압축된 아카이브에 대한 지원이 비활성화 된다.

● 서버 프로그래밍 언어 PL/Perl을 빌드하려면 libperl 라이브러리 헤더 파일을 비롯한 Perl 전체 설치가 필요.

● PL/Python을 빌드하려면 distutils 모듈을 이용한 파이썬 설치가 필요. 최소 요구버전은 2.3이다.

 - libpython은 대부분 플랫폼에서 공유 라이브러리이다. PostgreSQL을 빌드 및 설치한 후에 plpython.so라는 파일이 있는 경우 모든것이 정상적으로 진행되나, 없는 경우 사용자가 파이썬 설치를 리빌드 하여 공유 라이브러리를 생성해야 한다.

 프로그램 메시지를 영어가 아닌 다른 언어로 표시하는 기능인 NLS를 활성화 하려면 Gettext API의 구현이 필요하다. 

● 인증 및 암호화를 지원하려는 경우는 Kerberos, OpenSSL, OpenLDAP,PAM 등이 필요하다.

● 소스 패키지 압축을 해제하기 위해 gzip, bzip2, tar 필요.



소스 다운로드


http://postgresql.org/download


포스팅 기준(2018.04.03) 가장 최신 버전은 10.3 버전이 릴리즈 되어 있다. 




설치 방법


configure 스크립트 실행


 - 이 스크립트는 테스트를 여러 차례 실행하여 시스템 종속변수의 값을 결정하고 운영체제의 특이점을 검출하여, 최종적으로 빌드 트리에서 몇 개의 파일을 생성하여 발견된 것들을 기록한다. 빌드 디렉토리를 별도로 유지하고 싶으면 소스 트리 외부의 디렉토리에서 configure를 실행 할 수 있다. 이 절차를 VPATH 빌드라고 한다. 방법은 아래와 같다.


mkdir build_dir

cd build_dir

/path/to/source/tree/configure [options go here]

make



커스터마이즈 커맨드라인 옵션



--prefix=PREFIX


/usr/local/pgsql 대신 PREFIX 디렉토리에 모든 파일 설치

실제 파일은 서브 디렉토리에 설치된다. 개별 서브 디렉토리를 커스터마이즈 할 수 있다.

하지만 기본값으로 남겨두면 설치 재배치가 가능. 설치후 사용자가 디렉토리를 이동 할 수 있음.

재배치 가능한 설치의 경우 --disable-rpath 옵션을 사용 할 수 있음.



--exec-prefix=EXEC-PREFIX


PREFIX에 설정된 것이 아닌 다른 접두사 EXEC_PREFIX 아래에 아키텍처 종속 파일을 설치할 수 있다. 호스트 사이의 아키텍처 독립 파일을 공유할 때 유용. 이것을 생략하면 EXEC-PREFIX와 PREFIX가 동일 하게 설정 되고 동일한 트리 아래에 설치 된다.



--bindir=DIRECTORY


실행 프로그램에 대한 디렉토리를 지정한다. 기본값은 EXEC-PREFIX/bin이며 일반적으로 /user/local/pgsql/bin



--sysconfdir=DIRECTORY


구성 파일에 대한 디렉토리 PREFIX/etc를 기본값으로 설정



--libdir=DIRECTORY


라이브러리 및 동적으로 로드되는 모듈을 설치할 위치 설정. 기본값은 EXEC-PREFIX/lib



--includedir=DIRECTORY


C 및 C++ 헤더파일 설치를 위한 디렉토리 설정. 기본값 PREFIX/include



--datarootdir=DIRECTORY


다양한 종류의 읽기 전용 데이터 파일에 대한 root 디렉토리를 설정한다. 이것은 다음 옵션 일부에 대한 기본값만 설정한다. 기본값은 PREFIX/share



--datadir=DIRECTORY


설치한 프로그램에서 사용되는 읽기 전용 데이터 파일에 대한 디렉토리를 설정 한다. 기본값은 DATAROOTDIR

※ 이것은 데이터베이스 파일이 배치되는 위치와는 상관이 없다.



--localedir=DIRECTORY


로케일 데이터, 메시지 번역 카탈로그 파일 설치를 위한 디렉토리. 기본값 PREFIX/locale



--mandir=DIRECTORY


PostgreSQL에 딸려 있는 man 페이지는 이 디렉토리 아래에 각각의 manx 서브 디렉토리에 설치딘다. 기본값은 DATAROOTDIR/man



--docdir=DIRECOTORY


man 페이지를 제외한 문서 파일 을 설치하기 위한 root 디렉토리 설정. 기본값은 DATAROOTDIR/doc/postgresql



--htmldir=DIRECTORY


PostgreSQL에 대한 HTML 문서가 설치되는 경로. 기본값 DATAROOTDIR



※ 시스템의 나머지 네임스페이스에 지장을 주지 않고 PostgreSQL을 공유 설치 위치에 (예: /usr/local/include)에 설치하려면 주의가 필요하다. 먼저, string "/postgres"은 완전히 확장된 디렉토리 이름에 string "postgres" 또는 "psql"이 포함 되어 있지 않는 한 datadir, sysconfdir 및 docdir에 자동으로 첨부된다. 예를 들면 접두사로 /usr/local을 선택한 경우는 문서는 /usr/local/doc/postgresql에 설치 되지만, 접두사가 /opt/postgres인 경우 /opt/postgres/doc 밑에 있게 된다. 클라이언트의 공용 C 헤더 파일 includedir 설치되고 namespace-clean이다. 내부 헤더 파일 및 서버 헤더 파일은 includedir 아래의 전용 디렉토리에 설치된다. 헤더 파일에 액서스 하는 방법에 대한 정보는 각 인터페이스의 문서를 참조하기 바란다. 마지막으로, 적절한 경우 동적으로 로드되는 모듈에 대한 전용 서브 디렉토리도 libdir 아래에 생성된다.



--with-extar-version=STRING


STRING을 PostgreSQL 버전 번호에 첨부한다. 이것을 사용하면 릴리지 되지 않은 깃 스냅샷에서 빌드된 바이너리를 make하거나 git describe 식별자 또는 배포 패키지 릴리스 번호 같은 추가버전 문자열을 사용하여 커스텀 패키지를 포함할 수 있다.



-with-includes=DIRECTORIES


DIRECTORIES는 콜론으로 구분된 디렉토리 목록이며, 컴파일러라 헤더 파일을 검색하는 목록에 추가된다. 비표준 위치에 설치된 옵션 패키지 (예: GNU Readline)가 있을 경우 이 옵션을 사용해야 하고 해당 --with-libraries 옵션도 사용해야 한다.

예: --with-includes=/opt/gnu/include:/usr/sup/include



--with-libraries=DIRECTORIES


DIRECTORIES는 라이브러리 검색을 위한 콜론으로 구분된 디렉토리 목록이다. 비표준 위치에 설치된 경우 이 옵션(및 해당 --with-includes 옵션)을 사용해야 한다.



--enabled-nls [=LANGUAGES]


프로그램 메시지를 영어가 아닌 다른 언어로 표시하는 기능 NLS를 활성화한다.

언어의 코드목록은 공백으로 구분된 옵션이다. (예: --enable-nls='de fr kr'

목록을 지정하지 않는 경우 사용 가능한 모든 번역이 설치된다.



--with-pgport=NUMBER


서버와 클라이언트의 기본 포트 번호로 NUMBER를 지정한다. 기본값은 5432



--with-perl


PL/Perl 서버 언어를 빌드한다.



--wiith-python


PL/Python 서버 언어를 빌드한다.



--with-tcl


PL/TCL 서버 언어를 빌드한다.



--with-tclconfig=DIRECTORY


TCL은 Tcl과 인터페이스 하는 모듈을 빌드하는 데 필요한 구성 정보가 포함된 tclConfig.sh 파일을 설치한다. 이 파일은 자동으로 발견 되지만 다른 버전의 Tcl을 사용하려는 경우에는 검색하려는 디렉토리를 지정 할 수 있다.



--with-gssapi


GSSAPI 인증에 대한 지원을 사용하여 빌드 한다. GSSAP 시스템은 기본적으로 /usr/include, usr/lib 에 설치되지 않음으로 이 옵션 외에도 --with-libraries, --with-includes 옵션을 사용해야 한다. configure는 프로세싱전에 사용자의 GSSAPI 설치가 충분한지 확인하기 위해 필수 헤더 파일과 라이브러리를 점검한다.



--with-krb-srvnam=NAME


GSSAPI에서 사용되는 Kerberos 서비스 보안 주체의 기본 이름.기본값은 postgres. 윈도우환경에서는 대문자 POSTGRES



--with-openssl


SSL 연결에 대한 지원을 사용하여 빌드한다. OpenSSL 패키지 설치 필요,



--with-pam


PAM지원을 사용하여 빌드 한다.



--with-ldap


인증 및 연결 매개변수 조회에 대한 LDAP 지원을 사용하여 빌드한다. 유닉스에서 LDAP 패키지 설치 필요.



--without-readline


readline 라이브러리 사용 금지. 비권장



--with-libedit-preferred


BSD의 허가를 받은 libedit 라이브러리 사용 장려. 이 옵션은 readline과 libedit 라이브러리 둘다 설치된 경우에만 의미가 았다. 기본값은 Readline을 사용.



--with-bonjour


Bonjour 지원을 사용하여 빌드한다. Mac OSX 에서 권장



--with-uuid=LIBRARY


지정된 UUID 라이브러리를 사용하여 uuid-ossp 모듈을 빌드한다. LIBRARY는 다음중에 하나 여야 한다.

BSD, e2fs,ossp



--with-libxml


libxml을 사용하여 빌드한다.



--with-libxslt


xml2 모듈을 빌드하는 경우 libxslt 사용. xml2는 이 라이브러리에 의존하여 XML의 XSL 변환을 수행



--disable-integer-datetimes


타임스탬프 및 간격용 64비트 integer 저장소에 대한 지원을 비활성화 한고 datetime 값은 Floating-ponit 숫자로 대신 저장한다. Floating-point-datetime 저장소는 8.4 이전 버전의 기본값으로 마이크로초 정밀도를 지원하지 않아서 이제는 무의미 하다. 해당 타입을 사용할 수 없는 경우나 이전 버전으로 작성된 어플리케이션과의 호환성을 위해 사용.



--disable-float4-byval


float4 값을 "by value"로 전달. 이 옵션은 성능을 희생하는 대신 오래전에 C로 작성된 사용자 정의 함수와 호환 때문에, 그리고 "version 0" 호출변환을 사용하기 때문에 필요할 수도 있다.



--disable-float8-byval


float8 값을 "by value"로 전달. 이 옵션은 성능을 희생하는 대신 오래전에 C로 작성된 사용자 정의 함수와 호환 때문에, 그리고 "version 0" 호출변환을 사용하기 때문에 필요할 수도 있다. 32비트 플랫폼에서 float8-byval이 기본값이고, --enable-float8-byval 선택은 불가능하다. 이 옵션은 float8 뿐만 아니라 int8 및 timstamp같은 일부 관련 타입에도 영향을 미친다.



--with-segsize=SEGSIZE


segmentsize를 기가바이트 단위로 설정한다. 거대 테이블은 운영체제파일 여러개로 분할되며, 각각의 크기는 세그먼트 크기와 동일하다. 사용자의 운영체제에서 'Largefile" 지원이 있는 경우 더 큰 세그먼트 크기를 사용 할 수 있다. Large Table을 다수 사용하는 경우 소비되는 파일 디스크립터 수를 줄일때 유용하다. 



--with-blocksize=SEGSIZE


WAL segment size를 메가바이트 단위로 설정한다. WAL 로그에서 개별 파일의 크기이다. 기본값은 16MB. 1~64 사이의 2의 제곱이여야 한다. 이 값을 변경하려면 initdb가 필요하다.



--with-wal-blocksize=BLOCKSIZE


WAL block szie를 킬로바이트 단위로 설정한다. WAL로그 내에서 저장 및 I/O단위이다. 기본값 8k. 1~64 사이의 2의 제곱수로 설정.



--disable-spinlocks


PostgreSQL가 플랫폼에 대한 CPU 스핀락 지원이 없더라도 빌드가 성공하도록 한다. 스핀락 지원이 없는 경우 성능이 저하되므로 빌드 중단시 플랫폼에 스핀락 지원이 없을 경우에 사용한다. 이 옵션이 필요한 경우 PostgreSQL 개발자에게 문제를 리포트하기 바람.



--disable-thread-safety


클라이언트 라이브러리의 스레드 안전을 비활성화 한다. 이것은 libpq 및 ECPG 프로그램의 동시 스레드가 자체 전용 연결 핸들러를 안전하게 제어하는것을 막는다.



--with-system-tzdata=DIRECTORY


PostgreSQL에는 자체 시간대 데이터베이스가 포함되면, 이것은 날까 및 시간 작업에 필요하다. 서머타임을 사용하는 곳에서 사용하는 경우 OS에서 제공되는 절대경로(/usr/share/zoneinfo)로 지정시 서머타임 규칙이 바뀔때 마다 PostgreSQL 패키지를 업데이트 할 필요가 없다는 것.



--without-zlib


zlib 라이브러리 사용을 금지. pg_dump 및 pg_resotre에서 압축된 아카이브에 대한 지원을 비활성화 한다.



--enable-debug


디버깅 심볼을 사용하여 모든 프로그램과 라이브러리를 컴파일한다. 이 옵션은 GCC를 사용하는 경우에만 권장된다.




configure는 일반적으로 gcc를 고르고, 가능하지 않을때에서는 cc를 선택한다. 유사하게, 필요시 CFLAGS 변수를 사용하여 기본 컴파일러 플래그를 오버라이드할 수 있다. 더 자세한 내용은 공식 기본 문서를 참고하기 바란다.




빌드


make


문서와 추가 모듈을 비롯해 모든것을 빌드하려면


make world




파일 설치 (root로 실행)


make install


문서 설치


make install-docs 


(or)


make install-world 




환경 변수도 너무 많고, 전문가가 아니면 어떻게 손대야 할지 모르는 옵션이 너무 많다.

초보자라면 소스 설치보다는 패키지 설치를 추천한다...

'Database > PostgreSQL' 카테고리의 다른 글

PostgreSQL 11 설치  (0) 2018.12.03
PostgreSQL 백업 및 복구  (0) 2018.11.24
PostgreSQL 소스 코드로 설치  (0) 2018.04.03
PostgreSQL 버그 리포팅 가이드 라인  (0) 2018.04.03
PostgresSQL 이란?  (0) 2018.04.03
PostgreSQL 유저 및 Tablespace, DB 생성  (0) 2018.03.26

PostgreSQL 버그 리포팅 가이드 라인

PostgreSQL 버그 리포팅 가이드 라인


 ● 오픈소스 프로젝트의 장점과 단점은 명확하다.

   - 오라클이나 MSSQL 같이 비싼 라이센스 비용을 지불하지 않아도 상업적으로 이용이 가능하다.

   - 단점은 국내에 오픈소스의 프로젝트들의 유지보수 업체나 전문가가 많지 않아 장애처리가 어렵다.

     기술자가 있어도 몸값이 비싸다는것이 문제다.

 

 ● 어떤 프로그램이든 완벽한 동작을 하는 프로그램은 없다. 그렇기에 지속적인 버전업과 패치가 이루어 지는것.




버그 식별


 ● 프로그램이 fatal 신호와 함꼐 중단 또는 프로그램에 문제가 있음을 알리는 운영체제 메시지

 ● 주어진 입력에 대해 잘못된 출력이 프로그램에서 나옴

 ● 프로그램이 유효한 입력을 받아들이지 않음

 ● 프로그램이 경고 또는 에러 메시지 없이 잘못된 입력을 받아들임.

 ● 지원 플랫폼에 대한 지치에 따른 PostgreSQL의 컴파일, 빌드 또는 설치 실패


 ※ 느려지는 것이나, 리소스 호깅이 반드시 버그인 것은 아니다. 

   어플리케이션 튜닝에 대한 도움은 관련 문서를 보거나 메일링 리스트에 문의.




리포트 내용


 ● 문제의 재현을 위해 필요한 프로그램 시작부터 정확한 순서의 단계. SQL 관련 문제를 테스트할 때 최선의 형식은 문제를 보여주는 psql 프론트엔드를 통해 실행 가능한 파일이다. 이 파일을 간단하게 만드는 방법은 pg_dump를 사용하요 덤프하고 문제 쿼리를 추가하는 것.

  에러메세지의 제시. 단순히 개인적인 의견으로 작동안함, 충돌함. 이런 의견은 아무런 도움이 되지 않는다. 에러메세지의 내용이 이해되지 않더라도 반드시 첨부한다.

 

★ 로그 세팅

 

 psql에서

 \set VERBOSITY verbose


 서버 로그에서 메세지 추출 하는 경우

 log_error_verbose verbose로 설정 


 ● 예상된 출력은 서술이 매우 중요하다. 두리뭉실한 표현은 커맨드의 정확한 의미를 해독하는데 시간을 소비할 수 있다. 단순히 "오라클에서는 되는 문장인데 PostgreSQL에서는 안된다." 라고 기술하는 것도 옳지 않다. 모든 다른 데이터베이스의 동작은 자신만의 방식으로 동작하며, 데이터베이스 전문가라고 해서 모든 DB의 동작 방식을 알고 있는 것이 아니다.

 ● 기본값에서 변경된 관련 환경 변수 또는 구성 파일을 비롯한 커맨드 라인 옵션 및 기타 시작 옵션의 정확한 정보를 제공하기 바란다.

 ● 설치 지침과 다르게 실행한 모든것

 ● PostpgeSQL 버전. SELECT version();을 실행하면 연결된 서버의 버전을 알 수 있다. 최소한 postgres --version, psql --version은 지원한다. 해당 함수 또는 옵션이 존재하지 않는 경우 업그레이드를 해야할 만큼 오래된 버전이다.

 ● 플랫폼 정보, 커널 이름과 버전, C라이브러리, 프로세서, 메모리 정보 등이 포함.




버그 리포트를 보낼 곳



pgsql-bugs@postgresql.org


또는 프로젝트 웹사이트에서 버그 리포트 웹 양식에 입력. 


● 버그 리포트에 보안에 관련된 사항이 있어 공용 아카이브에 공개되지 않기를 원한다면,


security@postgresql.org


개인적으로 리포트 할 수 있음.


● 프로젝트가 제공하는 문서에 문제가 있을 경우


pgsql-doc@postgresql.org

 

● 개발 제안, 플랫폼 이식 등 문제는 개발자의 메일링 리스트로 보낸다.


pgsql-hackers@posgresql.org 



※ 당연히 영어로 적어서 보내야 한다.



참고 할 수 있는 사이트


프로젝트 홈페이지

https://www.postgresql.org/


PostgreSQL 한국 홈페이지

http://postgresql.kr/


데이터베이스사랑.net

http://database.sarang.net



'Database > PostgreSQL' 카테고리의 다른 글

PostgreSQL 백업 및 복구  (0) 2018.11.24
PostgreSQL 소스 코드로 설치  (0) 2018.04.03
PostgreSQL 버그 리포팅 가이드 라인  (0) 2018.04.03
PostgresSQL 이란?  (0) 2018.04.03
PostgreSQL 유저 및 Tablespace, DB 생성  (0) 2018.03.26
PostgreSQL 9.6 설치  (0) 2018.03.26

PostgresSQL 이란?

PostgresSQL 이란?


● Postgres 버전 4.2를 기반으로 하는 개체 관계 데이터베이스 관리 시스템 (ORDBMS) 이며, UC 버클리 컴퓨터 공학부에서 개발. 오리지널 버클리 코드에서 유래된 오픈소스다. SQL 표준 지원.


 - 복합쿼리

 - 외래키

 - 트리거

 - 업데이트 가능한 뷰

 - 트랜잭션 무결성

 - 멀티버전 동시성 제어


 PostgreSQL을 사용자가 여러가지 방법으로 확장 할 수 있음.


 - 데이터타입

 - 함수

 - 연산자

 - 집계함수

 - 인덱스 메소드

 - 프로시저 언어


★ 라이센스가 자유롭기 때문에 누구든 자유롭게 PostgreSQL을 상업적으로 사용, 수정 배포할 수 있다.

  단, PostgreSQL 오픈 소스 프로젝트이기 때문에, 장애 발생 및 버그에 대한 처리가 쉽지 않다. 사용자 커뮤니티를    통해 자신의 지식을 기부하고, 메일링 리스트를 통해 다른 사람의 도움을 받아야 한다.




'Database > PostgreSQL' 카테고리의 다른 글

PostgreSQL 백업 및 복구  (0) 2018.11.24
PostgreSQL 소스 코드로 설치  (0) 2018.04.03
PostgreSQL 버그 리포팅 가이드 라인  (0) 2018.04.03
PostgresSQL 이란?  (0) 2018.04.03
PostgreSQL 유저 및 Tablespace, DB 생성  (0) 2018.03.26
PostgreSQL 9.6 설치  (0) 2018.03.26

PostgreSQL 유저 및 Tablespace, DB 생성

유저 생성


# psql -d postgres -U postgres

Password for user postgres: 

psql (9.2.23)

Type "help" for help.


postgres=# create user test;



테이블 스페이스 생성


postgres=# create tablespace test01

postgres=# location '/data/postgresql/test/tbs';


* 주의 : 경로의 권한이 postgres.postgres 가 되어야 하며,

SELinux가 disabled로 설정 되어 있어야 한다.



DB생성


Synopsis :

CREATE DATABASE name

[ [ WITH ] [ OWNER [=] user_name ]

        [ TEMPLATE [=] template ]

        [ ENCODING [=] encoding ]

        [ LC_COLLATE [=] lc_collate ]

        [ LC_CTYPE [=] lc_ctype ]

        [ TABLESPACE [=] tablespace_name ]

        [ ALLOW_CONNECTIONS [=] allowconn ]

        [ CONNECTION LIMIT [=] connlimit ] ]

        [ IS_TEMPLATE [=] istemplate ]



postgres=# create database test  

postgres=# with tablespace = test01

postgres=# owner = test;

CREATE DATABASE


Test 유저가 소유한 test01 테이블 스페이스를 사용하는 test db가 만들어졌다.


postgres-# \l

                                  List of databases

   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   

-----------+----------+----------+-------------+-------------+-----------------------

 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 

 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +

           |          |          |             |             | postgres=CTc/postgres

 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +

           |          |          |             |             | postgres=CTc/postgres

 test      | test     | UTF8     | en_US.UTF-8 | en_US.UTF-8 |




test 유저에게 test db 에 대한 모든 권한 주기


postgres=# grant all privileges on database test to test;

GRANT

postgres=#



test 유저의 패스워드 설정


postgres=# \password test

Enter new password: 

Enter it again: 

postgres=#



'Database > PostgreSQL' 카테고리의 다른 글

PostgreSQL 백업 및 복구  (0) 2018.11.24
PostgreSQL 소스 코드로 설치  (0) 2018.04.03
PostgreSQL 버그 리포팅 가이드 라인  (0) 2018.04.03
PostgresSQL 이란?  (0) 2018.04.03
PostgreSQL 유저 및 Tablespace, DB 생성  (0) 2018.03.26
PostgreSQL 9.6 설치  (0) 2018.03.26

PostgreSQL 9.6 설치

CentOS 7버전


https://yum.postgresql.org/ 에 가서 yum repository를 받는다.


# rpm -Uvh pgdg-centos96-9.6-3.noarch.rpm


Repo를 설치하고 나면 최신 버전의 PostgreSQL을 설치 할 수 있다.


# yum -y install postgresql96


간단하게 설치 완료.



DB 인스톨


# postgressql-setup initdb


PostgreSQL 재시작


# systemctl restart postgresql.service


PostgreSQL OS 구동시 자동 시작


# chkconfig postgresql on




PostgreSQL 설치가 완료 되면 


postgres 라는 계정이 생성되어 있을 것.


# su - postgres



Postgres 계정의 기본 home 디렉토리는 

/var/lib/pgsql


.bash_porfile을 열어서


export PS1="[\u@\h:\w]\\$ "


추가




$ psql -d postgres -U postgres

psql (9.2.23)

Type "help" for help.


postgres=#


패스워드 변경하기 



postgres=# \password

Enter new password: 

Enter it again: 

postgres=#


Postgres 프롬프트에서 나가려면 \q 를 입력하면 된다.


다른 사람이 postgres 계정으로 접근하지 못하게 권한 설정을 바꿔준다.


# vi /var/lib/pgsql/data/pg_hba.conf


맨 밑에


# TYPE  DATABASE        USER            ADDRESS                 METHOD


# "local" is for Unix domain socket connections only

local   all             all                                     md5  

# IPv4 local connections:

host    all             all             0.0.0.0/32              md5

# IPv6 local connections:

host    all             all             ::1/128                 md5

# Allow replication connections from localhost, by a user with the

# replication privilege.

#local   replication     postgres                                peer

#host    replication     postgres        127.0.0.1/32            ident

#host    replication     postgres        ::1/128                 ident


turst나 ident를 md5로 변경


# systemctl restart postgresql.service


그러면 postgres db에 postgres 계정으로 접솔 할때 암호를 묻는다.


-bash-4.2$ psql -d postgres -U postgres

Password for user postgres: 

psql (9.2.23)

Type "help" for help.


postgres=#



리스너 설정


#vi /var/lib/pgsql/data/postgresql.conf


...

#listen_addresses = 'localhost'         # what IP address(es) to listen on;


해당부분을 아래와 같이 수정


listen_addresses = '*'         # what IP address(es) to listen on;


저장


# systemctl restart postgresql.service



이것으로 기본적인 PostgreSQL 의 설치가 완료 되었다.


'Database > PostgreSQL' 카테고리의 다른 글

PostgreSQL 백업 및 복구  (0) 2018.11.24
PostgreSQL 소스 코드로 설치  (0) 2018.04.03
PostgreSQL 버그 리포팅 가이드 라인  (0) 2018.04.03
PostgresSQL 이란?  (0) 2018.04.03
PostgreSQL 유저 및 Tablespace, DB 생성  (0) 2018.03.26
PostgreSQL 9.6 설치  (0) 2018.03.26