前置知识: SQL

PostgreSQL psql CLI 命令

3 min入门

PostgreSQL psql CLI 命令 的完整教学讲解。

连接登录

单行写法:本地连接 psql -U <用户名> -d <数据库名>

# 连接本地数据库
psql -U postgres -d mydb

单行写法:指定主机端口连接 psql -h <主机> -p <端口> -U <用户名> -d <数据库>

# 连接远程 PostgreSQL 服务器
psql -h 192.168.1.100 -p 5432 -U appuser -d mydb

单行写法:使用连接字符串 psql "postgresql://<用户>:<密码>@<主机>:<端口>/<数据库>"

# 使用 URI 连接字符串
psql "postgresql://appuser:password@192.168.1.100:5432/mydb"

单行写法:交互式输入密码 psql -U <用户名> -d <数据库> -W

# 强制提示输入密码
psql -U postgres -d mydb -W

单行写法:指定角色连接 psql -U <角色名> -d <数据库>

# 指定角色登录
psql -U appuser -d mydb

单行写法:使用环境变量连接 PGPASSWORD=<密码> psql -h <主机> -U <用户> -d <数据库>

# 通过环境变量传递密码
PGPASSWORD=StrongPass psql -h 192.168.1.100 -U postgres -d mydb

执行命令

单行写法:执行单条 SQL psql -U <用户> -d <数据库> -c "<SQL>"

# 执行单条 SQL 后退出
psql -U postgres -d mydb -c "SELECT version();"

单行写法:执行多条 SQL psql -U <用户> -d <数据库> -c "<SQL1>" -c "<SQL2>"

# 执行多条 SQL
psql -U postgres -d mydb -c "SELECT 1;" -c "SELECT 2;"

单行写法:执行 SQL 文件 psql -U <用户> -d <数据库> -f <文件路径>

# 执行 SQL 脚本文件
psql -U postgres -d mydb -f /path/to/script.sql

单行写法:从标准输入读取 psql -U <用户> -d <数据库> < <文件>

# 从文件重定向输入
psql -U postgres -d mydb < script.sql

单行写法:执行并输出到文件 psql -U <用户> -d <数据库> -c "<SQL>" -o <输出文件>

# 将查询结果输出到文件
psql -U postgres -d mydb -c "SELECT * FROM users;" -o users.txt

输出格式

单行写法:表格输出(默认) psql -U <用户> -d <数据库> -c "<SQL>" --format=aligned

# 默认表格对齐输出
psql -U postgres -d mydb -c "SELECT * FROM users LIMIT 3;"

单行写法:HTML 输出 psql -U <用户> -d <数据库> -c "<SQL>" -H

# 输出 HTML 表格
psql -U postgres -d mydb -c "SELECT * FROM users;" -H

单行写法:逗号分隔输出 psql -U <用户> -d <数据库> -c "<SQL>" -A -F ','

# 无对齐逗号分隔输出
psql -U postgres -d mydb -c "SELECT * FROM users;" -A -F ','

单行写法:制表符分隔输出 psql -U <用户> -d <数据库> -c "<SQL>" -A -F $'\t'

# 制表符分隔便于复制到 Excel
psql -U postgres -d mydb -c "SELECT * FROM users;" -A -F $'\t'

单行写法:静默输出无表头 psql -U <用户> -d <数据库> -c "<SQL>" -t -A

# 仅输出数据无表头无对齐
psql -U postgres -d mydb -c "SELECT username FROM users;" -t -A

单行写法:扩展显示 psql -U <用户> -d <数据库> -c "<SQL>" -x

# 垂直显示每列一行
psql -U postgres -d mydb -c "SELECT * FROM users WHERE id = 1;" -x

交互式元命令

单行写法:查看帮助 \?

-- 查看 psql 元命令帮助
\?

单行写法:查看 SQL 帮助 \h <命令>

-- 查看指定 SQL 命令帮助
\h CREATE TABLE

单行写法:退出 \q

-- 退出 psql
\q

单行写法:切换数据库 \c <数据库名>

-- 切换到其他数据库
\c mydb

单行写法:查看当前连接 \conninfo

-- 查看当前连接信息
\conninfo

对象查看元命令

单行写法:查看所有数据库 \l

-- 列出所有数据库
\l

单行写法:查看所有表 \dt

-- 列出当前数据库所有表
\dt

单行写法:查看指定模式表 \dt <模式名>.*

-- 列出指定模式的所有表
\dt public.*

单行写法:查看表结构 \d <表名>

-- 查看表结构含列、索引、约束
\d users

单行写法:查看表详细信息 \d+ <表名>

-- 查看表详细信息含描述和存储
\d+ users

单行写法:查看索引 \di

-- 列出所有索引
\di

单行写法:查看视图 \dv

-- 列出所有视图
\dv

单行写法:查看函数 \df

-- 列出所有函数
\df

单行写法:查看序列 \ds

-- 列出所有序列
\ds

单行写法:查看用户角色 \du

-- 列出所有用户和角色
\du

单行写法:查看模式 \dn

-- 列出所有模式
\dn

单行写法:查看扩展 \dx

-- 列出已安装扩展
\dx

文件操作元命令

单行写法:执行 SQL 文件 \i <文件路径>

-- 执行外部 SQL 文件
\i /path/to/script.sql

单行写法:输出到文件 \o <文件路径>

-- 将后续查询结果输出到文件
\o /tmp/result.txt

