PostgreSQL डेटाबेस में pg_repack एक्सटेंशन को सक्षम करने के लिए, इसे स्रोतों से संकलित किया जाना चाहिए। PostgreSQL के किसी भी स्थापित संस्करण (स्रोत, आरपीएम, बाइनरी) पर स्रोत से संकलन करना काफी आसान और सरल है, हालांकि यह पोस्टग्रेएसक्यूएल [वन क्लिक इंस्टालर] के बाइनरी प्रारूप के साथ थोड़ा अलग है क्योंकि वे निर्भरता के साथ पूर्व-निर्मित बाइनरी बंडल हैं। पुस्तकालय। आइए संकलित करें और देखें।
CentOS 7 वर्चुअल मशीन पर, मैंने PostgreSQL 9.4 (डाउनलोड लिंक) और इसकी होम निर्देशिका "/opt/PostgreSQL/9.4/" का बाइनरी प्रारूप स्थापित किया है। आगे हमें उनकी आधिकारिक साइट से pg_repack स्रोत डाउनलोड करना होगा।
[root@localhost ~]# git clone https://github.com/reorg/pg_repack.git
संकलन करने से पहले, PostgreSQL 9.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
अब हम सोर्स इंस्टॉलेशन कमांड "मेक" और "मेक इंस्टाल" को निष्पादित करने के लिए अच्छे हैं। आइए "मेक" निष्पादित करें
[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) लाइब्रेरी से संबंधित कोई त्रुटि है। अधिक जानकारी के लिए वर्बोज़ मोड (-verbose) में समान कमांड "ld -ledit" चलाते हैं, "मेक" कमांड द्वारा कोशिश की गई और विफल रही।
[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" है, लेकिन "मेक" कमांड द्वारा आवश्यक "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
"मेक" कमांड को फिर से चलाएँ।
[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]। मुझे यकीन नहीं है कि यह/lib64 निर्देशिका में क्यों दिख रहा है जब मेरा pg_config/opt/PostgreSQL/9.4/lib को इंगित करता है। आइए देखें कि दोनों जगहों पर हमारे पास क्या है।
[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" की दो प्रतियां हैं, एक प्रतीकात्मक लिंक के रूप में और दूसरी हार्ड कॉपी के रूप में। मैं कई पुस्तकालय प्रतियों के कारण इसका अनुमान लगा रहा हूं, आइए प्रतीकात्मक लिंक को हटा दें और पुस्तकालय की एक हार्ड कॉपी को बनाए रखें और पुनः प्रयास करें।
[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 बायनेरिज़ और लाइब्रेरी के लिए "इंस्टॉल करें" चलाएँ।
[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 Server 9.4[PPAS] के साथ एक पूर्व-निर्मित बाइनरी पैकेज संकलित करने का प्रयास किया है। इसी तरह के पुस्तकालय मुद्दों का सामना करना पड़ा, इसलिए मैंने पुस्तकालय निर्देशिका और संकलित करने के लिए लिंकर विकल्प "एलडीएफएलजीएस" का उपयोग किया है।
[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
बढ़िया, यह भी सुचारू रूप से संकलित। अब PPAS 9.4 में एक्सटेंशन बनाएं
-bash-4.1$ psql
Welcome
psql.bin (9.4.1.4)
Type "help" for help.
edb=# create extension pg_repack;
CREATE EXTENSION
edb=#
धन्यवाद।