PostgreSQL 9.4.0 문서 | |||
---|---|---|---|
이전 | 위로 | 장 17. 서버 설정 및 운용 | 다음 |
작업을 하기 전에 디스크의 데이터베이스 저장소 영역을 초기화해야 한다.이것을 데이터베이스 클러스터라고 한다(SQL에서는 카탈로그 클러스터라고 함.). 데이터베이스 클러스터는 실행 중인 데이터베이스 서버의 단일 인스턴스에 의해 관리되는 데이터베이스 컬렉션이다. 초기화 후 데이터베이스 클러스터에는 일명postgres라는 데이터베이스가 포함되는데, 이것은 유틸리티, 사용자 및 타사 어플리케이션이 사용하는 기본 데이터베이스이다. 데이터베이스 서버 자체는 postgres 데이터베이스가 불필요하지만, 다수의 외부 유틸리티 프로그램은 이 데이터베이스가 존재한다는 것을 전제로 한다. 초기화 중에 각 클러스터 내에 생성되는 또 다른 데이터베이스는 template1이라고 한다. 이름에서 알 수 있듯이, 이것은 이후에 생성된 데이터베이스의 템플릿으로 사용되며, 실제 작업에 사용해서는 안 된다(클러스터 내에서 데이터베이스로 새로 생성하는 방법은 21장 참조.).
파일 시스템의 관점에서, 데이터베이스 클러스터는 모든 데이터가 저장되는 단일 디렉토리이다. 이것을 데이터 디렉토리 또는 데이터 영역이라고 한다. 데이터를 어디에 저장할 것인지는 전적으로 사용자의 선택에 달려 있다. /usr/local/pgsql/data 또는 /var/lib/pgsql/data가 일반적이지만, 필수는 아니다. 데이터베이스 클러스터를 초기화하려면 PostgreSQL과 함께 설치된 initdb 명령을 사용한다. 데이터베이스 클러스터의 원하는 파일 시스템 위치는 -D 옵션으로 나타낼 수 있다. 예를 들면:
$ initdb -D /usr/local/pgsql/data
앞에서 설명한 대로 PostgreSQL 사용자 계정으로 로그인한 상태에서 이 명령을 실행해야 한다.
작은 정보: -D 옵션 대신 환경 변수 PGDATA를 설정할 수 있다.
또는, 다음과 같이 pg_ctl 프로그램으로 initdb를 실행할 수 있다.
$ pg_ctl -D /usr/local/pgsql/data initdb
좀 더 직관적으로, 서버를 시작하고 중지하는 데 pg_ctl을 사용하면(17.3절참조), pg_ctl은 데이터베이스 서버 인스턴스를 관리하는 유일한 명령이 된다.
initdb는 지정한 디렉토리가 존재하지 않는 경우에 디렉토리를 생성한다. 디렉토리를 생성하는 권한은 없을 가능성이 높다(당사 조언을 따랐고 권한이 없는 계정을 만든 경우). 그럴 경우 root 권한으로 디렉토리를 직접 생성하고 소유자를 PostgreSQL 사용자로 변경해야 한다. 다음과 같이 할 수 있다.
root# mkdir /usr/local/pgsql/data root# chown postgres /usr/local/pgsql/data root# su postgres postgres$ initdb -D /usr/local/pgsql/data
initdb는 데이터 디렉토리가 초기화된 것으로 보일 경우 실행을 거부한다.
데이터 디렉토리에는 데이터베이스의 모든 데이터가 저장되어 있으므로 무단 액세스로부터 데이터 디렉토리를 보호하는 것이 중요하기 때문에 initdb는 PostgreSQL 사용자를 제외한 모든 사용자로부터 접근 권한을 해지한다.
단, 디렉토리 내용이 보호 중인 경우 기본 클라이언트 인증 설정은 로컬 사용자의 데이터베이스 연결을 허용하고 로컬 사용자가 데이터베이스 수퍼유저가 되는 것을 허용하기도 한다. 다른 로컬 사용자를 신뢰하지 않을 경우에는 initdb의 -W, --pwprompt 또는 --pwfile 옵션 중 하나를 사용하여 데이터베이스 수퍼유저에게 패스워드를 할당하는 것이 좋다. 또한 -A md5 또는 -A password를 지정하여 기본 trust 인증 모드가 사용되지 않게 하거나, 서버를 처음으로 시작하기 전에 initdb를 실행한 후 생성된 pg_hba.conf 파일을 수정해야 한다. (기타 합리적 접근법에는 peer 인증 또는 파일 시스템 권한을 사용하여 연결을 제한하는 것이 있다. 자세한 내용은 19장 참조.)
initdb에서 데이터베이스 클러스터의 기본 로케일()을 초기화할 수도 있다. 일반적으로는 환경의 로케일(locale) 설정을 가져와서, 이것을 초기화된 데이터베이스에 적용한다. 데이터베이스에 서로 다른 로케일(locale)을 지정할 수 있다. 자세한 내용은 22.1절에 나와 있다. 특정 데이터베이스 클러스터 내에서 사용되는 기본 정렬 순서는 initdb로 설정되며, 서로 다른 정렬 순서로 새로운 데이터베이스를 생성하는 경우 initdb로 생성된 템플릿 데이터베이스에 사용되는 정렬 순서는 삭제 및 재생성하지 않고는 변경할 수 없다.C 또는 POSIX 이외의 로케일(locale)을 사용하는 경우 성능에도 영향을 미칠 수 있다. 따라서 처음부터 올바른 선택을 하는 것이 중요하다.
initdb로 데이터베이스 클러스터용 기본 문자 집합 인코딩도 설정한다. 일반적으로, 이것은 로케일(locale) 설정과 동일하게 선택해야 한다. 자세한 내용은 22.3절 참조.
여러 가지 설치로 네트워크 파일 시스템에 데이터베이스 클러스터가 만들어지는데, NFS를 통해 직접 생성되거나, 내부적으로 NFS를 사용하는 NAS(Network Attached Storage) 장치로 생성되기도 한다. PostgreSQL이 NFS파일 시스템에 특별한 무언가를 하는 것은 아니며, NFS가 정확히 로컬로 연결된 드라이브(DAS, Direct Attached Storage)처럼 동작한다. 클라이언트 및 서버 NFS 구현에 비표준 의미 체계가 있을 경우 안정성에 문제가 된다(http://www.time-travellers.org/shane/papers/NFS_considered_harmful.html 참조). 특히, NFS서버에 대한 쓰기 지연(비동기)은 안정성 문제의 원인이 되므로, 이러한 문제를 피하려면 가능한 한 NFS 파일 시스템을 캐시 없이 동기적으로 마운트해야 한다. 또한 NFS의 소프트 마운트는 권장되지 않는다(SAN(Storage Area Networks)은 NFS가 아닌 저수준 통신 프로토콜을 사용한다.).