暂无图片
暂无图片
4
暂无图片
暂无图片
暂无图片

推荐Postgresql中一些好用的psql命令(2)

1003

推荐Postgresql中一些好用的psql命令(2)

psql客户端工具应该是dba非常频繁使用的的工具。我想把自己觉得有助于提升工作效率的psql的命令整理一下,这些命令可以让你更好的使用postgresql。如果你是一个小白,那么这篇文章一定会让你有所收益。

我们接着上一篇文章,继续给大家介绍几个好用的psql命令。

回写\d等反斜杠命令执行的真实SQL

回写\d等反斜杠命令执行的真实SQL,这样方便我们了解其内部查询的逻辑,比如是使用那个schema下的系统表获取的数据等等。我们有两种方式可以操作,一种是在psql后面添加-E或–echo-hidden参数;另外一种是\set ECHO_HIDDEN变量 。

E或–echo-hidden参数

[postgres@wang ~]$ psql -E 
psql (16.3)
Type "help" for help.

postgres=# 

\set ECHO_HIDDEN变量

postgres=# \set ECHO_HIDDEN on

执行\l命令

通过上面的两种方式设置,然后执行\l命令后,我们在界面上就看到了\l命令在数据库上实际执行的sql语句,两种方式的结果是一样的。

postgres=# \l
********* QUERY **********
SELECT
  d.datname as "Name",
  pg_catalog.pg_get_userbyid(d.datdba) as "Owner",
  pg_catalog.pg_encoding_to_char(d.encoding) as "Encoding",
  CASE d.datlocprovider WHEN 'c' THEN 'libc' WHEN 'i' THEN 'icu' END AS "Locale Provider",
  d.datcollate as "Collate",
  d.datctype as "Ctype",
  d.daticulocale as "ICU Locale",
  d.daticurules as "ICU Rules",
  pg_catalog.array_to_string(d.datacl, E'\n') AS "Access privileges"
FROM pg_catalog.pg_database d
ORDER BY 1;
**************************

                                                      List of databases
   Name    |  Owner   | Encoding | Locale Provider |  Collate   |   Ctype    | ICU Locale | ICU Rules |   Access privileges   
-----------+----------+----------+-----------------+------------+------------+------------+-----------+-----------------------
 demo      | postgres | UTF8     | libc            | en_US.utf8 | en_US.utf8 |            |           | 
 postgres  | postgres | UTF8     | libc            | en_US.utf8 | en_US.utf8 |            |           | 
 template0 | postgres | UTF8     | libc            | en_US.utf8 | en_US.utf8 |            |           | =c/postgres          +
           |          |          |                 |            |            |            |           | postgres=CTc/postgres
 template1 | postgres | UTF8     | libc            | en_US.utf8 | en_US.utf8 |            |           | =c/postgres          +
           |          |          |                 |            |            |            |           | postgres=CTc/postgres
 testdb    | test     | UTF8     | libc            | en_US.utf8 | en_US.utf8 |            |           | =Tc/test             +
           |          |          |                 |            |            |            |           | test=CTc/test
(5 rows)

输出执行结果及其SQL语句

当我们批量执行文件中SQL语句时,想要查看执行的结果详情,通常通过标准输出文件,只有sql的执行结果,没有执行SQL,很不方便我们确认执行结果,就如下面执行的结果。

 psql -f test.sql
[postgres@wang ~]$ cat pg0927.log 
 id |  name  | address 
----+--------+---------
  1 | wang1  | beijing
  2 | wang2  | beijing
  4 | wang4  | beijing
  3 | wang3  | beijing
  5 | zhaosi | 
  6 | lisan  | 
  7 | lisi   | aaa
(7 rows)

UPDATE 1
 id | name  | address 
----+-------+---------
  1 | wang1 | beijing
  2 | wang2 | beijing
  4 | wang4 | beijing
(3 rows)

可以通过下面的两种方式把SQL和执行结果都输出到一个文件。

使用-L命令

使用-L命令后,会把SQL执行结果及SQL语句都输出到指定文件中,对应输出的文件,还进行了格式化,更方便用户核实执行结果。

psql -f test.sql -L  pg09273.log
[postgres@wang ~]$ cat pg09273.log 
********* QUERY **********
select * from t1;
**************************

 id |  name  | address 
----+--------+---------
  1 | wang1  | beijing
  2 | wang2  | beijing
  4 | wang4  | beijing
  3 | wang3  | beijing
  5 | zhaosi | 
  6 | lisan  | 
  7 | lisi   | aaa
(7 rows)

********* QUERY **********
update t1 set address = 'aaa' where id = 7;
**************************

UPDATE 1
********* QUERY **********
select * from t1 limit 3;
**************************

 id | name  | address 
----+-------+---------
  1 | wang1 | beijing
  2 | wang2 | beijing
  4 | wang4 | beijing
(3 rows)

使用-e命令

利用-e命令把执行的SQL复制到标准输出并结合默认查询结果,也可以满足上面的要求。

psql -f test.sql -e >> pg09274.log
[postgres@wang ~]$ cat pg09274.log 
You are now connected to database "testdb" as user "postgres".
select * from t1;
 id |  name  | address 
