2015-11-30

RHEL7: Old PostgreSQL's initdb fails

下記の環境で PostgreSQL 8.4.17 をビルドすると、

# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.1 (Maipo)

# rpm -q gcc
gcc-4.8.3-9.el7.x86_64

initdb コマンドでエラーが発生。

# su - postgres -c "/usr/local/pgsql-8.4.17/bin/initdb -E UTF8 --no-locale -D ./data" ; echo $?
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.

The database cluster will be initialized with locale C.
The default text search configuration will be set to "english".

creating directory ./data ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers ... 32MB
creating configuration files ... ok
creating template1 database in ./data/base/1 ... ok
initializing pg_authid ... FATAL:  wrong number of index expressions
STATEMENT:  CREATE TRIGGER pg_sync_pg_database   AFTER INSERT OR UPDATE OR DELETE ON pg_database   FOR EACH STATEMENT EXECUTE PROCEDURE flatfile_update_trigger();

child process exited with exit code 1
initdb: removing data directory "./data"
1

調べると、GCC 4.8 で発生するらしい。

上記では、結局 GCC 4.7 でないと駄目だった模様。他のネット情報を見ても、大体「GCC 4.7 使え」的な感じ。しかし RHEL7 DVD には GCC 4.7 が入っていないので、解決策がそれだと(個人的に)非常に困る。:-(

という状況で、駄目元で 8.4 系の最新(8.4.22)を取ってきたら、何事もなく動いた。助かった! :-D

該当の部分は多分これ。PostgreSQL 8.4 系では、8.4.18 で入っている。一応、8.4.18 で initdb が動くことは確認した。

現時点で、8.2 / 8.3 の HEAD に対しても同様の修正が入っている。私のように困っている人は、HEAD を落としてくると幸せになれるかも。