페이지 트리
메타 데이터의 끝으로 건너뛰기
메타 데이터의 시작으로 이동



목차

시스템 카탈로그

  • PostgreSQL은 효율적인 데이터베이스 시스템을 관리하기 위해 다른 RDBMS와 마찬가지로 내부적인 카탈로그를 사용
  • 카탈로그는 다른 RDBMS에서 데이터 사전 이라 불리기도 하며, 데이터베이스의 여러 가지 정보를 일목 정연하게 저장하고 있는 시스템의 테이블
  • PostgreSQL의 시스템 카탈로그는 클래스/타입 시스템 카탈로그와 상속, 규칙 시스템, 거대객체, 내부 용도의 카탈로그 등으로 크게 구성

이름

설명

pg_class

테이블, 시퀀스, 인덱스, 뷰의 객체에 대한 자세한 정보를 담고 있다.

pg_database

현재 시스템에 존재하는 데이터베이스에 대한 간단한 정보를 담고 있다.

pg_group

데이터베이스의 그룹별 사용자에 대한 정보를 담고 있다.

pg_shadow

유효한 사용자에 대한 정보를 담고 있다.

pg_listener

데이터베이스 상의 변화를 청취하고 있는 프로세스에 대한 정보를 담고 있다.

  • 그 외에도 여러 가지 카탈로그가 있지만 그다지 자주 사용되지 않음.
  • 위에서 언급한 카탈로그는 하나의 테이블이기 때문에 권한이 있다면 갱신할 수 있는 카탈로그도 있다. 하지만 postgres 수퍼 사용자나 일반 사용자가 갱신할 수 없는 카탈로그도 있다.
  • 아울러 무작정 카탈로그를 갱신하다보면 시스템 데이터가 엉길 수도 있으므로 미리 잘 파악하고 적절히 조정한다면 쾌적한 데이터베이스 환경을 조성할 수 있다.

pg_class - 관계(또는 객체)에 대한 종합적인 정보

pg_class 카탈로그는 시스템에서 관계에 대한 종합적인 정보를 담고 있다. 즉, 사용자가 생성한 테이블, 뷰 등의 이름과 소유자는 누구이며, 튜플, 속성은 몇 개인지 등에 대한 내용을 다루고 있다. 이중에서 몇 가지 중요한 칼럼은 다음과 같다.

이름

타입

설명

relname

NameData

관계(또는 테이블)의 이름

relowner

oid

관계의 소유자의 UNIX 시스템 ID

relnatts

int2

컬럼의 개수

일반 테이블에 대해 질의를 하듯이 pg_class에 대해서도 동일하게 할 수 있다. 테이블을 간단하게 만들고 데이터를 약간 입력한 다음 질의를 해보자.

create table 회원 (이름 text, 전화번호 text, 주소 text, 나이 int);
select relname, relowner, relnatts from pg_class where relname = '회원';
relname|relowner|relnatts
------+------+------
회원     |       500|        4

회원 테이블의 소유자는 UNIX ID 500번이고 속성의 개수는 4개라는 것을 알 수 있다. 카탈로그에 대한 갱신은 현재까지의 버전에서는 약간 불안한 측면이 있다. 즉, 어떤 특정한 카탈로그에서 A라는 클래스를 삭제하면 이후에 A라는 이름의 클래스를 생성하지 못하는 경우가 가끔 있다. 다음과 같은 질의를 사용하면 처음에는 잘 되는 것 같지만 나중에 문제가 생긴다.

delete from pg_class where relname = '회원';
create table 회원 (이름 text, 전화번호 text, 주소 text, 나이 int);
ERROR: cannot create 회원

pg_class를 직접 갱신하면 pg_class의 내용만 갱신되고, 관련된 pg_attribute를 비롯한 여러 클래스들은 갱신되지 않아서 생기는 문제로 보인다.

pg_attribute - 컬럼에 대한 정보

이름

타입

설명

attname

NameData

컬럼 이름

attlen

int2

컬럼의 바이트 길이, 가변 길이는 -1

attnum

int2

컬럼 번호, 테이블에서 컬럼은 1부터 시작

create table 회원2 (이름 text, 전화번호 text, 주소 text, 나이 int);
select attname, attlen, attnum from pg_attribute where attname = '전화번호';
attname|attlen|attnum
------+----+-----
전화번호|    -1|       2

회원2 테이블에서 전화번호 컬럼은 테이블 내에서 두 번째에 위치하고, 바이트 길이는 가변이라는 것을 알 수 있다.

pg_database - 데이터베이스에 대한 정보

  • 시스템에 존재하는 데이터베이스에 대한 간단한 정보를 출력한다.

    이름

    타입

    설명

    datname

    NameData

    데이터베이스 이름

    datdba

    oid

    해당 데이터베이스 관리자의 UNIX 시스템 ID

    text

    datpath

    데이터베이스 디렉토리 $PGDATA를 기준

