PostgreSQL 自动补齐(readline)问题

本文涉及的产品
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
简介: 新安装的系统没有自动补齐功能

概述

平时我在使用数据库时,一般都是使用命令行操作,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

此时发现数据库也可以正常使用各种快捷命令了

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
弹性计算 容灾 关系型数据库
PostgreSQL PITR 任意时间点恢复过程中如何手工得到recovery需要的下一个WAL文件名 - 默认情况下restore_command自动获取
标签 PostgreSQL , recovery , recovery.conf , restore_command , timeline , 时间线 , next wal , PITR , 时间点恢复 背景 PostgreSQL数据库支持PITR时间点恢复。默认情况下,只需要配置目标是时间点,resotre_command即可,PG会自动调用resotre_command去找需要的WA
1504 0
|
SQL 移动开发 关系型数据库
PostgreSQL 执行计划,成本公式解说,代价因子校准,自动跟踪SQL执行计划(三)|学习笔记
快速学习PostgreSQL 执行计划,成本公式解说,代价因子校准,自动跟踪SQL执行计划(三)
PostgreSQL 执行计划,成本公式解说,代价因子校准,自动跟踪SQL执行计划(三)|学习笔记
|
SQL 数据可视化 关系型数据库
postgresql如何设置自动增长
postgresql如何设置自动增长
454 0
|
关系型数据库 MySQL 数据库
PostgreSQL的学习心得和知识总结(二十五)|语法级自上而下完美实现MySQL数据库的 字段默认值的自动插入更新 的实现方案
本人CSDN博主 孤傲小二~阿沐,本文《PostgreSQL的学习心得和知识总结(二十五)|语法级自上而下完美实现MySQL数据库的 字段默认值的自动插入更新 的实现方案》来自于我在CSDN的同名文档
|
弹性计算 监控 关系型数据库
PostgreSQL 双节点流复制如何同时保证可用性、可靠性(rpo,rto) - (半同步,自动降级方法实践)
标签 PostgreSQL , 同步 , 半同步 , 流复制 背景 两节点HA架构,如何做到跨机房RPO=0(可靠性维度)?同时RTO可控(可用性维度)? 半同步是一个不错的选择。 1、当只挂掉一个节点时,可以保证RPO=0。如下: 主 -> 从(挂) 主(挂) -> 从 2、当一个节点挂掉后,在另一个节点恢复并开启同步模式前,如果在此期间(
2202 0
|
弹性计算 关系型数据库 数据库
PostgreSQL 如何让心跳永远不死,支持半同步自动同步、异步升降级 - udf 心跳
标签 PostgreSQL , 同步 , 半同步 , 流复制 , 心跳 , 自动降级 , 自动升级 , dblink , 异步调用 背景 在心跳时,通过自定义UDF,实现心跳永远不被堵塞,并且支持更加当前的配置自动的进行同步、异步模式的升降级。实现半同步的功能。 UDF输入 1、优先模式(同步、异步) 2、同步等待超时时间 当优先为同步模式时,假设当前为同步配置,如果备库异常导致
1927 0
|
关系型数据库 数据库 PostgreSQL
PostgreSQL 如何让心跳永远不死,支持半同步自动同步、异步升降级 - udf 心跳
PostgreSQL 如何让心跳永远不死,支持半同步自动同步、异步升降级 - udf 心跳
1164 0
|
监控 关系型数据库 测试技术
PostgreSQL 双节点流复制如何同时保证可用性、可靠性(rpo,rto) - (半同步,自动降级方法实践)
PostgreSQL 双节点流复制如何同时保证可用性、可靠性(rpo,rto) - (半同步,自动降级方法实践)
1329 0