소개
PostgreSQL 면접에서 탁월한 성과를 거두는 데 필요한 지식과 자신감을 갖추도록 설계된 이 포괄적인 가이드에 오신 것을 환영합니다. 숙련된 데이터베이스 관리자, 신진 개발자 또는 DevOps 엔지니어이든 관계없이 이 문서는 기본 개념 및 SQL 쿼리부터 고급 아키텍처, 성능 튜닝 및 보안에 이르기까지 광범위한 주제를 다룹니다. 자주 묻는 질문과 자세한 답변을 시나리오 기반 도전 과제 및 역할별 질문과 함께 세심하게 수집하여 끊임없이 진화하는 PostgreSQL 세계에서 철저히 준비하고 전문성을 입증할 수 있도록 도와드립니다. 지금 바로 시작하여 경력을 향상시키세요!

PostgreSQL 기초 및 핵심 개념
PostgreSQL 이란 무엇이며 주요 기능은 무엇인가요?
답변:
PostgreSQL 은 강력한 오픈 소스 객체 - 관계형 데이터베이스 시스템으로, 안정성, 풍부한 기능 및 성능으로 잘 알려져 있습니다. 주요 기능으로는 ACID 준수, 다양한 데이터 타입 (JSONB 포함) 지원, 확장성 및 고급 인덱싱 기법 등이 있습니다.
PostgreSQL 맥락에서 ACID 속성 개념을 설명해주세요.
답변:
ACID 는 원자성 (Atomicity), 일관성 (Consistency), 고립성 (Isolation), 지속성 (Durability) 을 의미합니다. PostgreSQL 은 트랜잭션에 대해 이러한 속성을 보장합니다. 원자성은 모든 작업이 성공하거나 실패함을 의미하고, 일관성은 데이터 무결성 규칙이 유지됨을 보장하며, 고립성은 동시 트랜잭션이 서로 간섭하지 않음을 의미하고, 지속성은 시스템 장애 발생 후에도 커밋된 데이터가 영구적으로 유지됨을 의미합니다.
PostgreSQL 에서 VARCHAR와 TEXT 데이터 타입의 차이점은 무엇인가요?
답변:
VARCHAR(n)은 n개의 문자로 제한된 문자열을 저장하며 길이 제한을 강제합니다. TEXT는 미리 정의된 제한 없이 임의 길이의 문자열을 저장합니다. 기능적으로 성능 차이는 거의 없지만, VARCHAR(n)은 길이 검사 오버헤드가 추가됩니다.
PRIMARY KEY 및 FOREIGN KEY 제약 조건의 목적을 설명해주세요.
답변:
PRIMARY KEY는 테이블의 각 레코드를 고유하게 식별하며 중복되거나 null 값이 없도록 하여 데이터 무결성을 강제합니다. FOREIGN KEY는 두 테이블 간의 연결을 설정하고, 외래 키 열의 값이 다른 테이블의 기본 키 값과 일치하도록 하여 참조 무결성을 강제합니다.
PostgreSQL 에서 인덱스란 무엇이며 왜 사용되나요?
답변:
인덱스는 데이터베이스 테이블에서 데이터 검색 작업의 속도를 향상시키는 데이터베이스 객체입니다. 하나 이상의 열에서 값의 정렬된 목록을 생성하여 데이터베이스가 전체 테이블을 스캔하지 않고도 행을 빠르게 찾을 수 있도록 합니다. 대규모 데이터셋에서 쿼리 성능에 매우 중요합니다.
PostgreSQL 에서 트랜잭션 개념을 설명해주세요.
답변:
트랜잭션은 하나 이상의 SQL 문으로 구성된 단일 논리적 작업 단위입니다. PostgreSQL 은 트랜잭션 내의 모든 문이 성공적으로 완료되거나 (커밋) 아무것도 완료되지 않도록 (롤백) 하여 데이터 무결성과 일관성을 유지합니다.
PostgreSQL 에서 pg_hba.conf 파일의 역할은 무엇인가요?
답변:
pg_hba.conf (host-based authentication) 는 PostgreSQL 의 클라이언트 인증 구성 파일입니다. 어떤 호스트가 연결할 수 있는지, 해당 호스트에서 어떤 PostgreSQL 사용자가 연결할 수 있는지, 어떤 데이터베이스에 연결할 수 있는지, 그리고 사용되는 인증 방법 (예: trust, md5, scram-sha-256) 을 제어합니다.
실행 중인 PostgreSQL 버전을 확인하는 방법은 무엇인가요?
답변:
데이터베이스에 연결하고 SQL 쿼리 SELECT version();를 실행하여 PostgreSQL 버전을 확인할 수 있습니다. 이 명령은 전체 버전 번호와 빌드 정보가 포함된 문자열을 반환합니다.
PostgreSQL 의 EXPLAIN 명령의 목적을 간략하게 설명해주세요.
답변:
EXPLAIN 명령은 SQL 문의 실행 계획을 표시하는 데 사용됩니다. PostgreSQL 이 쿼리를 어떻게 실행할 것인지, 어떤 테이블이 스캔될 것인지, 어떤 인덱스가 사용될 것인지, 그리고 작업 순서 등을 보여주어 성능 병목 현상을 식별하는 데 도움을 줍니다.
PostgreSQL 의 WAL (Write-Ahead Logging) 을 간략하게 설명해주세요.
답변:
WAL 은 데이터 무결성과 지속성을 보장하는 표준 방법입니다. 변경 사항이 주 데이터베이스 파일에 기록되기 전에 먼저 로그 파일 (WAL) 에 기록됩니다. 이를 통해 충돌 발생 시 로그를 다시 재생하여 데이터베이스를 일관된 상태로 복구할 수 있습니다.
SQL 쿼리 및 데이터 조작
SQL 에서 DELETE, TRUNCATE, DROP 문의 차이점을 설명해주세요.
답변:
DELETE는 행을 하나씩 제거하며, 롤백이 가능하고 트리거를 발생시킵니다. TRUNCATE는 모든 행을 빠르게 제거하며, 롤백이 불가능하고 트리거를 발생시키지 않습니다. DROP은 테이블 구조와 데이터를 영구적으로 제거합니다.
GROUP BY 절의 목적은 무엇이며 집계 함수와 어떻게 함께 작동하나요?
답변:
GROUP BY는 지정된 열에서 동일한 값을 가진 행들을 요약 행으로 그룹화합니다. 이는 전체 결과 집합이 아닌 각 그룹에 대한 계산을 수행하기 위해 집계 함수 (예: COUNT, SUM, AVG, MAX, MIN) 와 함께 사용됩니다.
SQL 의 다양한 JOIN 연산 유형을 설명해주세요.
답변:
일반적인 JOIN 유형에는 INNER JOIN (두 테이블에서 일치하는 행 반환), LEFT JOIN (왼쪽 테이블의 모든 행과 오른쪽 테이블의 일치하는 행 반환), RIGHT JOIN (오른쪽 테이블의 모든 행과 왼쪽 테이블의 일치하는 행 반환), FULL OUTER JOIN (두 테이블 중 하나라도 일치하는 모든 행 반환) 이 있습니다.
서브쿼리 (Subquery) 란 무엇이며 언제 사용하나요?
답변:
서브쿼리 (또는 내부 쿼리) 는 다른 SQL 쿼리 내부에 중첩된 쿼리입니다. 메인 쿼리에서 조건으로 사용될 데이터를 반환하거나 비교를 위한 값 집합을 제공하는 데 사용될 수 있습니다. 복잡한 필터링이나 값이 다른 쿼리의 결과에 의존하는 경우에 유용합니다.
WHERE 절과 HAVING 절의 차이점을 설명해주세요.
답변:
WHERE는 그룹화가 발생하기 전에 개별 행을 필터링하는 데 사용됩니다. HAVING은 GROUP BY 절이 적용되고 집계 함수가 계산된 후 그룹화된 행을 필터링하는 데 사용됩니다. HAVING은 집계 함수를 사용할 수 있지만, WHERE는 사용할 수 없습니다.
SQL 의 윈도우 함수 (Window Functions) 란 무엇이며 예시를 들어주세요.
답변:
윈도우 함수는 행을 축소하지 않고 현재 행과 관련된 테이블 행 집합에 대해 계산을 수행합니다. 순위 지정, 이동 평균 또는 누적 합계와 같은 계산을 가능하게 합니다. 예시: ROW_NUMBER() OVER (PARTITION BY category ORDER BY sales DESC).
SQL 을 사용하여 테이블의 중복 레코드를 어떻게 처리하나요?
답변:
중복을 찾으려면 GROUP BY와 COUNT(*) > 1을 사용합니다. 중복을 제거하려면 하위 쿼리 또는 CTE 를 사용하여 중복을 식별하고 하나를 제외한 모든 인스턴스를 제거하거나, SELECT 문에서 DISTINCT를 사용하여 고유한 행을 검색할 수 있습니다.
CTE(Common Table Expression) 란 무엇이며 왜 유용한가요?
답변:
CTE (WITH 절로 정의됨) 는 단일 SELECT, INSERT, UPDATE 또는 DELETE 문 내에서 참조할 수 있는 임시 명명된 결과 집합입니다. 가독성을 향상시키고 복잡한 쿼리를 단순화하며 재귀적으로 사용할 수 있습니다.
SQL 에서 NULL 값의 개념과 비교 시 어떻게 처리되는지 설명해주세요.
답변:
NULL은 누락되거나 알 수 없는 데이터를 나타냅니다. 0 이나 빈 문자열과 같지 않습니다. 비교 시 NULL은 특별하게 동작합니다: NULL = NULL은 TRUE가 아니라 UNKNOWN입니다. NULL 값을 확인하려면 IS NULL 또는 IS NOT NULL을 사용해야 합니다.
단일 INSERT 문으로 테이블에 여러 행을 삽입하는 방법은 무엇인가요?
답변:
VALUES 키워드 뒤에 쉼표로 구분된 여러 값 집합을 제공하여 여러 행을 삽입할 수 있습니다. 예시: INSERT INTO products (name, price) VALUES ('Laptop', 1200), ('Mouse', 25), ('Keyboard', 75);
PostgreSQL 아키텍처 및 관리
PostgreSQL 아키텍처의 핵심 구성 요소를 설명해주세요.
답변:
PostgreSQL 아키텍처는 서버 프로세스 (Postmaster), 백그라운드 프로세스 (예: Wal Writer, Checkpointer, Autovacuum), 공유 메모리 및 데이터 파일로 구성됩니다. 클라이언트 애플리케이션은 Postmaster 에 연결하며, Postmaster 는 각 연결에 대해 새로운 백엔드 프로세스를 포크하여 쿼리를 처리합니다.
PostgreSQL 에서 WAL(Write-Ahead Logging) 의 역할은 무엇인가요?
답변:
WAL 은 데이터 무결성과 지속성을 보장합니다. 데이터 파일에 대한 모든 변경 사항은 먼저 WAL 로그에 기록됩니다. 이를 통해 충돌 복구 (로그를 다시 재생하여 상태 복원) 및 WAL 세그먼트 아카이빙을 통한 시점 복구 (PITR) 가 가능합니다.
pg_basebackup의 목적을 설명해주세요.
답변:
pg_basebackup은 실행 중인 PostgreSQL 클러스터의 일관된 기본 백업을 생성하는 데 사용됩니다. 모든 데이터 파일과 필요한 WAL 세그먼트를 복사하여 시점 복구 또는 복제본 설정을 위한 기반을 형성합니다.
PostgreSQL 에서 시점 복구 (PITR) 를 수행하는 방법은 무엇인가요?
답변:
PITR 은 기본 백업을 복원한 다음 특정 타임스탬프 또는 트랜잭션 ID 까지 아카이브된 WAL 세그먼트를 다시 재생하는 것을 포함합니다. 이를 위해서는 복구 대상 및 WAL 아카이브 위치를 지정하는 recovery.conf (또는 최신 버전에서는 postgresql.conf) 파일이 필요합니다.
Autovacuum 이란 무엇이며 왜 중요한가요?
답변:
Autovacuum 은 사용되지 않는 튜플 (dead tuples) 이 차지하는 스토리지를 자동으로 회수하고 통계 정보를 업데이트하는 백그라운드 프로세스 집합입니다. 트랜잭션 ID 래퍼라운드 (wraparound) 를 방지하고, 인덱스를 효율적으로 유지하여 쿼리 성능을 향상시키며, 테이블 블로트 (bloat) 를 줄입니다.
VACUUM과 VACUUM FULL의 차이점을 설명해주세요.
답변:
VACUUM은 사용되지 않는 튜플에서 공간을 회수하여 재사용하지만 OS 에 반환하지는 않으며, 다른 작업과 동시에 실행될 수 있습니다. VACUUM FULL은 전체 테이블을 다시 작성하여 OS 에 공간을 반환하지만, 배타적 잠금 (exclusive lock) 이 필요하며 훨씬 느립니다.
PostgreSQL 에서 높은 CPU 사용률 문제를 어떻게 해결하겠습니까?
답변:
먼저 pg_stat_activity에서 활성 쿼리를 확인하고, pg_stat_statements에서 비용이 많이 드는 쿼리를 확인하며, pg_top 또는 top으로 시스템 수준 CPU 사용량을 확인하는 것부터 시작할 것입니다. 쿼리 계획 분석 (EXPLAIN ANALYZE) 및 누락된 인덱스 확인이 다음 단계가 될 것입니다.
PostgreSQL 테이블스페이스 (tablespaces) 란 무엇이며 언제 사용하나요?
답변:
테이블스페이스를 사용하면 데이터베이스 객체 (테이블, 인덱스) 를 파일 시스템의 다른 위치에 저장할 수 있습니다. 여러 디스크에 걸쳐 스토리지를 관리하거나, 자주 액세스하는 데이터를 분리하여 I/O 성능을 향상시키거나, 특정 스토리지 요구 사항을 충족하는 데 유용합니다.
PostgreSQL 성능을 어떻게 모니터링하나요?
답변:
주요 모니터링 도구로는 pg_stat_activity, pg_stat_statements, pg_locks, pg_buffercache가 있습니다. Prometheus/Grafana와 같은 외부 도구나 전문 모니터링 솔루션도 연결 수, 디스크 I/O, 쿼리 실행 시간과 같은 메트릭을 추적하는 데 일반적으로 사용됩니다.
pg_dump와 pg_restore의 목적을 설명해주세요.
답변:
pg_dump는 PostgreSQL 데이터베이스의 논리적 백업을 생성하며, 일반 텍스트 또는 사용자 정의 형식으로 저장될 수 있습니다. pg_restore는 사용자 정의 또는 디렉토리 형식으로 pg_dump가 생성한 백업을 복원하는 데 사용되며, 특정 객체를 유연하게 복원할 수 있습니다.
성능 튜닝 및 최적화
PostgreSQL 에서 느린 쿼리를 어떻게 식별하나요?
답변:
느린 쿼리는 EXPLAIN ANALYZE를 사용하여 실행 계획과 타이밍을 확인함으로써 식별할 수 있습니다. pg_stat_statements 확장 프로그램은 쿼리 통계 (총 실행 시간 및 호출 횟수 포함) 를 추적하는 데 매우 유용하며, 이를 통해 가장 리소스 집약적인 쿼리를 정확히 찾아낼 수 있습니다.
EXPLAIN ANALYZE란 무엇이며 성능 튜닝에 어떻게 사용되나요?
답변:
EXPLAIN ANALYZE는 쿼리의 실행 계획을 보여주고 실제로 실행하여 각 단계에 대한 실제 실행 시간을 제공합니다. 순차 스캔, 비용이 많이 드는 조인 또는 비효율적인 인덱스 사용과 같은 병목 현상을 식별하는 데 도움이 되며, 인덱스를 추가하거나 쿼리를 다시 작성해야 할 위치를 안내합니다.
언제 인덱스를 사용해야 하며 PostgreSQL 에서 사용할 수 있는 인덱스 유형은 무엇인가요?
답변:
인덱스는 특히 WHERE 절, JOIN 조건, ORDER BY 및 GROUP BY에 대한 데이터 검색 작업을 가속화하는 데 사용됩니다. PostgreSQL 은 B-tree(가장 일반적), Hash, GiST, SP-GiST, GIN 및 BRIN 인덱스를 제공하며, 각 인덱스는 서로 다른 데이터 유형 및 쿼리 패턴에 최적화되어 있습니다.
PostgreSQL 에서 VACUUM 의 개념과 성능에 대한 중요성을 설명해주세요.
답변:
VACUUM 은 사용되지 않는 튜플 (삭제 표시되었지만 아직 제거되지 않은 행) 이 차지하는 스토리지를 회수하고 쿼리 플래너를 위한 통계 정보를 업데이트합니다. 정기적인 VACUUM 작업은 테이블 블로트 (bloat) 를 방지하고, 스캔하는 데이터를 줄여 쿼리 성능을 향상시키며, 트랜잭션 ID 래퍼라운드 (wraparound) 방지에 중요합니다.
테이블 블로트 (table bloat) 란 무엇이며 어떻게 완화할 수 있나요?
답변:
테이블 블로트는 사용되지 않는 튜플이 축적되어 테이블과 인덱스가 불필요하게 많은 디스크 공간을 차지하고 쿼리가 느려지는 현상입니다. 정기적인 VACUUM 및 VACUUM FULL(단, VACUUM FULL은 테이블을 잠금) 과 적절한 autovacuum 매개변수 설정을 통해 완화할 수 있습니다.
PostgreSQL 에서 JOIN 작업을 어떻게 최적화하나요?
답변:
조인 열에 적절한 인덱스가 있는지 확인하여 JOIN 작업을 최적화합니다. 조인 시 테이블 순서를 고려하고 (옵티마이저가 종종 처리하지만), EXPLAIN ANALYZE를 사용하여 옵티마이저가 Nested Loop, Hash Join 또는 Merge Join 과 같은 효율적인 조인 방법을 선택하는지 확인합니다.
성능을 위해 조정할 주요 PostgreSQL 구성 매개변수는 무엇인가요?
답변:
주요 매개변수에는 shared_buffers(데이터 블록 캐싱용), work_mem(메모리 내 정렬/해시용), maintenance_work_mem(VACUUM/INDEX 작업용), wal_buffers(WAL 쓰기용) 및 effective_cache_size(OS 캐시 크기에 대한 옵티마이저 정보 제공용) 가 있습니다.
PostgreSQL 쿼리 플래너는 어떻게 작동하며, 어떻게 영향을 줄 수 있나요?
답변:
쿼리 플래너 (옵티마이저) 는 SQL 쿼리를 분석하고 가장 효율적인 실행 계획을 생성합니다. 테이블 통계 (ANALYZE 및 VACUUM으로 업데이트됨) 를 사용하여 비용을 추정합니다. 적절한 인덱스를 생성하거나, 복잡한 쿼리를 다시 작성하거나, 때로는 테스트를 위해 SET enable_seqscan = off;를 사용하여 영향을 줄 수 있습니다.
성능 모니터링에서 pg_stat_statements의 역할은 무엇인가요?
답변:
pg_stat_statements는 서버에서 실행된 모든 쿼리의 실행 통계를 추적하는 확장 프로그램입니다. 쿼리 빈도, 총 실행 시간, 평균 시간, 반환된 행 등에 대한 통찰력을 제공하여 상위 N 개의 느린 쿼리 및 전반적인 워크로드 분석을 식별하는 데 필수적입니다.
대규모 테이블을 파티셔닝 (partitioning) 하는 것을 고려해야 할 때는 언제인가요?
답변:
대규모 테이블은 효율적으로 관리하기 어려울 정도로 커져 쿼리, 유지 관리 및 백업이 느려질 때 파티셔닝을 고려합니다. 관련 파티션만 스캔하도록 하여 쿼리 성능을 향상시키고, 유지 관리 (예: 오래된 데이터 삭제) 를 단순화하며, 인덱스 성능을 향상시킬 수 있습니다.
복제, 백업 및 복구
PostgreSQL 에서 WAL(Write-Ahead Log) 의 목적은 무엇이며, 복제 및 복구와는 어떻게 관련되나요?
답변:
WAL 은 데이터 파일에 적용되기 전에 모든 변경 사항을 기록하여 데이터 무결성과 지속성을 보장합니다. 복제의 경우, WAL 레코드는 대기 서버로 스트리밍됩니다. 복구의 경우, WAL 은 충돌 후 데이터베이스를 일관된 상태로 되돌리거나 특정 시점으로 복원하는 데 사용됩니다.
PostgreSQL 에서 물리적 복제와 논리적 복제의 차이점을 설명해주세요.
답변:
물리적 복제 (스트리밍 복제) 는 전체 데이터 디렉토리와 WAL 레코드를 복사하여 바이트 단위로 동일하게 만듭니다. 논리적 복제는 논리적 수준 (행 단위) 에서 데이터 변경 사항을 복제하여 선택적 복제, 다른 주요 버전 및 이기종 환경을 허용합니다.
기본 백업 (base backup) 이란 무엇이며, 복구에 왜 필수적인가요?
답변:
기본 백업은 특정 시점의 데이터베이스 파일에 대한 일관된 스냅샷입니다. 복구를 위한 시작점을 제공하기 때문에 필수적입니다. 기본 백업 이후에 생성된 WAL 레코드는 데이터베이스를 최신 상태 또는 원하는 시점으로 가져오는 데 적용됩니다.
PostgreSQL 에서 시점 복구 (PITR) 를 수행하는 데 관련된 단계를 설명해주세요.
답변:
PITR 은 기본 백업을 복원한 다음, 원하는 복구 대상 시간 또는 트랜잭션 ID 까지 아카이브 위치에서 WAL 세그먼트를 적용하는 것을 포함합니다. 이를 통해 WAL 레코드를 사용할 수 있는 모든 특정 순간으로 데이터베이스를 복원할 수 있습니다.
pg_basebackup이란 무엇이며, 주요 장점은 무엇인가요?
답변:
pg_basebackup은 실행 중인 PostgreSQL 클러스터의 일관된 기본 백업을 수행하는 유틸리티입니다. 파일 시스템 스냅샷이 필요하지 않고, 백업을 직접 스트리밍할 수 있으며, 복구에 필요한 WAL 파일을 자동으로 포함한다는 장점이 있습니다.
PostgreSQL 에서 스트리밍 복제를 구성하는 방법은 무엇인가요?
답변:
주 서버에서 wal_level = replica, archive_mode = on, archive_command를 구성합니다. 대기 서버에서는 postgresql.conf에서 primary_conninfo를 구성하고 standby.signal 파일을 생성합니다. 그런 다음 주 서버의 기본 백업을 대기 서버에 복원합니다.
pg_rewind란 무엇이며, 언제 사용해야 하나요?
답변:
pg_rewind는 두 데이터베이스 복사본이 분기된 후 동일한 데이터베이스의 다른 복사본과 PostgreSQL 데이터 디렉토리를 동기화하는 유틸리티입니다. 일반적으로 장애 조치 후 이전 주 서버를 전체 기본 백업 없이 대기 서버로 다시 온라인 상태로 만드는 데 사용됩니다.
복구 및 복제에서 recovery.conf (또는 최신 버전의 standby.signal 및 postgresql.conf) 의 역할에 대해 설명해주세요.
답변:
이전 버전에서는 recovery.conf가 restore_command 및 primary_conninfo와 같은 복구 매개변수를 지정했습니다. PostgreSQL 12 이상에서는 이러한 매개변수가 postgresql.conf로 이동했으며, standby.signal 또는 recovery.signal 파일의 존재는 각각 대기 또는 복구 모드를 나타냅니다.
복제 슬롯 (replication slot) 이란 무엇이며, 논리적 복제에 왜 중요한가요?
답변:
복제 슬롯은 대기 서버 또는 논리적 복제 구독자가 뒤처지더라도 주 서버가 필요한 WAL 세그먼트를 유지하도록 보장합니다. 이를 통해 주 서버가 아직 필요한 WAL 파일을 제거하는 것을 방지하여 데이터 손실이나 전체 재동기화의 필요성을 피할 수 있습니다.
PostgreSQL 에서 복제 지연 (replication lag) 을 어떻게 모니터링할 수 있나요?
답변:
복제 지연은 주 서버의 pg_stat_replication 뷰를 사용하여 모니터링할 수 있으며, 특히 write_lag, flush_lag, replay_lag를 확인합니다. 대기 서버에서는 pg_last_wal_receive_lsn() 및 pg_last_wal_replay_lsn()을 주 서버의 현재 LSN 과 비교할 수 있습니다.
PostgreSQL 문제 해결 및 디버깅
PostgreSQL 에서 성능 문제 해결을 시작하는 일반적인 방법은 무엇인가요?
답변:
일반적으로 오류나 경고에 대해 PostgreSQL 로그를 확인하는 것부터 시작합니다. 그런 다음 pg_stat_activity를 사용하여 활성 쿼리를 확인하고 오래 실행되거나 차단된 트랜잭션을 식별합니다. 마지막으로 pg_stat_statements를 분석하여 자주 실행되거나 느린 쿼리를 찾습니다.
PostgreSQL 에서 느린 쿼리의 일반적인 이유는 무엇인가요?
답변:
일반적인 이유로는 누락되거나 비효율적인 인덱스, 잘못된 쿼리 계획 (예: 전체 테이블 스캔), 높은 I/O 대기 시간, 불충분한 메모리 할당 (work_mem, shared_buffers), 과도한 잠금 또는 경합 등이 있습니다. 오래된 통계 정보도 잘못된 쿼리 계획으로 이어질 수 있습니다.
PostgreSQL 에서 교착 상태 (deadlocked) 트랜잭션을 어떻게 식별하나요?
답변:
PostgreSQL 은 자동으로 교착 상태를 감지하고 트랜잭션 중 하나를 중단하여 해결합니다. 교착 상태에 대한 정보는 PostgreSQL 서버 로그에서 찾을 수 있습니다. 잠재적인 차단을 사전에 식별하기 위해 pg_locks와 pg_stat_activity를 쿼리하여 어떤 쿼리가 잠금을 보유하고 있고 어떤 쿼리가 대기 중인지 확인합니다.
EXPLAIN ANALYZE의 목적과 사용 시점에 대해 설명해주세요.
답변:
EXPLAIN ANALYZE는 쿼리를 실행한 다음 실제 행 수, 실행 시간 및 I/O 비용을 포함한 실행 계획을 표시합니다. PostgreSQL 이 쿼리를 처리하는 방법을 이해하고, 병목 현상을 식별하며, 특히 느린 쿼리에 대해 인덱스가 효과적으로 사용되고 있는지 확인하는 데 사용합니다.
Autovacuum 이란 무엇이며, PostgreSQL 상태에 왜 중요한가요?
답변:
Autovacuum 은 사용되지 않는 튜플이 차지하는 스토리지를 자동으로 회수하고 통계 정보를 업데이트하는 백그라운드 프로세스입니다. 테이블 블로트를 방지하고, 인덱스를 효율적으로 유지하여 쿼리 성능을 향상시키며, 데이터 손실을 유발할 수 있는 트랜잭션 ID 래퍼라운드 (wraparound) 가 발생하지 않도록 하는 데 중요합니다.
PostgreSQL 에서 디스크 공간 문제를 어떻게 확인하나요?
답변:
먼저 운영 체제의 디스크 사용량 (df -h on Linux) 을 확인합니다. PostgreSQL 내에서는 pg_database_size()를 사용하여 전체 데이터베이스 크기를 확인하고, pg_relation_size() 또는 pg_table_size()를 사용하여 개별 테이블/인덱스의 크기를 확인하여 공간을 차지하는 큰 객체를 식별할 수 있습니다.
클라이언트가 PostgreSQL 에 연결하려고 할 때 'connection refused' 오류가 자주 발생한다고 보고합니다. 이 문제를 진단하기 위한 첫 번째 단계는 무엇인가요?
답변:
먼저 PostgreSQL 서비스가 실행 중인지 확인합니다. 그런 다음 postgresql.conf에서 listen_addresses를, pg_hba.conf에서 클라이언트 인증 규칙을 확인합니다. 클라이언트와 서버 간의 네트워크 연결 (방화벽, 포트 5432) 도 확인해야 합니다.
PostgreSQL 서버에서 높은 CPU 사용률의 일반적인 원인은 무엇인가요?
답변:
높은 CPU 사용률은 종종 광범위한 계산 또는 정렬을 수행하는 복잡한 쿼리, 대규모 데이터 스캔으로 이어지는 비효율적인 쿼리 계획, 많은 활성 연결로 인한 높은 동시성 또는 더 많은 디스크 I/O 및 CPU 처리를 강제하는 불충분한 메모리에서 비롯됩니다. 과도한 로깅도 기여할 수 있습니다.
일관되게 잘못된 결과를 반환하는 쿼리를 어떻게 디버깅하나요?
답변:
쿼리의 일부 또는 하위 쿼리를 수동으로 실행하여 잘못된 데이터가 발생하는 위치를 격리하는 것부터 시작합니다. 데이터 유형, 조인 및 WHERE 절 조건의 논리적 오류를 확인하는 것이 중요합니다. 때로는 관련된 테이블의 원시 데이터를 보면 불일치를 식별하는 데 도움이 됩니다.
VACUUM FULL을 수동으로 실행해야 하는 시나리오를 설명해주세요.
답변:
상당한 블로트가 발생했으며 일반 VACUUM(또는 autovacuum) 이 공간을 효과적으로 회수하지 못하는 테이블에 대해 VACUUM FULL을 고려할 것입니다. 전체 테이블을 다시 작성하여 디스크 공간을 회수하지만, 독점 잠금이 필요하고 매우 느릴 수 있으므로 심각한 블로트에 대한 최후의 수단입니다.
보안 및 액세스 제어
PostgreSQL 에서 사용자 인증을 어떻게 관리하나요?
답변:
PostgreSQL 은 md5, scram-sha-256, ident, peer, trust와 같은 다양한 인증 방법과 LDAP 또는 Kerberos 와 같은 외부 방법을 지원합니다. 이러한 방법은 pg_hba.conf 파일에서 구성되며, 이 파일은 연결 유형, 데이터베이스, 사용자 및 IP 주소를 기반으로 클라이언트 인증을 제어합니다.
PostgreSQL 에서 역할 (role) 의 개념과 액세스 제어에 어떻게 사용되는지 설명해주세요.
답변:
역할은 PostgreSQL 에서 권한을 관리하는 데 기본적입니다. 역할은 사용자 (로그인 권한 포함) 또는 그룹 (로그인 권한 없음) 이 될 수 있습니다. 역할은 데이터베이스 객체를 소유하고 해당 객체에 대한 권한을 가질 수 있습니다. 다른 역할에 역할을 부여하여 계층적 권한 구조를 만들 수 있습니다.
PostgreSQL 에서 GRANT와 REVOKE의 차이점은 무엇인가요?
답변:
GRANT는 역할에 데이터베이스 객체 (테이블, 뷰, 함수) 에 대한 특정 권한 (예: SELECT, INSERT, UPDATE, DELETE) 을 할당하는 데 사용됩니다. REVOKE는 이전에 부여된 해당 권한을 제거하는 데 사용됩니다. 두 명령 모두 세분화된 액세스 제어에 필수적입니다.
테이블 내 특정 열에 대한 사용자의 액세스를 어떻게 제한할 수 있나요?
답변:
테이블의 특정 열에 대해 SELECT, INSERT, UPDATE 또는 REFERENCES 권한을 부여할 수 있습니다. 예를 들어, GRANT SELECT (column1, column2) ON my_table TO my_user;와 같이 사용할 수 있습니다. 이를 통해 데이터 액세스에 대한 매우 세분화된 제어가 가능합니다.
ROW LEVEL SECURITY (RLS) 란 무엇이며, 언제 사용해야 하나요?
답변:
행 수준 보안 (RLS) 을 사용하면 사용자의 속성 또는 기타 기준에 따라 사용자가 테이블에서 어떤 행을 보거나 수정할 수 있는지 제한하는 정책을 정의할 수 있습니다. 이는 다중 테넌트 애플리케이션이나 다른 사용자가 별도의 뷰 없이 동일한 테이블 내에서 데이터의 일부만 액세스해야 하는 경우에 유용합니다.
테이블에 간단한 RLS 정책을 활성화하고 정의하는 방법은 무엇인가요?
답변:
먼저 테이블에서 RLS 를 활성화합니다: ALTER TABLE my_table ENABLE ROW LEVEL SECURITY;. 그런 다음 정책을 생성합니다. 예를 들어: CREATE POLICY my_policy ON my_table FOR SELECT USING (user_id = current_user);. 이 정책은 사용자가 자신의 현재 사용자 이름과 일치하는 user_id를 가진 행만 볼 수 있도록 보장합니다.
pg_hba.conf 파일의 목적은 무엇인가요?
답변:
pg_hba.conf (host-based authentication) 파일은 어떤 호스트가 PostgreSQL 서버에 연결할 수 있는지, 어떤 PostgreSQL 사용자 계정을 사용할 수 있는지, 그리고 성공적인 연결에 어떤 인증 방법이 필요한지를 제어합니다. 클라이언트 인증을 위한 기본 구성 파일입니다.
역할을 부여할 때 WITH ADMIN OPTION 절에 대해 설명해주세요.
답변:
역할이 다른 역할에 WITH ADMIN OPTION으로 부여되면, 수여받은 역할은 해당 역할을 다른 역할에 부여할 수 있으며, 또한 취소할 수도 있습니다. 이는 역할 멤버십에 대한 관리 제어를 위임하여 권한의 분산 관리를 가능하게 합니다.
PostgreSQL 에서 보안 관련 이벤트를 어떻게 감사 (audit) 할 수 있나요?
답변:
PostgreSQL 의 로깅 기능을 구성하여 보안 관련 이벤트를 캡처할 수 있습니다. postgresql.conf에서 log_connections, log_disconnections, log_statement, log_hostname과 같은 매개변수를 설정할 수 있습니다. 더 고급 감사 기능을 위해서는 pgAudit과 같은 확장을 사용하여 SQL 문 및 연결에 대한 상세하고 구성 가능한 로깅을 제공합니다.
준비된 문장 (prepared statements) 이란 무엇이며, 보안과 어떤 관련이 있나요?
답변:
준비된 문장은 미리 구문 분석된 SQL 문으로, 다른 매개변수를 사용하여 여러 번 실행할 수 있습니다. 매개변수가 SQL 쿼리와 별도로 전송되어 실행 가능한 코드가 아닌 데이터 값으로 처리되도록 하므로 SQL 삽입 공격을 방지하는 데 중요합니다.
고급 기능 및 확장
PostgreSQL 확장 기능의 목적을 설명하고 일반적으로 사용되는 확장 기능의 예를 들어주세요.
답변:
PostgreSQL 확장은 데이터베이스의 기능을 확장하는 SQL 객체 (함수, 데이터 타입, 연산자 등) 의 패키지입니다. 사용자는 핵심 PostgreSQL 코드를 수정하지 않고도 새로운 기능을 추가할 수 있습니다. 일반적인 예로는 모든 SQL 문의 실행 통계를 추적하는 pg_stat_statements가 있습니다.
pg_stat_statements의 역할은 무엇이며, 성능 튜닝을 위해 어떻게 활성화하고 사용할 수 있나요?
답변:
pg_stat_statements는 서버에서 실행된 모든 SQL 문의 실행 통계를 추적합니다. 이를 활성화하려면 postgresql.conf에서 shared_preload_libraries에 pg_stat_statements를 추가하고 서버를 다시 시작합니다. 그런 다음 CREATE EXTENSION pg_stat_statements;를 실행합니다. 각 고유 쿼리의 호출 횟수, 총 시간 및 평균 시간을 표시하여 느린 쿼리를 식별하는 데 도움이 됩니다.
PostgreSQL 에서 외부 데이터 래퍼 (Foreign Data Wrappers, FDW) 의 개념을 설명해주세요. 언제 사용해야 하나요?
답변:
외부 데이터 래퍼 (FDW) 를 사용하면 PostgreSQL 이 마치 로컬 테이블처럼 외부 데이터 소스에 연결하고 데이터를 쿼리할 수 있습니다. FDW 는 데이터 통합, 다른 데이터베이스 (예: MySQL, Oracle, 다른 PostgreSQL 인스턴스) 간의 연합 쿼리 또는 SQL 에서 직접 외부 파일 (예: CSV) 에 액세스하는 데 사용됩니다.
PostgreSQL 에서 사용자 정의 데이터 타입을 어떻게 구현하나요? 간단한 개념적 예를 들어주세요.
답변:
사용자 정의 데이터 타입은 내부 표현을 정의하고 입력/출력 함수를 제공하여 구현할 수 있습니다. 예를 들어, complex_number 타입을 생성하려면 복합 타입으로 정의하거나 내부 처리를 위해 C 함수를 사용한 다음 문자열 변환을 위한 complex_in 및 complex_out 함수를 정의합니다.
PostgreSQL 의 테이블 파티셔닝 (Table Partitioning) 방법과 그 이점은 무엇인가요?
답변:
PostgreSQL 은 선언적 테이블 파티셔닝 (RANGE, LIST, HASH) 을 지원하며, 이는 대형 테이블을 파티션이라고 하는 더 작고 관리하기 쉬운 조각으로 나눕니다. 이점으로는 쿼리 성능 향상 (프루닝), 쉬운 데이터 관리 (예: 오래된 데이터 아카이빙), 더 작은 파티션에 대한 빠른 인덱스 재구축 등이 있습니다.
PostgreSQL 에서 논리적 복제 (Logical Replication) 와 물리적 복제 (Physical Replication) 의 차이점을 설명해주세요.
답변:
물리적 복제 (예: 스트리밍 복제) 는 전체 데이터 블록을 복사하므로 블록 수준이며 재해 복구에 적합합니다. 논리적 복제는 행 수준에서 데이터 변경을 복제하여 선택적 복제, 다른 스키마 버전 및 다른 주요 PostgreSQL 버전 또는 다른 데이터베이스 간의 복제를 허용합니다.
pg_repack이란 무엇이며, 온라인 테이블 재구성을 위해 VACUUM FULL보다 선호되는 이유는 무엇인가요?
답변:
pg_repack은 테이블에 대한 독점 잠금을 유지하지 않고 테이블과 인덱스의 블로트를 제거하는 확장 기능입니다. 독점 잠금이 필요하고 모든 작업을 차단하는 VACUUM FULL과 달리, pg_repack은 동시 읽기/쓰기 액세스를 허용하여 온라인 작업에 적합합니다.
PostgreSQL 내에서 데이터베이스 간 통신을 위해 dblink를 어떻게 사용할 수 있나요?
답변:
dblink는 다른 PostgreSQL 데이터베이스 (동일한 서버에 있는 경우에도) 에 연결하고 해당 데이터베이스에서 쿼리를 실행할 수 있게 해주는 확장 기능입니다. 원격 데이터베이스에서 데이터를 가져오거나 DDL/DML 문을 실행하는 데 사용할 수 있습니다. 예를 들어: SELECT * FROM dblink('dbname=mydb', 'SELECT col1 FROM mytable') AS t(col1 text);
pg_cron의 목적은 무엇이며, PostgreSQL 에서 작업 예약을 어떻게 단순화하나요?
답변:
pg_cron은 cron 구문을 사용하여 데이터베이스 내에서 직접 PostgreSQL 명령을 예약할 수 있게 해주는 확장 기능입니다. 외부 cron 작업이나 운영 체제 수준 스케줄러의 필요성을 제거하여 작업 예약을 단순화하고 데이터베이스 관련 작업을 데이터베이스 자체 내에서 관리하도록 합니다.
PostgreSQL 에서 PostGIS의 사용 사례를 설명해주세요.
답변:
PostGIS는 PostgreSQL 을 위한 강력한 공간 확장 기능으로, 지리적 객체 (점, 선, 다각형) 및 공간 함수에 대한 지원을 추가합니다. 매핑, 지오코딩 및 근접 분석과 같은 애플리케이션을 데이터베이스 내에서 직접 가능하게 하는 위치 기반 데이터의 저장, 쿼리 및 분석에 사용됩니다.
시나리오 기반 및 실용적 응용
수백만 행이 있는 users 테이블에서 last_login_date로 필터링할 때 쿼리 성능이 느립니다. 가장 먼저 조사할 사항은 무엇이며 어떻게 해결하시겠습니까?
답변:
먼저 last_login_date 열에 인덱스가 있는지 확인합니다. 없다면 B-tree 인덱스를 생성합니다: CREATE INDEX idx_users_last_login ON users (last_login_date);. 그런 다음 ANALYZE users;를 실행하여 쿼리 플래너의 통계를 업데이트합니다.
중요한 보고서 쿼리가 너무 오래 걸립니다. 대형 orders 테이블에 대한 전체 테이블 스캔을 수행하고 있음을 확인했습니다. 애플리케이션 코드를 변경하지 않고 어떻게 최적화하시겠습니까?
답변:
느린 쿼리의 WHERE 및 JOIN 절을 분석하여 필터링 또는 조인에 자주 사용되는 열을 식별합니다. 그런 다음 이러한 열에 적절한 인덱스를 생성합니다. 예를 들어, 고객별로 필터링하는 경우 CREATE INDEX idx_orders_customer_id ON orders (customer_id);와 같이 사용합니다.
customers 테이블에 존재하는 기존 customer에 각 주문이 속해야 하는 orders 테이블에 대한 데이터 무결성을 보장해야 합니다. 이 관계를 어떻게 강제하시겠습니까?
답변:
외래 키 제약 조건을 사용합니다. orders 테이블에 다음을 추가합니다: ALTER TABLE orders ADD CONSTRAINT fk_customer FOREIGN KEY (customer_id) REFERENCES customers (id);. 이렇게 하면 orders의 customer_id가 customers의 id로 존재해야 합니다.
PostgreSQL 에서 일반 테이블 표현식 (Common Table Expression, CTE) 을 사용하는 시나리오를 설명해주세요.
답변:
CTE 를 사용하여 복잡한 쿼리를 더 읽기 쉽고 관리하기 쉬운 단계로 분해하거나, 동일한 하위 쿼리를 다시 실행하지 않고 여러 번 참조하는 데 사용합니다. 예를 들어, 지역별 평균 판매량을 계산한 다음 전체 평균보다 높은 지역을 찾는 데 사용할 수 있습니다.
지난달에 가장 많은 주문을 한 상위 5 명의 고객을 검색해야 합니다. 이 쿼리를 어떻게 작성하시겠습니까?
답변:
GROUP BY 및 ORDER BY와 LIMIT를 사용합니다. SELECT customer_id, COUNT(order_id) AS total_orders FROM orders WHERE order_date >= NOW() - INTERVAL '1 month' GROUP BY customer_id ORDER BY total_orders DESC LIMIT 5;
데이터베이스가 빠르게 성장하고 있으며, 기록 데이터에 대한 디스크 공간 및 쿼리 성능에 대해 우려하고 있습니다. PostgreSQL 의 어떤 기능이 이를 관리하는 데 도움이 될 수 있나요?
답변:
테이블 파티셔닝 구현을 고려할 것입니다. 이를 통해 대형 테이블을 키 (예: order_date) 를 기준으로 더 작고 관리하기 쉬운 조각으로 분할할 수 있습니다. 이렇게 하면 더 적은 데이터를 스캔하여 쿼리 성능이 향상되고 데이터 보존 정책이 단순화됩니다.
데이터베이스 업그레이드를 수행해야 하지만 다운타임을 최소화해야 합니다. PostgreSQL 업그레이드에 어떤 전략을 고려하시겠습니까?
답변:
다운타임을 최소화하기 위해 논리적 복제 (예: pglogical 또는 최신 버전의 내장 논리적 복제) 를 사용하여 업그레이드된 PostgreSQL 버전의 새 서버를 복제본으로 설정하는 것을 고려할 것입니다. 동기화되면 애플리케이션 트래픽을 새 서버로 전환합니다.
개발자가 프로덕션 테이블에서 대량의 레코드를 실수로 삭제했습니다. 최소한의 데이터 손실로 데이터를 어떻게 복구하시겠습니까?
답변:
타임포인트 복구 (PITR) 가 활성화된 경우, 최근 기본 백업을 복원한 다음 실수로 삭제되기 직전까지의 Write-Ahead Log (WAL) 파일을 재생합니다. 이를 위해서는 강력한 백업 및 WAL 아카이빙 전략이 필요합니다.
반구조화된 데이터 (예: 속성이 다양한 사용자 기본 설정) 를 저장해야 하는 새로운 기능을 설계하고 있습니다. 어떤 PostgreSQL 데이터 타입을 권장하시겠습니까?
답변:
JSONB 데이터 타입을 권장합니다. JSON 데이터를 분해된 바이너리 형식으로 저장하여 JSON 문서 내의 특정 키 또는 요소에 대한 효율적인 인덱싱 및 쿼리를 가능하게 합니다. 이는 일반 텍스트로 저장하는 JSON과는 다릅니다.
PostgreSQL 인스턴스에서 실행되는 가장 비용이 많이 드는 쿼리를 어떻게 식별하시겠습니까?
답변:
pg_stat_statements를 활성화하고 구성합니다. 이 확장 기능은 모든 SQL 문의 실행 통계를 추적합니다. 그런 다음 pg_stat_statements 뷰를 쿼리하고 total_time 또는 mean_time으로 정렬하여 가장 느린 쿼리를 찾을 수 있습니다.
users 테이블의 email 열에 고유한 값만 포함되도록 해야 합니다. 이를 어떻게 강제하시겠습니까?
답변:
email 열에 UNIQUE 제약 조건을 추가합니다. 이는 ALTER TABLE users ADD CONSTRAINT uq_users_email UNIQUE (email);로 수행할 수 있습니다. 이렇게 하면 해당 열에 고유한 B-tree 인덱스가 자동으로 생성됩니다.
역할별 질문 (개발자, DBA, DevOps)
개발자: PostgreSQL 애플리케이션에서 N+1 쿼리 문제를 어떻게 처리하나요?
답변:
N+1 쿼리는 부모 객체 목록을 가져온 다음 각 부모에 대해 관련 자식 객체를 가져오기 위해 별도의 쿼리를 실행할 때 발생합니다. 이는 JOIN 연산 (예: LEFT JOIN) 을 사용하여 단일 쿼리에서 모든 관련 데이터를 가져오거나 WITH 절 (CTE) 을 사용하여 복잡한 관계를 처리함으로써 완화할 수 있습니다. ORM 은 종종 이를 달성하기 위한 즉시 로딩 (eager loading) 메커니즘을 제공합니다.
개발자: PostgreSQL 에서 LEFT JOIN과 INNER JOIN의 차이점을 설명해주세요.
답변:
INNER JOIN은 두 테이블 모두에서 일치하는 값을 가진 행만 반환합니다. LEFT JOIN(또는 LEFT OUTER JOIN) 은 왼쪽 테이블의 모든 행과 오른쪽 테이블의 일치하는 행을 반환합니다. 왼쪽 테이블 행에 대한 일치 항목이 없으면 오른쪽 테이블의 열에 대해 NULL 값이 반환됩니다.
개발자: PostgreSQL 에서 VIEW를 언제 사용하며, 그 제한 사항은 무엇인가요?
답변:
VIEW는 SQL 쿼리 결과 집합을 기반으로 하는 가상 테이블로, 복잡한 쿼리를 단순화하거나, 데이터 액세스를 제한하거나, 데이터를 다른 형식으로 표시하는 데 사용됩니다. 제한 사항으로는 복잡한 뷰의 잠재적인 성능 오버헤드가 있으며, 항상 업데이트 가능한 것은 아닙니다 (특히 조인, 집계 또는 고유 절을 포함하는 경우).
DBA: 성능을 위해 postgresql.conf에서 조정할 주요 매개변수는 무엇인가요?
답변:
주요 매개변수에는 shared_buffers(데이터 블록 캐싱용), work_mem(인메모리 정렬/해시용), maintenance_work_mem(VACUUM/INDEX 작업용), wal_buffers(WAL 쓰기용) 및 effective_cache_size(옵티마이저 추정치용) 가 있습니다. max_connections 및 autovacuum 설정도 중요합니다.
DBA: PostgreSQL 에서 VACUUM과 ANALYZE의 목적을 설명해주세요.
답변:
VACUUM은 데드 튜플 (삭제 표시되었지만 아직 제거되지 않은 행) 이 차지하는 스토리지를 회수하여 테이블 블로트를 방지하고 트랜잭션 ID 래퍼라운드 방지를 보장합니다. ANALYZE는 테이블 내용에 대한 통계를 수집하며, 쿼리 플래너는 이를 사용하여 쿼리에 대한 가장 효율적인 실행 계획을 결정합니다.
DBA: PostgreSQL 서버에서 디스크 공간 부족 문제를 어떻게 처리하나요?
답변:
먼저 pg_relation_size() 또는 pg_database_size()를 사용하여 가장 큰 테이블/인덱스를 식별합니다. 그런 다음 오래된 데이터를 삭제하거나, VACUUM FULL(잠금으로 인해 주의 필요) 을 실행하거나, 데이터를 다른 테이블스페이스로 이동하거나, 스토리지를 추가하는 것을 고려합니다. 큰 로그 파일이나 임시 파일도 확인합니다.
DevOps: PostgreSQL 데이터베이스의 고가용성 (high availability) 을 어떻게 설정하나요?
답변:
고가용성은 주 서버와 하나 이상의 대기 서버를 사용하는 스트리밍 복제 (물리적 복제) 를 통해 달성할 수 있습니다. Patroni 또는 repmgr 과 같은 도구는 장애 조치 (failover) 및 전환 (switchover) 프로세스를 자동화할 수 있습니다. 논리적 복제도 특정 사용 사례에 사용할 수 있지만, 스트리밍 복제가 HA 의 표준입니다.
DevOps: PostgreSQL 백업 전략에서 pg_basebackup의 역할은 무엇인가요?
답변:
pg_basebackup은 실행 중인 PostgreSQL 클러스터의 일관된 기본 백업을 수행하는 데 사용됩니다. 데이터 디렉토리의 바이너리 복사본을 생성하며, 이는 지속적인 WAL 아카이빙과 결합될 때 타임포인트 복구 (PITR) 에 사용할 수 있습니다. 새 복제본을 설정하거나 처음부터 복원하는 데 필수적입니다.
DevOps: 프로덕션 환경에서 PostgreSQL 성능을 어떻게 모니터링하나요?
답변:
모니터링에는 CPU, 메모리, 디스크 I/O, 네트워크, 활성 연결, 쿼리 실행 시간, 캐시 히트율 및 WAL 활동과 같은 주요 메트릭을 추적하는 것이 포함됩니다. Prometheus/Grafana, Datadog 또는 전문 PostgreSQL 모니터링 솔루션 (예: pg_stat_statements, pg_activity) 과 같은 도구가 일반적으로 사용됩니다.
DevOps: PostgreSQL 에서 타임포인트 복구 (Point-In-Time Recovery, PITR) 개념을 설명해주세요.
답변:
PITR 을 사용하면 PostgreSQL 데이터베이스를 특정 시점, 심지어 트랜잭션 경계까지 복원할 수 있습니다. 이를 위해서는 전체 기본 백업 (예: pg_basebackup에서) 과 지속적인 Write-Ahead Log (WAL) 파일 아카이브가 필요합니다. 복구 중에 기본 백업이 복원된 다음, 원하는 복구 대상까지 WAL 파일이 재생됩니다.
요약
인터뷰를 위한 PostgreSQL 숙달은 성실한 준비에서 시작되는 여정입니다. 일반적인 질문을 철저히 검토하고 기본 개념을 이해함으로써 전문성을 효과적으로 설명할 수 있는 지식과 자신감을 갖추게 되었습니다. 이러한 준비는 인터뷰를 잘 치르는 데 도움이 될 뿐만 아니라 이 강력한 데이터베이스 시스템에 대한 기초적인 이해를 공고히 합니다.
PostgreSQL 의 세계는 끊임없이 진화하고 있다는 것을 기억하십시오. 새로운 기능, 모범 사례 및 고급 주제를 계속 탐색하십시오. 지속적인 학습을 전문 개발의 핵심 원칙으로 받아들이십시오. 최신 정보를 유지하려는 헌신은 의심할 여지 없이 경력에서 더 큰 성공과 깊은 통찰력으로 이어질 것입니다.


