【Greebplum】日志管理

日志架构

日志路径

路径 描述
/home/gpadmin/gpadminlogs/* 很多不同种类的日志文件,每台服务器都有的目录
/home/gpadmin/gpadminlogs/gpstart_%Y%m%d.log 启动日志
/home/gpadmin/gpadminlogs/gpstop_%Y%m%d.log 停止日志
/home/gpadmin/gpadminlogs/gpsegstart.py_idb*gpadmin_%Y%m%d.log Segment启动日志
/home/gpadmin/gpadminlogs/gpsegstop.py_idb*gpadmin_%Y%m%d.log Segment停止日志
${GPDATA_HOME}/master/gpseg-1/pg_log/startup.log 实例启动日志
${GPDATA_HOME}/master/gpseg-1/gpperfmon/logs/gpmon.*.log gpperfmon日志
${GPDATA_HOME}/mirror/gpseg1/pg_log/*.csv 镜像Segment日志
${GPDATA_HOME}/primary/gpseg2/pg_log/*.csv 主Segment日志
/home/log/messages 全局Linux系统消息

日志文件格式

  • 服务器日志文件被写为逗号分隔值(CSV)格式。

  • 不是所有的日志项在所有的日志域中都有值,例如,只有与查询工作者进程相关的日志项才会有slice_id值。

  • 一个特定查询的相关日志项可以通过其会话标识符(gp_session_id)和命令标识符(gp_command_count)确定。

序号 域名 数据类型 描述
1 event_time timestamp with time zone 日志项被写到日志中的时间
2 user_name varchar(100) 数据库用户名
3 database_name varchar(100) 数据库名
4 process_id varchar(10) 系统进程ID(带前缀“p”)
5 thread_id varchar(50) 线程计数(带前缀“th”)
6 remote_host varchar(100) 在Master上,是客户端机器的主机名/地址。在Segment上,是Master的主机名/地址。
7 remote_port varchar(10) Segment或Master的端口号
8 session_start_time timestamp with time zone 会话连接打开的时间
9 transaction_id int Master上的顶层事务ID。这个ID是任何子事务的父亲。
10 gp_session_id text 会话标识符号(带前缀“con”)
11 gp_command_count text 会话内部的命令编号(带前缀“cmd”)
12 gp_segment text Segment内容标识符(对主Segment带前缀“seg”,镜像Segment带前缀“mir”)。Master的内容id总是-1。
13 slice_id text 切片id(查询计划被执行的部分)
14 distr_tranx_id text 分布式事务ID
15 local_tranx_id text 本地事务ID
16 sub_tranx_id text 子事务ID
17 event_severity varchar(10) 值包括:LOG、ERROR、FATAL、PANIC、DEBUG1、DEBUG2
18 sql_state_code varchar(10) 与日志消息相关的SQL状态代码
19 event_message text 日志或者错误消息文本
20 event_detail text 与错误或者警告消息相关的详细消息文本
21 event_hint text 与错误或者警告消息相关的提示消息文本
22 internal_query text 内部产生的查询文本
23 internal_query_pos int 指向内部产生的查询文本中的光标
24 event_context text 产生消息的上下文
25 debug_query_string text 带有完整细节的用户提供的查询字符串,用于调试。这个字符串可能会由于内部使用而修改。
26 error_cursor_pos int 指向查询字符串中的光标
27 func_name text 产生这个消息的函数
28 file_name text 产生消息的内部代码文件
29 file_line int 产生消息的内部代码文件的行号
30 stack_trace text 与这个消息相关的栈跟踪文本

日志说明

pg_log

  • 这个日志一般是记录服务器与DB的状态,比如各种Error信息,定位慢查询SQL,数据库的启动关闭信息,发生checkpoint过于频繁等的告警信息,诸如此类。
  • linux自带的路径一般在/home/log/postgres下面,该日志有.csv格式和.log。前一种一般会按大小和时间自动切割,这种日志可以被清理删除、压缩打包或者转移,不影响DB的正常运行。当有遇到DB无法启动或者更改参数没有生效时,第一个想到的就是查看这个日志。
  • 四类错误级别,FATAL-严重告警,ERROR-错误,WARNING-警告,LOG-操作日志。文本文件查询检索不方便,这些文件是有固定格式,可以采用外部表的方式进行查询,同时可以利用相关的工具进行过滤。
  • 记录各种Error信息,以及服务器与DB的状态信息,可由用户随意更新删除.

pg_xlog

  • 这个日志是记录的Postgresql的WAL信息,是一些事务日志信息(transaction log),默认单个大小是16M,源码安装的时候可以更改其大小。

  • 这些信息名字是类似‘00000001000000000000001A‘这样的文件,这些日志会在定时回滚恢复(PITR),流复制(Replication Stream)以及归档时能被用到。

  • 这些日志记录着数据库发生的各种事务信息,不得随意删除或者移动这类日志文件,不然的数据库会有无法恢复的风险。

  • 当你的归档或者流复制发生异常的时候,事务日志会不断地生成,有可能会造成磁盘空间被塞满,最终导致DB宕机或者无法启动。遇到这种情况可以先关闭归档或者流复制功能,备份pg_xlog日志到其他地方,但不要删除。然后删除较早时间的的pg_xlog,有一定空间后再试着启动Postgres。

pg_clog

  • pg_clog事务日志文件,但与pg_xlog不同的是它记录的是事务的元数据(metadata),
  • 这个日志告诉我们哪些事务完成了,哪些没有完成。
  • 这个日志文件一般非常小,但是重要性也是相当高,不得随意删除或者对其更改信息。

启动和关闭日志

使用gpstart,gpstop 等相关命令的日志,默认位于~/gpAdminLogs目录下

命令方式:<script_name>_.log 日志记录的格式: ::::[INFO|WARN|FATAL]:

日志常用参数和配置方案

常用参数

下面是Greenplum与安全相关的审计(或者日志)服务器配置参数,它们可以在postgresql.conf配置文件中设置:

域名 值范围 默认 描述
log_connections Boolean off 会向服务器日志输出一行,详细说明每个成功的连接。 某些客户端程序(如psql)在确定是否需要密码时尝试连接两次,因此重复的“已接收连接”消息不一定存在问题。
log_disconnections Boolean off 这在客户端会话终止时在服务器日志中输出一行,并包括会话的持续时间。
log_statement NONE,DDL,MOD,ALL ALL 控制记录哪些SQL语句。 DDL记录所有数据定义命令,如CREATE,ALTER和DROP命令。 MOD记录所有DDL语句,以及INSERT,UPDATE,DELETE,TRUNCATE和COPY FROM。 如果包含的命令属于适当的类型,也会记录PREPARE和EXPLAIN ANALYZE语句。
log_hostname Boolean off 默认情况下,连接日志消息仅显示连接主机的IP地址。 打开此选项会导致记录数据库主服务器的IP地址和主机名。 根据主机名解析设置可能会造成不可忽视的性能损失。
log_duration Boolean off 记录满足log_statement的每个已完成语句的持续时间。
log_error_verbosity TERSE,DEFAULT,VERBOSE DEFAULT 控制记录的每条消息在服务器日志中写入的详细信息量。
log_min_duration_statement 毫秒数, 0, -1 -1 如果语句的持续时间大于或等于指定的毫秒数,则将语句及其持续时间记录在单个日志行上。 将此值设置为0将打印所有语句及其持续时间。 -1禁用该功能。 例如,如果将其设置为250,则将记录运行250毫秒或更长时间的所有SQL语句。 启用此选项可用于跟踪应用程序中未优化的查询。
log_min_messages DEBUG5,DEBUG4, DEBUG3,DEBUG2, DEBUG1,INFO, NOTICE,WARNING, LOG,ERROR, FATAL,PANIC NOTICE 控制将哪些消息级别写入服务器日志。 每个级别包括其后的所有级别。 级别越靠后,发送到日志的消息越少。
log_rotation_age 任意有效的时间表达式(数字和单位) 1d 确定数据库将消息写入活动日志文件的时间。 经过这段时间后,文件将关闭并创建一个新的日志文件。 设置为零禁用基于时间的新日志文件创建。
log_statement_stats Boolean off 对于每个查询,将查询解析器,优化器和执行器的总体性能统计信息写入服务器日志。 这是一种原始的分析工具。
log_truncate_on_rotation Boolean off 截断(覆盖)而不是附加到任何现有的同名日志文件。 仅当由于基于时间的旋转而打开新文件时才会发生截断。 例如,将此设置与log_filename(例如gpseg#-%H.log)结合使用将导致生成二十四小时的日志文件,然后循环覆盖它们。 禁用时,将在所有情况下追加预先存在的文件。

配置方案

如下一共三个配置方案,可根据业务需求进行配置

0、通用配置

参数 说明
logging_collector 是否打印log
log_line_prefix 日志格式
log_directory 日志保存目录
log_statement 打印sql 类型
log_min_duration_statement 记录超时sql,超时多少秒记录

1、每天生成一个日志文件

参数 说明
log_filename = ‘postgresql-%Y-%m-%d_%H%M%S.log‘ 文件名
log_truncate_on_rotation = off 文件存在是否覆盖
log_rotation_age = 1d 间隔多长时间更换新文件
log_rotation_size = 0 超过大小则换一个文件

2、每当日志写完一定大小,则换一个

参数 说明
log_filename = ‘postgresql-%Y-%m-%d_%H%M%S.log‘ 文件名
log_truncate_on_rotation = off 文件存在是否覆盖
log_rotation_age = 0 间隔多长时间更换新文件
log_rotation_size = 10M 超过大小则换一个文件

3、根据星期保留7天日志,循环替换

参数 说明
log_filename = ‘postgresql-%a.log‘ 星期
log_truncate_on_rotation = on 开启覆盖
log_rotation_age = 1d 间隔多长时间更换新文件
log_rotation_size = 0 超过大小则换一个文件

日志分析

  • 文件查看和检索

  • 利用外部表方式进行查询

  • 通过logstash工具进行定制分析

  • 通过在安装了gpperfmon组件的情况下,通过log_alert_history 进行查询

  • 通过gplogfilter工具来查找匹配指定标准的日志数据

gplogfilter 查看日志

日志文件对于确定出错的原因可以提供更多的信息。 Master和每个Segment都有日志文件,位于数据目录下的 pg_log 中。 Master 的日志文件包含着最多的信息,应该首先检查Master日志文件。

可以使用 gplogfilter命令 检查GPDB日志文件。要检查 Segment 的日志文件,可以使用 gpssh 在 Segment 主机上运行 gplogfilter命令。

参数选项

####时间戳选项
-b datetime | --begin=datetime
#以格式YYYY-MM-DD [hh:mm[:ss]] 指定要搜索的日志项的开始日期时间,如果指定一个时间,日期和时间必须被封闭在单引号或者双引号中。
-e datetime | --end=datetime
#指定一个YYYY-MM-DD [hh:mm[:ss]] 格式的结束日期时间来停止搜索日志信息。
-d time | --duration=time
#以[hh][:mm[:ss]]格式指定要搜索的日志项所在的时间长度。如果指定这个选项但没有指定-b或-e选项,将使用当前时间作为基础。


####模式匹配选项
-c i[gnore] | r[espect] || --case=i[gnore] | r[espect]
#除非前面放上--case=ignore选项,字母表符号的匹配默认是大小写敏感的。
-C ‘string‘ | --columns=‘string‘
#从日志文件中选择特定的列。将想要的列指定为由逗号定界的列编号串,列编号从1开始, 从左到右依次是1、2、3等等。
-f ‘string‘ | --find=‘string‘
#查找包含指定字符串的日志项。
-F ‘string‘ | --nofind=‘string‘
#拒绝包含指定字符串的日志项。
-m regex | --match=regex
#查找匹配指定的Python正则表达式的日志项。
-M regex | --nomatch=regex
#拒绝匹配指定Python正则表达式的日志项。
-t | --trouble
#只查找在第一行有ERROR:、FATAL:或者 PANIC:的日志项。


#### 输出选项
-n integer | --tail=integer
#限制输出为找到的符合条件日志项中的最后integer项。
-s offset [limit] | --slice=offset [limit]
#从符合条件的日志项列表中,从offset项处开始返回limit个项,其中为零的offset指示结果集中的第一项,并且任何不超过零的offset表示从结果集的末尾开始数。
-o output_file | --out=output_file
#将输出写到指定的文件或者目录位置而不是STDOUT。
-z 0-9 | --zip=0-9
#使用gzip把输出文件压缩到指定的压缩级别,其中0是不压缩,9是最大压缩。如果用户提供一个以.gz结束的输出文件名,该输出文件默认将使用最大压缩级别压缩。
-a | --append
#如果输出文件已经存在,会追加到该文件而不是覆盖它。


#### 输入选项
-input_file
#要在其中搜索的输入日志文件的名称。如果没有提供输入文件gplogfilter将使用环境变量$MASTER_DATA_DIRECTORY来定位Greenplum数据库的Master日志文件。要从标准输入读取,可使用一个破折号(-)作为输入文件名。
-u | --unzip
#使用gunzip解压输入文件。如果输入文件名以.gz结束, 它默认将被解压。
--help
#显示在线帮助。
--version
#显示这个工具的版本。

查询例子

  • 查看Master和Segment日志文件 WARNING、 ERROR、 FATAL 或 PANIC 级别的日志信息:
#输出最后3行日志 
gplogfilter -n 3 
#查看master节点错误日志
gplogfilter -t /data/greenplum/data/master/gpseg-1/pg_log/gpdb-2021-08-31* > /data/greenplum/setlog.log
#查看segment所有节点错误日志
gpssh -f /usr/local/greenplum-db/seg_host -e ‘source /usr/local/greenplum db/greenplum_path.sh; gplogfilter -t /data/greenplum/data*/*/gpseg*/pg_log/gpdb-2021-08-31* ‘ > /data/greenplum/setlog.log
  • 查看时间段日志
