# PostgreSQL 常用命令 ## 连接数据库 ```bash # 查看版本 psql -V # 连接数据库 psql -U postgres -h 127.0.0.1 -p 5432 # 连接指定数据库 psql -U postgres -d database_name -h 127.0.0.1 -p 5432 # 使用密码文件连接 psql -U postgres -h 127.0.0.1 -p 5432 -d database_name -f query.sql # 退出交互界面 \q ``` ## 宝塔 aapanel 安装扩展 ```bash ss -tlnp | grep postgres cd /usr/local/pgsql make -C contrib -j"$(nproc)" PG_CONFIG=/www/server/pgsql/bin/pg_config make -C contrib install PG_CONFIG=/www/server/pgsql/bin/pg_config /www/server/pgsql/bin/psql -U postgres -d postgres -c "SELECT name FROM pg_available_extensions ORDER BY name;" sudo su - postgres /www/server/pgsql/bin/pg_ctl restart -D /www/server/pgsql/data # 重新创建扩展并验证 /www/server/pgsql/bin/psql -U postgres -d database_name -p 5432 -c "CREATE EXTENSION IF NOT EXISTS citext;" /www/server/pgsql/bin/psql -U postgres -d database_name -p 5432 -c "\dx" # 可选(最常用的扩展) CREATE EXTENSION IF NOT EXISTS pg_trgm; CREATE EXTENSION IF NOT EXISTS unaccent; CREATE EXTENSION IF NOT EXISTS citext; CREATE EXTENSION IF NOT EXISTS hstore; CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; CREATE EXTENSION IF NOT EXISTS pg_stat_statements; ``` ## 数据库管理 ```sql -- 列出所有数据库 \l -- 或 SELECT datname FROM pg_database; -- 创建数据库 CREATE DATABASE database_name; -- 删除数据库 DROP DATABASE database_name; -- 切换数据库 \c database_name -- 查看当前数据库 SELECT current_database(); -- 查看数据库大小 SELECT pg_size_pretty(pg_database_size('database_name')); -- 查看所有数据库大小 SELECT datname, pg_size_pretty(pg_database_size(datname)) AS size FROM pg_database ORDER BY pg_database_size(datname) DESC; ``` ## 用户和权限管理 ```sql -- 列出所有用户 \du -- 或 SELECT usename FROM pg_user; -- 创建用户 CREATE USER username WITH PASSWORD 'password'; -- 创建超级用户 CREATE USER username WITH SUPERUSER PASSWORD 'password'; -- 修改用户密码 ALTER USER username WITH PASSWORD 'new_password'; -- 删除用户 DROP USER username; -- 授予权限 GRANT ALL PRIVILEGES ON DATABASE database_name TO username; GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO username; -- 撤销权限 REVOKE ALL PRIVILEGES ON DATABASE database_name FROM username; -- 查看用户权限 \du username ``` ## 表管理 ```sql -- 列出所有表 \dt -- 或 SELECT tablename FROM pg_tables WHERE schemaname = 'public'; -- 列出所有表(包括系统表) \dt+ -- 查看表结构 \d table_name \d+ table_name -- 详细信息 -- 查看表大小 SELECT pg_size_pretty(pg_total_relation_size('table_name')) AS total_size, pg_size_pretty(pg_relation_size('table_name')) AS table_size, pg_size_pretty(pg_indexes_size('table_name')) AS indexes_size; -- 查看所有表大小 SELECT schemaname, tablename, pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) AS size FROM pg_tables WHERE schemaname = 'public' ORDER BY pg_total_relation_size(schemaname||'.'||tablename) DESC; -- 查看表行数 SELECT COUNT(*) FROM table_name; -- 查看表统计信息 SELECT * FROM pg_stat_user_tables WHERE relname = 'table_name'; ``` ## 索引管理 ```sql -- 列出所有索引 \di \di table_name* -- 或 SELECT indexname FROM pg_indexes WHERE tablename = 'table_name'; -- 查看索引详细信息 \d+ index_name -- 创建索引 CREATE INDEX idx_name ON table_name(column_name); -- 创建唯一索引 CREATE UNIQUE INDEX idx_name ON table_name(column_name); -- 创建复合索引 CREATE INDEX idx_name ON table_name(column1, column2); -- 创建 GIN 索引(用于全文搜索、数组等) CREATE INDEX idx_name ON table_name USING GIN(column_name gin_trgm_ops); -- 创建 GIST 索引(用于几何数据、范围等) CREATE INDEX idx_name ON table_name USING GIST(column_name); -- 删除索引 DROP INDEX index_name; -- 重建索引(解决索引碎片) REINDEX INDEX index_name; REINDEX TABLE table_name; REINDEX DATABASE database_name; -- 查看索引使用情况 SELECT schemaname, tablename, indexname, idx_scan, idx_tup_read, idx_tup_fetch FROM pg_stat_user_indexes ORDER BY idx_scan DESC; ``` ## 查询和分析 ```sql -- 查看执行计划 EXPLAIN SELECT * FROM table_name WHERE condition; EXPLAIN ANALYZE SELECT * FROM table_name WHERE condition; EXPLAIN (ANALYZE, BUFFERS, VERBOSE) SELECT * FROM table_name WHERE condition; -- 查看慢查询(需要启用 pg_stat_statements) SELECT query, calls, total_exec_time, mean_exec_time, max_exec_time FROM pg_stat_statements ORDER BY total_exec_time DESC LIMIT 10; -- 查看当前正在执行的查询 SELECT pid, usename, application_name, state, query, query_start FROM pg_stat_activity WHERE state = 'active'; -- 查看等待锁的查询 SELECT blocked_locks.pid AS blocked_pid, blocking_locks.pid AS blocking_pid, blocked_activity.usename AS blocked_user, blocking_activity.usename AS blocking_user, blocked_activity.query AS blocked_statement, blocking_activity.query AS blocking_statement FROM pg_catalog.pg_locks blocked_locks JOIN pg_catalog.pg_stat_activity blocked_activity ON blocked_activity.pid = blocked_locks.pid JOIN pg_catalog.pg_locks blocking_locks ON blocking_locks.locktype = blocked_locks.locktype JOIN pg_catalog.pg_stat_activity blocking_activity ON blocking_activity.pid = blocking_locks.pid WHERE NOT blocked_locks.granted AND blocking_locks.granted; -- 终止查询 SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE pid = ; ``` ## 扩展管理 ```sql -- 列出所有已安装的扩展 \dx -- 或 SELECT extname, extversion FROM pg_extension; -- 查看可用扩展 SELECT * FROM pg_available_extensions; -- 安装扩展 CREATE EXTENSION extension_name; -- 安装扩展(如果不存在) CREATE EXTENSION IF NOT EXISTS extension_name; -- 卸载扩展 DROP EXTENSION extension_name; -- pg_trgm 扩展(用于相似度搜索) -- 查看已安装的扩展,确认包含 pg_trgm SELECT extname, extversion FROM pg_extension WHERE extname = 'pg_trgm'; -- 启用 pg_trgm 扩展(数据库级生效,超级用户权限) CREATE EXTENSION IF NOT EXISTS pg_trgm; -- 降低阈值(默认0.3),匹配更多相似结果(测试用) SET pg_trgm.similarity_threshold = 0.2; -- 执行相似匹配查询 SELECT * FROM test_trgm WHERE similarity(content, '三四五') > 0.2; -- 重建GIN索引(定期执行,比如每月1次) 解决索引碎片 REINDEX INDEX idx_test_trgm_content; ``` ## 备份和恢复 ```bash # 备份数据库(自定义格式,支持压缩) pg_dump -U postgres -h 127.0.0.1 -d database_name -F c -f backup.dump # 备份数据库(SQL格式) pg_dump -U postgres -h 127.0.0.1 -d database_name -f backup.sql # 备份单个表 pg_dump -U postgres -h 127.0.0.1 -d database_name -t table_name -f table_backup.sql # 仅备份结构(不包含数据) pg_dump -U postgres -h 127.0.0.1 -d database_name -s -f schema.sql # 仅备份数据(不包含结构) pg_dump -U postgres -h 127.0.0.1 -d database_name -a -f data.sql # 恢复数据库(从自定义格式) pg_restore -U postgres -h 127.0.0.1 -d database_name backup.dump # 恢复数据库(从SQL文件) psql -U postgres -h 127.0.0.1 -d database_name -f backup.sql # 备份所有数据库 pg_dumpall -U postgres -h 127.0.0.1 -f all_databases.sql # 恢复所有数据库 psql -U postgres -h 127.0.0.1 -f all_databases.sql ``` ## 性能监控 ```sql -- 查看数据库连接数 SELECT count(*) FROM pg_stat_activity; -- 查看最大连接数 SHOW max_connections; -- 查看当前配置 SHOW ALL; -- 查看共享缓冲区使用情况 SELECT * FROM pg_stat_bgwriter; -- 查看表统计信息 SELECT schemaname, tablename, n_tup_ins AS inserts, n_tup_upd AS updates, n_tup_del AS deletes, n_live_tup AS live_rows, n_dead_tup AS dead_rows, last_vacuum, last_autovacuum, last_analyze, last_autoanalyze FROM pg_stat_user_tables ORDER BY n_live_tup DESC; -- 查看缓存命中率 SELECT sum(heap_blks_read) as heap_read, sum(heap_blks_hit) as heap_hit, (sum(heap_blks_hit) - sum(heap_blks_read)) / sum(heap_blks_hit) as ratio FROM pg_statio_user_tables; ``` ## 维护操作 ```sql -- 分析表(更新统计信息) ANALYZE table_name; ANALYZE; -- 分析所有表 -- 清理表(VACUUM) VACUUM table_name; VACUUM FULL table_name; -- 完全清理,会锁表 VACUUM ANALYZE table_name; -- 清理并分析 -- 自动清理(后台进程) -- 查看自动清理配置 SHOW autovacuum; -- 查看需要清理的表 SELECT schemaname, tablename, n_dead_tup, n_live_tup, round(n_dead_tup * 100.0 / NULLIF(n_live_tup, 0), 2) AS dead_ratio FROM pg_stat_user_tables WHERE n_dead_tup > 0 ORDER BY dead_ratio DESC; ``` ## 实用命令 ```sql -- 查看当前时间 SELECT NOW(); -- 查看时区 SHOW timezone; SELECT current_setting('timezone'); -- 设置时区 SET timezone = 'Asia/Shanghai'; -- 查看当前用户 SELECT current_user; -- 查看当前数据库 SELECT current_database(); -- 查看 PostgreSQL 版本 SELECT version(); -- 查看服务器配置 SHOW config_file; -- 配置文件路径 SHOW data_directory; -- 数据目录 -- 复制表结构 CREATE TABLE new_table (LIKE old_table INCLUDING ALL); -- 复制表数据 INSERT INTO new_table SELECT * FROM old_table; -- 查看序列 \ds SELECT sequence_name FROM information_schema.sequences; -- 重置序列 ALTER SEQUENCE sequence_name RESTART WITH 1; ``` ## 安装扩展(Ubuntu/Debian) ```bash # 替换版本号(如 14, 15, 16)为你的 PostgreSQL 版本 apt-get update apt-get install -y postgresql-contrib-16 # 安装其他常用扩展 apt-get install -y postgresql-16-pg-stat-statements ``` ## 常用 psql 命令 ```bash # 在 psql 交互界面中 \l # 列出所有数据库 \c dbname # 连接到数据库 \dt # 列出当前数据库的所有表 \d table # 显示表结构 \di # 列出索引 \du # 列出用户 \dx # 列出扩展 \df # 列出函数 \dn # 列出模式 \q # 退出 \? # 帮助 \h # SQL 命令帮助 \timing # 显示查询执行时间 \x # 扩展显示模式(列转行) \copy # 导入/导出 CSV ``` ## 导入/导出 CSV ```sql -- 导出表到 CSV \copy table_name TO '/path/to/file.csv' WITH CSV HEADER; -- 从 CSV 导入 \copy table_name FROM '/path/to/file.csv' WITH CSV HEADER; -- 使用 COPY 命令(需要超级用户权限) COPY table_name TO '/path/to/file.csv' WITH CSV HEADER; COPY table_name FROM '/path/to/file.csv' WITH CSV HEADER; ```