单行写法:停止输出到文件 \o

-- 恢复标准输出
\o

单行写法:编辑查询缓冲区 \e

-- 使用编辑器编辑当前查询
\e

单行写法:编辑指定文件 \e <文件路径>

-- 编辑指定文件并执行
\e /tmp/query.sql

单行写法:保存查询到文件 \w <文件路径>

-- 将当前查询缓冲区保存到文件
\w /tmp/query.sql

交互式实用命令

单行写法:清除屏幕 \! clear

-- 清除终端屏幕
\! clear

单行写法:执行系统命令 \! <系统命令>

-- 执行系统 shell 命令
\! ls -la

单行写法:设置变量 \set <变量名> <值>

-- 设置 psql 变量
\set limit 10

单行写法:使用变量 SELECT * FROM users LIMIT :limit;

-- 在 SQL 中使用变量
SELECT * FROM users LIMIT :limit;

单行写法:取消当前输入 \r

-- 重置当前查询缓冲区
\r

单行写法:查看执行时间 \timing

-- 开启/关闭查询执行时间统计
\timing

备份恢复工具

单行写法:导出数据库 pg_dump -U <用户> -d <数据库> > <文件>

# 导出整个数据库
pg_dump -U postgres -d mydb > mydb_backup.sql

单行写法:导出为自定义格式 pg_dump -U <用户> -d <数据库> -F c -f <文件>

# 导出为自定义压缩格式
pg_dump -U postgres -d mydb -F c -f mydb.dump

单行写法:仅导出表结构 pg_dump -U <用户> -d <数据库> -s > <文件>

# 仅导出表结构不导出数据
pg_dump -U postgres -d mydb -s > schema.sql

单行写法:仅导出数据 pg_dump -U <用户> -d <数据库> -a > <文件>

# 仅导出数据不导出表结构
pg_dump -U postgres -d mydb -a > data.sql

单行写法:导出指定表 pg_dump -U <用户> -d <数据库> -t <表名> > <文件>

# 仅导出指定表
pg_dump -U postgres -d mydb -t users > users_backup.sql

单行写法:从 SQL 文件恢复 psql -U <用户> -d <数据库> < <文件>

# 从 SQL 文本文件恢复
psql -U postgres -d mydb < mydb_backup.sql

单行写法:从自定义格式恢复 pg_restore -U <用户> -d <数据库> <文件>

# 从自定义压缩格式恢复
pg_restore -U postgres -d mydb mydb.dump

单行写法:导出所有数据库 pg_dumpall -U <用户> > <文件>

# 导出所有数据库及全局对象
pg_dumpall -U postgres > all_backup.sql

服务管理工具

单行写法:初始化数据库集群 initdb -D <数据目录>

# 初始化新的数据库集群
initdb -D /var/lib/postgresql/data

单行写法:启动服务 pg_ctl -D <数据目录> start

# 启动 PostgreSQL 服务
pg_ctl -D /var/lib/postgresql/data start

单行写法:停止服务 pg_ctl -D <数据目录> stop

# 停止 PostgreSQL 服务
pg_ctl -D /var/lib/postgresql/data stop

单行写法:重启服务 pg_ctl -D <数据目录> restart

# 重启 PostgreSQL 服务
pg_ctl -D /var/lib/postgresql/data restart

单行写法:查看服务状态 pg_ctl -D <数据目录> status

# 查看服务运行状态
pg_ctl -D /var/lib/postgresql/data status

单行写法:重载配置 pg_ctl -D <数据目录> reload

# 重载配置文件不重启
pg_ctl -D /var/lib/postgresql/data reload

单行写法:创建用户 createuser -U <管理员> <新用户名>

# 创建新数据库用户
createuser -U postgres appuser

单行写法:创建数据库 createdb -U <管理员> -O <所有者> <数据库名>

# 创建数据库并指定所有者
createdb -U postgres -O appuser mydb

单行写法:删除用户 dropuser -U <管理员> <用户名>

# 删除数据库用户
dropuser -U postgres appuser

单行写法:删除数据库 dropdb -U <管理员> <数据库名>

# 删除数据库
dropdb -U postgres mydb

性能分析

单行写法:分析查询计划 EXPLAIN SELECT <列> FROM <表名> WHERE <条件>;

-- 查看查询执行计划
EXPLAIN SELECT * FROM users WHERE email = 'test@example.com';

单行写法:分析并执行 EXPLAIN ANALYZE SELECT <列> FROM <表名> WHERE <条件>;

-- 执行查询并显示实际耗时
EXPLAIN ANALYZE SELECT * FROM users WHERE status = 1;

单行写法:分析含缓冲区 EXPLAIN (ANALYZE, BUFFERS) SELECT <列> FROM <表名>;

-- 显示缓冲区使用情况
EXPLAIN (ANALYZE, BUFFERS) SELECT * FROM users WHERE id = 1;

单行写法:查看活动连接 SELECT * FROM pg_stat_activity;

-- 查看当前所有活动连接
SELECT pid, usename, datname, state, query FROM pg_stat_activity;

单行写法:查看数据库大小 SELECT pg_size_pretty(pg_database_size('<库名>'));

-- 查看数据库大小
SELECT pg_size_pretty(pg_database_size('mydb'));

单行写法:查看表大小 SELECT pg_size_pretty(pg_total_relation_size('<表名>'));

-- 查看表及其索引总大小
SELECT pg_size_pretty(pg_total_relation_size('users'));