PostgreSQL數(shù)據(jù)庫從入門到精通實戰(zhàn)
這是一份詳細的 PostgreSQL 數(shù)據(jù)庫使用指南,涵蓋核心概念、操作、管理和優(yōu)化實踐。
1. 介紹與安裝
1.1 什么是 PostgreSQL?
PostgreSQL 是一個功能強大、開源的對象關(guān)系型數(shù)據(jù)庫管理系統(tǒng) (ORDBMS)。它以其高度的 SQL 標(biāo)準(zhǔn)兼容性、強大的功能集(如 JSON 支持、地理空間數(shù)據(jù)處理、全文搜索)、可擴展性(通過擴展)以及可靠性(ACID 事務(wù)支持)而聞名。
1.2 安裝 PostgreSQL
- 操作系統(tǒng): PostgreSQL 支持 Windows, Linux (各發(fā)行版), macOS 等。
- 安裝方式:
- 官方倉庫/包管理器: 推薦方式。例如:
- Ubuntu/Debian:
sudo apt-get update && sudo apt-get install postgresql postgresql-contrib - CentOS/RHEL:
sudo yum install postgresql-server postgresql-contrib - macOS (Homebrew):
brew install postgresql - Windows: 下載安裝程序并運行。
- Ubuntu/Debian:
- 源碼編譯: 提供最大靈活性,適合高級用戶。
- 官方倉庫/包管理器: 推薦方式。例如:
- 初始化數(shù)據(jù)庫集群: 安裝后,通常需要初始化一個數(shù)據(jù)庫集群(存放數(shù)據(jù)的目錄)。
- Linux:
sudo postgresql-setup initdb - macOS (Homebrew):
initdb -D /usr/local/var/postgres(路徑可能不同)
- Linux:
- 啟動服務(wù):
- Linux (Systemd):
sudo systemctl start postgresql - macOS (Homebrew):
brew services start postgresql - Windows: 使用服務(wù)管理器或
pg_ctl命令。
- Linux (Systemd):
2. 基本概念與操作
2.1 連接數(shù)據(jù)庫
- 默認用戶: 安裝后通常創(chuàng)建一個名為
postgres的超級用戶。 - 命令行連接 (psql):
psql -U username -d dbname -h hostname -p port-U: 用戶名 (如postgres)-d: 數(shù)據(jù)庫名 (默認postgres)-h: 主機 (默認localhost)-p: 端口 (默認5432)
- 圖形化工具: pgAdmin, DBeaver, DataGrip 等。
- 在
psql內(nèi):\q: 退出\l: 列出所有數(shù)據(jù)庫\c dbname: 切換到數(shù)據(jù)庫dbname\dt: 列出當(dāng)前數(shù)據(jù)庫的所有表\d tablename: 查看表tablename的結(jié)構(gòu)\?: 查看幫助\e: 打開編輯器編輯當(dāng)前查詢\i filename: 執(zhí)行 SQL 腳本文件filename\timing: 切換命令執(zhí)行時間顯示
2.2 創(chuàng)建數(shù)據(jù)庫
CREATE DATABASE mydatabase; -- 指定所有者 CREATE DATABASE mydatabase OWNER myuser; -- 指定編碼 (推薦 UTF8) CREATE DATABASE mydatabase ENCODING 'UTF8';
2.3 創(chuàng)建用戶/角色
在 PostgreSQL 中,"角色"(Role)可以代表用戶(User)或用戶組(Group)。
-- 創(chuàng)建登錄角色 (用戶) CREATE ROLE myuser WITH LOGIN PASSWORD 'mypassword'; -- 創(chuàng)建超級用戶 CREATE ROLE adminuser WITH LOGIN PASSWORD 'adminpass' SUPERUSER; -- 修改密碼 ALTER ROLE myuser WITH PASSWORD 'newpassword';
2.4 創(chuàng)建表
CREATE TABLE employees (
id SERIAL PRIMARY KEY, -- SERIAL 通常用于自動遞增主鍵
first_name VARCHAR(50) NOT NULL,
last_name VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE,
hire_date DATE NOT NULL,
salary NUMERIC(10, 2) CHECK (salary > 0),
department_id INTEGER REFERENCES departments(id) -- 外鍵約束
);
常見數(shù)據(jù)類型:
INTEGER,SMALLINT,BIGINTNUMERIC(precision, scale),DECIMAL(precision, scale)- 精確數(shù)值REAL,DOUBLE PRECISION- 浮點數(shù)VARCHAR(n),CHAR(n),TEXTBOOLEANDATE,TIME,TIMESTAMP,INTERVALJSON,JSONB(二進制 JSON, 更高效)UUIDARRAYGEOMETRY(PostGIS 擴展)
2.5 CRUD 操作 (創(chuàng)建、讀取、更新、刪除)
插入數(shù)據(jù) (Create):
INSERT INTO employees (first_name, last_name, email, hire_date, salary, department_id)
VALUES ('John', 'Doe', 'john.doe@example.com', '2023-01-15', 60000.00, 1);
-- 插入多條
INSERT INTO employees (...) VALUES (...), (...), (...);
查詢數(shù)據(jù) (Read):
-- 基本查詢 SELECT * FROM employees; -- 選擇特定列 SELECT first_name, last_name, salary FROM employees; -- 條件過濾 (WHERE) SELECT * FROM employees WHERE salary > 50000; SELECT * FROM employees WHERE hire_date BETWEEN '2022-01-01' AND '2023-12-31'; SELECT * FROM employees WHERE last_name LIKE 'Sm%'; -- 模糊匹配 -- 排序 (ORDER BY) SELECT * FROM employees ORDER BY salary DESC; -- 限制結(jié)果集 (LIMIT, OFFSET) SELECT * FROM employees ORDER BY hire_date DESC LIMIT 10 OFFSET 20; -- 分頁 -- 聚合函數(shù) (COUNT, SUM, AVG, MIN, MAX) SELECT COUNT(*) FROM employees; SELECT department_id, AVG(salary) AS avg_salary FROM employees GROUP BY department_id; SELECT department_id, AVG(salary) FROM employees GROUP BY department_id HAVING AVG(salary) > 50000; -- HAVING 過濾分組 -- 連接查詢 (JOIN) SELECT e.first_name, e.last_name, d.name AS department_name FROM employees e INNER JOIN departments d ON e.department_id = d.id; -- 子查詢 SELECT * FROM employees WHERE salary > (SELECT AVG(salary) FROM employees);
更新數(shù)據(jù) (Update):
UPDATE employees SET salary = salary * 1.05 WHERE department_id = 3; -- 給部門3的員工漲薪5% UPDATE employees SET email = 'new.email@example.com' WHERE id = 42;
刪除數(shù)據(jù) (Delete):
DELETE FROM employees WHERE id = 100; -- 刪除特定行 DELETE FROM employees; -- 刪除所有行 (危險!通常用 TRUNCATE 更快) TRUNCATE TABLE employees; -- 快速清空表,重置序列 (如果有),但無法觸發(fā) DELETE 觸發(fā)器 TRUNCATE TABLE employees RESTART IDENTITY; -- 同時重置關(guān)聯(lián)的序列
3. 高級功能
3.1 索引
索引是加速查詢的關(guān)鍵。
- 創(chuàng)建索引:
CREATE INDEX idx_employees_last_name ON employees (last_name); CREATE INDEX idx_employees_department_salary ON employees (department_id, salary); -- 復(fù)合索引 -- 唯一索引 (通常由 UNIQUE 約束自動創(chuàng)建) CREATE UNIQUE INDEX idx_employees_email ON employees (email);
- 索引類型:
- B-tree: 默認類型,適用于等值查詢、范圍查詢、排序。支持所有數(shù)據(jù)類型。
- Hash: 僅適用于等值查詢 (=),通常不如 B-tree 常用。
- GiST (Generalized Search Tree): 適用于幾何數(shù)據(jù)、全文搜索、范圍類型等復(fù)雜數(shù)據(jù)類型。
- GIN (Generalized Inverted Index): 適用于包含操作符(如
@>,<@,&&)的數(shù)據(jù)類型,如數(shù)組、JSONB、全文搜索。 - SP-GiST (Space-Partitioned GiST): 適用于可分割空間的數(shù)據(jù)類型(如點)。
- BRIN (Block Range INdex): 適用于非常大的、物理存儲有序的表(如時間序列),索引非常小。
- 查看索引:
\d tablename或SELECT * FROM pg_indexes WHERE tablename = 'employees'; - 維護索引:
REINDEX INDEX idx_name;或REINDEX TABLE table_name;或REINDEX DATABASE db_name;
3.2 事務(wù) (Transactions)
PostgreSQL 使用 MVCC (多版本并發(fā)控制) 來管理并發(fā)訪問。
- 事務(wù)塊:
BEGIN; -- 或 START TRANSACTION; -- 執(zhí)行一系列 SQL 語句 UPDATE accounts SET balance = balance - 100.00 WHERE id = 1; UPDATE accounts SET balance = balance + 100.00 WHERE id = 2; COMMIT; -- 提交事務(wù) -- 如果出錯 ROLLBACK; -- 回滾事務(wù)
- 事務(wù)隔離級別: PostgreSQL 支持 SQL 標(biāo)準(zhǔn)級別:
READ COMMITTED(默認)REPEATABLE READSERIALIZABLE- 設(shè)置:
SET TRANSACTION ISOLATION LEVEL ...;(在BEGIN之后)
3.3 視圖 (Views)
視圖是基于一個或多個表的查詢結(jié)果的虛擬表。
-- 創(chuàng)建視圖 CREATE VIEW employee_summary AS SELECT e.id, e.first_name, e.last_name, d.name AS department, e.salary FROM employees e JOIN departments d ON e.department_id = d.id; -- 查詢視圖 SELECT * FROM employee_summary WHERE department = 'Engineering'; -- 更新視圖 (有限制條件,需滿足特定規(guī)則) CREATE OR REPLACE VIEW ... -- 修改視圖定義 DROP VIEW employee_summary; -- 刪除視圖
3.4 存儲過程與函數(shù) (PL/pgSQL)
PostgreSQL 支持多種過程語言,最常用的是 PL/pgSQL。
-- 簡單函數(shù)示例
CREATE OR REPLACE FUNCTION get_employee_count(dept_id INTEGER)
RETURNS INTEGER AS $$
DECLARE
emp_count INTEGER;
BEGIN
SELECT COUNT(*) INTO emp_count
FROM employees
WHERE department_id = dept_id;
RETURN emp_count;
END;
$$ LANGUAGE plpgsql;
-- 調(diào)用函數(shù)
SELECT get_employee_count(1);3.5 觸發(fā)器 (Triggers)
觸發(fā)器在特定事件(INSERT, UPDATE, DELETE)發(fā)生時自動執(zhí)行一個函數(shù)。
-- 創(chuàng)建觸發(fā)器函數(shù) (記錄員工薪資變更)
CREATE OR REPLACE FUNCTION log_salary_change()
RETURNS TRIGGER AS $$
BEGIN
IF NEW.salary <> OLD.salary THEN
INSERT INTO salary_history (employee_id, old_salary, new_salary, change_time)
VALUES (OLD.id, OLD.salary, NEW.salary, NOW());
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
-- 創(chuàng)建觸發(fā)器
CREATE TRIGGER track_salary_change
AFTER UPDATE OF salary ON employees -- 僅當(dāng) salary 列更新時觸發(fā)
FOR EACH ROW
EXECUTE FUNCTION log_salary_change();3.6 擴展 (Extensions)
PostgreSQL 的功能可以通過擴展來增強。
- 查看可用擴展:
SELECT * FROM pg_available_extensions; - 安裝擴展:
CREATE EXTENSION extension_name;(需要超級用戶權(quán)限) - 常用擴展:
- PostGIS: 地理空間數(shù)據(jù)處理。
- pgcrypto: 加密函數(shù)。
- uuid-ossp: 生成 UUID。
- hstore: 鍵值對存儲。
- pg_stat_statements: 跟蹤 SQL 執(zhí)行統(tǒng)計。
- citext: 大小寫不敏感的文本類型。
- 查看已安裝擴展:
\dx或SELECT * FROM pg_extension;
4. 管理與維護
4.1 配置 (postgresql.conf)
主要配置文件,控制數(shù)據(jù)庫行為(內(nèi)存、連接、日志、復(fù)制等)。位置通常在數(shù)據(jù)目錄下。
- 重要參數(shù):
listen_addresses: 監(jiān)聽地址 ('*'表示所有 IP)。port: 監(jiān)聽端口 (默認 5432)。max_connections: 最大并發(fā)連接數(shù)。shared_buffers: 共享內(nèi)存緩沖區(qū)大小(通常設(shè)為系統(tǒng)內(nèi)存的 25%)。work_mem: 每個操作(排序、哈希)可用的內(nèi)存。maintenance_work_mem: VACUUM, CREATE INDEX 等維護操作使用的內(nèi)存。wal_level: 預(yù)寫日志級別(影響復(fù)制和備份)。fsync: 是否確保數(shù)據(jù)寫入磁盤(通常on)。
- 修改配置:
- 編輯
postgresql.conf。 - 使用 SQL:
ALTER SYSTEM SET parameter_name = 'value';(需要superuser權(quán)限,修改postgresql.auto.conf)。 - 重新加載配置:
SELECT pg_reload_conf();(無需重啟) 或重啟 PostgreSQL 服務(wù)。
- 編輯
4.2 用戶與權(quán)限管理
- 授權(quán) (GRANT):
GRANT SELECT, INSERT, UPDATE ON TABLE employees TO myuser; -- 授予表權(quán)限 GRANT ALL PRIVILEGES ON DATABASE mydatabase TO adminuser; -- 授予數(shù)據(jù)庫所有權(quán)限 GRANT USAGE ON SCHEMA public TO myuser; -- 授予模式使用權(quán)限 (通常是必要的)
- 撤銷權(quán)限 (REVOKE):
REVOKE UPDATE ON TABLE employees FROM myuser;
- 角色成員關(guān)系:
GRANT role_name TO user_name; -- 將用戶加入角色組 REVOKE role_name FROM user_name;
4.3 備份與恢復(fù)
- 邏輯備份 (pg_dump / pg_dumpall):
# 備份單個數(shù)據(jù)庫 pg_dump -U username -d dbname -F c -f backup_file.dump # 自定義格式 (推薦,支持并行恢復(fù)) pg_dump -U username -d dbname -F p -f backup_file.sql # 純 SQL 格式 # 備份所有數(shù)據(jù)庫 (包括全局對象) pg_dumpall -U username -f alldbs.sql
- 物理備份 (文件系統(tǒng)級): 需要停止數(shù)據(jù)庫或使用 PITR (Point-In-Time Recovery)。通常與 WAL 歸檔結(jié)合使用。
- 恢復(fù):
# 恢復(fù)邏輯備份 (自定義格式) pg_restore -U username -d newdbname -C backup_file.dump # -C 表示先創(chuàng)建數(shù)據(jù)庫 # 恢復(fù) SQL 備份 psql -U username -d dbname -f backup_file.sql
4.4 性能調(diào)優(yōu)
- 使用
EXPLAIN分析查詢計劃: 這是調(diào)優(yōu)的基礎(chǔ)。EXPLAIN SELECT * FROM employees WHERE last_name = 'Smith'; -- 顯示計劃 EXPLAIN ANALYZE SELECT ...; -- 實際執(zhí)行并顯示計劃和實際耗時
- 關(guān)注點:
- Seq Scan vs Index Scan: 避免全表掃描 (Seq Scan),利用索引 (Index Scan)。
- 成本 (cost): 估算的執(zhí)行代價。
- 行數(shù)估計 (rows): 優(yōu)化器估計的行數(shù)是否準(zhǔn)確?不準(zhǔn)確可能源于過時的統(tǒng)計信息。
- 連接類型 (Join Type): Nested Loop, Hash Join, Merge Join。選擇取決于數(shù)據(jù)量和索引。
- 更新統(tǒng)計信息:
ANALYZE table_name;或VACUUM ANALYZE table_name;。自動autovacuum進程通常會處理。 - 調(diào)整配置參數(shù): 如
shared_buffers,work_mem,effective_cache_size,random_page_cost,maintenance_work_mem。 - 使用
pg_stat_statements擴展: 識別高頻、高消耗的 SQL 語句。 - 監(jiān)控工具: pgAdmin Dashboard,
pg_top,vmstat,iostat,top等。
4.5 日常維護
VACUUM: 清理死元組(由 MVCC 產(chǎn)生),回收空間,更新可見性信息。- 普通 VACUUM:
VACUUM table_name;(不阻塞讀寫) - 完整 VACUUM:
VACUUM FULL table_name;(重寫表,阻塞,需要更多空間,慎用) - 自動 VACUUM (autovacuum): 強烈推薦開啟并配置合理參數(shù) (
autovacuum_vacuum_scale_factor,autovacuum_vacuum_threshold)。監(jiān)控pg_stat_all_tables的n_dead_tup。
- 普通 VACUUM:
REINDEX: 重建索引以消除碎片。定期或在性能下降時進行。- 日志管理: 配置
log_destination,logging_collector,log_filename,log_rotation_size,log_rotation_age。分析日志 (pg_log) 以排查問題。 - 監(jiān)控: 使用
pg_stat_*視圖 (pg_stat_database,pg_stat_user_tables,pg_stat_user_indexes),pg_statio_*視圖。
5. 安全
- 身份驗證 (pg_hba.conf): 控制誰可以如何連接。
- 位置:數(shù)據(jù)目錄下。
- 格式:
host database user address auth-method [auth-options] - 常用方法:
trust(不安全),md5,scram-sha-256(推薦),peer(本地),cert(SSL 證書)。
- 密碼策略: 使用
ALTER ROLE ... PASSWORD ...設(shè)置強密碼??紤]密碼有效期(需額外配置)。 - 網(wǎng)絡(luò)加密 (SSL):
- 配置
postgresql.conf:ssl = on, 設(shè)置ssl_cert_file,ssl_key_file。 - 配置
pg_hba.conf: 使用hostssl條目強制 SSL 連接。
- 配置
- 行級安全策略 (RLS): 限制用戶對表中特定行的訪問。
CREATE POLICY employee_policy ON employees FOR SELECT TO sales_staff USING (department_id = (SELECT department_id FROM user_departments WHERE username = current_user)); ALTER TABLE employees ENABLE ROW LEVEL SECURITY;
- 最小權(quán)限原則: 僅為用戶授予完成工作所需的最小權(quán)限。
- 定期審計: 審查用戶權(quán)限、配置文件和日志。
6. 復(fù)制與高可用
PostgreSQL 支持多種復(fù)制方案以實現(xiàn)高可用性和讀寫分離。
- 流復(fù)制 (Streaming Replication): 基于 WAL 的異步或同步復(fù)制。一個主庫 (Master),多個備庫 (Standby/Replica)。備庫可以用于只讀查詢。
- 邏輯復(fù)制: 復(fù)制特定的表或數(shù)據(jù)變更,更靈活,允許不同版本或部分復(fù)制。使用發(fā)布/訂閱模型。
- 高可用解決方案: 需要額外的工具來管理故障切換 (Failover)。
- 內(nèi)置工具:
pg_rewind(修復(fù)分歧的備庫)。 - 流行方案: Patroni, repmgr, pgpool-II。
- 內(nèi)置工具:
- 負載均衡: 使用 pgpool-II 或 HAProxy 等中間件分發(fā)讀請求到多個備庫。
附錄
- 常用函數(shù):
- 字符串:
concat(),substring(),trim(),upper(),lower(),length(),position()。 - 日期/時間:
now(),current_date,current_time,extract(field FROM timestamp),date_trunc('unit', timestamp),age(timestamp)。 - 數(shù)學(xué):
abs(),round(),ceil(),floor(),sqrt(),power(),random()。 - 聚合:
count(),sum(),avg(),min(),max(),array_agg(),string_agg()。 - JSON:
jsonb_array_elements(),jsonb_extract_path_text(),jsonb_set(),->,->>。
- 字符串:
- 錯誤代碼: 參考 PostgreSQL 文檔中的 "Appendix A. PostgreSQL Error Codes"。
- 官方文檔: 始終是權(quán)威參考 - https://www.postgresql.org/docs/
這份指南提供了 PostgreSQL 的全面概覽和核心實踐。請務(wù)必查閱官方文檔以獲取最準(zhǔn)確和最新的信息,并根據(jù)您的具體需求和應(yīng)用場景進行深入學(xué)習(xí)和配置調(diào)整。
到此這篇關(guān)于PostgreSQL數(shù)據(jù)庫全攻略:從入門到精通的文章就介紹到這了,更多相關(guān)PostgreSQL從入門到精通內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
postgresql數(shù)據(jù)庫基本操作及命令詳解
本文介紹了PostgreSQL數(shù)據(jù)庫的基礎(chǔ)操作,包括連接、創(chuàng)建、查看數(shù)據(jù)庫,表的增刪改查、索引管理、備份恢復(fù)及退出命令,適用于數(shù)據(jù)庫管理和開發(fā)實踐,感興趣的朋友一起看看吧2025-06-06
使用PostgreSQL數(shù)據(jù)庫建立用戶畫像系統(tǒng)的方法
這篇文章主要介紹了使用PostgreSQL數(shù)據(jù)庫建立用戶畫像系統(tǒng),下面使用一個具體的例子來說明如何使用PostgreSQL的json數(shù)據(jù)類型來建立用戶標(biāo)簽數(shù)據(jù),需要的朋友可以參考下2022-10-10
PostgreSQL之分區(qū)表(partitioning)
通過合理的設(shè)計,可以將選擇一定的規(guī)則,將大表切分多個不重不漏的子表,這就是傳說中的partitioning。比如,我們可以按時間切分,每天一張子表,比如我們可以按照某其他字段分割,總之了就是化整為零,提高查詢的效能2016-11-11
PostgreSQL登陸方式(本地和遠程)的實現(xiàn)
本次分享一下PostgreSQL 的登陸方式,包括本地登錄和遠程登錄,文中通過圖文示例介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-11-11

