우분투에 PostgreSQL 설치하는 방법
소개
PostgreSQL, 흔히 Postgres라고 불리는 이 데이터베이스는 강력한 오픈 소스 객체-관계형 데이터베이스 시스템입니다. 30년 이상의 활발한 개발 역사를 가진 PostgreSQL은 신뢰성, 기능의 견고함, 성능 면에서 강력한 명성을 얻고 있습니다.
우분투에 PostgreSQL을 설치하는 것은 여러 가지 설득력 있는 이유로 많은 개발자와 데이터베이스 관리자에게 인기 있는 선택입니다:
-
호환성: 우분투는 가장 널리 사용되는 리눅스 배포판 중 하나로, PostgreSQL과 뛰어난 호환성을 제공합니다.
-
성능: 우분투의 효율성과 PostgreSQL의 견고한 아키텍처가 결합되어 고성능 데이터베이스 운영을 가능하게 합니다.
-
보안: 우분투와 PostgreSQL 모두 강력한 보안 기능으로 알려져 있어 민감한 데이터를 다루기에 이상적입니다.
-
커뮤니티 지원: 우분투와 PostgreSQL 모두 크고 활발한 커뮤니티가 있어 필요할 때 도움을 쉽게 받을 수 있습니다.
-
무료 및 오픈 소스: 두 시스템 모두 무료로 사용 가능하며 오픈 소스이기 때문에 비용 효율적인 배포와 필요 시 맞춤화가 가능합니다.
이 가이드는 우분투 시스템에 PostgreSQL을 설치하는 과정을 준비부터 기본 사용법까지 단계별로 안내합니다. 개발 환경을 구축하든, 운영 서버를 준비하든, 이 튜토리얼은 우분투에서 PostgreSQL을 설치하고 실행하는 데 필요한 절차를 제공합니다.
사전 준비 사항
설치 과정을 시작하기 전에 시스템이 필요한 요구 사항을 충족하는지, 적절한 권한이 있는지 확인하는 것이 중요합니다. 사전 준비 사항을 살펴보겠습니다:
우분투 시스템 요구 사항
-
우분투 버전: 이 가이드는 우분투 20.04 LTS (Focal Fossa) 이상 버전에 적용됩니다. 안정성을 위해 최신 장기 지원(LTS) 버전을 사용하는 것이 권장됩니다.
-
시스템 자원: PostgreSQL은 제한된 자원에서도 실행 가능하지만 최적의 성능을 위해 다음 권장 사항을 고려하세요:
- CPU: 1GHz 이상 프로세서
- RAM: 최소 1GB (운영 환경에서는 4GB 이상 권장)
- 저장 공간: PostgreSQL 설치용 512MB 이상, 데이터베이스 용 추가 공간 필요
-
인터넷 연결: PostgreSQL 및 의존성 패키지를 다운로드하려면 활성 인터넷 연결이 필요합니다.
사용자 권한
PostgreSQL을 설치하려면 우분투 시스템에서 sudo 권한이 필요합니다. 즉, 루트 사용자로 로그인했거나 sudo를 사용해 루트 권한으로 명령을 실행할 수 있는 계정이어야 합니다.
사용자가 sudo 권한이 있는지 확인하려면 터미널에서 다음 명령을 실행하세요:
sudo -v
비밀번호 입력을 요청받고 오류 없이 명령이 실행되면 sudo 권한이 있는 것입니다.
터미널 접근
설치 및 구성 과정 대부분이 터미널에서 이루어지므로 명령줄 인터페이스(CLI)를 사용하는 데 익숙해야 합니다.
데이터 백업
중요한 데이터가 이미 있는 시스템에 PostgreSQL을 설치하는 경우, 주요 소프트웨어 설치 전에 데이터를 백업하는 것이 좋습니다.
시스템 업데이트
PostgreSQL 설치 전에 우분투 시스템이 최신 상태인지 확인하는 것이 중요합니다. 이 단계는 다음과 같은 이유로 필요합니다:
- 보안: 업데이트에는 중요한 보안 패치가 포함됩니다.
- 안정성: 최신 업데이트는 버그를 수정하고 시스템 안정성을 향상시킵니다.
- 호환성: 최신 패키지를 사용하면 PostgreSQL 설치 시 호환성 문제를 방지할 수 있습니다.
우분투 업데이트 절차
우분투 시스템을 업데이트하려면 다음 단계를 따르세요:
-
터미널을 엽니다.
Ctrl + Alt + T
를 누르거나 우분투 대시보드에서 "Terminal"을 검색하세요. -
먼저 업그레이드 및 새 패키지 설치를 위한 패키지 목록을 업데이트합니다:
sudo apt update
이 명령은 사용 가능한 패키지와 버전 목록을 새로 고치지만, 패키지를 설치하거나 업그레이드하지는 않습니다.
-
업데이트가 완료되면 설치된 패키지를 최신 버전으로 업그레이드합니다:
sudo apt upgrade
업그레이드할 패키지 목록이 표시되면 'Y'를 입력하고 Enter를 눌러 진행하세요.
-
선택적으로, 의존성 변경을 포함한 전체 시스템 업그레이드를 실행할 수 있습니다:
sudo apt full-upgrade
이 명령은 필요에 따라 일부 패키지를 제거할 수도 있으니 주의하세요.
-
업그레이드가 완료되면 모든 업데이트가 제대로 적용되도록 시스템을 재부팅하는 것이 좋습니다:
sudo reboot
업데이트 확인
시스템 재부팅 후 다음 명령으로 우분투 버전을 확인하여 업데이트가 성공했는지 검증할 수 있습니다:
lsb_release -a
이 명령은 우분투 배포판 정보와 버전 번호를 표시합니다.
PostgreSQL 저장소 추가
우분투 기본 저장소에도 PostgreSQL이 포함되어 있지만 최신 버전이 아닐 수 있습니다. 최신 안정 버전을 설치하기 위해 공식 PostgreSQL 저장소를 시스템에 추가하겠습니다.
공식 PostgreSQL 저장소를 추가하는 이유
- 최신 버전: 공식 저장소는 가장 최신 PostgreSQL 버전을 제공합니다.
- 신속한 업데이트: 보안 패치와 버그 수정이 더 빨리 제공됩니다.
- 일관성: 공식 저장소를 사용하면 PostgreSQL과 확장 기능 간 호환성이 보장됩니다.
PostgreSQL 저장소 추가 절차
다음 단계를 따라 우분투 시스템에 PostgreSQL 저장소를 추가하세요:
-
먼저 PostgreSQL 서명 키를 추가합니다. 이 키는 설치할 패키지의 진위를 확인하는 데 사용됩니다. 다음 명령을 실행하세요:
sudo apt-get install wget ca-certificates wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
-
다음으로, PostgreSQL 저장소를 시스템 소스 목록에 추가합니다.
/etc/apt/sources.list.d/
디렉터리에pgdg.list
라는 새 파일을 만듭니다:sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
이 명령은 저장소 정보를 포함하는 새 파일을 생성합니다.
$(lsb_release -cs)
부분은 우분투 버전 코드를 자동으로 감지하여 올바른 이름을 삽입합니다. -
저장소를 추가한 후 패키지 목록을 다시 업데이트하여 새 저장소를 포함시킵니다:
sudo apt update
저장소 추가 확인
PostgreSQL 저장소가 성공적으로 추가되었는지 확인하려면 pgdg.list
파일 내용을 확인하세요:
cat /etc/apt/sources.list.d/pgdg.list
다음과 유사한 줄이 표시되어야 합니다:
deb http://apt.postgresql.org/pub/repos/apt focal-pgdg main
(참고: "focal"은 우분투 버전 코드명에 따라 다를 수 있습니다)
PostgreSQL 설치
PostgreSQL 저장소를 추가하고 시스템을 업데이트했으니 이제 PostgreSQL을 설치할 준비가 되었습니다. 이 과정은 간단하며 몇 가지 명령으로 완료할 수 있습니다.
PostgreSQL 설치 명령
apt
패키지 관리자를 사용하여 PostgreSQL과 자주 사용되는 확장 기능을 함께 설치합니다:
sudo apt install postgresql postgresql-contrib
명령어 구성:
postgresql
: PostgreSQL 핵심 패키지postgresql-contrib
: 핵심 시스템에 포함되지 않지만 유용한 추가 유틸리티 및 기능 패키지
설치 중에 확인 메시지가 나타나면 'Y'를 입력하고 Enter를 눌러 진행하세요.
설치 확인
설치가 완료되면 PostgreSQL이 올바르게 설치되고 실행 중인지 확인하는 방법은 다음과 같습니다:
-
PostgreSQL 버전 확인:
psql --version
설치된 PostgreSQL 버전이 표시됩니다.
-
PostgreSQL 서비스 상태 확인:
sudo systemctl status postgresql
서비스가 활성(실행 중) 상태인지 확인하세요.
-
PostgreSQL이 기본 포트(5432)에서 연결을 수신하는지 확인:
sudo ss -tunelp | grep 5432
PostgreSQL이 정상 실행 중이면 출력이 나타납니다.
초기 PostgreSQL 설정
우분투에 PostgreSQL을 설치하면 자동으로 postgres
라는 새 사용자 계정이 생성됩니다. 이 계정은 기본 Postgres 역할과 연결되어 있습니다. 이 계정으로 전환하려면 다음을 실행하세요:
sudo -i -u postgres
그런 다음 PostgreSQL 프롬프트에 접속하려면:
psql
다음과 같은 화면이 나타납니다:
psql (13.x)
Type "help" for help.
postgres=#
PostgreSQL 프롬프트를 종료하려면:
\q
일반 사용자 계정으로 돌아가려면:
exit
축하합니다! 우분투 시스템에 PostgreSQL 설치를 성공적으로 완료했습니다. 다음 섹션에서는 PostgreSQL을 필요에 맞게 구성하는 방법을 다룹니다.
PostgreSQL 구성
PostgreSQL 설치 후에는 필요에 맞게 적절히 구성하는 것이 중요합니다. 이 섹션에서는 새 데이터베이스 생성, 새 사용자 설정, 인증 방법 구성에 대해 설명합니다.
새 데이터베이스 생성
기본적으로 PostgreSQL은 postgres
라는 데이터베이스를 생성합니다. 하지만 프로젝트별로 별도의 데이터베이스를 만드는 것이 좋습니다. 새 데이터베이스 생성 방법은 다음과 같습니다:
-
postgres 사용자로 전환:
sudo -i -u postgres
-
PostgreSQL 프롬프트 접속:
psql
-
CREATE DATABASE 명령어로 새 데이터베이스 생성:
CREATE DATABASE myproject;
myproject
를 원하는 데이터베이스 이름으로 바꾸세요. -
데이터베이스 생성 확인:
\l
모든 데이터베이스 목록이 표시됩니다.
새 사용자 설정
기본 postgres 슈퍼유저 대신 각 애플리케이션별로 새 사용자를 만드는 것이 권장됩니다. 방법은 다음과 같습니다:
-
psql 프롬프트에서 새 사용자 생성:
CREATE USER myuser WITH PASSWORD 'mypassword';
myuser
와mypassword
를 원하는 사용자명과 비밀번호로 바꾸세요. -
새 사용자에게 새 데이터베이스에 대한 권한 부여:
GRANT ALL PRIVILEGES ON DATABASE myproject TO myuser;
-
사용자 생성 확인:
\du
모든 사용자와 역할 목록이 표시됩니다.
인증 방법 구성
PostgreSQL은 pg_hba.conf
파일에서 다양한 인증 방법을 설정합니다. 수정 방법은 다음과 같습니다:
-
PostgreSQL 프롬프트 종료:
\q
-
텍스트 편집기로
pg_hba.conf
파일 열기 (sudo 권한 필요):sudo nano /etc/postgresql/13/main/pg_hba.conf
참고:
13
은 PostgreSQL 버전에 따라 다를 수 있습니다. -
파일 내 인증 설정 라인 예시:
# TYPE DATABASE USER ADDRESS METHOD local all postgres peer local all all md5 host all all 127.0.0.1/32 md5 host all all ::1/128 md5
local
: 유닉스 도메인 소켓 연결host
: TCP/IP 연결md5
: 비밀번호 인증peer
: 시스템 사용자명과 PostgreSQL 사용자명이 일치해야 인증
-
변경 후 파일 저장 및 편집기 종료
-
변경 사항 적용을 위해 PostgreSQL 재시작:
sudo systemctl restart postgresql
이것은 기본 설정입니다. 특히 운영 환경에서는 보안을 위해 추가 설정이 필요할 수 있습니다.
기본 PostgreSQL 명령어
PostgreSQL 설치 및 구성이 완료되었으니, 데이터베이스와 상호작용하는 데 유용한 기본 명령어를 살펴보겠습니다. 이 명령어들은 데이터베이스 및 테이블 관리, 기본 작업 수행에 필수적입니다.
PostgreSQL 접속
-
postgres 사용자로 접속:
sudo -i -u postgres
-
PostgreSQL 대화형 터미널 시작:
psql
-
특정 데이터베이스에 접속:
psql -d myproject
myproject
를 데이터베이스 이름으로 바꾸세요.
데이터베이스 작업
-
모든 데이터베이스 목록 보기:
\l
-
특정 데이터베이스에 접속:
\c myproject
-
새 데이터베이스 생성:
CREATE DATABASE newdb;
-
데이터베이스 삭제:
DROP DATABASE newdb;
테이블 작업
-
현재 데이터베이스의 테이블 목록 보기:
\dt
-
새 테이블 생성:
CREATE TABLE users ( id SERIAL PRIMARY KEY, name VARCHAR(100), email VARCHAR(100) UNIQUE NOT NULL );
-
테이블 구조 설명:
\d users
-
테이블 삭제:
DROP TABLE users;
기본 쿼리 예제
-
테이블에 데이터 삽입:
INSERT INTO users (name, email) VALUES ('John Doe', '[email protected]');
-
테이블의 모든 데이터 조회:
SELECT * FROM users;
-
테이블 데이터 수정:
UPDATE users SET name = 'Jane Doe' WHERE id = 1;
-
테이블 데이터 삭제:
DELETE FROM users WHERE id = 1;
기타 유용한 명령어
-
PostgreSQL 버전 확인:
SELECT version();
-
모든 사용자 및 역할 목록:
\du
-
현재 사용자 및 데이터베이스 정보:
\conninfo
-
파일에서 명령 실행:
\i filename.sql
-
psql 종료:
\q
이 명령어들은 시작하는 데 필요한 기본 사항입니다. PostgreSQL은 더 복잡한 작업과 최적화를 위한 다양한 고급 기능과 명령어를 제공합니다.
PostgreSQL 유지 관리
PostgreSQL 설치를 적절히 유지 관리하는 것은 최적의 성능, 데이터 무결성 및 보안을 보장하는 데 중요합니다. 이 섹션에서는 필수 유지 관리 작업을 다룹니다.
PostgreSQL 서비스 시작 및 중지
-
PostgreSQL 서비스 시작:
sudo systemctl start postgresql
-
PostgreSQL 서비스 중지:
sudo systemctl stop postgresql
-
PostgreSQL 서비스 재시작:
sudo systemctl restart postgresql
-
PostgreSQL 서비스 상태 확인:
sudo systemctl status postgresql
데이터베이스 백업 및 복원
정기적인 데이터베이스 백업은 데이터 보호에 필수적입니다. PostgreSQL은 여러 백업 및 복원 방법을 제공합니다.
백업 생성
-
단일 데이터베이스 백업:
pg_dump dbname > dbname.sql
-
모든 데이터베이스 백업:
pg_dumpall > all_databases.sql
백업에서 복원
-
단일 데이터베이스 복원:
psql dbname < dbname.sql
-
모든 데이터베이스 복원:
psql -f all_databases.sql postgres
PostgreSQL 업데이트
보안과 성능을 위해 PostgreSQL을 최신 상태로 유지하는 것이 중요합니다. 업데이트 방법은 다음과 같습니다:
-
패키지 목록 업데이트:
sudo apt update
-
PostgreSQL 업그레이드:
sudo apt upgrade postgresql postgresql-contrib
PostgreSQL 모니터링
-
활성 연결 확인:
SELECT * FROM pg_stat_activity;
-
데이터베이스 크기 모니터링:
SELECT pg_size_pretty(pg_database_size('dbname'));
-
테이블 크기 확인:
SELECT relname, pg_size_pretty(pg_total_relation_size(relid)) FROM pg_catalog.pg_statio_user_tables ORDER BY pg_total_relation_size(relid) DESC;
VACUUM 및 ANALYZE
PostgreSQL은 MVCC(다중 버전 동시성 제어)를 사용하여 테이블과 인덱스에 부하가 발생할 수 있습니다. VACUUM 명령어가 이를 관리합니다:
-
특정 테이블 VACUUM:
VACUUM tablename;
-
VACUUM 및 통계 업데이트(ANALYZE):
VACUUM ANALYZE;
-
자동 VACUUM 활성화 여부는
postgresql.conf
파일에서 확인:autovacuum = on
로그 관리
PostgreSQL 로그는 문제 해결과 성능 튜닝에 유용합니다:
-
로그 파일 위치 확인:
SHOW log_directory; SHOW log_filename;
-
postgresql.conf
파일에서 로깅 설정을 수정하여 기록 내용을 조정할 수 있습니다.
이것들은 기본 유지 관리 작업입니다. 운영 환경에서는 복제 설정, 부하 분산, 고급 백업 및 모니터링 솔루션 등 더 복잡한 전략이 필요할 수 있습니다.
일반적인 문제 해결
신중한 설정과 유지 관리에도 불구하고 PostgreSQL 설치 중 문제를 겪을 수 있습니다. 다음은 흔한 문제와 해결책입니다:
권한 문제
-
문제: PostgreSQL 접근 시 "Permission denied" 오류 발생.
해결책:
- 사용자가 필요한 권한을 가지고 있는지 확인:
sudo -i -u postgres createuser --interactive
- 사용자에게 권한 부여:
GRANT ALL PRIVILEGES ON DATABASE mydb TO myuser;
- 사용자가 필요한 권한을 가지고 있는지 확인:
-
문제: 우분투 사용자로 PostgreSQL에 접근 불가.
해결책:
- 우분투 사용자명과 동일한 PostgreSQL 역할 생성:
sudo -u postgres createuser --interactive
- 우분투 사용자명과 동일한 PostgreSQL 역할 생성:
연결 문제
-
문제: "Connection refused" 오류 발생.
해결책:
- PostgreSQL 실행 상태 확인:
sudo systemctl status postgresql
- 실행 중이 아니면 시작:
sudo systemctl start postgresql
postgresql.conf
에서 올바른 주소로 리스닝 설정 확인:listen_addresses = 'localhost' # 또는 모든 인터페이스는 '*'
- PostgreSQL 실행 상태 확인:
-
문제: 원격 접속 불가.
해결책:
pg_hba.conf
에서 원격 접속 허용:host all all 0.0.0.0/0 md5
postgresql.conf
에서 리스닝 주소 변경:listen_addresses = '*'
- PostgreSQL 재시작:
sudo systemctl restart postgresql
버전 충돌
-
문제: PostgreSQL 버전과 설치된 확장 기능 간 호환성 문제.
해결책:
- PostgreSQL 버전 확인:
psql --version
- 확장 기능 호환성 확인 및 필요 시 업그레이드:
ALTER EXTENSION extension_name UPDATE TO 'new_version';
- PostgreSQL 버전 확인:
성능 문제
-
문제: 쿼리 지연 또는 전반적인 성능 저하.
해결책:
- EXPLAIN ANALYZE로 쿼리 실행 계획 분석:
EXPLAIN ANALYZE SELECT * FROM large_table WHERE condition;
- 적절한 인덱스 생성:
CREATE INDEX idx_name ON table_name (column_name);
postgresql.conf
에서 설정 조정:shared_buffers = 256MB effective_cache_size = 768MB
- EXPLAIN ANALYZE로 쿼리 실행 계획 분석:
-
문제: 데이터베이스 부풀기(bloat)로 인한 성능 저하.
해결책:
- 정기적으로 VACUUM 및 ANALYZE 실행:
VACUUM ANALYZE;
- 자동 VACUUM 설정 고려.
- 정기적으로 VACUUM 및 ANALYZE 실행:
디스크 공간 문제
-
문제: 디스크 공간 부족.
해결책:
- 큰 테이블 및 인덱스 확인:
SELECT relname, pg_size_pretty(pg_total_relation_size(relid)) FROM pg_catalog.pg_statio_user_tables ORDER BY pg_total_relation_size(relid) DESC;
- 불필요한 데이터 삭제 또는 아카이브.
- 매우 큰 테이블은 파티셔닝 고려.
- 큰 테이블 및 인덱스 확인:
이들은 일반적인 해결책이며, PostgreSQL 버전과 시스템 구성에 따라 다를 수 있습니다. 중요한 변경 전에는 항상 데이터를 백업하세요.
자주 묻는 질문 (FAQ)
Q: 내가 사용 중인 PostgreSQL 버전을 어떻게 확인하나요?
A: 터미널에서 다음 명령을 사용하세요:
psql --version
또는 psql 프롬프트 내에서는:
SELECT version();
Q: 같은 우분투 시스템에 여러 버전의 PostgreSQL을 설치할 수 있나요?
A: 네, 가능합니다. 다만 포트와 데이터 디렉터리를 신중히 관리하여 충돌을 방지해야 합니다.
Q: PostgreSQL 사용자 비밀번호를 어떻게 변경하나요?
A: 다음 SQL 명령어를 사용하세요:
ALTER USER username WITH PASSWORD 'new_password';
Q: PostgreSQL 서버에 원격 접속을 활성화하려면 어떻게 해야 하나요?
A: postgresql.conf
와 pg_hba.conf
파일을 수정해야 합니다. postgresql.conf
에서 listen_addresses = '*'
로 설정하고, pg_hba.conf
에 host all all 0.0.0.0/0 md5
같은 라인을 추가하세요. 변경 후 PostgreSQL을 재시작해야 합니다.
Q: PostgreSQL에서 TRUNCATE와 DELETE의 차이점은 무엇인가요?
A: TRUNCATE는 테이블의 모든 행을 개별적으로 스캔하지 않고 빠르게 제거합니다. DELETE는 행을 하나씩 삭제하며 트랜잭션 로그에 기록합니다. TRUNCATE는 시퀀스를 리셋하고 DELETE 트리거를 발생시키지 않습니다.
Q: PostgreSQL 성능을 어떻게 향상시킬 수 있나요?
A: 성능 향상 방법은 다음과 같습니다:
- 적절한 인덱싱
- 정기적인 VACUUM 및 ANALYZE
- 쿼리 최적화
- PostgreSQL 설정 파라미터 조정
- 하드웨어 업그레이드 (특히 RAM 추가)