概述
平时我在使用数据库时,一般都是使用命令行操作,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
readline 是一个强大的库,只要使用了它的程序,都可以用同一个配置文件配置,而且用同样的方法操作命令行,让你可以方便的编辑命令行
发现同事在编译的时候,发现报readline这个错编译不过去,就直接使用without-readline 跳过了,导致了这个问题
问题解决
这个问题的解决方法最好的就是重新编译数据库了。替换掉原来的安装目录
如果插件安装的很多,替换安装目录很麻烦的换。可以直接将替换好的数据目录中的psql命令直接替换,因为psql是控制了readline的相关功能