日志概述
PG有三种日志pg_log、pg_xlog、pg_clog
pg_log:系统运行日志,里面记录了慢sql,以及数据库的运行日志,报错信息等等,MogDB存放在$DATA_DIR/log/pg_log中,如果数据库启动失败、运行过程中失败都会记录到这个日志中。
pg_xlog:记录的是redo日志,redo日志是数据库中比较重要的日志,用户数据恢复前滚操作,MogDB默认存放在$DATA_DIR/data/中,默认是开启的。
pg_clog:记录数据库的事务提交信息MogDB默认存放在$DATA_DIR/data/中,默认是开启的。
但是查看Mogdb的日志目录还有一下几个目录
日志目录介绍
/log/bin | 记录了Mogdb服务端工具调用数据库产生的日志 |
/log/sql_monitor | 慢sql日志 |
/log/om | 记录了gs_om的日志以及本地的控制日志 |
/log/pg_audit | 审计日志 |
/log/gs_profile | 性能日志数据库系统在运行时检测物理资源的运行状态的日志 |
/log/asp_data | 应该是与快照和样本有关的路径,具体还不太清楚 |
目录中dn_6001或者dn_6002中的数字表示节点编号,可以通过gs_om -t query查看。
与日志相关的参数
1)日志参数列表
参数名称 | 含义 |
log_directory | MogDB运行日志路径 |
log_filename | MogDB运行日志格式 |
query_log_directory | Sql执行日志路径 |
query_log_file | sql日志文件格式 |
log_max_size | 控制日志最大存储值 |
log_max_count | 硬盘上可存储的最多日志数量。 |
log_saved_days | 日志保存的天数。 |
enable_slow_query_log | 是否开启慢日志 |
wal_keep_segments | xlog保留的最小日志个数 |
wal_level | 写入WAL信息量的级别 |
wal_segment_size | WAL日志段文件的大小默认是16M |
log_statement | 记录到日志中的sql格式,会记录到运行日志中,不建议开启,如果设置为all会导致运行日志非常大,并且会忽略掉 log_min_duration_statement,跟踪所有的sql语句 |
log_rotation_age | 多长时间创建新的文件记录日志,分钟 |
log_rotation_size | 文件多大后创建新的文件记录日志,kb |
log_truncate_on_rotation | 可重用同名日志文件 |
- 查看参数
以上都属于GUC参数,GUC参数主要是存储在(“postgresql.conf”、“pg_hba.conf”)配置文件中建议使用gs_guc命令修改参数值。
查看所有节点参数命令
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表示所有节点
-D 表示数据文件路径
-I 表示instance_id
Instance_id和node_id可以通过一下命令查看
gs_om -t status --all |
3)修改guc参数
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日志而言,数据库在热备份的时候,归档日志做为备份的一部分,可以让数据库恢复到数据库损坏之前,或者指定时间点恢复,指定归档日志以后,在线wal日志在轮转重用wal文件之前,要先把wal归档,然后在覆盖重写。
1)查看当前归档模式
方式一:登录MogDB数据库查看
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相关的参数:
track_stmt_stat_level:
格式是【fullsql,slowsql】,取值范围是OFF,L0,L1,L2,fullsql表明是否记录所有的sql语句,不建议开启,除非是在某一个时间段执行诊断的时候可以临时打开。L0只记录sql,L1记录sql+执行计划、L3记录sql+执行计划+锁信息。默认值是OFF,L0,表示不记录所有sql,只记录慢sql的sql语句。
log_min_duration_statement:
sql执行时间超过这个值(毫秒)会记录为慢sql。默认1800000毫秒,30分钟才定义为慢sql在OLTP类系统中显然是不可能的,方便测试,我修改成了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; |
其他参数:
enable_stmt_track | 开启sql收集 |
track_stmt_details_size | 单条Sql收集最大字节 |
track_stmt_parameter | 是否开启收集sql中的参数 |
track_stmt_retention_time | 历史sql保留时间 |
track_stmt_session_slot | 最多可以收集多少条sql |
query_log_directory | 慢sql日志地址 |
query_log_file | 慢sql日志文件格式 |
与慢sql相关的系统表
STATEMENT_HISTORY:
获得当前节点的执行语句的信息。查询系统表必须具有sysadmin权限。只可在系统库postgres中查询到结果,用户库中无法查询并且必须配置上面两个参数。
与慢sql相关的日志
$DATA_DIR/log/sql_monitor/dn_N
慢sql测试:
在上一个笔记中我使用MTK导入了一个600多万的表
select count(*) from db_mysql.dump_tables_mysql dtm ; |
这条sql执行了13秒,检查一下慢查询表,连接到postgres数据库
创建角色,并且给zkh用户赋权
CREATE ROLE manager IDENTIFIED BY 'Zkh12345678'; GRANT USAGE ON SCHEMA dbe_perf to zkh; |
使用用户zkh登录postgres数据库查询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结果都为空。。。。。。
数据库重启之后还是如此,看来不是参数问题导致的,因为log_min_duration_statement这个参数是superuser,按理说是实时生效的,不需要重启。
已经在https://gitee.com/enmotech/mogdb-docs/issues/I5MGMR?from=project-issue和
https://www.modb.pro/issue/16084提交问题。后续跟踪。
感谢墨天轮高云龙老师帮忙解答了问题,原来是因为参数enable_resource_track没有打开,这个参数的含义是是否启用跟踪统计。
GUC参数补充
结合官方中的GUC参数级别,查询pg_settings表中的context分类,不同的分类支持不同的修改方式
select distinct context from pg_settings;
参数级别 | 说明 | 设置方式和备注 |
INTERNAL | 固定参数 | 无 |
POSTMASTER | 数据库服务端参数,在数据库启动时确定,可以通过配置文件指定 | 1、gs_guc set 2、MogDB=# ALTER SYSTEM SET paraname TO value; 重启后生效 |
SIGHUP | 数据库全局参数,可在数据库启动时设置或者在数据库启动后,发送指令重新加载。 | 1、gs_guc set 2、gs_guc reload 3、MogDB=# ALTER SYSTEM SET paraname TO value; 不需要重启 |
BACKEND | 会话连接参数。在创建会话连接时指定,连接建立后无法修改。连接断掉后参数失效 | 1、gs_guc set 2、gs_guc reload 3、MogDB=# ALTER SYSTEM SET paraname TO value; 不需要重启,当前会话无效,新连接的会话生效 |
USER | 普通用户参数。可被任何用户在任何时刻设置 | 1、gs_guc set 2、gs_guc reload 3、三个级别数据库、用户、会话: ALTER DATABASE dbname SET paraname TO value; ALTER USER username SET paraname TO value; 当前会话生效 MogDB=# SET paraname TO value; |
superuser | 数据库管理员参数。可在数据库启动时、数据库启动后或者数据库管理员通过SQL进行设置 | 同user级别的参数 |
注意:参数的生效优先级是 session>user>dbname>postgres