PostgreSQL05-常用命令
1、服务管理命令
-- 16 为主版本,main 为实例名
systemctl start/stop/status postgresql@16-main
-- 安全停止(等待事务结束)
sudo -u postgres pg_ctl start -D /var/lib/postgresql/16/main
-- 强制停止
sudo -u postgres pg_ctl stop -D /var/lib/postgresql/16/main -m immediate
2、元命令
1、常用元命令
\c 数据库名 -- 切换到指定数据库
\conninfo -- 显示当前连接的数据库、用户、端口等信息
\dt -- 列出当前数据库中所有表(仅显示 public schema 下的表)
\dt+ -- 列出当前数据库中所有表及详细信息(大小、描述等)
\dn -- 列出当前数据库中的所有 schema(模式)
\di -- 列出当前数据库中的所有索引
\dv -- 列出当前数据库中的所有视图
\df -- 列出当前数据库中的所有函数
\du -- 列出所有数据库用户及权限信息
\dp 表名 -- 查看指定表的权限分配情况
\d 表名 -- 查看指定表的结构(字段、类型、约束、索引等)
\d+ 表名 -- 查看指定表的详细结构(含存储信息、注释等)
\echo 内容 -- 在 psql 中输出指定内容
\echo :value -- 显示变量value的值
\echo :PROMPT[1,2,3] -- 显示提示符格式
\encoding [字元编码名称] -- 显示或设定用户端字元编码
\q -- 退出 psql 交互模式
\h sql语句 -- 查看 SQL 命令的语法帮助(如 \h SELECT 查看 SELECT 语法)
\i 文件名 -- 执行指定 SQL 文件中的命令
\l -- 列出所有数据库
\o 文件名 -- 将后续命令的输出重定向到指定文件(再次执行 \o 关闭重定向)
\password 用户名 -- 修改指定用户的密码
\set -- 查看当前 psql 的环境变量设置
\set name value -- 设置变量
\sf func_name -- 查看函数定义
\timing -- 开启 / 关闭命令执行时间统计(显示 SQL 执行耗时)
\watch second -- 以second间隔秒数,反复执行上一条sql
\x -- 纵向显示查询结果
? -- 列出所有 psql 元命令的帮助信息
2、获取元命令对应的SQL代码
psql -U ap -E \l
3、常用命令
select oid,datname from pg_database where datname = 'auto'; -- 查看auto库的oid
select oid,relfilenode from pg_class where relname = 'product'; -- 查看product表的oid
select now() -- 查看时间
select version() -- 查看版本
select txid_current() -- 查看当前事务
create database db_name owner user_name -- 创建数据库
alter database dbname owner to new_owner; -- 修改数据库所有者
alter table table_name rename to new_name; -- 重命名一个表
alter table table_name add column column_name type_name; -- 在已有的表里添加字段
alter table table_name drop column column_name; -- 删除表中的字段
alter table table_name alter column_name type type_name(350) -- 修改数据库列属性
alter table table_name rename column column_name to new_name; -- 重命名一个字段
alter table table_name alter column column_name drop default; -- 去除缺省值
alter table table_name alter column column_name set default new_default_value; -- 给一个字段设置缺省值
4、psql命令
1、命令行执行sql语句
psql -U ap -d auto -c "select * from product where id = 6"
-c 必选项,后接sql语句
-A 命令紧凑,输出没有空格
-t 只显示数据,不显示选项名
- 输出格式示例
id | name | auto_type | product_type | software_versions | lic_name
---+------+-----------+---------------------------+------------------------------+----------
6 | BVS | 1 | {NX3-X,NX3-S,NX3-E,NX3-P} | {V6.0.1.0,V6.0.1.4,V6.0.2.0} | bvs
- 其他示例命令
psql --version -- 查看数据库版本
psql -l -- 列出所有数据库 (数据库用户可操作)
2、执行文件中的sql语句
psql -U ap -f test.sql -q
-f 指定文件名,*.sql中有sql语句就能执行
-q 取消命令的输出
3、psql传递变量
\set v_id 2 # \set 设置变量
select * from product where id =:v_id # 使用变量
\set v_id # 取消变量
vim test.sql
select * from product where id =:v_id; # 引用变量
psql -v v_id=2 mydb pguser -f test.sql # -v 指定变量的实际值
5、变量的使用
1、通过 \set 将常用查询语句保存为变量
- 将查询活跃连接的SQL存储为变量 active_session。执行 :active_session 可快速执行SQL
\set active_session '
SELECT
pid,
usename,
datname,
query,
client_addr,
state
FROM pg_stat_activity
WHERE
pid <> pg_backend_pid()
AND state = ''active''
ORDER BY query;
'
:active_session
- 将查询等待状态连接的SQL存储为变量 wait_event。执行 :wati_event 可快速执行SQL
\set wait_event '
SELECT
pid,
usename,
datname,
query,
client_addr,
wait_event_type,
wait_event
FROM pg_stat_activity
WHERE
pid <> pg_backend_pid()
AND wait_event IS NOT NULL
ORDER BY
wait_event_type,
wait_event;
'
:wait_event
6、数据导入导出
6.1、SQL 文件导入导出(适用于结构 + 数据迁移)
1. 导出 SQL 文件(pg_dump)
- 导出整个数据库(包含表结构、数据、索引、权限等)
pg_dump -U postgres -d app_db -f /backup/app_db_full.sql
-U 指定用户
-d 指定数据库
-f 指定输出文件路径)
- 仅导出表结构(不含数据)
pg_dump -U postgres -d app_db -s -f /backup/app_db_schema.sql
-s 表示只导出 schema)
- 仅导出单张表的结构和数据
pg_dump -U postgres -d app_db -t user_table -f /backup/user_table.sql
-t 指定表名,多张表用多个 -t)
2. 导入 SQL 文件(psql)
- 先创建目标数据库(若不存在)
CREATE DATABASE app_db_new WITH OWNER app_user;
- 导入 SQL 文件到目标库
psql -U postgres -d app_db_new -f /backup/app_db_full.sql
6.2、自定义格式备份(高效压缩,支持灵活恢复)
1. 导出自定义格式文件(pg_dump)
- 全库导出(压缩率高,支持单表恢复)
pg_dump -U postgres -d app_db -F c -f /backup/app_db.dump
-F c 表示自定义格式,比 SQL 文件更小,恢复更快
- 单表导出
pg_dump -U postgres -d app_db -t user_table -F c -f /backup/user_table.dump
2. 导入自定义格式文件(pg_restore)
- 恢复全库到新库
pg_restore -U postgres -d app_db_new /backup/app_db.dump
- 仅恢复单张表(需目标库已存在表结构)
pg_restore -U postgres -d app_db_new -t user_table /backup/app_db.dump
- 恢复时重命名表(如需迁移到不同表名)
- pg_restore -U postgres -d app_db_new --rename-table=old_table:new_table /backup/app_db.dump
6.3、CSV 文本文件(适用于单表数据批量导入导出)
1. 导出表数据为 CSV(psql 元命令或 SQL)
- 用 psql 的 \copy 命令(客户端执行,无需服务器文件权限)
psql -U postgres -d app_db -c "\copy (SELECT * FROM user_table) TO '/data/user_table.csv' WITH CSV HEADER;"
# HEADER 表示包含表头,即字段名
- 用 SQL 语句(需服务器有文件写入权限)
COPY (SELECT id, name FROM user_table WHERE status = 'active') TO '/var/lib/postgresql/user_active.csv' WITH CSV;
2. 从 CSV 导入数据到表(\copy 或 COPY)
- 用 \copy 导入(客户端执行,支持本地 CSV 文件)
psql -U postgres -d app_db -c "\copy user_table (id, name, create_time) FROM '/data/new_users.csv' WITH CSV HEADER;"
# 需确保 CSV 字段顺序与表字段匹配,HEADER 表示跳过首行表头
- 用 SQL 导入(服务器读取本地文件):
COPY user_table FROM '/var/lib/postgresql/batch_users.csv' WITH CSV DELIMITER ',';
6.4、跨库 / 跨服务器迁移(直接传输)
- 通过管道直接导出并导入(无需中间文件):
# 左侧导出本地库,通过管道直接导入到远程服务器的 app_db_remote 库,-h 指定远程 IP
pg_dump -U postgres -d app_db -F c | pg_restore -U postgres -d app_db_remote -h 192.168.1.200
6.5、注意事项
- pg_dump/pg_restore 需要数据库读取权限(通常 postgres 或超级用户)。
- COPY 命令生成的文件存储在服务器,需 postgres 用户有写入权限;\copy 操作客户端文件,需本地用户有读写权限。
- 导出大表时,优先用自定义格式(-F c)或 CSV,避免 SQL 文件过大。
- 导入大表时,可临时关闭索引和约束(ALTER TABLE user_table DISABLE TRIGGER ALL;),导入后再开启,提升速度。
- 生产环境导出时,若需数据一致性,可加 -x 排除权限、-S 指定超级用户,或在事务中执行(pg_dump 默认会保证导出期间的一致性)。
7、创建表空间
- 在 PostgreSQL 中,表空间(tablespace)用于指定数据库对象(表、索引等)的存储路径,可将不同数据存储在不同磁盘 / 分区,便于管理磁盘空间或隔离数据。
7.1、创建表空间的前提
需在服务器上创建一个空目录,作为表空间的存储路径
且该目录必须由 postgres 用户拥有(或数据库运行用户),确保权限可读写。
# 创建表空间目录
sudo mkdir -p /data/pg_tablespace
# 授权给postgres用户(根据实际运行用户调整)
sudo chown postgres:postgres /data/pg_tablespace
# 仅所有者可读写执行
sudo chmod 700 /data/pg_tablespace
7.2、创建表空间(SQL 命令)
CREATE TABLESPACE 表空间名
OWNER 用户名
LOCATION '存储目录路径';
-- OWNER 用户名,该选项可选,指定表空间的所有者,默认当前用户
-- 创建名为ts_app_data的表空间,所有者为app_user,存储路径为/data/pg_tablespace
CREATE TABLESPACE ts_app_data
OWNER app_user
LOCATION '/data/pg_tablespace';
7.3、使用表空间(创建对象时指定)
- 创建数据库、表、索引等对象时,通过 TABLESPACE 子句指定使用的表空间
1、创建数据库时指定表空间
-- 新数据库将存储在表空间所指定的路径
CREATE DATABASE app_db
OWNER app_user
TABLESPACE ts_app_data;
2、创建表时指定表空间
-- 新表将存储在表空间所指定的路径
CREATE TABLE user_table (
id SERIAL PRIMARY KEY,
name VARCHAR(50)
) TABLESPACE ts_app_data;
3、为已有表迁移表空间
-- 将现有表移到ts_app_data表空间
ALTER TABLE old_table SET TABLESPACE ts_app_data;
7.4、查看表空间信息
1、列出所有表空间
-- 列出所有表空间的基础信息(名称、所有者、位置)
\db
-- 列出所有表空间的详细信息(额外包含大小、描述等)
\db+
SELECT spcname AS 表空间名, spcowner::regrole AS 所有者, spclocation AS 存储路径
FROM pg_tablespace;
- pg_tablespace 是系统表,存储表空间元数据
- spcname 是 tablespace name 的缩写,表示表空间名
- spcowner 是 pg_tablespace 表中的字段,存储表空间所有者的 OID(对象标识符)
- regrole 是一个特殊的数据类型,用于将 OID 转换为对应的角色(用户)名
- spcowner::regrole 表示将spcowner转换为regrole类型
2、查看表所在的表空间
# 会显示 user_table 所在的表空间及其他详细信息(如大小、所有者)
\dt+ user_table
SELECT relname AS 表名, tablespace::regnamespace AS 表空间名
FROM pg_class
WHERE relkind = 'r' AND relname = 'user_table';
-- relkind='r'表示普通表
7.5、删除表空间(谨慎操作)
- 删除表空间前,需确保该表空间下无任何对象(表、索引等),否则会报错:
-- 先删除表空间中的所有对象(如表、索引),这里删除user_table表
DROP TABLE IF EXISTS user_table;
-- 再删除表空间,这里删除表空间ts_app_data
DROP TABLESPACE IF EXISTS ts_app_data;
-- 踢掉test_user空闲超过1小时的连接
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE usename='test_user'
AND state='idle'
AND now() - query_start > interval '1 hour';

浙公网安备 33010602011771号