PostgreSQL 系統管理函數詳解
PostgreSQL 提供了一系列強大的系統管理函數,用于數據庫維護、監控和配置。這些函數可分為多個類別,以下是主要功能的詳細說明:
一、數據庫配置函數
1. 參數管理函數
-- 查看所有配置參數
SELECT name, setting, unit, context FROM pg_settings;-- 動態修改參數(無需重啟)
SELECT set_config('log_min_duration_statement', '1000', false);-- 重置參數為默認值
SELECT reset_config('work_mem');
2. 配置文件操作
-- 重載配置文件(等效于pg_ctl reload)
SELECT pg_reload_conf();-- 查看配置文件位置
SELECT pg_current_logfile(), pg_conf_load_time();
二、維護與清理函數
1. VACUUM 相關函數
-- 執行VACUUM(非FULL模式)
SELECT pg_stat_reset();
VACUUM (VERBOSE, ANALYZE) customers;-- 僅收集統計信息(不清理死元組)
VACUUM (ANALYZE, SKIP_LOCKED) orders;-- 查看需要VACUUM的表
SELECT schemaname, relname, n_dead_tup
FROM pg_stat_user_tables
WHERE n_dead_tup > 0
ORDER BY n_dead_tup DESC;
2. 凍結事務ID管理
-- 檢查事務ID年齡
SELECT datname, age(datfrozenxid) FROM pg_database;-- 手動推進凍結事務ID
VACUUM FREEZE customers;-- 緊急凍結(避免事務ID回卷)
SELECT pg_emergency_freeze('my_table');
三、備份與恢復函數
1. 基礎備份控制
-- 開始備份模式
SELECT pg_start_backup('nightly_backup', true, false);-- 結束備份模式
SELECT pg_stop_backup(false, true);-- 檢查備份進度
SELECT * FROM pg_stat_progress_basebackup;
2. 時間點恢復(PITR)
-- 創建還原點
SELECT pg_create_restore_point('before_major_update');-- 查看WAL信息
SELECT pg_current_wal_lsn(), pg_walfile_name_offset(pg_current_wal_lsn());-- 強制切換WAL文件
SELECT pg_switch_wal();
四、監控與統計函數
1. 統計信息收集
-- 重置統計計數器
SELECT pg_stat_reset();
SELECT pg_stat_reset_shared('bgwriter');-- 獲取后臺寫入器統計
SELECT * FROM pg_stat_get_bgwriter_stats();-- 用戶自定義統計
SELECT pg_stat_get_activity(pg_backend_pid());
2. 會話管理
-- 查看活動會話
SELECT pid, usename, application_name, state
FROM pg_stat_activity;-- 終止會話
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE application_name = 'problem_app';-- 取消長時間運行的查詢
SELECT pg_cancel_backend(pid)
FROM pg_stat_activity
WHERE state = 'active' AND now() - query_start > interval '5 minutes';
五、擴展與插件管理
1. 擴展操作函數
-- 創建擴展
SELECT pg_available_extensions();
CREATE EXTENSION pg_stat_statements;-- 更新擴展
ALTER EXTENSION pg_partman UPDATE;-- 查看擴展依賴
SELECT * FROM pg_extension_dependencies();
2. 插件控制
-- 加載共享庫(需超級用戶)
LOAD 'auto_explain';-- 查看已加載庫
SELECT * FROM pg_loaded_libraries();
六、存儲與文件管理
1. 表空間操作
-- 創建表空間
SELECT pg_tablespace_location(oid), * FROM pg_tablespace;-- 檢查表空間使用情況
SELECT pg_tablespace_size('fast_ssd');
2. 大對象管理
-- 創建大對象
SELECT lo_create(0);-- 導入文件為大對象
SELECT lo_import('/path/to/file.pdf');-- 導出大對象到文件
SELECT lo_export(oid, '/path/to/output.pdf') FROM pg_largeobject_metadata;
七、復制與高可用
1. 流復制控制
-- 查看復制狀態
SELECT * FROM pg_stat_replication;-- 提升備庫為主庫
SELECT pg_promote(true, 60);-- 創建物理復制槽
SELECT * FROM pg_create_physical_replication_slot('standby1_slot');
2. 邏輯復制
-- 創建邏輯復制槽
SELECT * FROM pg_create_logical_replication_slot('inventory_slot', 'pgoutput'
);-- 解碼WAL變更
SELECT * FROM pg_logical_slot_get_changes('inventory_slot',NULL,NULL
);
八、安全相關函數
1. 加密函數
-- 密碼哈希
SELECT crypt('mypassword', gen_salt('bf', 8));-- 數據加密
SELECT pgp_sym_encrypt('secret data', 'aes_key');-- 查看密碼哈希算法
SELECT * FROM pg_password_hash_algorithms();
2. 權限檢查
-- 檢查表權限
SELECT has_table_privilege('user1', 'customers', 'INSERT');-- 查看角色權限
SELECT * FROM pg_roles WHERE rolname = 'admin';-- 授予默認權限
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT ON TABLES TO readonly_role;
九、實用工具函數
1. 系統信息
-- 獲取PostgreSQL版本
SELECT version();-- 查看編譯選項
SELECT pg_config();-- 服務器啟動時間
SELECT pg_postmaster_start_time();
2. 性能診斷
-- 查看鎖等待
SELECT * FROM pg_lock_waits();-- 獲取當前執行的查詢計劃
SELECT pg_stat_get_backend_activity(pid)
FROM pg_stat_activity
WHERE state = 'active';-- 生成隨機數據
SELECT generate_series(1,100), md5(random()::text);
十、最佳實踐示例
1. 自動化維護腳本
-- 每周維護腳本
DO $$
BEGIN-- 分析所有用戶表EXECUTE format('ANALYZE %I', string_agg(table_schema||'.'||table_name, ', '))FROM information_schema.tablesWHERE table_schema NOT IN ('pg_catalog', 'information_schema');-- 清理碎片嚴重的表PERFORM vacuum_full_ratio(schemaname, relname, 0.3 -- 碎片率閾值) FROM pg_stat_user_tablesWHERE n_dead_tup > 1000;-- 記錄維護日志INSERT INTO maintenance_log VALUES (now(), 'Weekly maintenance completed');
END $$;
2. 緊急情況處理
-- 事務ID回卷緊急處理
DO $$
DECLAREdb record;
BEGINFOR db IN SELECT datname FROM pg_database WHERE datname NOT IN ('template0', 'template1')LOOPEXECUTE format('VACUUM FREEZE %I', db.datname);RAISE NOTICE 'Frozen database: %', db.datname;END LOOP;
END $$;
PostgreSQL 的系統管理函數提供了對數據庫各個方面的精細控制,合理使用這些函數可以顯著簡化管理工作。對于生產環境,建議:
- 將常用管理操作封裝為PL/pgSQL函數
- 通過pgAgent或cron設置定期維護任務
- 在執行破壞性操作前創建還原點
- 結合監控系統使用統計函數進行性能分析