文章目錄
- PostgreSQL常用命令與工具指南
- 簡介
- 1. 連接與基本操作
- 連接數據庫
- 環境變量設置(避免密碼輸入)
- 常用元命令
- 2. 數據庫與表管理
- 數據庫操作
- 創建數據庫
- 刪除數據庫
- 修改數據庫屬性
- 表操作
- 創建表
- 修改表結構
- 刪除表
- 索引管理
- 創建索引
- 刪除索引
- 3. 數據操作(CRUD)
- 插入數據
- 查詢數據
- 更新數據
- 刪除數據
- 事務控制
- 4. 賬號與權限管理
- 角色/用戶操作
- 創建角色
- 修改角色
- 刪除角色
- 權限控制
- 授予權限
- 撤銷權限
- 查看權限
- 5. 常用函數
- 字符串函數
- 日期時間函數
- 數學與聚合函數
- 數組與JSON函數
- 窗口函數
- 6. 數據導出與備份
- 使用pg_dump導出
- 基本用法
- 高級選項
- 導出為CSV
- 備份恢復示例
- 7. 性能優化與維護
- 數據庫分析與優化
- 查詢性能分析
- 連接管理
- 系統參數設置
- 8. 圖形化管理工具
- 主流工具對比
- 工具推薦
- 9. 常用維護命令
- 系統狀態檢查
- 數據庫一致性檢查
- 日志管理
- 參考資料
PostgreSQL常用命令與工具指南
簡介
本文檔匯總了PostgreSQL數據庫的常用命令和工具,涵蓋數據庫連接、管理、數據操作、權限控制、函數、備份恢復及圖形化工具等方面,適用于開發人員、DBA及數據庫初學者參考。
1. 連接與基本操作
連接數據庫
psql -U username -d dbname -h hostname -p port
示例:連接本地PostgreSQL默認實例
psql -U postgres -d mydatabase -h localhost -p 5432
環境變量設置(避免密碼輸入)
export PGPASSWORD='your_password'
psql -U username -d dbname
?? 注意:生產環境不建議使用明文環境變量,可配置
.pgpass
文件
常用元命令
\l
:列出所有數據庫\c dbname
:切換到指定數據庫\dt
:列出當前數據庫的所有表\d table_name
:查看表結構\du
:列出所有角色/用戶\df
:列出所有函數\x
:切換擴展顯示模式(適合查看寬表)\q
:退出psql終端
2. 數據庫與表管理
數據庫操作
創建數據庫
CREATE DATABASE mydatabase
WITH OWNER = postgres
ENCODING = 'UTF8'
LC_COLLATE = 'en_US.UTF-8'
LC_CTYPE = 'en_US.UTF-8'
TABLESPACE = pg_default
CONNECTION LIMIT = -1;
刪除數據庫
DROP DATABASE IF EXISTS mydatabase;
修改數據庫屬性
ALTER DATABASE mydatabase RENAME TO newdbname;
ALTER DATABASE mydatabase SET CONNECTION LIMIT = 100;
表操作
創建表
id SERIAL PRIMARY KEY,username VARCHAR(50) NOT NULL UNIQUE,email VARCHAR(100) NOT NULL UNIQUE,created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,age INTEGER CHECK (age >= 0),status VARCHAR(20) DEFAULT 'active'
);
修改表結構
-- 添加列
ALTER TABLE users ADD COLUMN phone VARCHAR(20);-- 修改列
ALTER TABLE users ALTER COLUMN email SET NOT NULL;-- 刪除列
ALTER TABLE users DROP COLUMN phone;-- 添加約束
ALTER TABLE users ADD CONSTRAINT unique_email UNIQUE (email);
刪除表
DROP TABLE IF EXISTS users CASCADE; -- CASCADE會刪除依賴對象
索引管理
創建索引
-- 普通索引
CREATE INDEX idx_users_username ON users(username);-- 唯一索引
CREATE UNIQUE INDEX idx_users_email ON users(email);-- 復合索引
CREATE INDEX idx_users_status_created_at ON users(status, created_at);-- 部分索引(只索引滿足條件的行)
CREATE INDEX idx_active_users ON users(id) WHERE status = 'active';
刪除索引
DROP INDEX IF EXISTS idx_users_username;
3. 數據操作(CRUD)
插入數據
-- 插入單行
INSERT INTO users (username, email, age)
VALUES ('john_doe', 'john@example.com', 30);-- 插入多行
INSERT INTO users (username, email, age)
VALUES ('jane_smith', 'jane@example.com', 28),('bob_johnson', 'bob@example.com', 35);
查詢數據
-- 基本查詢
SELECT id, username, email FROM users WHERE status = 'active';-- 排序
SELECT * FROM users ORDER BY created_at DESC LIMIT 10;-- 聚合查詢
SELECT status, COUNT(*) as count FROM users GROUP BY status;-- 連接查詢
SELECT u.username, p.product_name
FROM users u
JOIN orders o ON u.id = o.user_id
JOIN products p ON o.product_id = p.id
WHERE u.id =
更新數據
-- 更新單行
UPDATE users SET age = 31, status = 'inactive' WHERE id = 1;-- 更新多行
UPDATE users SET status = 'inactive' WHERE last_login < '2023-01-01';
刪除數據
-- 刪除特定行
DELETE FROM users WHERE id = 1;-- 刪除滿足條件的多行
DELETE FROM users WHERE status = 'inactive' AND created_at < '2023-01-01';
事務控制
BEGIN; -- 開始事務INSERT INTO users (username, email) VALUES ('new_user', 'new@example.com');
UPDATE stats SET user_count = user_count + 1;COMMIT; -- 提交事務,或ROLLBACK; 回滾
4. 賬號與權限管理
角色/用戶操作
創建角色
-- 創建普通用戶(帶登錄權限)
CREATE ROLE app_user WITH LOGIN PASSWORD 'secure_password';-- 創建超級用戶
CREATE ROLE db_admin WITH SUPERUSER LOGIN PASSWORD 'admin_password';-- 創建角色(無登錄權限,用于權限分組)
CREATE ROLE reporting;
修改角色
-- 修改密碼
ALTER ROLE app_user WITH PASSWORD 'new_secure_password';-- 添加/移除權限
ALTER ROLE app_user WITH CREATEDB; -- 允許創建數據庫
ALTER ROLE app_user WITH NOCREATEDB; -- 移除創建數據庫權限-- 修改連接限制
ALTER ROLE app_user CONNECTION LIMIT 10;
刪除角色
DROP ROLE IF EXISTS app_user;
權限控制
授予權限
-- 授予數據庫權限
GRANT CONNECT ON DATABASE mydb TO app_user;
GRANT USAGE ON SCHEMA public TO app_user;-- 授予表權限
GRANT SELECT, INSERT, UPDATE ON TABLE users TO app_user;
GRANT ALL PRIVILEGES ON TABLE products TO app_user;-- 授予列級權限
GRANT SELECT (id, username), UPDATE (email) ON TABLE users TO app_user;-- 授予角色給用戶(繼承權限)
GRANT reporting TO app_user;
撤銷權限
REVOKE UPDATE ON TABLE users FROM app_user;
查看權限
-- 查看表權限
\dp users-- 查看角色權限
SELECT * FROM information_schema.role_table_grants WHERE grantee = 'app_user';
5. 常用函數
字符串函數
函數 | 描述 | 示例 | 結果 |
---|---|---|---|
CONCAT(str1, str2) | 連接字符串 | CONCAT('Hello', ' ', 'World') | ‘Hello World’ |
SUBSTRING(str FROM start FOR len) | 截取子串 | SUBSTRING('PostgreSQL' FROM 1 FOR 4) | ‘Post’ |
LENGTH(str) | 字符串長度 | LENGTH('test') | 4 |
TRIM(str) | 去除首尾空格 | TRIM(' test ') | ‘test’ |
UPPER(str) /LOWER(str) | 大小寫轉換 | UPPER('test') | ‘TEST’ |
REPLACE(str, old, new) | 替換字符串 | REPLACE('abc', 'a', 'x') | ‘xbc’ |
日期時間函數
-- 當前時間
SELECT CURRENT_TIMESTAMP; -- 帶時區
SELECT NOW(); -- 同上
SELECT CURRENT_DATE; -- 僅日期-- 日期運算
SELECT NOW() + INTERVAL '1 day'; -- 明天此時
SELECT NOW() - INTERVAL '2 hours'; -- 兩小時前-- 日期格式化
SELECT TO_CHAR(NOW(), 'YYYY-MM-DD HH24:MI:SS'); -- '2023-11-15 14:30:45'-- 日期截斷
SELECT DATE_TRUNC('month', NOW()); -- 當月第一天 00:00:00
數學與聚合函數
-- 數學函數
SELECT ROUND(3.1415, 2); -- 3.14
SELECT CEIL(3.2); -- 4
SELECT FLOOR(3.8); -- 3
SELECT RANDOM(); -- 0-1隨機數-- 聚合函數
SELECT AVG(age) FROM users; -- 平均值
SELECT SUM(amount) FROM orders; -- 總和
SELECT COUNT(*) FROM users; -- 總行數
SELECT MAX(created_at) FROM posts; -- 最大值
SELECT MIN(price) FROM products; -- 最小值-- 分組聚合
SELECT status, COUNT(*) as count FROM users GROUP BY status;
數組與JSON函數
-- 數組函數
SELECT ARRAY_AGG(id) FROM users WHERE status = 'active'; -- 聚合為數組
SELECT UNNEST(ARRAY[1,2,3]); -- 數組展開為多行
SELECT ARRAY_LENGTH(ARRAY[1,2,3], 1); -- 數組長度-- JSON函數
SELECT '{"name": "John", "age": 30}'::jsonb -> 'name'; -- 獲取JSON字段
SELECT jsonb_object_keys('{"a": 1, "b": 2}'); -- 獲取所有鍵
SELECT jsonb_extract_path_text('{"user": {"name": "John"}}', 'user', 'name'); -- 嵌套獲取
窗口函數
-- 行號
SELECT id, username, ROW_NUMBER() OVER (ORDER BY age) as row_num FROM users;-- 排名
SELECT id, score, RANK() OVER (ORDER BY score DESC) as rank FROM students;-- 分區排名
SELECT department, id, salary, RANK() OVER (PARTITION BY department ORDER BY salary DESC) as dept_rank
FROM employees;
6. 數據導出與備份
使用pg_dump導出
基本用法
# 導出整個數據庫
pg_dump -U username -d dbname -f backup.sql# 導出為自定義格式(壓縮,支持恢復時選擇對象)
pg_dump -U username -d dbname -F c -f backup.dump# 導出為目錄格式(支持并行備份)
pg_dump -U username -d dbname -F d -f backup_dir
高級選項
# 僅導出數據(無表結構)
pg_dump -U username -d dbname -a -f data_only.sql# 僅導出表結構
pg_dump -U username -d dbname -s -f schema_only.sql# 導出特定表
pg_dump -U username -d dbname -t table1 -t table2 -f tables_backup.sql# 排除特定表
pg_dump -U username -d dbname --exclude-table=logs --exclude-table=tmp_data -f backup.sql# 并行導出(4個工作進程)
pg_dump -U username -d dbname -j4 -F d -f parallel_backup
導出為CSV
-- 服務器端導出(需要文件系統權限)
COPY users TO '/var/lib/postgresql/users.csv' WITH (FORMAT csv, HEADER, DELIMITER ',');-- 客戶端導出(無需服務器文件權限)
\copy (SELECT id, username, email FROM users WHERE status = 'active') TO 'active_users.csv' WITH (FORMAT csv, HEADER);
```### 大數據量導出策略1. **分批次導出**
```bash
# 使用WHERE條件分批次導出
pg_dump -t "users" -c "WHERE id BETWEEN 1 AND 100000" -f users_part1.sql
pg_dump -t "users" -c "WHERE id BETWEEN 100001 AND 200000" -f users_part2.sql
- 并行導出與恢復
# 并行備份
pg_dump -j 8 -F d -f backup_dir dbname# 并行恢復
pg_restore -j 8 -d dbname backup_dir
- 使用COPY命令優化
-- 導出前禁用觸發器和索引
ALTER TABLE large_table DISABLE TRIGGER ALL;
DROP INDEX idx_large_table;-- 執行導出
COPY large_table TO 'data.csv' CSV;-- 重新啟用觸發器和索引
ALTER TABLE large_table ENABLE TRIGGER ALL;
CREATE INDEX idx_large_table ON large_table(column);
備份恢復示例
# 從SQL文件恢復
psql -U username -d dbname -f backup.sql# 從自定義格式恢復
pg_restore -U username -d dbname backup.dump# 恢復到新數據庫
createdb -U username new_db
pg_restore -U username -d new_db backup.dump
7. 性能優化與維護
數據庫分析與優化
-- 更新統計信息(幫助查詢優化器)
ANALYZE users;
ANALYZE VERBOSE users; -- 詳細輸出-- 真空清理(回收空間,更新可見性映射)
VACUUM users; -- 普通真空
VACUUM ANALYZE users; -- 真空并分析
VACUUM FULL users; -- 徹底清理(需要更多資源,會鎖表)
查詢性能分析
-- 查看查詢計劃
EXPLAIN SELECT * FROM users WHERE status = 'active';-- 執行并分析(實際運行查詢)
EXPLAIN ANALYZE SELECT * FROM users WHERE status = 'active' ORDER BY created_at;
連接管理
-- 查看當前連接
SELECT pid, usename, datname, state, wait_event_type, wait_event
FROM pg_stat_activity;-- 終止連接
SELECT pg_terminate_backend(12345); -- 12345為pid
系統參數設置
-- 查看參數
SHOW work_mem;
SELECT name, setting, unit FROM pg_settings WHERE name LIKE 'work_mem';-- 修改參數(會話級)
SET work_mem = '64MB';-- 修改參數(全局,需要重啟或重載)
ALTER SYSTEM SET work_mem = '64MB';
SELECT pg_reload_conf(); -- 重載配置
8. 圖形化管理工具
主流工具對比
工具 | 授權類型 | 支持平臺 | 主要特點 | 適用場景 |
---|---|---|---|---|
pgAdmin | 開源免費 | Windows/Linux/Mac | 官方工具,功能全面,支持查詢構建、性能監控、備份恢復 | DBA、開發人員 |
DBeaver | 開源免費(社區版)/商業(企業版) | 跨平臺 | 多數據庫支持,ER圖,數據導入導出,高級元數據管理 | 多數據庫環境,開發/分析 |
Navicat | 商業 | 跨平臺 | 界面直觀,易用性強,數據可視化,模型設計,數據同步 | 數據庫初學者,快速操作 |
phpPgAdmin | 開源免費 | Web應用 | 基于Web,適合服務器端部署,遠程管理 | 無本地客戶端環境,多用戶共享 |
OmniDB | 開源免費 | 跨平臺/Web | 支持團隊協作,可視化查詢構建,監控儀表板 | 團隊協作,遠程數據庫管理 |
工具推薦
- 開發人員:DBeaver(免費功能足夠)或DataGrip(集成開發體驗)
- DBA:pgAdmin(官方工具,功能全面)
- 初學者:Navicat(界面友好,學習曲線低)
- 服務器管理:phpPgAdmin(Web訪問,無需客戶端安裝)
9. 常用維護命令
系統狀態檢查
-- 查看數據庫大小
SELECT pg_size_pretty(pg_database_size('mydb'));-- 查看表大小(含索引)
SELECT pg_size_pretty(pg_total_relation_size('users'));-- 查看連接數
SELECT count(*) FROM pg_stat_activity;
SELECT count(*) FROM pg_stat_activity WHERE state = 'active';
數據庫一致性檢查
# 需要關閉數據庫
pg_checksums -c -d /var/lib/postgresql/14/main
日志管理
-- 查看日志配置
SHOW log_directory;
SHOW log_filename;
SHOW log_min_duration_statement;-- 臨時設置日志級別
ALTER SYSTEM SET log_min_duration_statement = 1000; -- 記錄執行時間>1秒的查詢
pg_reload_conf();
參考資料
- PostgreSQL官方文檔
- PostgreSQL中文社區
- pg_dump官方手冊
- PostgreSQL性能優化指南