PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Kompilieren der pg_repack-Erweiterung im Binärformat der PostgreSQL-Installation

In diesem Blog geht es um das Kompilieren der pg_repack-Erweiterung im Binärformat der PostgreSQL-Installation. Die meisten von Ihnen wissen, dass die pg_repack-Erweiterung eine der bekannten PostgreSQL-Erweiterungen ist, die speziell für die Rückgewinnung von Speicherplatz [bloats] ONLINE verwendet wird, ohne eine EXCLUSIVE LOCK für Tabellen/Indizes zu halten.

Um die pg_repack-Erweiterung in der PostgreSQL-Datenbank zu aktivieren, sollte sie aus den Quellen kompiliert werden. Es ist ziemlich einfach und einfach, aus dem Quellcode auf allen installierten Varianten (Quelle, RPM, Binär) von PostgreSQL zu kompilieren, es ist jedoch etwas anders, wenn es sich um das Binärformat von PostgreSQL [One Click Installer] handelt, da es sich um vorgefertigte Binärpakete mit Abhängigkeit handelt Bibliotheken. Lassen Sie uns kompilieren und sehen.

Auf der CentOS 7 Virtual Machine habe ich das Binärformat von PostgreSQL 9.4 (Download-Link) und sein Home-Verzeichnis „/opt/PostgreSQL/9.4/“ installiert. Als nächstes müssen wir die pg_repack-Quelle von ihrer offiziellen Seite herunterladen.

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

Vor dem Kompilieren sollte pg_config von PostgreSQL 9.4 im PATH gesetzt werden.

[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

Jetzt können wir die Quellinstallationsbefehle „make“ und „make install“ ausführen. Lassen Sie uns „make“

ausführen
[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

Hoppla…!!, es scheint, dass ein Fehler im Zusammenhang mit der -ledit(libedit)-Bibliothek im PostgreSQL-Bibliotheksverzeichnis fehlt. Lassen Sie uns denselben Befehl „ld -ledit“ im ausführlichen Modus (-verbose) ausführen, um weitere Informationen zu erhalten, der mit dem Befehl „make“ versucht und fehlgeschlagen ist.

[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
nicht finden

Okay, jetzt ist klar, dass im PostgreSQL-Bibliotheksverzeichnis [/opt/PostgreSQL/9.4/lib] nach der Bibliothek libedit.so gesucht wird. Lassen Sie uns nach einer Bibliothek in diesem Verzeichnis suchen.

[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

Ah, wir haben „libedit.so.0“, aber nicht „libedit.so“, das vom Befehl „make“ benötigt wird. Das Erstellen eines symbolischen Links sollte eine schnelle Lösung sein.

[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

Führen Sie den Befehl „make“ erneut aus.

[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

Hoppla…!!! interessant, es hat den -ledit-Fehler bestanden und berichtet jetzt über die libldap-Bibliothek [ libldap_r-2.4.so.2 ]. Ich bin mir nicht sicher, warum es im /lib64-Verzeichnis sucht, wenn meine pg_config auf /opt/PostgreSQL/9.4/lib zeigt. Sehen wir uns an, was wir an beiden Orten haben.

[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

Scheint, dass es zwei Kopien von „libldap_r-2.4.so.2“ gibt, eine in Form eines symbolischen Links und eine als Hardcopy. Ich vermute, es liegt an mehreren Bibliothekskopien, entfernen Sie den symbolischen Link und behalten Sie eine Hardcopy der Bibliothek und versuchen Sie es erneut.

[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'

wow… endlich hat es kompiliert. Führen Sie „make install“ für die pg_repack-Binärdateien und -Bibliotheken aus.

[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'

Nach der Kompilierung befindet sich das Dienstprogramm pg_repack im Verzeichnis $PGHOME/bin und die Bibliothek pg_repack.so im Verzeichnis $PGHOME/lib/postgresql/.

[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

Jetzt sind wir bereit, die pg_repack-Erweiterung in der Datenbank zu erstellen.

-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

Ebenso habe ich versucht, mit dem EnterpriseDB-Produkt PostgresPlus Advanced Server 9.4[PPAS] ein vorgefertigtes Binärpaket zu kompilieren. Ich hatte ähnliche Bibliotheksprobleme, daher habe ich die Linker-Option „LDFLAGS“ verwendet, die auf das Bibliotheksverzeichnis zeigt, und kompiliert.

[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

Cool, das hat auch reibungslos kompiliert. Jetzt Erweiterung in PPAS 9.4 erstellen

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

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

Danke.