티스토리 뷰
0. PostgreSQL
PostgreSQL 은 확장 가능성 및 표준 준수를 강조하는 객체-관계형 데이터베이스 관리 시스템의 하나입니다.
SQL 을 이용하여 데이터를 다룰 수 있게하며, 안정적인 트랜잭션 및 다양한 격리레벨의 동시성과 같은 많은 고급 기능을 제공합니다. 실제로 mac os 의 기본 데이터 베이스로 사용되는 PostgreSQL을 ubuntu 20.04 에 설치하는 방법을 알아보겠습니다
ubuntu 20.04 원격 서버에 mac 으로 ssh 접속해서 설치했습니다.
1. PostgreSQL 설치 및 확인
서버의 로컬 페키지를 업데이트 해줍니다.
$ sudo apt update
PostgreSQL package 를 -contrib package 와 함께 설치해줍니다.
$ sudo apt install postgresql postgresql-contrib
PostgreSQL 은 extension 이라는 기능을 제공합니다. extenstion을 통해서 제 3자의 프로그램을 plug-in 형태로 PostgreSQL에 연동할 수 있습니다. 이때 postgresql-contrib package 는 PostgreSQL 에서 사용하는 다양한 extenstion 을 제공합니다.
대표적으로 pg_stat_statements, pgrowlocks, pgcrypto 등의 extension들이 포함됩니다. 상세한 목록은 공식 메뉴얼(https://www.postgresql.org/docs/current/contrib.html)에서 확인할 수 있습니다.
설치 로그를 확인해보면 다음과 같은 문구를 확인할 수 있습니다.
Success. You can now start the database server using:
pg_ctlcluster 12 main start
PostgreSQL 은 클러스터로 데이터베이스를 관리합니다. 간단하게 '클러스터 > 데이터베이스 > 테이블' 의 순서로 생각해볼 수 있습니다. 여러개의 클러스터가 존재할 수 있고 한 클러스터 내에 여러개의 데이터베이스를 가질 수 있습니다.
pg_ctlcluster 는 PostgreSQL의 다양한 버전과 여러 클러스터를 효율적으로 관리하기 위한 스크립트 파일입니다.
database server를 실행하기 위해 위의 명령어를 입력하면 이미 실행되고 있다고 주의문구가 나옵니다. 정말 실행되고 있는지 확인해볼까요?
$ ps -ef | grep postgres
로 실행되고 있는 process 를 확인해보면
postgres 3496 1 0 04:53 ? 00:00:00 /usr/lib/postgresql/12/bin/postgres -D /var/lib/postgresql/12/main -c config_file=/etc/postgresql/12/main/postgresql.conf
postgres 의 Postmaster 프로세스를 확인할 수 있습니다. ubuntu 의 pstree 를 이용하면 process 의 부모 자식관계를 확인할 수 있는데, 이를 이용해서 Postmaster 프로세스의 tree 를 확인해보면 (pstree -p PID 를 이용해 특정 PID의 프로세스 구조를 확인가능)
$ pstree -p 3496 -al
postgres,3496 -D /var/lib/postgresql/12/main -c config_file=/etc/postgresql/12/main/postgresql.conf
├─postgres,3498
├─postgres,3499
├─postgres,3500
├─postgres,3501
├─postgres,3502
└─postgres,3503
Postmaster 프로세스와 그에 딸린 자식 프로세스들을 확인할 수 있습니다.
Postmaster 의 자식 프로세스로 logger, checkpointer, autovacuum 등 다양한 백그라운드 프로세스들이 있습니다.
2. PostgreSQL prompt
postgres 는 roles 방식을 이용해서 사용자의 인증과 인가처리를 처리합니다. 이런 roles 방식은 유닉스 계열의 유저/그룹 방식과 유사합니다. postgres 가 설치 될때, postgres 는 ident authentication 을 사용하도록 세팅됩니다. 이렇게 세팅됨으로서 postgres 는 운영체제의 계정과 연동됩니다. 즉 postgres 에서 A 라는 새로운 role 을 만들고 A에 (가), (나) 라는 권한을 부여한다면, A 라는 이름의 user 가 ubuntu 에 생성되고, 우리가 ubuntu 의 A user 로 로그인하여 postgres 에 접속한다면 (가), (나) 의 권한을 사용할 수 있습니다.
postgres 는 설치과정에서 기본 사용자로 postgres role을 생성합니다. 처음 postgres가 설치될때의 로그를 살펴보면,
Setting up ssl-cert (1.0.39) ...
Setting up postgresql-common (214ubuntu0.1) ...
Adding user postgres to group ssl-cert
Creating config file /etc/postgresql-common/createcluster.conf with new version
Building PostgreSQL dictionaries from installed myspell/hunspell packages...
Adding user postgres to group ssl-cert 부분에서 postgres 이름의 user 가 추가된 것을 확인할 수 있습니다.
또한 아래 명령어를 통해 postgres 라는 이름의 사용자가 ubuntu 에 생성된 것을 확인할 수 있습니다.
$ cut -f1 -d: /etc/passwd | grep postgres
그럼 postgres prompt 에 접속해볼까요?
$ psql
위 명령어를 통해 postgres prompt 에 접속할 수 있습니다. 하지만 psql: error: FATAL: role "sehyeona" does not exist 와 같은 에러가 발생하는군요. 제 ubuntu의 기본 user는 sehyeona 인데, postgres 에는 다음과 같은 role 이 존재하지 않기 때문에 발생하는 문제입니다. postgres role 에 존재하는 ubuntu user 로 바꿔준 뒤, postgres prompt 에 접속해야합니다.
$ sudo -i -u postgres
$ psql
postgres user로 변경하고 psql 을 이용해 prompt 에 접속해봅시다.
테스트도 해볼겸 \du+ 명령어를 통해 지금 모든 user 들의 목록을 description과 함께 조회해봅니다.
postgres-# \du+
List of roles
Role name | Attributes | Member of | Description
-----------+------------------------------------------------------------+-----------+-------------
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {} |
prompt 를 종료하기위해 다음 명령어를 이용할 수 있습니다.
postgres-# \q
또한 exit를 이용해 postgres user 에서 원래 user 로 돌아갈 수 있습니다. 저의 경우에는 sehyeona 로 돌아왔습니다.
postgres@sehyeona:~$ exit
logout
sehyeona@sehyeona:~$
prompt 에 접속하는 또 다른 방법으로 다음 명령어를 이용할 수 있습니다.
$ sudo -u postgres psql
위 명령어를 이용해 bash shell 을 거치는 과정 없이 곧장 prompt 로 접속할 수 있으며, 종료하는 방식은 위의 코드와 동일합니다.