select * from pg_database;
datname |datdba|datpath
-------+-----+-------
template1|    501|template1
test         |    501|test
mydb      |    500|mydb

pg_group - 그룹별 사용자에 대한 정보

이름

타입

설명

groname

NameData

그룹 이름

grosysid

int2

그룹의 UNIX 그룹 ID

int2

grolist[]

그룹 회원들의 UNIX 사용자 ID의 목록

UNIX 스타일의 파일 시스템에도 그룹별 사용자 개념이 적용되듯이, PsotgreSQL 데이터베이스 시스템에도 마찬가지이다. 일반적으로 데이터베이스에 다양한 사용자들이 접근할 수 있으므로, 사용자의 부서나 업무 성격에 따라 그룹을 나누어 주어, 권한 설정을 따로 할 수 있다. 즉, 권한을 부여(grant)할 때 그룹 ID가 요긴하게 사용된다. 여기서는 users라는 그룹을 만들어 몇몇 사용자를 등록하고, 회원2하는 테이블의 사용권을 이들 사용자에게 허용한다.

insert into pg_group values ('users', 100, '{500, 501, 506, 510}');
grant all on 회원2 to group users;

500, 501 등의 숫자는 UNIX 사용자 ID이고, 100은 그룹 ID이다. 이들은 각각 /etc/passwd와 /etc/group의 관련 내용에 해당한다.

pg_shadow - 유효한 사용자와 그 허용 권한

이름

타입

설명

usename

NameData

사용자의 이름

usesysid

int2

사용자의 UNIX 사용자 ID

bool

usecreatedb

사용자가 데이터베이스를 만들 수 있는 가의 여부

bool

usetrace

사용자가 추적 플래그를 설정할 수 있는 가의 여부

bool

usesuper

사용자가 postgres 수퍼유저가 될 수 있는가의 여부

bool

usecatupd

사용자가 카탈로그를 갱신할 수 있는가의 여부

select * from pg_shadow where usename = 'hoon';
usename|usesysid|usecreatedb|usetrace|usesuper|usecatupd|passwd|valuntil
-------+------+---------+-------+------+--------+-----+-----
hoon      |          500|t     |t         |t           |t         |           |

hoon이라는 사용자는 UNIX 사용자 500번이고, 데이터베이스를 생성할 수 있는 권한이 있고, 추적 플래그를 설정할 수 있으며, 다른 사용자를 데이터베이스 사용자로 추가할 수 있는 수퍼 유저 권한도 있으며, 카탈로그를 생산할 수 있는 권한도 있다. 이것은 postgres 사용자가 adduser로 사용자를 초기 생성할 때 모두 yes로 했을 경우이다.

update pg_shadow set usecatupd = 'f' where usename = 'hoon';
UPDATE 1
update pg_shadow set usecatupd = 't' where usename = 'hoon';
ERROR: pg_shadow: Permission denied.

카탈로그 갱신 권한을 다시 부여하려면, postgres 수퍼 사용자로 데이터베이스에 접속하여 해당 pg_shadow 컬럼을 갱신하면 된다.

pg_listener - 상황을 청취하고 있는 프로세스

이름

타입

설명

relname

NameData

동시성 통지를 희망하는 클래스의 이름

listenerpid

int4

동시성 통지를 기다리고 있는, 응용 프로그램의 서버 프로세스 ID

PostgreSQL 서버에는 동시성 통지와 청취라는 기능이 있다. 별달리 중요한 것은 아니고, 프로세스 사이의 동시성을 좀 더 확실히 하기 위해 지원하는 기능이다. 동일한 테이블 상에서 하나의 프로세스가 먼저 작업을 시작하기 전에 notify를 하고, 다음에 동일한 테이블을 접근하려는 프로세스가 listen을 하면, listen하는 프로세스는 해당 테이블에서 notify하는 다른 프로세스에게서 동시성 통지를 받게 된다. 이 때 listen하는 프로세스에 대한 정보가 pg_listener 카탈로그에 접수되는 것이다.

select * from pg_listener;
relname|listenerpid|notification
------+--------+--------
회원2    |      17816|  0

기타

  • 이외에도 시스템 카탈로그가 여러 개가 있지만 실 용도는 높지 않고, PostgreSQL 시스템이 내부적으로 사용하는 경우가 많다.
  • 될 수 있으면 정식 명령을 사용하도록 하고, 카탈로그에 대한 갱신은 꼭 필요한 경우에 부분적으로 사용하기 바란다.
  • 카탈로그에 대한 부분적인 갱신은 전체 카탈로그의 유기적인 관계에 좋지 않은 영향을 미칠 수 있기 때문이다.
  • 레이블 없음