[[223726]]

近两天总结了下PostgreSQL的基本操作命令,对PostgreSQL也有了一个基本的认识。

PostgreSQL的功能还是很丰富的,有序列,支持db link,基本Oracle里有的概念它这里也有,目前来看不支持package。

风格和Oracle也类似,没有MySQL中快捷方便的show create table 这样的语句。

从我的使用习惯来说,我基本关注以下的一些方面。

    查看数据库的配置

    查看用户信息

    查看会话连接信息

    show tables的类似方法

    用户的权限查看

    建表语句

    表空间信息

    对象存储信息

    查看锁的信息

    查看数据库参数

    显示数据库的运行状态

    查看数据字典的信息

    查看索引的信息

    查看执行计划

    查看存储过程

    存储过程的调度执行

    事务隔离级别

1.查看数据库的配置

可以直接使用\l 选项列出所有的数据库来,字符集,基本的配置都一目了然,有点Oracle 12c中的show pdbs的感觉。

从进程情况来看,PG是多进程多线程的架构设计。

如果查看当前数据库,可以使用current_database()。

    postgres=#selectcurrent_database();current_database------------------postgres

2.查看用户信息

可以使用\dn来得到schema的相关信息,在PG里面的schema和user还是有一些差别,在其他数据库schema基本就是user了。

    postgres-#\dnListofschemasName|Owner--------+----------public|postgres

我们创建一个schema,然后使用\dn来查看。

    postgres=#createschemajeanron100;CREATESCHEMApostgres=#\dnListofschemasName|Owner------------+----------jeanron100|postgrespublic|postgres

或者使用数据字典pg_authid来查看。

    postgres=#select*frompg_authid;

关于schema的概念,我们可以创建一个表test,

    postgres=#createtabletest(idint);CREATETABLE

可以看到这个是一个public的schema

    postgres=#\dListofrelationsSchema|Name|Type|Owner--------+------+-------+----------public|test|table|postgres

如果使用\d来查看字段信息,结果如下:

    postgres=#\dtestTable"public.test"Column|Type|Modifiers--------+---------+-----------id|integer|

还可以使用pg_users来查看,比如我创建了一个用户replica,就会有相应的配置。

    select*frompg_user;usename|usesysid|usecreatedb|usesuper|userepl|usebypassrls|passwd|valuntil|useconfig----------+----------+-------------+----------+---------+--------------+----------+----------postgres|10|t|t|t|t|********||replica|16384|f|f|t|f|********||

查看当前的schema信息,可以使用current_schema()

3.查看会话连接信息

如果查看PG中的会话信息,可以使用select * from pg_stat_activity;

如果新增了一个连接,开启了一个会话,在服务端是会有一个影子进程存在的。可以根据pid找到对应的会话。包括执行的SQL都可以看到,如果有多个会话,就是多条记录。

    postgres=#select*frompg_stat_activity;-[RECORD1]----+--------------------------------datid|13241datname|postgrespid|20644usesysid|10usename|postgresapplication_name|psqlclient_addr|client_hostname|client_port|-1backend_start|2018-03-2505:38:16.988057+08xact_start|2018-03-2505:48:08.113649+08query_start|2018-03-2505:48:08.113649+08state_change|2018-03-2505:48:08.113653+08waiting|fstate|activebackend_xid|backend_xmin|1753query|select*frompg_stat_activity;

4.show tables的类似方法

PG里面暂时没有找到show tables这种的快捷方式,目前发现有两类方式。

一种是通过数据字典pg_tables来查看,相当于Oracle里面的all_tables

或者是使用information_schema里面的tables来查看。

    postgres=#select*frominformation_schema.tables;postgres=#select*frompg_tables;

PG里面的information_schema比较特别,在数据库中直接\l无法看到,但是确确实实存在,着数据字典风格和MySQL很相似。

5.用户的权限查看

查看权限可以使用\dp来完成,或者等价的命令\z来实现。

    postgres=#\dpAccessprivilegesSchema|Name|Type|Accessprivileges|Columnprivileges|Policies--------+------+-------+-------------------+-------------------+----------public|test|table|||

6.建表语句

建表语句,目前还没有发现show create table这种快捷的方式,不过可以通过pg_dump或者根据数据字典的信息来拼接了。

7.表空间信息

表空间的部分相对比较清晰,可以直接使用\db来完成。

    postgres=#\dbListoftablespacesName|Owner|Location------------+----------+----------pg_default|postgres|pg_global|postgres|

或者使用pg_tablespace

    postgres=#select*frompg_tablespace;spcname|spcowner|spcacl|spcoptions------------+----------+--------+------------pg_default|10||pg_global|10||

8.对象存储信息

这部分信息可以参考pg_tables,还有一些更细节的

更多的细节还有待求证和发现。

9.查看锁的信息

查看锁的信息可以使用pg_locks来得到。

    postgres=#select*frompg_locks;-[RECORD1]------+----------------locktype|relationdatabase|13241relation|11673page|tuple|virtualxid|transactionid|classid|objid|objsubid|virtualtransaction|4/81pid|20644mode|AccessShareLockgranted|tfastpath|t

10.查看数据库参数

这部分的功能不是很理解,因为没有找到很便捷的方式。

比如查看缓存的设置

    postgres=#showshared_buffers;-[RECORD1]--+------shared_buffers|128MB

或者根据参数文件postgresql.conf来查看。

11.显示数据库的运行状态

这个信息毫无疑问,建议还是从pg_stats_activity来查看。

12.查看数据字典的信息

这应该是本小节的重点,通过查看视图可以看到,有100多个视图。

    postgres=#selectcount(*)frompg_views;-[RECORD1]count|112

还可以使用information_schema中的信息来补充。

13.查看索引的信息

查看索引的信息,可以使用\di来完成,非常快捷。

14.查看执行计划

查看执行计划一般可以根据explain来得到,但是还有几类方法,对结果做格式化处理,比如转化为json或者xml的格式等。

    postgres=#explainselect*fromtest;-[RECORD1]------------------------------------------------------QUERYPLAN|SeqScanontest(cost=0.00..35.50rows=2550width=4)得到json格式的执行计划。postgres=#explain(formatjson)select*fromtest;-[RECORD1]------------------------------QUERYPLAN|[+|{+|"Plan":{+|"NodeType":"SeqScan",+|"RelationName":"test",+|"Alias":"test",+|"StartupCost":0.00,+|"TotalCost":35.50,+|"PlanRows":2550,+|"PlanWidth":4+|}+|}+|]

或者做一些分析,能够得到更细节的执行信息。

    postgres=#explainanalyzeselect*fromtest;QUERYPLAN--------------------------------------------------------------------------------------------------SeqScanontest(cost=0.00..35.50rows=2550width=4)(actualtime=0.001..0.001rows=0loops=1)Planningtime:0.018msExecutiontime:0.009ms

15.查看存储过程

查看存储过程就是比较单薄的。可以直接使用pg_proc来得到详细的信息。

pg_proc

16.存储过程的调度执行

目前没有看到很直接的方式,这部分感觉还不够强大。

17.事务隔离级别

根据公司现状和业务规模的不断扩大,其实技术上也是不断地改进和积累,事务方面的处理也是如此,等规模达到了一定的量级,这部分的要求就会很明确。所以很多开发同学对于锁机制都很感兴趣。

查看事务隔离级别的两种SQL语句。

    postgres=#showdefault_transaction_isolation;default_transaction_isolation-------------------------------readcommitted

查看当前的事务隔离级别设置。

    postgres=#showtransaction_isolation;transaction_isolation-----------------------readcommitted