概述
平時我在使用資料庫時,一般都是使用指令行操作,PG是我使用最友善的資料庫,可以自動補全指令,指令提示,敲出來的指令肯定不會錯。
但是在建立的一個系統中發現不能使用該功能,很苦惱,找了一下原因。
問題描述
[postgres@erp-db01 ~]$ psql
psql (10.6)
Type "help" for help.
postgres=# \d
List of relations
Schema | Name | Type | Owner
--------+------------------+-------+----------
public | cs_sys_heartbeat | table | postgres
(1 row)
postgres=# \c cs das^[[A^[[D^[[C^[[B^C
postgres=#
postgres=# sele ^Hct^C
postgres=#
如上,補全,指令提示,和上下翻指令都是失敗的
原因查找
查了一下原因,發現最初的原因,檢視了一下資料庫的基本資訊
[postgres@erp-db01 ~]$ pg_config
BINDIR = /usr/pgsql-10/bin
DOCDIR = /usr/pgsql-10/share/doc
HTMLDIR = /usr/pgsql-10/share/doc
INCLUDEDIR = /usr/pgsql-10/include
PKGINCLUDEDIR = /usr/pgsql-10/include
INCLUDEDIR-SERVER = /usr/pgsql-10/include/server
LIBDIR = /usr/pgsql-10/lib
PKGLIBDIR = /usr/pgsql-10/lib
LOCALEDIR = /usr/pgsql-10/share/locale
MANDIR = /usr/pgsql-10/share/man
SHAREDIR = /usr/pgsql-10/share
SYSCONFDIR = /usr/pgsql-10/etc
PGXS = /usr/pgsql-10/lib/pgxs/src/makefiles/pgxs.mk
CONFIGURE = '--prefix=/usr/pgsql-10' '--with-perl' '--with-python' '--with-openssl' '--with-pam' '--with-ldap' '--with-libxml' '--with-libxslt' '--without-readline'
CC = gcc
CPPFLAGS = -D_GNU_SOURCE -I/usr/include/libxml2
CFLAGS = -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -O2
CFLAGS_SL = -fPIC
LDFLAGS = -Wl,--as-needed -Wl,-rpath,'/usr/pgsql-10/lib',--enable-new-dtags
LDFLAGS_EX =
LDFLAGS_SL =
LIBS = -lpgcommon -lpgport -lpthread -lxslt -lxml2 -lpam -lssl -lcrypto -lz -lrt -lcrypt -ldl -lm
VERSION = PostgreSQL 10.6
可以發現編譯時使用了參數 --without-readline
我們在資料庫的安裝資料目錄bin中可以檢視到psql指令的依賴庫情況,發現也是缺少readline的。這就是問題所在
[postgres@erp-db28 usr]$ ldd pgsql/bin/psql
linux-vdso.so.1 => (0x00007fffc011c000)
libpq.so.5 => /usr/pgsql/lib/libpq.so.5 (0x00007fb706579000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fb70635d000)
librt.so.1 => /lib64/librt.so.1 (0x00007fb706155000)
libm.so.6 => /lib64/libm.so.6 (0x00007fb705e53000)
libc.so.6 => /lib64/libc.so.6 (0x00007fb705a86000)
libssl.so.10 => /lib64/libssl.so.10 (0x00007fb705814000)
libcrypto.so.10 => /lib64/libcrypto.so.10 (0x00007fb7053b3000)
libldap_r-2.4.so.2 => /lib64/libldap_r-2.4.so.2 (0x00007fb705154000)
/lib64/ld-linux-x86-64.so.2 (0x00007fb7067bf000)
libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007fb704f07000)
libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007fb704c1e000)
libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007fb704a1a000)
libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007fb7047e7000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fb7045e3000)
libz.so.1 => /lib64/libz.so.1 (0x00007fb7043cd000)
liblber-2.4.so.2 => /lib64/liblber-2.4.so.2 (0x00007fb7041be000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x00007fb703fa5000)
libsasl2.so.3 => /lib64/libsasl2.so.3 (0x00007fb703d88000)
libssl3.so => /lib64/libssl3.so (0x00007fb703b36000)
libsmime3.so => /lib64/libsmime3.so (0x00007fb70390f000)
libnss3.so => /lib64/libnss3.so (0x00007fb7035e2000)
libnssutil3.so => /lib64/libnssutil3.so (0x00007fb7033b2000)
libplds4.so => /lib64/libplds4.so (0x00007fb7031ae000)
libplc4.so => /lib64/libplc4.so (0x00007fb702fa9000)
libnspr4.so => /lib64/libnspr4.so (0x00007fb702d6b000)
libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007fb702b5b000)
libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007fb702957000)
libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007fb702720000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fb7024f9000)
libfreebl3.so => /lib64/libfreebl3.so (0x00007fb7022f6000)
libpcre.so.1 => /lib64/libpcre.so.1 (0x00007fb702094000)
readline 是一個強大的庫,隻要使用了它的程式,都可以用同一個配置檔案配置,而且用同樣的方法操作指令行,讓你可以友善的編輯指令行
發現同僚在編譯的時候,發現報readline這個錯編譯不過去,就直接使用without-readline 跳過了,導緻了這個問題
問題解決
這個問題的解決方法最好的就是重新編譯資料庫了。替換掉原來的安裝目錄
如果插件安裝的很多,替換安裝目錄很麻煩的換。可以直接将替換好的資料目錄中的psql指令直接替換,因為psql是控制了readline的相關功能
首先需要把相關的依賴庫安裝
yum install readline
yum install readline-devel
在其他編譯條件不變的情況下增加with-readline參數,編譯安裝
(在重新編譯的時候,記得一定要将原來的編譯環境make clean,不然會以原來的參數編譯)
完成之後檢視編譯好的psql指令,可以發現是有readline了
[root@erp-db27 pgsql-10-text]# ldd bin/psql
linux-vdso.so.1 => (0x00007ffd87dd4000)
libpq.so.5 => /usr/pgsql-10-text/lib/libpq.so.5 (0x00007f05b3565000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f05b3349000)
libreadline.so.6 => /lib64/libreadline.so.6 (0x00007f05b3103000) <<<<<<<這裡
librt.so.1 => /lib64/librt.so.1 (0x00007f05b2efb000)
libm.so.6 => /lib64/libm.so.6 (0x00007f05b2bf9000)
libc.so.6 => /lib64/libc.so.6 (0x00007f05b282c000)
libssl.so.10 => /lib64/libssl.so.10 (0x00007f05b25ba000)
libcrypto.so.10 => /lib64/libcrypto.so.10 (0x00007f05b2159000)
libldap_r-2.4.so.2 => /lib64/libldap_r-2.4.so.2 (0x00007f05b1efa000)
/lib64/ld-linux-x86-64.so.2 (0x00007f05b37ab000)
libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007f05b1cd0000)
libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007f05b1a83000)
libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007f05b179a000)
libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007f05b1596000)
libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007f05b1363000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f05b115f000)
libz.so.1 => /lib64/libz.so.1 (0x00007f05b0f49000)
liblber-2.4.so.2 => /lib64/liblber-2.4.so.2 (0x00007f05b0d3a000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f05b0b21000)
libsasl2.so.3 => /lib64/libsasl2.so.3 (0x00007f05b0904000)
libssl3.so => /lib64/libssl3.so (0x00007f05b06b2000)
libsmime3.so => /lib64/libsmime3.so (0x00007f05b048b000)
libnss3.so => /lib64/libnss3.so (0x00007f05b015e000)
libnssutil3.so => /lib64/libnssutil3.so (0x00007f05aff2e000)
libplds4.so => /lib64/libplds4.so (0x00007f05afd2a000)
libplc4.so => /lib64/libplc4.so (0x00007f05afb25000)
libnspr4.so => /lib64/libnspr4.so (0x00007f05af8e7000)
libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007f05af6d7000)
libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007f05af4d3000)
libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007f05af29c000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f05af075000)
libfreebl3.so => /lib64/libfreebl3.so (0x00007f05aee72000)
libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f05aec10000)
将原來的psql指令替換掉
[root@erp-db28 pgsql]# mv psql bin/
mv: overwrite ‘bin/psql’? yes
此時發現資料庫也可以正常使用各種快捷指令了