Prompting是指psql的客户端提示符,有三个变量:PROMPT1, PROMPT2, ROMPT3,具体区别如下:
- PROMPT1 : 当
psql
等待新命令发出时的常规提示符,PROMPT1最常见。 - PROMPT2: 在命令输入过程中等待更多输入时发出的提示符,例如当命令没有使用分号终止或者引用没有被关闭时就会发出这个提示符。
- PROMPT3 : 在运行一个
COPY FROM STDIN
命令,并且需要在终端上输入一个行值时发出的提示符。
官网的解释如下:
Prompting
The prompts psql issues can be customized to your preference. The three variables
PROMPT1
,PROMPT2
, andPROMPT3
contain strings and special escape sequences that describe the appearance of the prompt. Prompt 1 is the normal prompt that is issued when psql requests a new command. Prompt 2 is issued when more input is expected during command entry, for example because the command was not terminated with a semicolon or a quote was not closed. Prompt 3 is issued when you are running an SQLCOPY FROM STDIN
command and you need to type in a row value on the terminal.
PROMPT1和PROMPT2的默认设置值一样,默认值都为%/%R%#,这三个字符的解释如下:
- %/: 当前的数据库名称。
- %R: PROMPT1通常为=,如果会话断开,则显示!;PROMPT2中-表示命令等待更多输入,*表示未完成的注释。
- %#: 如果是超级用户则显示#,其他用户显示>。
一、常用的提示符
PROMPT1和PROMPT2可以设置的一些常用的提示符如下,也可以参考官网PostgreSQL: Documentation: 13: psql
%> 端口
%p 当前连接的后端的进程ID。
%M 数据库服务器的完整主机名
%m 数据库服务器的主机名,在第一个点处截断
%n 数据库会话用户名。(在数据库会话期间,该值的扩展可能会因命令的结果而发生变化SET SESSION AUTHORIZATION。)
%/ 当前数据库的名称。
%# 如果会话用户是数据库超级用户,则为 a #,否则为>。(在数据库会话期间,该值的扩展可能会因命令的结果而发生变化SET SESSION AUTHORIZATION。)
%p 当前连接的后端的进程ID。
二、灵活设置PROMPT1的一些例子
PROMPT1最常见。设置psql启动时执行的命令,可以把如下的\set ...相关命令加入.psqlrc。定义在 psql 启动时自动运行的命令,更改提示显示并设置别名。
但是不建议设置过多,设置过多反而臃肿了。一行的提示的显示就占了大半行。
有时候使用gdb调试PostgreSQL的时候,需要根据pid去attach对应连接。这个时候如果我们增加了%p的变量,这样pid就直接在前边提示符里打印出来了,就不需要再去查询pg_backend_pid();获取pid了。同时也可以在前边加上%n得到当前连接使用的用户
postgres=# \set PROMPT1 '%/(ConnAs[%n]:PID[%p])%R# '
postgres(ConnAs[postgres]:PID[24683])=#
postgres(ConnAs[postgres]:PID[24683])=#
也可以加上系统的时间
postgres=# \set PROMPT1 '%/(ConnAs[%n]:PID[%p] %`date +"%Y-%m-%d/%H:%M:%S"`)%R# '
postgres(ConnAs[postgres]:PID[24618] 2024-02-01/15:26:34)=#
postgres(ConnAs[postgres]:PID[24618] 2024-02-01/15:26:35)=#
postgres(ConnAs[postgres]:PID[24618] 2024-02-01/15:26:36)=#
加上 postgrers server的版本
postgres=# \set PROMPT1 '%/<%:SERVER_VERSION_NAME:>(ConnAs[%n]:PID[%p] %`date +"%Y-%m-%d/%H:%M:%S"`)%R# '
postgres<16.1>(ConnAs[postgres]:PID[25950] 2024-02-01/15:34:26)=#
postgres<16.1>(ConnAs[postgres]:PID[25950] 2024-02-01/15:34:27)=#
甚至可以使用返引号加上一些自定义的东西进去,例如把PGDATA的变量打印进去。
postgres=# \set PROMPT1 '%/<%:SERVER_VERSION_NAME:>(ConnAs[%n]:PID[%p] %`date +"%Y-%m-%d/%H:%M:%S"` %`echo $PGDATA`)%R# '
postgres<16.1>(ConnAs[postgres]:PID[26909] 2024-02-01/15:40:10 /home/postgres/data-16)=#
postgres<16.1>(ConnAs[postgres]:PID[26909] 2024-02-01/15:40:12 /home/postgres/data-16)=#
或者在进行某些测试的时候,临时更改这个显示,例如我把pg_xlog下的xlog数量加到这个里边,便于我每次进入的时候,都能看到它的数量,直接回车也可以看到
postgres@ubuntu-linux-22-04-desktop:~$ cd $PGDATA/pg_wal
postgres@ubuntu-linux-22-04-desktop:~/data-16/pg_wal$ ls
000000010000000000000038 000000010000000000000039 00000001000000000000003A archive_status
postgres@ubuntu-linux-22-04-desktop:~/data-16/pg_wal$ psql
psql (16.1)
Type "help" for help.
postgres=# \set PROMPT1 '%/<%:SERVER_VERSION_NAME:>(ConnAs[%n]:PID[%p] %`date +"%Y-%m-%d/%H:%M:%S"` pg_wal_count:%`ls $PGDATA/pg_wal|grep -v archive_status| wc -l`)%R# '
postgres<16.1>(ConnAs[postgres]:PID[28068] 2024-02-01/15:46:42 pg_wal_count:3)=#
再或者结合psql可以把数据库里查询到的东西作为前边的显示选项,例如把活跃连接数加到前边。(只不过有点笨,可能没必要,可以结合需求来。而且不建议设置那种执行时间比较长的SQL,否则可能造成性能问题,具体以实际环境为准,可以设置一些秒出,较简单的SQL)
postgres=# \set PROMPT1 '%/<%:SERVER_VERSION_NAME:>(ConnAs[%n]:PID[%p] %`date +"%Y-%m-%d/%H:%M:%S"` conn_count:%`psql -c" select count(*) from pg_stat_activity where state=\'active\';" -tAq`)%R# '
postgres<16.1>(ConnAs[postgres]:PID[30521] 2024-02-01/15:58:53 conn_count:1)=#
postgres<16.1>(ConnAs[postgres]:PID[30521] 2024-02-01/15:59:21 conn_count:2)=#