無法連接數據庫是最常見的故障之一,需依次檢查以下環節:
sudo iptables -L -n
查看防火墻規則,確認5432端口(PostgreSQL默認端口)是否開放;若未開放,使用sudo ufw allow 5432
開放端口。systemctl status postgresql
查看服務是否運行;若未啟動,使用systemctl start postgresql
啟動服務。postgresql.conf
(通常位于/etc/postgresql/<version>/main/
)中的listen_addresses
參數,確保允許遠程連接(如設置為*
表示允許所有IP);同時檢查pg_hba.conf
文件,確認有正確的客戶端訪問控制條目(如host all all 0.0.0.0/0 md5
允許所有IP通過密碼認證)。telnet <服務器IP> 5432
或nc -zv <服務器IP> 5432
測試端口是否可達。日志是故障排查的核心依據,PostgreSQL日志通常位于/var/log/postgresql/
目錄(如postgresql-<version>-main.log
)。
sudo tail -f /var/log/postgresql/postgresql-<version>-main.log
跟蹤最新日志,快速定位錯誤信息(如連接拒絕、查詢超時等)。grep
命令篩選關鍵錯誤,例如grep "ERROR" /var/log/postgresql/postgresql-<version>-main.log
查看所有錯誤條目。pgBadger
生成可視化報告(如慢查詢、連接統計),安裝命令為sudo apt-get install pgbadger
,分析命令為pgbadger -d /var/log/postgresql/ -o report.html
(生成HTML格式報告)。查詢慢是性能問題的主要表現,可通過以下工具和方法定位:
EXPLAIN
關鍵字(如EXPLAIN SELECT * FROM users WHERE age > 30;
),查看執行計劃。若出現“Seq Scan”(全表掃描),需為相關字段創建索引(如CREATE INDEX idx_age ON users(age);
)。ANALYZE
命令更新表統計信息,幫助查詢優化器選擇更優的執行計劃。pg_stat_statements
擴展(在postgresql.conf
中設置shared_preload_libraries = 'pg_stat_statements'
并重啟服務),通過SELECT * FROM pg_stat_statements ORDER BY total_time DESC LIMIT 10;
查看耗時最長的查詢,針對性優化。磁盤空間不足會導致數據庫崩潰或性能下降,常見原因及解決方法:
pg_wal
,默認位于數據目錄下),若占用過高,可使用pg_archivecleanup
清理過期日志(如sudo pg_archivecleanup /var/lib/postgresql/<version>/main/pg_wal 0000000100000032000000A1
,保留指定日志文件)。SELECT * FROM pg_replication_slots;
查看復制槽狀態,使用SELECT pg_drop_replication_slot('slot_name');
刪除廢棄槽。postgresql.conf
中的max_wal_size
(如設置為20GB)、min_wal_size
(如5GB)、checkpoint_timeout
(如30分鐘)等參數,延長檢查點間隔,減少WAL日志生成頻率。內存泄漏或資源不足會導致數據庫周期性重啟(OOM)或響應緩慢:
pg_top
命令監控PostgreSQL進程的內存使用情況,找出內存占用持續增長的進程。work_mem
(排序、哈希操作的內存分配,如設置為4MB)、maintenance_work_mem
(維護操作的內存,如設置為64MB)等參數,避免內存過度消耗。死鎖會導致事務相互等待,無法繼續執行:
SELECT * FROM pg_locks;
查看當前鎖狀態,識別相互等待的事務。SELECT pg_cancel_backend(<pid>);
取消阻塞事務的進程,或使用SELECT pg_terminate_backend(<pid>);
終止進程(謹慎使用,避免數據丟失)。配置不當會導致連接失敗、性能低下等問題:
postgresql.conf
中的listen_addresses
設置為*
(允許所有IP)或指定允許的IP段(如192.168.1.0/24
)。max_connections
(如設置為100),避免過多連接導致內存耗盡。shared_buffers
(如設置為物理內存的25%,如8GB內存設置為2GB),提高緩存命中率。定期維護是保持數據庫高性能的關鍵:
VACUUM
清理表中的死元組(如VACUUM VERBOSE users;
),釋放空間;對于頻繁更新的表,使用VACUUM FULL
(需鎖表,建議在低峰期執行)。ANALYZE
更新表統計信息(如ANALYZE VERBOSE users;
),幫助優化器選擇最優查詢計劃。REINDEX
重建索引(如REINDEX TABLE users;
),修復索引碎片;使用pg_repack
壓縮表(如pg_repack -t users
),減少表占用空間。