PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Biên dịch phần mở rộng pg_repack trên định dạng nhị phân của cài đặt PostgreSQL

Blog này là về việc biên dịch phần mở rộng pg_repack trên định dạng nhị phân của cài đặt PostgreSQL. Hầu hết các bạn đều biết, tiện ích mở rộng pg_repack là một trong những tiện ích mở rộng PostgreSQL nổi tiếng, nó đặc biệt được sử dụng để lấy lại không gian [bloats] TRỰC TUYẾN mà không cần giữ KHÓA ĐỘC QUYỀN trên Bảng / Chỉ mục.

Để bật tiện ích mở rộng pg_repack trong cơ sở dữ liệu PostgreSQL, nó phải được biên dịch từ các nguồn. Nó khá dễ dàng và đơn giản để biên dịch từ nguồn trên bất kỳ biến thể được cài đặt nào (nguồn, rpm, binary) của PostgreSQL, tuy nhiên nó hơi khác nếu nó ở định dạng nhị phân của PostgreSQL [One Click Installer] vì chúng là gói nhị phân được tạo sẵn với sự phụ thuộc các thư viện. Hãy biên dịch và xem.

Trên Máy ảo CentOS 7, tôi đã cài đặt định dạng nhị phân của PostgreSQL 9.4 (liên kết tải xuống) và thư mục chính của nó “/opt/PostgreSQL/9.4/”. Tiếp theo, chúng tôi cần tải xuống nguồn pg_repack từ trang web chính thức của họ.

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

Trước khi biên dịch, pg_config của PostgreSQL 9.4 nên được đặt trong 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

Bây giờ chúng ta đã thực hiện tốt các lệnh cài đặt nguồn “make” &“make install”. Hãy thực hiện "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

Rất tiếc… !!, có vẻ như đã xảy ra lỗi liên quan đến thư viện -ledit (libedit) bị thiếu trong thư mục lib PostgreSQL. Cho phép chạy cùng một lệnh “ld -ledit” ở chế độ tiết (-verbose) để biết thêm thông tin, đã thử và không thành công bằng lệnh “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

Được rồi, bây giờ rõ ràng là nó đang tìm kiếm thư viện libedit.so trong thư mục lib PostgreSQL [/opt/PostgreSQL/9.4/lib]. Hãy kiểm tra thư viện trong thư mục đó.

[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

À, chúng tôi có “libedit.so.0” nhưng không có “libedit.so” theo yêu cầu của lệnh “make”. Tạo một liên kết tượng trưng sẽ là một giải pháp nhanh chóng.

[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

Chạy lại lệnh "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

Giáo sư…!!! thú vị, nó đã vượt qua lỗi -ledit và bây giờ nó đang báo cáo trên thư viện libldap [libldap_r-2.4.so.2]. Tôi không chắc tại sao nó lại tìm trong thư mục / lib64 khi pg_config của tôi trỏ đến /opt/PostgreSQL/9.4/lib. Hãy kiểm tra những gì chúng tôi có ở cả hai vị trí.

[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

Có vẻ như có hai bản sao của “libldap_r-2.4.so.2”, một bản ở dạng liên kết tượng trưng và một bản khác ở dạng bản cứng. Tôi đoán nó là do có nhiều bản sao thư viện, hãy xóa liên kết tượng trưng và giữ lại một bản sao cứng của thư viện và thử lại.

[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… cuối cùng, nó đã được biên dịch. Chạy "thực hiện cài đặt" cho các tệp và thư viện 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'

Sau khi biên dịch sẽ có tiện ích pg_repack trong thư viện $ PGHOME / bin và pg_repack.so trong thư mục $ 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

Bây giờ chúng ta đã thiết lập để tạo phần mở rộng pg_repack bên trong cơ sở dữ liệu.

-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

Tương tự như vậy, tôi đã cố gắng biên dịch với sản phẩm EnterpriseDB PostgresPlus Advanced Server 9.4 [PPAS] một gói nhị phân được tạo sẵn. Đối mặt với các vấn đề thư viện tương tự, do đó tôi đã sử dụng tùy chọn trình liên kết “LDFLAGS” trỏ đến thư mục thư viện và được biên dịch.

[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

Tuyệt, điều này được biên dịch quá suôn sẻ. Bây giờ hãy tạo tiện ích mở rộng trong 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=#

Xin cảm ơn.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Giám sát động các phiên bản PostgreSQL bằng pg_top

  2. Các truy vấn được tham số hóa với psycopg2 / Python DB-API và PostgreSQL

  3. Giá trị tham chiếu của cột nối tiếp trong một cột khác trong cùng một INSERT

  4. Ánh xạ trường điểm hình học PostGIS với Hibernate trên Spring Boot

  5. Tự động tạo các cột cho bảng chéo trong PostgreSQL