日誌審計 sql
審計是值記錄用戶的登錄退出以及登錄後在數據庫裏的行爲操做,能夠根據安全等級不同設置不同級別的審計, 數據庫
此處涉及的參數文件有:安全
logging_collector --是否開啓日誌收集開關,默認off,開啓要重啓DB網絡
log_destination --日誌記錄類型,默認是stderr,只記錄錯誤輸出session
log_directory --日誌路徑,默認是$PGDATA/pg_log, 這個目錄最好不要和數據文件的目錄放在一塊兒, 目錄須要給啓動postgres的操做系統用戶寫權限.post
log_filename --日誌名稱,默認是postgresql-%Y-%m-%d_%H%M%S.log性能
log_file_mode --日誌文件類型,默認爲0600spa
log_truncate_on_rotation --默認爲off,設置爲on的話,若是新建了一個同名的日誌文件,則會清空原來的文件,再寫入日誌,而不是在後面附加。操作系統
log_rotation_age --保留單個文件的最大時長,默認是1d,也有1h,1min,1s,我的以爲不實用插件
log_rotation_size --保留單個文件的最大尺寸,默認是10MB
log_error_verbosity --默認爲default,verbose表示冗長的
log_connections --用戶session登錄時是否寫入日誌,默認off
log_disconnections --用戶session退出時是否寫入日誌,默認off
【推薦的日誌配置】
logging_collector = on
log_destination = 'csvlog'
log_truncate_on_rotation = on
log_connections = off
log_disconnections = off
log_error_verbosity = verbose
log_statement = ddl
log_min_duration_statement = 60s
log_checkpoints = on
log_lock_waits = on
deadlock_timeout = 1s
1.記錄級別:
記錄用戶登錄數據庫後的各類操做,postgres日誌裏分紅了3類,經過參數pg_statement來控制,默認的pg_statement參數值是none,即不記錄,能夠設置ddl(記錄create,drop和alter)、mod(記錄ddl+insert,delete,update和truncate)和all(mod+select)。
log_statement = ddl
通常的OLTP系統審計級別設置爲ddl就夠了,由於記錄輸出各類SQL對性能的影響仍是蠻大的,安全級別高一點的也能夠設置mod模式,有條件也能夠不在數據庫層面作,而是購買設備放在網絡層監控解析。
若是這裏設置爲none,在 log_min_duration_statement設置爲60s,那麼log_min_duration_statement也會生效,將執行時間超過60s的SQL打印到日誌。
按不一樣狀況進行配置審計級別:
1)審計用戶hm連到數據庫hm 的全部SQL.
alter role hm in database hm set log_statement='all';
2) 審計用戶hm 的全部SQL.
alter role hm set log_statement='all';
3) 審計任何用戶鏈接到數據庫hm 的全部SQL.
alter database hm set log_statement='all';
2.定位慢查詢SQL
能夠設置必定時長的參數(log_min_duration_statement),來記錄超過該時長的全部SQL,對找出當前數據庫的慢查詢頗有效。 好比log_min_duration_statement = 2s,記錄超過2秒的SQL,改完須要reload
log_min_duration_statement = 2s
3.監控數據庫的checkpoint
當數據庫進行一項大更新操做時,若是參數設置不當,會在日誌裏留下大量的告警信息,頻繁的作checkpoint會致使系統變慢,不用設置都會有。
可是不會記錄系統正常的checkpoint,若是你想看系統一天之類發生了多少次checkpoint,以及每次checkpoint的一些詳細信息,好比buffer,sync等,就能夠經過設置log_checkpoints,該參數默認值是off。
log_checkpoints = on
4.監控數據庫的鎖
數據庫的鎖一般能夠在pg_locks這個系統表裏找,但這只是當前的鎖表/行信息,若是你想看一天內有多少個超過死鎖時間的鎖發生,能夠在日誌裏設置並查看,log_lock_waits 默認是off,能夠設置開啓。這個能夠區分SQL慢是資源緊張仍是鎖等待的問題。
log_lock_waits=on
deadlock_timeout=1
還有一些Debug功能,適合修改源碼調試,通常的的系統上並不須要,暫時比較關注的就這些。
5.能夠在表上設置觸發器,來審計
6.可使用插件pg_log_userqueries 來作,沒有必要
【注意事項】
1. 超級用戶能夠修改這些配置項, 因此被審計的用戶最好是普通用戶. 不然用戶連上來能夠修改這些審計項.
2. 程序用的數據庫帳號和我的用的數據庫帳號分開, 對於程序用的數據庫帳號能夠只審計DDL操做, 而對於我的使用的數據庫帳號, 建議審計全部的SQL.
3. 變量優先級(事務>會話>database/role>啓動參數>配置文件)
某些全局變量能夠動態修改,例如本文提到的log_statement。修改後reload以後,全部會話都會讀到最新的變量