----+--------+---------
  1 | wang1  | beijing
  2 | wang2  | beijing
  4 | wang4  | beijing
  3 | wang3  | beijing
  5 | zhaosi | 
  6 | lisan  | 
  7 | lisi   | aaa
(7 rows)

update t1 set address = 'aaa' where id = 7;
UPDATE 1
select * from t1 limit 3;
 id | name  | address 
----+-------+---------
  1 | wang1 | beijing
  2 | wang2 | beijing
  4 | wang4 | beijing
(3 rows)

自定义提示符

psql的默认提示符是数据库名称,也没有显示其他内容。那么,是否可以自定义设置呢,其实这个是可以满足实现的,可以添加一些主机和会话的信息。我自己习惯添加日期和时间,这样可以随时知道执行sql的当时时间;另外如果你保存会话的信息,也方便查看历史。

\set PROMPT1 '%/ %`date "+%Y-%m-%d %H:%M:%S"`=#'

设置完成的效果如下

testdb=# \set PROMPT1 '%/ %`date "+%Y-%m-%d %H:%M:%S"`=#'
testdb 2024-09-27 17:02:41=#
testdb 2024-09-27 17:02:43=#

自定义快捷方式

使用自定义快捷方式,可以很方便的我们手动快速执行一些常用SQL语句。比如查看表大小、未使用索引、执行耗时长的查询等等。下面通过自定义设置查询表大小快捷方式。

--查询表大小
\set table_sizes 'SELECT c.relname AS name, pg_size_pretty(pg_table_size(c.oid)) AS size FROM pg_class c LEFT JOIN pg_namespace n ON (n.oid = c.relnamespace) WHERE n.nspname NOT IN (''pg_catalog'', ''information_schema'') AND n.nspname !~ ''^pg_toast'' AND c.relkind=''r'' ORDER BY pg_table_size(c.oid) DESC;'

在设置查询表大小后,然后在psql中可以使用冒号和查询的名称来运行它,这样就可以使用一个超级简单的psql输入来运行它们。

testdb=# :table_sizes                                                                                                                                                      
       name        |    size    
-------------------+------------
 bmsql_stock       | 3397 MB
 bmsql_order_line  | 2895 MB
 bmsql_customer    | 1772 MB
 bmsql_history     | 253 MB
 bmsql_oorder_test | 189 MB
 bmsql_oorder      | 189 MB
 bmsql_new_order   | 38 MB
 bmsql_item        | 10 MB
 bmsql_district    | 200 kB
 bmsql_warehouse   | 56 kB
 bmsql_config      | 40 kB

设置默认的.psqlrc配置文件

上面的设置,每次使用时都需要设置。那么,是否有方便的办法呢。其实是有的,对于上面的所有设置都可以在每次使用psql时自动生效。在这里,就需要提到.psqlrc,当psql启动时,它会自动查找.psqlrc文件,如果存在,将执行其中的命令。这就方便我们自定义提示和查询快捷方式及其他psql设置。

先来查看一下是否存在.psqlrc文件

ls -la ~/.psqlrc

如果不存在,我们可以touch创建一个文件或者直接vim编辑该文件,并添加上述自己需要的设置命令

touch ~/.psqlrc
或
vim ~/.psqlrc

在.psqlrc中添加如下设置

\set PROMPT1 '%/ %`date "+%Y-%m-%d %H:%M:%S"`=#'
\set table_sizes 'SELECT c.relname AS name, pg_size_pretty(pg_table_size(c.oid)) AS size FROM pg_class c LEFT JOIN pg_namespace n ON (n.oid = c.relnamespace) WHERE n.nspname NOT IN (''pg_catalog'', ''information_schema'') AND n.nspname !~ ''^pg_toast'' AND c.relkind=''r'' ORDER BY pg_table_size(c.oid) DESC;'

当我们再次进入psql时,上述的设置就生效了。

[postgres@wang ~]$ psql
psql (16.3)
Type "help" for help.

postgres 2024-10-07 15:48:01=#\c testdb
You are now connected to database "testdb" as user "postgres".
testdb 2024-10-07 15:48:07=#
testdb 2024-10-07 15:48:08=#
testdb 2024-10-07 15:48:08=#:table_sizes
       name        |    size    
-------------------+------------
 bmsql_stock       | 3397 MB
 bmsql_order_line  | 2895 MB
 bmsql_customer    | 1772 MB
 bmsql_history     | 253 MB
 bmsql_oorder_test | 189 MB

快速搜索历史

你是否记得我们经常查询shell命令的执行历史,那么对于psql的执行历史,是否也可以快速查找,答案肯定是可以的,要不我就没必要说了。可以通过ctrl+R命令来快速查询执行的历史命令。

总结

上面的这些psql命令的使用方式,我希望能够对你的工作有所启发。

– / END / –

可以通过下面的方式联系我

  • 微信公众号:@墨竹札记
  • 墨天轮:@墨竹
  • 微信:wshf395062788
  • PGFans:@墨竹

如果这篇文章为你带来了灵感或启发,就请帮忙点赞收藏转发;如果文章中不严谨或者错漏之处,请及时评论指正。非常感谢!

最后修改时间:2025-02-06 10:49:16
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论