sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQLインストールのバイナリ形式でpg_repack拡張機能をコンパイルする

    このブログは、PostgreSQLインストールのバイナリ形式でpg_repack拡張機能をコンパイルすることについてです。ご存知のとおり、pg_repack拡張機能はよく知られているPostgreSQL拡張機能の1つであり、テーブル/インデックスで排他ロックを保持せずにオンラインでスペース[膨張]を再利用するために特に使用されます。

    PostgreSQLデータベースでpg_repack拡張機能を有効にするには、ソースからコンパイルする必要があります。インストールされているPostgreSQLのバリアント(source、rpm、binary)でソースからコンパイルするのは非常に簡単で簡単ですが、PostgreSQLのバイナリ形式[One Click Installer]の場合は、依存関係のあるビルド済みのバイナリバンドルであるため、わずかに異なります。ライブラリ。コンパイルして見てみましょう。

    CentOS 7仮想マシンに、PostgreSQL 9.4のバイナリ形式(ダウンロードリンク)とそのホームディレクトリ「/opt/PostgreSQL/9.4/」をインストールしました。次に、公式サイトからpg_repackソースをダウンロードする必要があります。

    [root@localhost ~]# git clone https://github.com/reorg/pg_repack.git

    コンパイルする前に、PostgreSQL9.4のpg_configをPATHに設定する必要があります。

    [root@localhost pg_repack]# export PATH=/opt/PostgreSQL/9.4/bin:$PATH
    [root@localhost pg_repack]# type pg_config
    pg_config is /opt/PostgreSQL/9.4/bin/pg_config

    これで、ソースインストールコマンド「make」と「makeinstall」を実行できます。 「make」を実行してみましょう

    [root@localhost ~]# cd pg_repack/
    [root@localhost pg_repack]# make
    make[1]: Entering directory `/root/pg_repack/bin'
    ....
    ....
    gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -O2 pg_repack.o pgut/pgut.o pgut/pgut-fe.o -L/opt/PostgreSQL/9.4/lib -lpq -L/opt/PostgreSQL/9.4/lib -L/opt/local/Current/lib -Wl,--as-needed -Wl,-rpath,'/opt/PostgreSQL/9.4/lib',--enable-new-dtags -lpgcommon -lpgport -lssl -lcrypto -lgssapi_krb5 -lz -ledit -lrt -lcrypt -ldl -lm -o pg_repack
    /usr/bin/ld: cannot find -ledit
    collect2: ld returned 1 exit status
    make[1]: *** [pg_repack] Error 1
    make[1]: Leaving directory `/root/pg_repack/bin'
    make: *** [all] Error 2

    おっと…!!、PostgreSQLのlibディレクトリに-ledit(libedit)ライブラリがないことに関連するエラーがあるようです。同じコマンド「ld-ledit」を冗長モード(-verbose)で実行して詳細を確認し、「make」コマンドで試行と失敗を確認します。

    [root@localhost pg_repack]# ld -ledit -verbose
    GNU ld version 2.20.51.0.2-5.42.el6 20100205
    ...
    ...
    ...
    ==================================================
    attempt to open /usr/x86_64-redhat-linux/lib64/libedit.so failed
    attempt to open /usr/x86_64-redhat-linux/lib64/libedit.a failed
    attempt to open /usr/local/lib64/libedit.so failed
    attempt to open /usr/local/lib64/libedit.a failed
    attempt to open /lib64/libedit.so failed
    attempt to open /lib64/libedit.a failed
    attempt to open /usr/lib64/libedit.so failed
    attempt to open /usr/lib64/libedit.a failed
    attempt to open /usr/x86_64-redhat-linux/lib/libedit.so failed
    attempt to open /usr/x86_64-redhat-linux/lib/libedit.a failed
    attempt to open /usr/lib64/libedit.so failed
    attempt to open /usr/lib64/libedit.a failed
    attempt to open /usr/local/lib/libedit.so failed
    attempt to open /usr/local/lib/libedit.a failed
    attempt to open /lib/libedit.so failed
    attempt to open /lib/libedit.a failed
    attempt to open /usr/lib/libedit.so failed
    attempt to open /usr/lib/libedit.a failed
    ld: cannot find -ledit

    さて、PostgreSQLのlibディレクトリ[/opt/PostgreSQL/9.4/lib]でlibedit.soライブラリを探していることが明らかになりました。そのディレクトリのライブラリを確認しましょう。

    [root@localhost pg_repack]# cd /opt/PostgreSQL/9.4/lib
    [root@localhost lib]# ls -l libedit*
    -rwxr-xr-x. 1 root daemon 254702 Mar 22 23:32 libedit.so.0

    ああ、「libedit.so.0」はありますが、「make」コマンドに必要な「libedit.so」はありません。シンボリックリンクを作成するのは簡単な修正です。

    [root@localhost lib]# ln -s libedit.so.0 libedit.so
    [root@localhost lib]# ls -l libedit*
    lrwxrwxrwx. 1 root root 12 May 19 22:25 libedit.so -> libedit.so.0
    -rwxr-xr-x. 1 root daemon 254702 Mar 22 23:32 libedit.so.0

    「make」コマンドを再実行します。

    [root@localhost pg_repack]# make
    make[1]: Entering directory `/root/pg_repack/bin'
    gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -O2 pg_repack.o pgut/pgut.o pgut/pgut-fe.o -L/opt/PostgreSQL/9.4/lib -lpq -L/opt/PostgreSQL/9.4/lib -L/opt/local/Current/lib -Wl,--as-needed -Wl,-rpath,'/opt/PostgreSQL/9.4/lib',--enable-new-dtags -lpgcommon -lpgport -lssl -lcrypto -lgssapi_krb5 -lz -ledit -lrt -lcrypt -ldl -lm -o pg_repack
    /usr/bin/ld: warning: libssl.so.1.0.0, needed by /opt/PostgreSQL/9.4/lib/libpq.so, may conflict with libssl.so.10
    /lib64/libldap_r-2.4.so.2: undefined reference to `ber_sockbuf_io_udp'
    collect2: ld returned 1 exit status
    make[1]: *** [pg_repack] Error 1
    make[1]: Leaving directory `/root/pg_repack/bin'
    make: *** [all] Error 2

    おっと…!!!興味深いことに、-leditエラーに合格し、libldapライブラリ[libldap_r-2.4.so.2]に関するレポートが作成されました。 pg_configが/opt/PostgreSQL/9.4/libを指しているときに/lib64ディレクトリを検索する理由がわかりません。両方の場所にあるものを確認しましょう。

    [root@localhost pg_repack]# ls -l /lib64/libldap*
    lrwxrwxrwx. 1 root root 21 Jan 6 22:05 libldap-2.4.so.2 -> libldap-2.4.so.2.10.2
    -rwxr-xr-x. 1 root root 329696 Oct 15 2014 libldap-2.4.so.2.10.2
    lrwxrwxrwx. 1 root root 23 May 19 06:43 libldap_r-2.4.so.2 -> libldap_r-2.4.so.2.10.2
    -rwxr-xr-x. 1 root root 351920 Oct 15 2014 libldap_r-2.4.so.2.10.2

    [root@localhost pg_repack]# ls -l /opt/PostgreSQL/9.4/lib/libldap*
    -rwxr-xr-x. 1 root daemon 404761 Mar 22 23:32 /opt/PostgreSQL/9.4/lib/libldap-2.4.so.2
    -rwxr-xr-x. 1 root daemon 442657 Mar 22 23:32 /opt/PostgreSQL/9.4/lib/libldap_r-2.4.so.2

    「libldap_r-2.4.so.2」のコピーが2つあるようです。1つはシンボリックリンクの形式で、もう1つはハードコピーの形式です。ライブラリのコピーが複数あるためだと推測しています。シンボリックリンクを削除し、ライブラリのハードコピーを保持して、再試行してください。

    [root@localhost lib64]# unlink libldap_r-2.4.so.2

    [root@localhost pg_repack]# make
    make[1]: Entering directory `/root/pg_repack/bin'
    ....
    ....
    ....
    sed 's,REPACK_VERSION,1.3.1,g' pg_repack.sql.in > pg_repack--1.3.1.sql;
    sed 's,REPACK_VERSION,1.3.1,g' pg_repack.control.in > pg_repack.control
    make[1]: Leaving directory `/root/pg_repack/lib'
    make[1]: Entering directory `/root/pg_repack/regress'
    make[1]: Nothing to be done for `all'.
    make[1]: Leaving directory `/root/pg_repack/regress'

    うわー…ついにコンパイルしました。 pg_repackバイナリとライブラリに対して「makeinstall」を実行します。

    [root@localhost pg_repack]# make install
    make[1]: Entering directory `/root/pg_repack/bin'
    /bin/mkdir -p '/opt/PostgreSQL/9.4/bin'
    /usr/bin/install -c pg_repack '/opt/PostgreSQL/9.4/bin'
    make[1]: Leaving directory `/root/pg_repack/bin'
    make[1]: Entering directory `/root/pg_repack/lib'
    /bin/mkdir -p '/opt/PostgreSQL/9.4/lib/postgresql'
    /bin/mkdir -p '/opt/PostgreSQL/9.4/share/postgresql/extension'
    /bin/mkdir -p '/opt/PostgreSQL/9.4/share/postgresql/extension'
    /usr/bin/install -c -m 755 pg_repack.so '/opt/PostgreSQL/9.4/lib/postgresql/pg_repack.so'
    /usr/bin/install -c -m 644 pg_repack.control '/opt/PostgreSQL/9.4/share/postgresql/extension/'
    /usr/bin/install -c -m 644 pg_repack--1.3.1.sql pg_repack.control '/opt/PostgreSQL/9.4/share/postgresql/extension/'
    make[1]: Leaving directory `/root/pg_repack/lib'
    make[1]: Entering directory `/root/pg_repack/regress'
    make[1]: Nothing to be done for `install'.
    make[1]: Leaving directory `/root/pg_repack/regress'

    コンパイル後、$ PGHOME / binにpg_repackユーティリティがあり、$ PGHOME / lib /postgresql/ディレクトリにpg_repack.soライブラリがあります。

    [root@localhost pg_repack]# ls -l /opt/PostgreSQL/9.4/bin/pg_rep*
    -rwxr-xr-x. 1 root root 84030 May 20 00:07 /opt/PostgreSQL/9.4/bin/pg_repack

    [root@localhost postgresql]# ls -l /opt/PostgreSQL/9.4/lib/postgresql/pg_rep*
    -rwxr-xr-x. 1 root root 31028 May 20 00:07 /opt/PostgreSQL/9.4/lib/postgresql/pg_repack.so

    これで、データベース内にpg_repack拡張機能を作成する準備が整いました。

    -bash-4.1$ psql
    Password:
    psql.bin (9.4.1)
    Type "help" for help.

    postgres=# select * from pg_available_extensions where name='pg_repack';
    name | default_version | installed_version | comment
    -----------+-----------------+-------------------+--------------------------------------------------------------
    pg_repack | 1.3.1 | 1.3.1 | Reorganize tables in PostgreSQL databases with minimal locks
    (1 row)

    postgres=# create extension pg_repack;
    CREATE EXTENSION

    同様に、EnterpriseDB製品のPostgresPlus Advanced Server9.4[PPAS]でビルド済みのバイナリパッケージをコンパイルしようとしました。同様のライブラリの問題に直面したため、ライブラリディレクトリを指すリンカーオプション「LDFLAGS」を使用してコンパイルしました。

    [root@localhost ~]# export PATH=/opt/PostgresPlus/9.4AS/bin:$PATH
    [root@localhost ~]# export LDFLAGS=-L/opt/PostgresPlus/9.4AS/lib
    [root@localhost ~]# cd pg_repack/
    [root@localhost pg_repack]# make
    [root@localhost pg_repack]# make install


    [root@localhost pg_repack]# ls -l /opt/PostgresPlus/9.4AS/bin/pg_rep*
    -rwxr-xr-x. 1 root root 201877 May 15 11:06 /opt/PostgresPlus/9.4AS/bin/pg_repack
    [root@localhost pg_repack]# ls -l /opt/PostgresPlus/9.4AS/lib/pg_rep*
    -rwxr-xr-x. 1 root root 94516 May 15 11:06 /opt/PostgresPlus/9.4AS/lib/pg_repack.so

    かっこいい、これもスムーズにコンパイルされました。次に、PPAS9.4で拡張機能を作成します

    -bash-4.1$ psql
    Welcome
    psql.bin (9.4.1.4)
    Type "help" for help.

    edb=# create extension pg_repack;
    CREATE EXTENSION
    edb=#

    ありがとうございます。


    1. MySQL動的ピボットテーブル

    2. MySQLテーブルの重複を削除するにはどうすればよいですか?

    3. Androidルームデータベースはすべてのデータをエクスポートしません

    4. MySQL TRUNCATE()関数–数値を指定された小数点以下の桁数に切り捨てます