postgresql-13.12 on CentOS 5.8
0. 주의사항
0.1. postgresql-15.4 및 postgresql-14.9 에 대해서
postgresql-15.4 및 postgresql-14.9 는 epoll_create1() and EPOLL_CLOEXEC 이 없는 Linux < 2.6.27 and glibc < 2.9 을 지원하지 않는다.
CentOS 5.8 은 Linux Kernel 2.6.18 및 glibc 2.5 이므로 postgresql-14.9 내지 postgresql-15.4 혹은 그 이후 버전은 CentOS 5.8 을 공식적으로 지원하지 않는다.
이에 대해서는 PostgreSQL Weekly News - March 7, 2021 을 참조한다.
(postgresql-13.12 를 참조해서) latch.c 를 변경하는 방법이 있기는 하겠지만, 그렇게 까지 할 필요는 없을 것 같다.
0.2. PostgreSQL 버전 호환성
다음과 같은 PostgreSQL 의 이전 버전들도 같은 방법으로 컴파일을 성공했다.
- postgresql-12.16
- postgresql-11.21
- postgresql-10.23
- postgresql-9.6.24
1. 준비작업
1.1. 다운로드
https://www.postgresql.org/ftp/source/ 에서 다운로드 한다.
CentOS 5.8 에서 직접 다운로드 할 수 없고, 다른 장비에서 다운로드 한 파일을 sftp 따위로 올려야 한다.
$ curl -O https://ftp.postgresql.org/pub/source/v13.12/postgresql-13.12.tar.gz
1.2. gcc 및 make 설치
yum install gcc make -y
1.3. 의존성
configure 명령에서 --without-readline --without-zlib
옵션을 추가하거나,
다음 2개의 라이브러리를 설치한다.
- zlib-devel
- readline-devel
$ yum install zlib-devel readline-devel
오래된 이야기지만, 오픈소스 라이선스 간의 차이 때문에 발생한 해프닝이 있었다. 해프닝 직후에는 더 오래된 readline 라이브러리가 더 안정적일 가능성이 높다는 생각이 있었고, 지금은 관성의 법칙이 지배하고 있는 것으로 생각된다.
2. 컴파일 및 설치
설치 디렉토리(--prefix
) 는 알아서 변경한다.
$ mkdir -p logs/postgresql-13.12 $ env > logs/postgresql-13.12/env.`date +%Y%m%d.%H%M%S`.log 2>&1 $ tar xvfz postgresql-13.12.tar.gz > logs/postgresql-13.12/tar.`date +%Y%m%d.%H%M%S`.log 2>&1 $ cd postgresql-13.12 $ ./configure \ --without-readline \ --without-zlib \ --prefix=/opt/postgresql-13.12 > ../logs/postgresql-13.12/config.`date +%Y%m%d.%H%M%S`.log 2>&1 $ make > ../logs/postgresql-13.12/make.`date +%Y%m%d.%H%M%S`.log 2>&1 $ make install > ../logs/postgresql-13.12/install.`date +%Y%m%d.%H%M%S`.log 2>&1
3. 설치후의 작업
다음과 같은 절차에 따라 postgresql 을 기동시킨다.
$ adduser postgres $ mkdir /opt/postgresql-13.12/data $ chown postgres /opt/postgresql-13.12/data $ mkdir /opt/postgresql-13.12/log $ chown postgres /opt/postgresql-13.12/log $ su - postgres $ export LANG=ko_KR.UTF-8 $ export LC_ALL=ko_KR.UTF-8 $ /opt/postgresql-13.12/bin/initdb -D /opt/postgresql-13.12/data $ /opt/postgresql-13.12/bin/pg_ctl -D /opt/postgresql-13.12/data -l /opt/postgresql-13.12/log/postgresql.log start
한국어 UTF-8 인코딩을 사용할 예정이라면, initdb 전에 locale 을 변경해서 ko_KR.UTF-8 로 template* 데이타베이스를 생성하지 않으면, 나중에 이를 변경하는 것이 번거로울 수 있다.
다음과 같이 접속한다.
$ /opt/postgresql-13.12/bin/psql
데이타베이스 목록을 확인한다.
postgres=# \list
결과는 다음과 같다.
List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+----------+----------+-------------+-------------+----------------------- postgres | postgres | UTF8 | ko_KR.UTF-8 | ko_KR.UTF-8 | template0 | postgres | UTF8 | ko_KR.UTF-8 | ko_KR.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | ko_KR.UTF-8 | ko_KR.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres (3 rows)
다음은 필자가 작성한 Postgresql 설치 을 참조해서 사용자, 테이블스페이스, 데이타베이스를 생성한다.
PGTune, 최소한의 튜닝 도 참고한다.
CentOS 5.8 시절에는 다음과 같이 /etc/init.d/pgsql.sh 와 같은 스크립트를 만들고, /etc/rc3.d/S99pgsql.sh 와 같이 Symbolic link 를 생성하는 관행이 있었다.
#!/bin/bash export POSTGRES_HOME=/opt/postgresql-13.12 export PGLIB=$POSTGRES_HOME/lib export PGDATA=$POSTGRES_HOME/data export MANPATH=$MANPATH:$POSTGRES_HOME/man export PATH=$POSTGRES_HOME/bin:$PATH start() { su -c '/opt/postgresql-13.12/bin/pg_ctl start -D /opt/postgresql-13.12/data/ -l /opt/postgresql-13.12/log/postgresql.log' postgres RETVAL=$? return $RETVAL } stop() { su -c '/opt/postgresql-13.12/bin/pg_ctl stop -m fast -D /opt/postgresql-13.12/data/ -l /opt/postgresql-13.12/log/postgresql.log' postgres RETVAL=$? return $RETVAL } case "$1" in start) start ;; stop) stop ;; *) echo $"Usage: $0 {start|stop}" esac exit $RETVAL
4. 문제해결
해결방법은 전술한 의존성 있는 모듈 설치에 대한 내용을 참조한다.
4.1. configure: error: zlib library not found
configure 에서 발생한다.
zlib-devel 를 설치하거나 다음과 같이 --without-zlib
옵션을 추가한다.
$ ./configure \ --without-zlib \ --prefix=/opt/postgresql-13.12 > ../logs/postgresql-13.12/config.`date +%Y%m%d.%H%M%S`.log 2>&1
4.2. configure: error: readline library not found
configure 에서 발생한다.
readline-devel 를 설치하거나 다음과 같이 --without-zlib
옵션을 추가한다.
$ ./configure \ --without-readline \ --prefix=/opt/postgresql-13.12 > ../logs/postgresql-13.12/config.`date +%Y%m%d.%H%M%S`.log 2>&1
4.3. EPOLL_CLOEXEC 내지 EPOLLRDHUP 가 선언되어 있지 않다는 에러
postgresql-15.4 및 postgresql-14.9 는 CentOS 5.8 에서 컴파일 할 수 없다.
컴파일 에러의 직접적인 원인은 epoll.h 에 EPOLL_CLOEXEC 내지 EPOLLRDHUP 가 선언되어 있지 않는 것이지만, Linux Kernel 과 glibc 버전과 관련이 있다.
이에 대해서는 이 글의 도입부에서 기술한 내용을 참고하라.
4.4. 읽을거리
- INSTALL : 설치방법에 대한 안내