PostgreSQL 安裝部署及配置使用教程
一、PostgreSQL 簡介
PostgreSQL 是一個功能強大的開源對象關系型數(shù)據(jù)庫系統(tǒng),支持 SQL 標準和擴展,適合各種規(guī)模應用。
二、安裝 PostgreSQL
1. Linux(以 Ubuntu 為例)
1.1 更新系統(tǒng)包列表
sudo apt update
1.2 安裝 PostgreSQL
sudo apt install postgresql postgresql-contrib
1.3 查看 PostgreSQL 服務狀態(tài)
sudo systemctl status postgresql
2. CentOS/RHEL
sudo yum install -y postgresql-server postgresql-contrib sudo postgresql-setup initdb sudo systemctl enable postgresql sudo systemctl start postgresql
3. Windows
- 訪問 PostgreSQL 官網(wǎng) 下載安裝包。
- 運行安裝程序,按提示選擇安裝路徑、端口、超級用戶密碼等。
- 安裝完成后,可通過 pgAdmin 或命令行管理數(shù)據(jù)庫。
三、基本配置
1. 配置文件位置
postgresql.conf:主配置文件,通常在/etc/postgresql/<版本>/main/或/var/lib/pgsql/data/pg_hba.conf:客戶端連接認證配置文件
2. 修改監(jiān)聽地址(允許遠程連接)
編輯 postgresql.conf:
listen_addresses = '*'
編輯 pg_hba.conf,添加如下一行允許所有 IP 通過密碼方式訪問:
host all all 0.0.0.0/0 md5
修改后重啟服務:
sudo systemctl restart postgresql
3. 設置端口號
在 postgresql.conf 中修改:
port = 5432
四、數(shù)據(jù)庫管理
1. 切換到 PostgreSQL 用戶(Linux)
sudo -i -u postgres
2. 進入數(shù)據(jù)庫命令行
psql
3. 創(chuàng)建數(shù)據(jù)庫和用戶
-- 創(chuàng)建用戶 CREATE USER myuser WITH PASSWORD 'mypassword'; -- 創(chuàng)建數(shù)據(jù)庫 CREATE DATABASE mydb OWNER myuser; -- 授權 GRANT ALL PRIVILEGES ON DATABASE mydb TO myuser;
4. 修改用戶權限
ALTER USER myuser WITH SUPERUSER;
五、基本使用
1. 連接數(shù)據(jù)庫
命令行連接
psql -U myuser -h localhost -d mydb
使用 pgAdmin(圖形化工具)
- 打開 pgAdmin,添加服務器,填寫連接信息。
2. 常用 SQL 操作
-- 創(chuàng)建表
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(50),
email VARCHAR(100)
);
-- 插入數(shù)據(jù)
INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com');
-- 查詢數(shù)據(jù)
SELECT * FROM users;
-- 更新數(shù)據(jù)
UPDATE users SET name = 'Bob' WHERE id = 1;
-- 刪除數(shù)據(jù)
DELETE FROM users WHERE id = 1;六、備份與恢復
1. 備份數(shù)據(jù)庫
pg_dump -U myuser -h localhost mydb > mydb_backup.sql
2. 恢復數(shù)據(jù)庫
psql -U myuser -h localhost -d mydb < mydb_backup.sql
七、常用維護命令
- 查看數(shù)據(jù)庫列表:
\l - 切換數(shù)據(jù)庫:
\c dbname - 查看表列表:
\dt - 查看用戶列表:
\du - 退出:
\q
八、附加說明
- 推薦使用 pgAdmin 進行圖形化管理。
- 可以使用 Docker 快速部署:
docker run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -p 5432:5432 -d postgres
九、進階配置
1. 連接數(shù)與內存參數(shù)
在 postgresql.conf 中調整:
max_connections = 100 # 最大連接數(shù) shared_buffers = 128MB # 數(shù)據(jù)庫緩存區(qū)大小,建議為物理內存的 1/4 work_mem = 4MB # 每個查詢操作分配的內存 maintenance_work_mem = 64MB # 維護操作(如 VACUUM)的內存 effective_cache_size = 512MB # 操作系統(tǒng)可用于緩存的內存估算
修改后需重啟 PostgreSQL 服務。
2. 日志設置
logging_collector = on log_directory = 'pg_log' log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' log_statement = 'all' # 建議生產環(huán)境設置為 'none' 或 'mod'
3. 自動清理(VACUUM)
PostgreSQL 自動進行垃圾回收,但可手動執(zhí)行:
VACUUM; VACUUM FULL; -- 更徹底,可能會鎖表
十、性能優(yōu)化建議
索引優(yōu)化
創(chuàng)建索引可加速查詢:
CREATE INDEX idx_users_email ON users(email);
查詢優(yōu)化
使用 EXPLAIN 分析 SQL 性能:
EXPLAIN SELECT * FROM users WHERE email = 'xxx';
分區(qū)表
大表可分區(qū)提升性能:
CREATE TABLE measurement ( city_id int, logdate date, peaktemp int, unitsales int ) PARTITION BY RANGE (logdate);
連接池
建議使用連接池(如 PgBouncer)減少資源消耗。
十一、擴展插件
PostGIS:地理空間數(shù)據(jù)庫擴展
sudo apt install postgis CREATE EXTENSION postgis;
uuid-ossp:生成 UUID
CREATE EXTENSION "uuid-ossp"; SELECT uuid_generate_v4();
pg_stat_statements:SQL 統(tǒng)計分析
CREATE EXTENSION pg_stat_statements; SELECT * FROM pg_stat_statements;
十二、安全加固
密碼策略
強密碼,定期更換,禁用默認用戶 postgres 的遠程訪問。
限制訪問 IP
編輯 pg_hba.conf,只允許信任 IP 段訪問。
SSL 加密
配置 SSL,保護數(shù)據(jù)傳輸安全。
ssl = on ssl_cert_file = 'server.crt' ssl_key_file = 'server.key'
定期備份
使用 pg_dump 或 pg_basebackup 定期備份,保存到安全位置。
十三、常見問題及解決方法
- 無法遠程連接
- 檢查
listen_addresses和pg_hba.conf配置。 - 檢查防火墻是否開放 5432 端口。
- 檢查
- 密碼認證失敗
- 確認用戶名、密碼正確。
- 檢查
pg_hba.conf的認證方式(如md5、scram-sha-256)。
- 數(shù)據(jù)庫啟動失敗
- 查看日志文件(
pg_log目錄)。 - 檢查磁盤空間和配置文件語法。
- 查看日志文件(
- 性能變慢
- 檢查慢查詢日志。
- 執(zhí)行
VACUUM和REINDEX。 - 增加內存分配。
十四、高可用與主從復制
1. 主從流復制
主庫配置
編輯 postgresql.conf:
wal_level = replica max_wal_senders = 10 archive_mode = on archive_command = 'cp %p /var/lib/postgresql/wal_archive/%f'
在 pg_hba.conf 添加從庫 IP:
host replication all <slave_ip>/32 md5
從庫初始化
使用 pg_basebackup:
pg_basebackup -h <master_ip> -D /var/lib/postgresql/data -U replication -P --wal-method=stream
配置 recovery.conf(PostgreSQL 12 及以上為 standby.signal 文件)。
十五、常用工具推薦
- pgAdmin:官方圖形化管理工具
- DBeaver:多數(shù)據(jù)庫管理工具
- Navicat:商業(yè)數(shù)據(jù)庫管理工具
- psql:命令行工具
- PgBouncer:輕量級連接池
十六、自動備份與定時任務
1. 使用cron定時備份(Linux)
編輯 crontab,例如每天凌晨2點自動備份數(shù)據(jù)庫:
crontab -e
添加如下內容:
0 2 * * * pg_dump -U myuser -h localhost mydb > /backup/mydb_$(date +\%F).sql
注意:確保
/backup/目錄存在且有寫權限,myuser用戶有備份權限。
2. 自動清理過期備份腳本示例
保留最近7天備份,其余自動刪除:
find /backup/ -name "mydb_*.sql" -mtime +7 -exec rm {} \;3. Windows 定時任務
可用“任務計劃程序”調用批處理或 PowerShell 腳本實現(xiàn)定時備份。
十七、數(shù)據(jù)庫監(jiān)控
1. 內置視圖
pg_stat_activity:查看當前連接和執(zhí)行的SQLpg_stat_database:數(shù)據(jù)庫級統(tǒng)計信息
示例:
SELECT * FROM pg_stat_activity; SELECT datname, numbackends, xact_commit, xact_rollback FROM pg_stat_database;
2. 監(jiān)控工具
- pgAdmin:自帶部分監(jiān)控功能
- Prometheus + Grafana:結合 postgres_exporter 進行可視化監(jiān)控
- Zabbix、Nagios 等企業(yè)級監(jiān)控工具
十八、升級與遷移
1. 版本升級
1.1 使用pg_upgrade工具(推薦大版本升級)
- 安裝新版本 PostgreSQL
- 停止舊服務,備份數(shù)據(jù)
- 執(zhí)行
pg_upgrade - 檢查數(shù)據(jù)完整性,切換新服務
詳細官方文檔:pg_upgrade
1.2 邏輯備份還原(跨平臺、跨版本)
pg_dumpall -U postgres > all.sql # 在新環(huán)境還原 psql -U postgres -f all.sql
2. 數(shù)據(jù)遷移
- 跨服務器遷移:使用
pg_dump+psql,或pg_basebackup(物理遷移) - 跨數(shù)據(jù)庫類型:可用 DBConvert 等工具
十九、常用SQL腳本示例
1. 批量插入數(shù)據(jù)
INSERT INTO users (name, email)
VALUES
('Tom', 'tom@example.com'),
('Jerry', 'jerry@example.com'),
('Spike', 'spike@example.com');2. 批量更新
UPDATE users SET status = 'active' WHERE id IN (1,2,3);
3. 查詢表結構
\d+ users
4. 查詢某表空間大小
SELECT pg_size_pretty(pg_total_relation_size('users'));5. 查詢數(shù)據(jù)庫當前連接數(shù)
SELECT count(*) FROM pg_stat_activity;
6. 查看鎖等待
SELECT * FROM pg_locks WHERE NOT granted;
二十、PostgreSQL 優(yōu)秀學習資源
二十一、FAQ 補充
如何重置用戶密碼?
ALTER USER myuser WITH PASSWORD 'newpassword';
如何查看數(shù)據(jù)庫版本?
SELECT version();
如何導出/導入表結構而不帶數(shù)據(jù)?
pg_dump -U myuser -h localhost -s mydb > mydb_schema.sql
如何只導出/導入部分表?
pg_dump -U myuser -h localhost -t users mydb > users.sql psql -U myuser -d mydb < users.sql
二十三、表分區(qū)(Partition)
1. 適用場景
- 大數(shù)據(jù)量表,按時間、ID等字段分區(qū),提高查詢與維護效率。
2. 分區(qū)創(chuàng)建示例(按日期分區(qū))
CREATE TABLE sales (
id serial PRIMARY KEY,
sale_date date NOT NULL,
amount numeric
) PARTITION BY RANGE (sale_date);
CREATE TABLE sales_2023 PARTITION OF sales FOR VALUES FROM ('2023-01-01') TO ('2024-01-01');
CREATE TABLE sales_2024 PARTITION OF sales FOR VALUES FROM ('2024-01-01') TO ('2025-01-01');3. 查看分區(qū)信息
SELECT
inhrelid::regclass AS child,
inhparent::regclass AS parent
FROM
pg_inherits;二十四、事務與并發(fā)控制
1. 事務基礎
BEGIN; UPDATE users SET balance = balance - 100 WHERE id = 1; UPDATE users SET balance = balance + 100 WHERE id = 2; COMMIT;
用于保證操作的原子性,一致性,隔離性,持久性(ACID)。
2. 隔離級別
READ COMMITTEDREPEATABLE READSERIALIZABLE
設置示例:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
3. 并發(fā)與鎖
- 行級鎖:
SELECT ... FOR UPDATE - 表級鎖:
LOCK TABLE table_name IN ACCESS EXCLUSIVE MODE;
查看鎖信息:
SELECT * FROM pg_locks WHERE NOT granted;
二十五、觸發(fā)器與存儲過程
1. 觸發(fā)器示例
自動記錄更新日志:
CREATE TABLE users_log (
id serial PRIMARY KEY,
user_id int,
action varchar(20),
log_time timestamp DEFAULT now()
);
CREATE OR REPLACE FUNCTION log_user_update()
RETURNS trigger AS $$
BEGIN
INSERT INTO users_log(user_id, action) VALUES (NEW.id, 'update');
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER user_update_trig
AFTER UPDATE ON users
FOR EACH ROW EXECUTE FUNCTION log_user_update();2. 存儲過程(函數(shù))示例
CREATE OR REPLACE FUNCTION add_user(name text, email text)
RETURNS void AS $$
BEGIN
INSERT INTO users(name, email) VALUES (name, email);
END;
$$ LANGUAGE plpgsql;調用:
SELECT add_user('Bob', 'bob@example.com');二十六、JSON 與全文搜索
1. JSON 數(shù)據(jù)類型
CREATE TABLE orders (
id serial PRIMARY KEY,
info jsonb
);
INSERT INTO orders(info) VALUES ('{"customer": "Tom", "items": ["apple", "banana"]}');
SELECT info->>'customer' FROM orders;2. 全文搜索
CREATE TABLE docs (id serial PRIMARY KEY, content text);
INSERT INTO docs(content) VALUES ('PostgreSQL is a powerful database system.');
SELECT * FROM docs WHERE to_tsvector('english', content) @@ to_tsquery('powerful & database');二十七、常用運維腳本
1. 清理無用連接
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE state = 'idle' AND pid <> pg_backend_pid();
2. 自動重建索引
REINDEX TABLE users;
3. 檢查表膨脹
SELECT relname, n_dead_tup FROM pg_stat_user_tables WHERE n_dead_tup > 1000;
二十八、故障處理方法
1. 數(shù)據(jù)庫無法啟動
- 檢查日志文件(默認在
pg_log目錄) - 檢查磁盤空間、配置文件語法
- 使用
pg_resetwal修復 WAL 日志損壞
2. 數(shù)據(jù)丟失恢復
- 立即停止服務,備份現(xiàn)有數(shù)據(jù)目錄
- 通過備份文件和 WAL 日志恢復
3. 鎖表導致阻塞
- 查詢阻塞 SQL
- 殺死阻塞進程(注意數(shù)據(jù)一致性)
二十九、集群與分布式方案
1. 主從復制(同步/異步)
見前文說明。
2. 讀寫分離
- 主庫寫,從庫讀
- 應用層或中間件(如 Pgpool-II)實現(xiàn)
3. 分布式擴展
- Citus:PostgreSQL 分布式擴展插件,適合大數(shù)據(jù)分表分庫
- Greenplum:基于 PostgreSQL 的分布式數(shù)據(jù)倉庫
4. 高可用
- Patroni:自動化主從切換、故障恢復
- Keepalived + VIP:實現(xiàn)數(shù)據(jù)庫虛擬 IP 高可用
三十、PostgreSQL 版本與生命周期
- 官方建議使用長期支持版本(LTS)
- 定期關注 PostgreSQL 官方發(fā)布頁面 獲取安全補丁和新版本信息
結語
PostgreSQL 功能強大,適合各種應用場景。掌握安裝、配置、性能優(yōu)化、擴展、集群與高可用、故障處理等技能,可以讓你輕松應對生產環(huán)境中的各種需求。如果有具體業(yè)務場景、報錯信息或者深入某一模塊的需求,歡迎繼續(xù)追問!
到此這篇關于PostgreSQL 安裝部署及配置使用教程的文章就介紹到這了,更多相關PostgreSQL 安裝使用內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
基于PostgreSQL和mysql數(shù)據(jù)類型對比兼容
這篇文章主要介紹了基于PostgreSQL和mysql數(shù)據(jù)類型對比兼容,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12
postgresql 實現(xiàn)取出分組中最大的幾條數(shù)據(jù)
這篇文章主要介紹了postgresql 實現(xiàn)取出分組中最大的幾條數(shù)據(jù),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01
從原理到實戰(zhàn)詳解PostgreSQL如何進行性能優(yōu)化
PostgreSQL作為成熟的開源關系型數(shù)據(jù)庫,以其豐富的特性和高擴展性受到廣泛青睞,但如果不對其內部原理與配置參數(shù)進行深入理解并合理調優(yōu),往往難以發(fā)揮其最佳性能,本文我們就來看看PostgreSQL性能優(yōu)化的相關技巧吧2025-07-07

