CentOSのPostgreSQLを9.2にアップグレードする

CentOS6系だとyumでPostgreSQLをインストールすると8.4が入ります。僕もこれで運用していました。ところが全文検索がデフォでサポートされているのは9.1以降なのでアップデートしたいという話です。

前もチラッと書きましたが、マルチバイト文字に対応するには若干コードを修正する必要があるので、自前でビルドという事になります。RPMを適当に探してきてというわけにはいきません。

またyum管理下のPostgreSQLを自前ビルドのバージョンで更新ということで、明らかに面倒そうなのでほったらかしていたのですが、先ほど重い腰を上げて作業したのでログを残しておきます。

基本的にはオフィシャルのドキュメントのアップグレードの項目に沿った作業を行いました。とりあえず一読をお勧めします。

さて今回行いたい事は下記です。

  • 運用中のPostgreSQLの8.4から9.2へのアップグレード
  • 運用中のPostgreSQLとビルドオプション等は揃えたい
  • 9.2をインストールする際にマルチバイトの全文検索をON

まず現在動作中のPostgreSQLのビルドオプションをpg_configコマンドで確認します。CentOSのyumパッケージではディレクトリの設定が細かく行われている事がわかります。

本エントリではこのビルドオプションのうち、ディレクトリ配置系のオプション以外を引き継いでビルドを行います。配置はデフォルトの/usr/local/pgsql以下に行います。理由は上書き漏れ等で、一部のファイルだけ古いバージョンのままというのが発生すると怖いからです。

$ pg_config
BINDIR = /usr/bin
DOCDIR = /usr/share/doc/pgsql
HTMLDIR = /usr/share/doc/pgsql
INCLUDEDIR = /usr/include
PKGINCLUDEDIR = /usr/include/pgsql
INCLUDEDIR-SERVER = /usr/include/pgsql/server
LIBDIR = /usr/lib64
PKGLIBDIR = /usr/lib64/pgsql
LOCALEDIR = /usr/share/locale
MANDIR = /usr/share/man
SHAREDIR = /usr/share/pgsql
SYSCONFDIR = /etc/sysconfig/pgsql
PGXS = /usr/lib64/pgsql/pgxs/src/makefiles/pgxs.mk
CONFIGURE = '--build=x86_64-redhat-linux-gnu' '--host=x86_64-redhat-linux-gnu' '--target=x86_64-redhat-linux-gnu' '--program-prefix=' '--prefix=/usr' '--exec-prefix=/usr' '--bindir=/usr/bin' '--sbindir=/usr/sbin' '--sysconfdir=/etc' '--datadir=/usr/share' '--includedir=/usr/include' '--libdir=/usr/lib64' '--libexecdir=/usr/libexec' '--localstatedir=/var' '--sharedstatedir=/var/lib' '--mandir=/usr/share/man' '--infodir=/usr/share/info' '--disable-rpath' '--with-perl' '--with-tcl' '--with-tclconfig=/usr/lib64' '--with-python' '--with-ldap' '--with-openssl' '--with-pam' '--with-krb5' '--with-gssapi' '--with-ossp-uuid' '--with-libxml' '--with-libxslt' '--enable-nls' '--enable-dtrace' '--enable-thread-safety' '--with-system-tzdata=/usr/share/zoneinfo' '--sysconfdir=/etc/sysconfig/pgsql' '--datadir=/usr/share/pgsql' 'build_alias=x86_64-redhat-linux-gnu' 'host_alias=x86_64-redhat-linux-gnu' 'target_alias=x86_64-redhat-linux-gnu' 'CFLAGS=-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -DLINUX_OOM_ADJ=0'
CC = gcc
CPPFLAGS = -D_GNU_SOURCE -I/usr/include/libxml2
CFLAGS = -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -DLINUX_OOM_ADJ=0 -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -fno-strict-aliasing -fwrapv
CFLAGS_SL = -fpic
LDFLAGS = -Wl,--as-needed
LDFLAGS_SL =
LIBS = -lpgport -lxslt -lxml2 -lpam -lssl -lcrypto -lgssapi_krb5 -lz -lreadline -lcrypt -ldl -lm

ビルドに先立って必要なパッケージをインストールします。一度VMware上で練習したので、その際に./configureで必要だったパッケージを先回りしてインストールしました。

