453 lines
10 KiB
Markdown
453 lines
10 KiB
Markdown
# 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 = <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;
|
||
```
|