场景: 客户的pg数据库安装在内容,之前操作通过客户远程windows系统上客户端连接查看数据库和表结构信息,项目结束后客户取消window客户端,但运维过程中有新的临时需求,需要查看相关pg表结构信息,需要在linux应用服务器上临时安装pg客户端,并通过内网远程连接pg数据库。
基本安装步骤流程如下:
- 确认对应pg版本的安装包(项目中pg版本是12)
- 选择合适的客户端安装包(主要下载postgresql和postgresql-libs包即可),下载地址:
yum.postgresql.org/12/redhat/r…
进入页面后,点击下方链接
查看到server端分为多个子包,下载下列两个包
- 下载完成后,将对应两个安装包上传到linux指定目录,并执行相关安装命令 ,先安装libs包
rpm -i postgresql12-libs-12.12-1PGDG.rhel7.x86_64.rpmrpm -i postgresql12-12.12-1PGDG.rhel7.x86_64.rpm
安装过程报警信息可忽略
warning: postgresql12-12.12-1PGDG.rhel7.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID 442df0f8: NOKEY
- 验证结果 执行psql命令,未报命令不存在信息,说明安装成功。
说明
postgresql12 - PostgreSQL 客户端程序和依赖包,官网包的详细描述中有说明
postgresql12-contrib - PostgreSQL 发布的源代码和二进制文件
postgresql12-libs - PostgreSQL 客户端依赖的公共包,pg的基础包,跟pg相关程序都需要安装
postgresql12-server - PostgreSQL 的服务端程序代码
以上是基本安装流程,最后整理常用的sql语句,供查询使用:
| 远程数据库连接 | psql -h 172.31.102.21 -p XXX -d handle -U XXX -W |
|---|---|
| 查看所有数据库 | \l |
| 查看当前库所有表 | \d |
| 查看表定义 | \d handle.prefixes其他schema下表需带schema前缀 |
| 查看XXXX表大小 | select pg_relation_size('XXXX'); |
| 查看表的总大小,包括索引大小 | select pg_size_pretty(pg_total_relation_size('test')); |
| 以KB,MB,GB的方式来查看表大小 | select pg_size_pretty(pg_relation_size('test')); |
| 查看当前schema | show search_path |
| 切换schema-当前连接 | set search_path to XXX如果不切换,则访问表名需添加schema前缀,如:_Yschema.tablename |
| 调整数据库schema | alert database 'XXX' set search_path to XXXX默认是public |
| 查看当前数据库所有索引 | \di |
| 查看单个索引大小 | select pg_size_pretty(pg_relation_size('parent_pkey')); |
| 查看所有表空间 | select spcname from pg_tablespace |
| 查看表空间大小 | select pg_size_pretty(pg_tablespace_size('pg_default')); |
| 查看表字段信息 | SELECT c.relname 表名称, A.attname AS 字段名称, col_description(A.attrelid,A.attnum) AS 注释, format_type ( A.atttypid, A.atttypmod ) AS 类型, CASE WHEN A.attnotnull='f' THEN '否' ELSE '是' END AS 是否必填, a.attnum 序号FROM pg_class AS c, pg_attribute AS aWHERE A.attrelid = C.oid AND A.attnum > 0 ORDER BY c.relname,a.attnum;示例:SELECT c.relname 表名称, A.attname AS 字段名称, split_part(col_description ( A.attrelid, A.attnum ),':',1) AS 注释, format_type ( A.atttypid, A.atttypmod ) AS 类型, CASE WHEN A.attnotnull='f' THEN '否' ELSE '是' END AS 是否必填, a.attnum 序号FROM pg_class AS c, pg_attribute AS aWHERE c.relnamespace=16389 AND c.relname not like 'v_%' AND c.relname not like 'pk_%' AND c.relname not like 'unidx%' AND c.relname not like '%_index' AND c.relname not like '%_seq' AND c.relname not like '%_pkey' AND A.attrelid = C.oid AND A.attnum > 0 ORDER BY c.relname,a.attnum;效果: |
| 查询数据库中所有表名 | SELECT tablename FROM pg_tables WHERE tablename NOT LIKE 'pg%' AND tablename NOT LIKE 'sql_%'ORDER BY tablename; |
| ### .获取数据库中所有table名及table的注解信息 | SELECT tablename,obj_description(relfilenode,'pg_class') FROM pg_tables a, pg_class bWHERE a.tablename = b.relnameand a.tablename NOT LIKE 'pg%' AND a.tablename NOT LIKE 'sql_%'ORDER BY a.tablename; |
| ### 查询字段名、字段类型及字段长度和字段注释 | select a.attnum,a.attname,concat_ws('',t.typname,SUBSTRING(format_type(a.atttypid,a.atttypmod) from '(.*)')) as type,d.description from pg_class c, pg_attribute a , pg_type t, pg_description dwhere c.relname = 'table_name' and a.attnum>0 and a.attrelid = c.oid and a.atttypid = t.oid and d.objoid=a.attrelid and d.objsubid=a.attnum |
| ### 获取表中字段名及字段注解 | SELECT col_description(a.attrelid,a.attnum) as comment,format_type(a.atttypid,a.atttypmod) as type,a.attname as name, a.attnotnull as notnullFROM pg_class as c,pg_attribute as awhere c.relname = 'tablename' and a.attrelid = c.oid and a.attnum>0 |