日志概述
PG有三種日志pg_log、pg_xlog、pg_clog
pg_log:系統(tǒng)運行日志,里面記錄了慢sql,以及數(shù)據(jù)庫的運行日志,報錯信息等等,MogDB存放在$DATA_DIR/log/pg_log中,如果數(shù)據(jù)庫啟動失敗、運行過程中失敗都會記錄到這個日志中。
pg_xlog:記錄的是redo日志,redo日志是數(shù)據(jù)庫中比較重要的日志,用戶數(shù)據(jù)恢復(fù)前滾操作,MogDB默認存放在$DATA_DIR/data/中,默認是開啟的。
pg_clog:記錄數(shù)據(jù)庫的事務(wù)提交信息MogDB默認存放在$DATA_DIR/data/中,默認是開啟的。
但是查看Mogdb的日志目錄還有一下幾個目錄
日志目錄介紹
/log/bin | 記錄了Mogdb服務(wù)端工具調(diào)用數(shù)據(jù)庫產(chǎn)生的日志 |
/log/sql_monitor | 慢sql日志 |
/log/om | 記錄了gs_om的日志以及本地的控制日志 |
/log/pg_audit | 審計日志 |
/log/gs_profile | 性能日志數(shù)據(jù)庫系統(tǒng)在運行時檢測物理資源的運行狀態(tài)的日志 |
/log/asp_data | 應(yīng)該是與快照和樣本有關(guān)的路徑,具體還不太清楚 |
目錄中dn_6001或者dn_6002中的數(shù)字表示節(jié)點編號,可以通過gs_om -t query查看。
與日志相關(guān)的參數(shù)
1)日志參數(shù)列表
參數(shù)名稱 | 含義 |
log_directory | MogDB運行日志路徑 |
log_filename | MogDB運行日志格式 |
query_log_directory | Sql執(zhí)行日志路徑 |
query_log_file | sql日志文件格式 |
log_max_size | 控制日志最大存儲值 |
log_max_count | 硬盤上可存儲的最多日志數(shù)量。 |
log_saved_days | 日志保存的天數(shù)。 |
enable_slow_query_log | 是否開啟慢日志 |
wal_keep_segments | xlog保留的最小日志個數(shù) |
wal_level | 寫入WAL信息量的級別 |
wal_segment_size | WAL日志段文件的大小默認是16M |
log_statement | 記錄到日志中的sql格式,會記錄到運行日志中,不建議開啟,如果設(shè)置為all會導(dǎo)致運行日志非常大,并且會忽略掉 log_min_duration_statement,跟蹤所有的sql語句 |
log_rotation_age | 多長時間創(chuàng)建新的文件記錄日志,分鐘 |
log_rotation_size | 文件多大后創(chuàng)建新的文件記錄日志,kb |
log_truncate_on_rotation | 可重用同名日志文件 |
- 查看參數(shù)
以上都屬于GUC參數(shù),GUC參數(shù)主要是存儲在(“postgresql.conf”、“pg_hba.conf”)配置文件中建議使用gs_guc命令修改參數(shù)值。
查看所有節(jié)點參數(shù)命令
gs_guc check -N all -D /opt/mogdb/data/data -c "log_filename" |
或者使用
gs_guc check -N all -I all -c "log_filename" |
-N all表示所有節(jié)點
-D 表示數(shù)據(jù)文件路徑
-I 表示instance_id
Instance_id和node_id可以通過一下命令查看
gs_om -t status --all |
3)修改guc參數(shù)
gs_guc set -N all -I all -c "log_filename='pgtest-%Y-%m-%d_%H%M%S.log'" |
或
gs_guc reload -N all -I all -c "log_filename='pgtest-%Y-%m-%d_%H%M%S.log'" |
歸檔日志
日志歸檔主要是針對xlog日志而言,數(shù)據(jù)庫在熱備份的時候,歸檔日志做為備份的一部分,可以讓數(shù)據(jù)庫恢復(fù)到數(shù)據(jù)庫損壞之前,或者指定時間點恢復(fù),指定歸檔日志以后,在線wal日志在輪轉(zhuǎn)重用wal文件之前,要先把wal歸檔,然后在覆蓋重寫。
1)查看當前歸檔模式
方式一:登錄MogDB數(shù)據(jù)庫查看
db_mogdb=> show archive_mode; |
方式二:使用gs_guc命令查看
[omm@pkt_mogdb1 gs_guc]$ gs_guc check -N all -I all -c "archive_mode" |
2)打開歸檔模式
[omm@pkt_mogdb1 gs_guc]$ gs_guc reload -N all -I all -c "archive_mode=on" |
3)修改歸檔日志路徑
mkdir -p /opt/mogdb/data/archivelog gs_guc reload -N all -I all -c "archive_dest='/opt/mogdb/data/archivelog'" |
慢SQL診斷
與慢sql相關(guān)的參數(shù):
track_stmt_stat_level:
格式是【fullsql,slowsql】,取值范圍是OFF,L0,L1,L2,fullsql表明是否記錄所有的sql語句,不建議開啟,除非是在某一個時間段執(zhí)行診斷的時候可以臨時打開。L0只記錄sql,L1記錄sql+執(zhí)行計劃、L3記錄sql+執(zhí)行計劃+鎖信息。默認值是OFF,L0,表示不記錄所有sql,只記錄慢sql的sql語句。
log_min_duration_statement:
sql執(zhí)行時間超過這個值(毫秒)會記錄為慢sql。默認1800000毫秒,30分鐘才定義為慢sql在OLTP類系統(tǒng)中顯然是不可能的,方便測試,我修改成了10秒。
[omm@pkt_mogdb1 ~]$ gs_guc reload -N all -I all -c "log_min_duration_statement=10000"; |
或者
[omm@pkt_mogdb1 ~]$ gs_guc set -N all -I all -c "log_min_duration_statement=10000"; |
或者
ALTER DATABASE zkh SET log_min_duration_statement TO 10000; |
其他參數(shù):
enable_stmt_track | 開啟sql收集 |
track_stmt_details_size | 單條Sql收集最大字節(jié) |
track_stmt_parameter | 是否開啟收集sql中的參數(shù) |
track_stmt_retention_time | 歷史sql保留時間 |
track_stmt_session_slot | 最多可以收集多少條sql |
query_log_directory | 慢sql日志地址 |
query_log_file | 慢sql日志文件格式 |
與慢sql相關(guān)的系統(tǒng)表
STATEMENT_HISTORY:
獲得當前節(jié)點的執(zhí)行語句的信息。查詢系統(tǒng)表必須具有sysadmin權(quán)限。只可在系統(tǒng)庫postgres中查詢到結(jié)果,用戶庫中無法查詢并且必須配置上面兩個參數(shù)。
與慢sql相關(guān)的日志
$DATA_DIR/log/sql_monitor/dn_N
慢sql測試:
在上一個筆記中我使用MTK導(dǎo)入了一個600多萬的表
select count(*) from db_mysql.dump_tables_mysql dtm ; |
這條sql執(zhí)行了13秒,檢查一下慢查詢表,連接到postgres數(shù)據(jù)庫
創(chuàng)建角色,并且給zkh用戶賦權(quán)
CREATE ROLE manager IDENTIFIED BY 'Zkh12345678'; GRANT USAGE ON SCHEMA dbe_perf to zkh; |
使用用戶zkh登錄postgres數(shù)據(jù)庫查詢STATEMENT_HISTORY
gsql -U zkh -W Zkh12345678 -d postgres select * from dbe_perf.get_global_slow_sql_by_timestamp('2022-08-15 20:40:21', '2022-08-15 21:51:21'); |
查詢STATEMENT_HISTORY和 dbe_perf.get_global_slow_sql_by_timestamp結(jié)果都為空。。。。。。
數(shù)據(jù)庫重啟之后還是如此,看來不是參數(shù)問題導(dǎo)致的,因為log_min_duration_statement這個參數(shù)是superuser,按理說是實時生效的,不需要重啟。
已經(jīng)在https://gitee.com/enmotech/mogdb-docs/issues/I5MGMR?from=project-issue和
http://www.sunline.cc/issue/16084提交問題。后續(xù)跟蹤。
感謝墨天輪高云龍老師幫忙解答了問題,原來是因為參數(shù)enable_resource_track沒有打開,這個參數(shù)的含義是是否啟用跟蹤統(tǒng)計。
GUC參數(shù)補充
結(jié)合官方中的GUC參數(shù)級別,查詢pg_settings表中的context分類,不同的分類支持不同的修改方式
select distinct context from pg_settings;
參數(shù)級別 | 說明 | 設(shè)置方式和備注 |
INTERNAL | 固定參數(shù) | 無 |
POSTMASTER | 數(shù)據(jù)庫服務(wù)端參數(shù),在數(shù)據(jù)庫啟動時確定,可以通過配置文件指定 | 1、gs_guc set 2、MogDB=# ALTER SYSTEM SET paraname TO value; 重啟后生效 |
SIGHUP | 數(shù)據(jù)庫全局參數(shù),可在數(shù)據(jù)庫啟動時設(shè)置或者在數(shù)據(jù)庫啟動后,發(fā)送指令重新加載。 | 1、gs_guc set 2、gs_guc reload 3、MogDB=# ALTER SYSTEM SET paraname TO value; 不需要重啟 |
BACKEND | 會話連接參數(shù)。在創(chuàng)建會話連接時指定,連接建立后無法修改。連接斷掉后參數(shù)失效 | 1、gs_guc set 2、gs_guc reload 3、MogDB=# ALTER SYSTEM SET paraname TO value; 不需要重啟,當前會話無效,新連接的會話生效 |
USER | 普通用戶參數(shù)??杀蝗魏斡脩粼谌魏螘r刻設(shè)置 | 1、gs_guc set 2、gs_guc reload 3、三個級別數(shù)據(jù)庫、用戶、會話: ALTER DATABASE dbname SET paraname TO value; ALTER USER username SET paraname TO value; 當前會話生效 MogDB=# SET paraname TO value; |
superuser | 數(shù)據(jù)庫管理員參數(shù)。可在數(shù)據(jù)庫啟動時、數(shù)據(jù)庫啟動后或者數(shù)據(jù)庫管理員通過SQL進行設(shè)置 | 同user級別的參數(shù) |
注意:參數(shù)的生效優(yōu)先級是 session>user>dbname>postgres