gplogfilter -b ‘2021-08-31 14:33:00‘ -e ‘2021-08-31 14:33:50‘
  • 显示Master日志文件中时间戳位于最后10分钟内的所有日志消息:
gplogfilter -d :10
  • 显示Master日志文件中包含字符串|con6 cmd11|的日志消息:
gplogfilter -f ‘|con6 cmd11|‘

日志文件视图

gp_toolkit管理模式下的日志视图,日志文件以外部表的形式通过SQL语句查询

视图名以gp_log开头,且仅有管理用户才能访问

gp_log_command_timings

该视图使用外部表来读取主数据库上的日志文件,并报告在数据库会话中执行的SQL命令的执行时间。 使用此视图需要超级用户权限。

描述
logsession 会话标识符(以"con"为前缀)。
logcmdcount 会话中的命令号(以"cmd"为前缀)。
logdatabase 数据库的名称。
loguser 数据库用户的名称。
logpid 进程ID(前缀为"p")。
logtimemin 此命令的第一条日志消息的时间。
logtimemax 该命令的最后一条日志消息的时间。
logduration 语句从开始到结束时间的持续时间。

gp_log_database

该视图使用外部表读取整个Greenplum系统的服务器日志文件(master,primary和mirror), 并列出与当前数据库关联的日志条目。 可以通过会话ID(logsession)和命令ID(logcmdcount)标识关联的日志条目。 使用此视图需要超级用户权限。

