1. PSQL概述
psql是PostgreSQL的一个命令行交互式的客户端,它可以通过内置的元命令或者sql语句查看和管理数据库对象。它是一个纯字符界面,能够通过tab键自动补全命令。
2. PSQL使用
bash
使用方法:
psql [选项]... [数据库名称 [用户名称]]
通用选项:
-c,--command=命令 执行单一命令(SQL或内部指令)然后结束
-d, --dbname=DBNAME 指定要连接的数据库 (默认:"postgres")
-f, --file=文件名 从文件中执行命令然后退出
-l, --list 列出所有可用的数据库,然后退出
-v, --set=, --variable=NAME=VALUE
设置psql变量NAME为VALUE
(例如,-v ON_ERROR_STOP=1)
-V, --version 输出版本信息, 然后退出
-X, --no-psqlrc 不读取启动文档(~/.psqlrc)
-1 ("one"), --single-transaction
作为一个单一事务来执行命令文件(如果是非交互型的)
-?, --help[=options] 显示此帮助,然后退出
--help=commands 列出反斜线命令,然后退出
--help=variables 列出特殊变量,然后退出
输入和输出选项:
-a, --echo-all 显示所有来自于脚本的输入
-b, --echo-errors 回显失败的命令
-e, --echo-queries 显示发送给服务器的命令
-E, --echo-hidden 显示内部命令产生的查询
-L, --log-file=文件名 将会话日志写入文件
-n, --no-readline 禁用增强命令行编辑功能(readline)
-o, --output=FILENAME 将查询结果写入文件(或 |管道)
-q, --quiet 以沉默模式运行(不显示消息,只有查询结果)
-s, --single-step 单步模式 (确认每个查询)
-S, --single-line 单行模式 (一行就是一条 SQL 命令)
输出格式选项 :
-A, --no-align 使用非对齐表格输出模式
-F, --field-separator=STRING
为字段设置分隔符,用于不整齐的输出(默认:"|")
-H, --html HTML 表格输出模式
-P, --pset=变量[=参数] 设置将变量打印到参数的选项(查阅 \pset 命令)
-R, --record-separator=STRING
为不整齐的输出设置字录的分隔符(默认:换行符号)
-t, --tuples-only 只打印记录i
-T, --table-attr=文本 设定 HTML 表格标记属性(例如,宽度,边界)
-x, --expanded 打开扩展表格输出
-z, --field-separator-zero
为不整齐的输出设置字段分隔符为字节0
-0, --record-separator-zero
为不整齐的输出设置记录分隔符为字节0
联接选项:
-h, --host=主机名 数据库服务器主机或socket目录(默认:"本地接口")
-p, --port=端口 数据库服务器的端口(默认:"5432")
-U, --username=用户名 指定数据库用户名(默认:"postgres")
-w, --no-password 永远不提示输入口令
-W, --password 强制口令提示 (自动)
更多信息,请在psql中输入"\?"(用于内部指令)或者 "\help"(用于SQL命令),
使用方法:
psql [选项]... [数据库名称 [用户名称]]
通用选项:
-c,--command=命令 执行单一命令(SQL或内部指令)然后结束
-d, --dbname=DBNAME 指定要连接的数据库 (默认:"postgres")
-f, --file=文件名 从文件中执行命令然后退出
-l, --list 列出所有可用的数据库,然后退出
-v, --set=, --variable=NAME=VALUE
设置psql变量NAME为VALUE
(例如,-v ON_ERROR_STOP=1)
-V, --version 输出版本信息, 然后退出
-X, --no-psqlrc 不读取启动文档(~/.psqlrc)
-1 ("one"), --single-transaction
作为一个单一事务来执行命令文件(如果是非交互型的)
-?, --help[=options] 显示此帮助,然后退出
--help=commands 列出反斜线命令,然后退出
--help=variables 列出特殊变量,然后退出
输入和输出选项:
-a, --echo-all 显示所有来自于脚本的输入
-b, --echo-errors 回显失败的命令
-e, --echo-queries 显示发送给服务器的命令
-E, --echo-hidden 显示内部命令产生的查询
-L, --log-file=文件名 将会话日志写入文件
-n, --no-readline 禁用增强命令行编辑功能(readline)
-o, --output=FILENAME 将查询结果写入文件(或 |管道)
-q, --quiet 以沉默模式运行(不显示消息,只有查询结果)
-s, --single-step 单步模式 (确认每个查询)
-S, --single-line 单行模式 (一行就是一条 SQL 命令)
输出格式选项 :
-A, --no-align 使用非对齐表格输出模式
-F, --field-separator=STRING
为字段设置分隔符,用于不整齐的输出(默认:"|")
-H, --html HTML 表格输出模式
-P, --pset=变量[=参数] 设置将变量打印到参数的选项(查阅 \pset 命令)
-R, --record-separator=STRING
为不整齐的输出设置字录的分隔符(默认:换行符号)
-t, --tuples-only 只打印记录i
-T, --table-attr=文本 设定 HTML 表格标记属性(例如,宽度,边界)
-x, --expanded 打开扩展表格输出
-z, --field-separator-zero
为不整齐的输出设置字段分隔符为字节0
-0, --record-separator-zero
为不整齐的输出设置记录分隔符为字节0
联接选项:
-h, --host=主机名 数据库服务器主机或socket目录(默认:"本地接口")
-p, --port=端口 数据库服务器的端口(默认:"5432")
-U, --username=用户名 指定数据库用户名(默认:"postgres")
-w, --no-password 永远不提示输入口令
-W, --password 强制口令提示 (自动)
更多信息,请在psql中输入"\?"(用于内部指令)或者 "\help"(用于SQL命令),
https://www.postgresql.org/docs/current/static/app-psql.html
3. PSQL元命令
- 语法
bash
## 查看SQL元命令
postgres=# \?
一般性
\copyright 显示PostgreSQL的使用和发行许可条款
\crosstabview [COLUMNS] 执行查询并且以交叉表显示结果
\errverbose 以最冗长的形式显示最近的错误消息
\g [文件] or; 执行查询 (并把结果写入文件或 |管道)
\gdesc 描述查询结果,而不执行它
\gexec 执行策略,然后执行其结果中的每个值
\gset [PREFIX] 执行查询并把结果存到psql变量中
\gx [FILE] 就像\g,但强制扩展输出模式
\q 退出 psql
\watch [SEC] 每隔SEC秒执行一次查询
帮助
\? [commands] 显示反斜线命令的帮助
\? options 显示 psql 命令行选项的帮助
\? variables 显示特殊变量的帮助
\h [名称] SQL命令语法上的说明,用*显示全部命令的语法说明
查询缓存区
\e [FILE] [LINE] 使用外部编辑器编辑查询缓存区(或文件)
\ef [FUNCNAME [LINE]] 使用外部编辑器编辑函数定义
\ev [VIEWNAME [LINE]] 用外部编辑器编辑视图定义
\p 显示查询缓存区的内容
\r 重置(清除)查询缓存区
\s [文件] 显示历史记录或将历史记录保存在文件中
\w 文件 将查询缓存区的内容写入文件
输入/输出
\copy ... 执行 SQL COPY,将数据流发送到客户端主机
\echo [字符串] 将字符串写到标准输出
\i 文件 从文件中执行命令
\ir FILE 与 \i类似, 但是相对于当前脚本的位置
\o [文件] 将全部查询结果写入文件或 |管道
\qecho [字符串] 将字符串写到查询输出串流(参考 \o)
条件
\if EXPR 开始条件块
\elif EXPR 当前条件块内的备选方案
\else 当前条件块内的最终备选方案
\endif 条件块的结尾
资讯性
(选项: S = 显示系统对象, + = 其余的详细信息)
\d[S+] 列出表,视图和序列
\d[S+] 名称 描述表,视图,序列,或索引
\da[S] [模式] 列出聚合函数
\dA[+] [模式] 列出访问方法
\db[+] [模式] 列出表空间
\dc[S+] [模式] 列表转换
\dC[+] [模式] 列出类型强制转换
\dd[S] [模式] 显示没有在别处显示的对象描述
\dD[S+] [模式] 列出共同值域
\ddp [模式] 列出默认权限
\dE[S+] [模式] 列出引用表
\det[+] [模式] 列出引用表
\des[+] [模式] 列出外部服务器
\deu[+] [模式] 列出用户映射
\dew[+] [模式] 列出外部数据封装器
\df[anptw][S+] [PATRN] 列出[只包括 聚合/常规/程序/触发器/窗口]函数
\dF[+] [模式] 列出文本搜索配置
\dFd[+] [模式] 列出文本搜索字典
\dFp[+] [模式] 列出文本搜索解析器
\dFt[+] [模式] 列出文本搜索模版
\dg[S+] [模式] 列出角色
\di[S+] [模式] 列出索引
\dl 列出大对象, 功能与\lo_list相同
\dL[S+] [模式] 列出所有过程语言
\dm[S+] [模式] 列出所有物化视图
\dn[S+] [模式] 列出所有模式
\do[S+] [PATTERN] list operators
\dO[S+] [模式] 列出所有校对规则
\dp [模式] 列出表,视图和序列的访问权限
\drds [模式1 [模式2]] 列出每个数据库的角色设置
\dRp[+] [模式] 列出复制出版物
\dRs[+] [模式] 列出复制订阅
\ds[S+] [模式] 列出序列
\dt[S+] [模式] 列出表
\dT[S+] [模式] 列出数据类型
\du[S+] [模式] 列出角色
\dv[S+] [模式] 列出视图
\dx[+] [模式] 列出扩展
\dy[+] [PATTERN] list event triggers
\l[+] [模式] 列出所有数据库
\sf[+] FUNCNAME 显示一个函数的定义
\sv[+] VIEWNAME 显示一个视图的定义
\z [模式] 和\dp的功能相同
格式化
\a 在非对齐模式和对齐模式之间切换
\C [字符串] 设置表的标题,或如果没有的标题就取消
\f [字符串] 显示或设定非对齐模式查询输出的字段分隔符
\H 切换HTML输出模式 (目前是 关闭)
\pset [NAME [VALUE]] 设置表输出选项
(NAME := {border|columns|expanded|fieldsep|fieldsep_zero|
footer|format|linestyle|null|numericlocale|pager|
pager_min_lines|recordsep|recordsep_zero|tableattr|title|
tuples_only|unicode_border_linestyle|
unicode_column_linestyle|unicode_header_linestyle})
\t [开|关] 只显示记录 (目前是 关闭)
\T [字符串] 设置HTML <表格>标签属性, 或者如果没有的话取消设置
\x [on|off|auto] 切换扩展输出模式(目前是 关闭)
连接
\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}
连接到新数据库(当前是"postgres")
\conninfo 显示当前连接的相关信息
\encoding [编码名称] 显示或设定客户端编码
\password [USERNAME] 安全地为用户更改口令
操作系统
\cd [目录] 更改目前的工作目录
\setenv NAME [VALUE] 设置或清空环境变量
\timing [开|关] 切换命令计时开关 (目前是 关闭)
\! [命令] 在 shell中执行命令或启动一个交互式shell
变量
\prompt [文本] 名称 提示用户设定内部变量
\set [名称 [值数]] 设定内部变量,若无参数则列出全部变量
\unset 名称 清空(删除)内部变量
大对象
\lo_export LOBOID 文件
\lo_import 文件 [注释]
\lo_list
\lo_unlink LOBOID 大对象运算
## 查看SQL元命令
postgres=# \?
一般性
\copyright 显示PostgreSQL的使用和发行许可条款
\crosstabview [COLUMNS] 执行查询并且以交叉表显示结果
\errverbose 以最冗长的形式显示最近的错误消息
\g [文件] or; 执行查询 (并把结果写入文件或 |管道)
\gdesc 描述查询结果,而不执行它
\gexec 执行策略,然后执行其结果中的每个值
\gset [PREFIX] 执行查询并把结果存到psql变量中
\gx [FILE] 就像\g,但强制扩展输出模式
\q 退出 psql
\watch [SEC] 每隔SEC秒执行一次查询
帮助
\? [commands] 显示反斜线命令的帮助
\? options 显示 psql 命令行选项的帮助
\? variables 显示特殊变量的帮助
\h [名称] SQL命令语法上的说明,用*显示全部命令的语法说明
查询缓存区
\e [FILE] [LINE] 使用外部编辑器编辑查询缓存区(或文件)
\ef [FUNCNAME [LINE]] 使用外部编辑器编辑函数定义
\ev [VIEWNAME [LINE]] 用外部编辑器编辑视图定义
\p 显示查询缓存区的内容
\r 重置(清除)查询缓存区
\s [文件] 显示历史记录或将历史记录保存在文件中
\w 文件 将查询缓存区的内容写入文件
输入/输出
\copy ... 执行 SQL COPY,将数据流发送到客户端主机
\echo [字符串] 将字符串写到标准输出
\i 文件 从文件中执行命令
\ir FILE 与 \i类似, 但是相对于当前脚本的位置
\o [文件] 将全部查询结果写入文件或 |管道
\qecho [字符串] 将字符串写到查询输出串流(参考 \o)
条件
\if EXPR 开始条件块
\elif EXPR 当前条件块内的备选方案
\else 当前条件块内的最终备选方案
\endif 条件块的结尾
资讯性
(选项: S = 显示系统对象, + = 其余的详细信息)
\d[S+] 列出表,视图和序列
\d[S+] 名称 描述表,视图,序列,或索引
\da[S] [模式] 列出聚合函数
\dA[+] [模式] 列出访问方法
\db[+] [模式] 列出表空间
\dc[S+] [模式] 列表转换
\dC[+] [模式] 列出类型强制转换
\dd[S] [模式] 显示没有在别处显示的对象描述
\dD[S+] [模式] 列出共同值域
\ddp [模式] 列出默认权限
\dE[S+] [模式] 列出引用表
\det[+] [模式] 列出引用表
\des[+] [模式] 列出外部服务器
\deu[+] [模式] 列出用户映射
\dew[+] [模式] 列出外部数据封装器
\df[anptw][S+] [PATRN] 列出[只包括 聚合/常规/程序/触发器/窗口]函数
\dF[+] [模式] 列出文本搜索配置
\dFd[+] [模式] 列出文本搜索字典
\dFp[+] [模式] 列出文本搜索解析器
\dFt[+] [模式] 列出文本搜索模版
\dg[S+] [模式] 列出角色
\di[S+] [模式] 列出索引
\dl 列出大对象, 功能与\lo_list相同
\dL[S+] [模式] 列出所有过程语言
\dm[S+] [模式] 列出所有物化视图
\dn[S+] [模式] 列出所有模式
\do[S+] [PATTERN] list operators
\dO[S+] [模式] 列出所有校对规则
\dp [模式] 列出表,视图和序列的访问权限
\drds [模式1 [模式2]] 列出每个数据库的角色设置
\dRp[+] [模式] 列出复制出版物
\dRs[+] [模式] 列出复制订阅
\ds[S+] [模式] 列出序列
\dt[S+] [模式] 列出表
\dT[S+] [模式] 列出数据类型
\du[S+] [模式] 列出角色
\dv[S+] [模式] 列出视图
\dx[+] [模式] 列出扩展
\dy[+] [PATTERN] list event triggers
\l[+] [模式] 列出所有数据库
\sf[+] FUNCNAME 显示一个函数的定义
\sv[+] VIEWNAME 显示一个视图的定义
\z [模式] 和\dp的功能相同
格式化
\a 在非对齐模式和对齐模式之间切换
\C [字符串] 设置表的标题,或如果没有的标题就取消
\f [字符串] 显示或设定非对齐模式查询输出的字段分隔符
\H 切换HTML输出模式 (目前是 关闭)
\pset [NAME [VALUE]] 设置表输出选项
(NAME := {border|columns|expanded|fieldsep|fieldsep_zero|
footer|format|linestyle|null|numericlocale|pager|
pager_min_lines|recordsep|recordsep_zero|tableattr|title|
tuples_only|unicode_border_linestyle|
unicode_column_linestyle|unicode_header_linestyle})
\t [开|关] 只显示记录 (目前是 关闭)
\T [字符串] 设置HTML <表格>标签属性, 或者如果没有的话取消设置
\x [on|off|auto] 切换扩展输出模式(目前是 关闭)
连接
\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}
连接到新数据库(当前是"postgres")
\conninfo 显示当前连接的相关信息
\encoding [编码名称] 显示或设定客户端编码
\password [USERNAME] 安全地为用户更改口令
操作系统
\cd [目录] 更改目前的工作目录
\setenv NAME [VALUE] 设置或清空环境变量
\timing [开|关] 切换命令计时开关 (目前是 关闭)
\! [命令] 在 shell中执行命令或启动一个交互式shell
变量
\prompt [文本] 名称 提示用户设定内部变量
\set [名称 [值数]] 设定内部变量,若无参数则列出全部变量
\unset 名称 清空(删除)内部变量
大对象
\lo_export LOBOID 文件
\lo_import 文件 [注释]
\lo_list
\lo_unlink LOBOID 大对象运算
4. 常用操作
bash
## 查看客户端工具版本信息
psql -v
## 使用-c参数执行查询数据库版本信息
psql -c "select version()";
## psql登录到数据库后去执行操作系统的命令
\! top
## psql登录到数据库
psql -h 127.0.0.1 -U postgres -d postgres
## 查看当前连接状态
\conninfo
## 查看当前数据库
select current_database();
## 查看当前连接用户
select * from current_user;select user;
## 查看所有数据库
select * from pg_database;\l+
## 查看数据库用户情况
\du
select * from pg_user;
## 切换数据库
\c <dbname>
## 使用某个用户连接到某个数据库
\c <dbname> <username>
## 查看当前数据库下的对象
\d+
## 查看当数数据库下的表
\dt
## 查看当前数据库下的索引
\di
#查看命令执行时间
\timing on
## 设置自动提交(默认情况)
\set autocommit on
## 查看客户端工具版本信息
psql -v
## 使用-c参数执行查询数据库版本信息
psql -c "select version()";
## psql登录到数据库后去执行操作系统的命令
\! top
## psql登录到数据库
psql -h 127.0.0.1 -U postgres -d postgres
## 查看当前连接状态
\conninfo
## 查看当前数据库
select current_database();
## 查看当前连接用户
select * from current_user;select user;
## 查看所有数据库
select * from pg_database;\l+
## 查看数据库用户情况
\du
select * from pg_user;
## 切换数据库
\c <dbname>
## 使用某个用户连接到某个数据库
\c <dbname> <username>
## 查看当前数据库下的对象
\d+
## 查看当数数据库下的表
\dt
## 查看当前数据库下的索引
\di
#查看命令执行时间
\timing on
## 设置自动提交(默认情况)
\set autocommit on
5.PSql定制脚本
https://github.com/NikolayS/postgres_dba
bash
[ptgres@db_prod ~]$ cat .psqlrc
\echo 🧐 🐘 postgres_dba 6.0 installed. Use ":dba" to see menu
\set dba '\\i /home/ptgres/postgres_dba-6.0/start.psql'
[ptgres@db_prod ~]$ cat .psqlrc
\echo 🧐 🐘 postgres_dba 6.0 installed. Use ":dba" to see menu
\set dba '\\i /home/ptgres/postgres_dba-6.0/start.psql'
脚本扩展方法
只需要将自己的sql脚本添加到sql/这个目录下面即可
然后执行generate.sh脚本初始化:
./init/generate.sh
./init/generate.sh
然后我们去start.psql中可以为我们新增的选项加点注释:
bash
...
\echo ' c1 – List the count of objects for each Database Schema'
...
...
\echo ' c1 – List the count of objects for each Database Schema'
...
5.1 第二种方式
[postgres@localhost ~]$ cat ~/.psqlrc
\set active_session ' select pid,usename,datname,query,client_addr from pg_stat_activity where pid <> pg_backend_pid() and state=\'active\' order by query;'
[postgres@localhost ~]$ cat ~/.psqlrc
\set active_session ' select pid,usename,datname,query,client_addr from pg_stat_activity where pid <> pg_backend_pid() and state=\'active\' order by query;'
- 调用
bash
使用方法:冒号后面接变量名
postgres=# :active_session
pid | usename | datname | query | client_addr
-----+---------+---------+-------+-------------
(0 rows)
使用方法:冒号后面接变量名
postgres=# :active_session
pid | usename | datname | query | client_addr
-----+---------+---------+-------+-------------
(0 rows)