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 로컬라이제이션


 - 로케일 지원은 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 아카이브 모드



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 점검



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