描述
logtime 日志消息的时间戳。
loguser 数据库用户的名称。
logdatabase 数据库的名称。
logpid 关联的进程ID(前缀为"p")。
logthread 关联的线程数(以"th"为前缀)。
loghost segment或master主机名。
logport segment或master端口号。
logsessiontime 会话连接打开时间。
logtransaction 全局事务ID。
logsession 会话标识符(以"con"为前缀)。
logcmdcount 会话中的命令号(以"cmd"为前缀)。
logsegment segment内容标识符 (对于primary标识符,前缀为"seg",对于mirror,前缀为"mir"。master服务器的内容ID始终为-1)。
logslice 切片ID(正在执行的查询计划的一部分)。
logdistxact 分布式事务ID。
loglocalxact 本地事务ID。
logsubxact 子事务ID。
logseverity LOG, ERROR, FATAL, PANIC, DEBUG1或DEBUG2。
logstate 与日志消息关联的SQL状态代码。
logmessage 日志或错误消息文本。
logdetail 与错误消息关联的详细消息文本。
loghint 与错误消息关联的提示消息文本。
logquery 内部生成的查询文本。
logquerypos 游标索引到内部生成的查询文本中。
logcontext 生成此消息的上下文。
logdebug 用于调试的带有详细信息的查询字符串。
logcursorpos 查询字符串中的游标索引。
logfunction 生成此消息的函数。
logfile 生成此消息的日志文件。
logline 日志文件中生成此消息的行。
logstack 与该消息关联的堆栈跟踪的全文。

