[Dd]enzow(ill)? with DB and Python

DBとか資格とかPythonとかの話をつらつらと

PostgreSQL 9.6をroot権限を使わずにソースからコンパイル

ちょっとPostgreSQL全文検索等を試したかったのですが、そもそも手元の環境に入れてなかったので ついでにまとめてしまいます。

対象環境

今回は以下の環境で実施しました。

ソースの入手

とりあえずソースをダウンロードして解凍します。

denzow@denzow-ubuntu:~$ mkdir -p work/pg
denzow@denzow-ubuntu:~$ cd work/pg
denzow@denzow-ubuntu:~/work/pg$ wget https://ftp.postgresql.org/pub/source/v9.6.5/postgresql-9.6.5.tar.bz2
--2017-09-08 22:42:08--  https://ftp.postgresql.org/pub/source/v9.6.5/postgresql-9.6.5.tar.bz2
ftp.postgresql.org (ftp.postgresql.org) をDNSに問いあわせています... 204.145.124.244, 174.143.35.246, 87.238.57.227, ...
ftp.postgresql.org (ftp.postgresql.org)|204.145.124.244|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 19576132 (19M) [application/x-bzip]
`postgresql-9.6.5.tar.bz2' に保存中

postgresql-9.6.5.tar.bz2         100%[=======================================================>]  18.67M   437KB/s    in 44s

2017-09-08 22:42:54 (436 KB/s) - `postgresql-9.6.5.tar.bz2' へ保存完了 [19576132/19576132]

denzow@denzow-ubuntu:~/work/pg$ tar xf postgresql-9.6.5.tar.bz2
denzow@denzow-ubuntu:~/work/pg$ cd postgresql-9.6.5/
denzow@denzow-ubuntu:~/work/pg/postgresql-9.6.5$

必要パッケージの入手

指定するオプション次第ですが、readlinelibxmlopensslあたりはないとあとで面倒な気がするので入れておきます。

denzow@denzow-ubuntu:~/work/pg/postgresql-9.6.5$ sudo apt-get install libreadline6-dev
denzow@denzow-ubuntu:~/work/pg/postgresql-9.6.5$ sudo apt-get install libxml2-dev
denzow@denzow-ubuntu:~/work/pg/postgresql-9.6.5$ sudo apt-get install libssl-dev

ディレクトリの準備

インストール先を用意しておきます。

denzow@denzow-ubuntu:~/work/pg/postgresql-9.6.5$ mkdir -p ~/posgreHome/pg965

ビルドの実施

MySQLcmakeでしたが、PostgreSQL./configureでMakeの前準備をします。ここでインストール先等も指定することになります。

denzow@denzow-ubuntu:~/work/pg/postgresql-9.6.5$ ./configure -prefix=$HOME/posgreHome/pg965 --with-openssl --with-libxml
:
configure: creating ./config.status
config.status: creating GNUmakefile
config.status: creating src/Makefile.global
config.status: creating src/include/pg_config.h
config.status: creating src/include/pg_config_ext.h
config.status: creating src/interfaces/ecpg/include/ecpg_config.h
config.status: linking src/backend/port/tas/dummy.s to src/backend/port/tas.s
config.status: linking src/backend/port/dynloader/linux.c to src/backend/port/dynloader.c
config.status: linking src/backend/port/sysv_sema.c to src/backend/port/pg_sema.c
config.status: linking src/backend/port/sysv_shmem.c to src/backend/port/pg_shmem.c
config.status: linking src/backend/port/dynloader/linux.h to src/include/dynloader.h
config.status: linking src/include/port/linux.h to src/include/pg_config_os.h
config.status: linking src/makefiles/Makefile.linux to src/Makefile.port

うまく行ったのであとはmakeしてmake installです。CPUに余力があるので-j4で4並列にしてしまいます。

denzow@denzow-ubuntu:~/work/pg/postgresql-9.6.5$ make -j4 && make install
:
/bin/mkdir -p '/home/denzow/posgreHome/pg965/lib/postgresql/pgxs/config'
/usr/bin/install -c -m 755 ./install-sh '/home/denzow/posgreHome/pg965/lib/postgresql/pgxs/config/install-sh'
/usr/bin/install -c -m 755 ./missing '/home/denzow/posgreHome/pg965/lib/postgresql/pgxs/config/missing'
make[1]: ディレクトリ '/home/denzow/work/pg/postgresql-9.6.5/config' から出ます
PostgreSQL installation complete.

環境変数の設定

PATH等を指定しないで実行できるように必要な環境変数を設定しておきます。.bashrcに書いてしまいます。

# for pg
export PATH=$HOME/posgreHome/pg965/bin:$PATH
export PGDATA=$HOME/posgreHome/pg965/data
export LD_LIBRARY_PATH=$HOME/posgreHome/pg965/lib
export PGPORT=5432

書いたあとはちゃんと読み込んでおきましょう。

denzow@denzow-ubuntu:~$ . .bashrc

DBの初期化

DBを作成していきます。initdbを実行します。エンコーディングはまぁ要件次第ですが日本語を扱う場合は--no-localeを指定するのが定石です。 ロケールの指定はソート順序等に影響しますが、日本語データではメリットが少ない割にオーバヘッドがあるためです。

denzow@denzow-ubuntu:~$ initdb --encoding=UTF8 --no-locale
The files belonging to this database system will be owned by user "denzow".
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".

Data page checksums are disabled.

creating directory /home/denzow/posgreHome/pg965/data ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting dynamic shared memory implementation ... posix
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok

WARNING: enabling "trust" authentication for local connections
You can change this by editing pg_hba.conf or using the option -A, or
--auth-local and --auth-host, the next time you run initdb.

Success. You can now start the database server using:

    pg_ctl -D /home/denzow/posgreHome/pg965/data -l logfile start

無事にできましたので起動してみます。

denzow@denzow-ubuntu:~$ pg_ctl start
server starting
denzow@denzow-ubuntu:~$ LOG:  database system was shut down at 2017-09-08 23:01:40 JST
LOG:  MultiXact member wraparound protections are now enabled
LOG:  database system is ready to accept connections
LOG:  autovacuum launcher started

denzow@denzow-ubuntu:~$ psql -l
                          List of databases
   Name    | Owner  | Encoding | Collate | Ctype | Access privileges
-----------+--------+----------+---------+-------+-------------------
 postgres  | denzow | UTF8     | C       | C     |
 template0 | denzow | UTF8     | C       | C     | =c/denzow        +
           |        |          |         |       | denzow=CTc/denzow
 template1 | denzow | UTF8     | C       | C     | =c/denzow        +
           |        |          |         |       | denzow=CTc/denzow
(3 rows)

denzow@denzow-ubuntu:~$ psql postgres -c "select version()"
                                                 version
----------------------------------------------------------------------------------------------------------
 PostgreSQL 9.6.5 on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 5.3.1-14ubuntu2) 5.3.1 20160413, 64-bit
(1 row)

構築できましたので、この環境を次回以降でいじっていきます。