# ビルドに必要なものをインストール
$ sudo yum install systemtap-sdt-devel
$ sudo yum install perl-ExtUtils-Embed
$ sudo yum install readline-devel
$ sudo yum install pam-devel
$ sudo yum install uuid-devel
$ sudo yum install openldap-devel
$ sudo yum install gettext
$ sudo yum install tcl-devel

ビルドの準備が整ったら現在運用しているデータベースからpg_dumpallでバックアップを取ります。バックアップが完了したらpostgresqlパッケージを削除しています。本来はこのタイミングで削除をする必要は無いのかもしれませんが、復元作業等で古いコマンドに知らずにアクセスみたいな事になると嫌なので先に消しました。

# データベースへの書き込み系のサービス停止
$ sudo service celeryd stop
$ sudo service uwsgi stop
# データベースのバックアップ
$ sudo su - postgres
postgres$ pg_dumpall > /tmp/database.dump
postgres$ exit
# posgresqlパッケージの削除
$ sudo service postgresql stop
$ sudo yum remove postgresql

バックアップが取れたので早速インストール作業を行います。現在の最新版は9.2.2でした。先ほども書きましたが./configureに指定するオプションは古いバージョンのpg_configの内容から配置系パラメータを除いたものになります。インストール作業はpostgresユーザで行います。/usr/local/pgsqlにファイルが配置されるので、インストール後にPATH等の環境変数を設定しておきます。

# 新しいpostgresqlをインストール
$ sudo mkdir /usr/local/pgsql
$ chown postgres:postgres /usr/local/pgsql
$ sudo su - postgres
postgres$ wget http://ftp.postgresql.org/pub/source/v9.2.2/postgresql-9.2.2.tar.gz
postgres$ tar zxvf postgresql-9.2.2.tar.gz
postgres$ cd postgresql-9.2.2
postgres$ ./configure '--build=x86_64-redhat-linux-gnu' '--host=x86_64-redhat-linux-gnu' '--target=x86_64-redhat-linux-gnu' '--disable-rpath' '--with-perl' '--with-tcl' '--with-tclconfig=/usr/lib64' '--with-python' '--with-ldap' '--with-openssl' '--with-pam' '--with-krb5' '--with-gssapi' '--with-ossp-uuid' '--with-libxml' '--with-libxslt' '--enable-nls' '--enable-dtrace' '--enable-thread-safety' '--with-system-tzdata=/usr/share/zoneinfo' '--sysconfdir=/etc/sysconfig/pgsql' 'build_alias=x86_64-redhat-linux-gnu' 'host_alias=x86_64-redhat-linux-gnu' 'target_alias=x86_64-redhat-linux-gnu' 'CFLAGS=-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -DLINUX_OOM_ADJ=0'
postgres$ make
postgres$ make install

# pg_trgmのインストール
postgres$ cd contrib/pg_trgm/
postgres$ vim trgm.h   # KEEPONLYALNUMをコメントアウト
postgres$ make && make install
postgres$ cd ../..

# 環境変数
postgres$ vim ~/.bashrc # 編集
postgres$ cat ~/.bashrc
export PATH=/usr/local/pgsql/bin:$PATH
export POSTGRES_HOME=/usr/local/pgsql
export PGLIB=$POSTGRES_HOME/lib
export PGDATA=$POSTGRES_HOME/data
export MANPATH="$MANPATH":$POSTGRES_HOME/man
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH":"$PGLIB"
postgres$ vim ~/.bash_profile # 編集
postgres$ cat ~/.bash_profile
. ~/.bashrc

インストールが完了したら初期設定を行ってからデータベースの復元をします。

# データベース初期化と起動
postgres$ initdb --no-locale -D /usr/local/pgsql/data
postgres$ sudo cp contrib/start-scripts/linux /etc/init.d/postgresql
postgres$ sudo chmod 755 /etc/init.d/postgresql
postgres$ sudo chkconfig --add postgresql
postgres$ sudo chkconfig postgresql on
postgres$ sudo service postgresql start

# データベースを復元
postgres$ psql -f db.dump postgres

これで運用中のPostgreSQLをアップグレード出来ました。書くと大した事ではないですね。精神負荷が高い作業なので一度は練習用の環境で試してから本番環境で行うのが良いと思います。

あと記事中では書きませんでしたが、posgresql.conf等の設定ファイルの編集も忘れずに行いましょう。

Leave a Reply

Your email address will not be published. Required fields are marked *