gp_log_master_concise

该视图使用外部表从master日志文件读取日志字段的子集。 使用此视图需要超级用户权限。

描述
logtime 日志消息的时间戳。
logdatabase 数据库的名称。
logsession 会话标识符(以"con"为前缀)。
logcmdcount 会话中的命令号(以"cmd"为前缀)。
logmessage 日志或错误消息文本。

gp_log_system

该视图使用一个外部表来读取整个Greenplum系统(master,segment和mirror)的服务器日志文件,并列出所有日志条目。 可以通过会话ID(logsession)和命令ID(logcmdcount)标识关联的日志条目。 使用此视图需要超级用户权限。

描述
logtime 日志消息的时间戳。
loguser 数据库用户的名称。
logdatabase 数据库的名称。
logpid 关联的进程ID(前缀为"p")。
logthread 关联的线程数(以"th"为前缀)。
loghost segment或master主机名。
logport segment或master端口号。
logsessiontime 会话连接打开时间。
logtransaction 全局事务ID。
logsession 会话标识符(以"con"为前缀)。
logcmdcount 会话中的命令号(以"cmd"为前缀)。
logsegment segment内容标识符 (对于primary标识符,前缀为"seg",对于mirror,前缀为"mir"。master服务器的内容ID始终为-1)。
logslice 切片ID(正在执行的查询计划的一部分)。
logdistxact 分布式事务ID。
loglocalxact 本地事务ID。
logsubxact 子事务ID。
logseverity LOG, ERROR, FATAL, PANIC, DEBUG1或DEBUG2。
logstate 与日志消息关联的SQL状态代码。
logmessage 日志或错误消息文本。
logdetail 与错误消息关联的详细消息文本。
loghint 与错误消息关联的提示消息文本。
logquery 内部生成的查询文本。
logquerypos 游标索引到内部生成的查询文本中。
logcontext 生成此消息的上下文。
logdebug 用于调试的带有详细信息的查询字符串。
logcursorpos 查询字符串中的游标索引。
logfunction 生成此消息的函数。
logfile 生成此消息的日志文件。
logline 日志文件中生成此消息的行。
logstack 与该消息关联的堆栈跟踪的全文。

日志文件的定期清理

greenplum日志存放在pg_log下,master节点和每个segment节点都会有,格式为gpdb-YYYY-MM-DD_hhmmss.cs

清理90天之前的日志文件

find ${GPDATA_HOME}/master/gpseg-1/pg_log -type f -name "gpdb-*.csv" -mtime +90 -exec rm -f {} \;

【Greebplum】日志管理

上一篇:【值类型作为函数形参,形参被修改,不影响原值】 不怎么正确。


下一篇:FreeHand MX全新体验介绍