日志分类

PostgreSQL有3种日志,分别是:

日志目录作用可读性默认状态
pg_log数据库运行日志内容可读默认关闭,需要设置参数启动
pg_xlogWAL 日志,即重做日志内容一般不具有可读性强制开启
pg_clog事务提交日志,记录的是事务的元数据内容一般不具有可读性强制开启

日志所在路径

pg_xlog 和 pg_clog 一般是在 PGDATA 下面的文件夹下。
pg_log 默认路径是 PGDATA/pg_log,实际路径可以在 PGDATA/postgresql.conf 文件中设置。

各类日志的作用解析

pg_log

这个日志一般是记录服务器与DB的状态,比如各种Error信息,定位慢查询SQL,数据库的启动关闭信息,发生checkpoint过于频繁等的告警信息,诸如此类。

该日志有.csv格式和.log。建议使用.csv格式,因为它一般会按大小和时间自动切割,毕竟查看一个巨大的日志文件比查看不同时间段的多个日志要难得多。

pg_log是可以被清理删除,压缩打包或者转移,同时并不影响数据库的正常运行。
应用场景:

  • 当我们有遇到数据库无法启动或者更改参数没有生效时,第一个想到的就是查看这个日志。

pg_xlog

这个日志是记录的 Postgresql 的WAL信息,也就是一些事务日志信息(transaction log)。

WAL:PostgreSQL在将缓存的数据刷入到磁盘之前,先写日志,这就是PostgreSQL WAL ( Write-Ahead Log )方式,也就是预写日志方式 。

这种日志形如 ‘00000001000000000000008E’,包含的是最近失误的数据镜像;

这些日志会在定时回滚恢复(PITR),流复制(Replication Stream)以及归档时能被用到。

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

大小:每个日志文件是16M。

注意:当你的归档或者流复制发生异常的时候,事务日志会不断地生成,有可能会造成你的磁盘空间被塞满,最终导致数据库挂掉或者起不来。遇到这种情况不用慌,可以先关闭归档或者流复制功能,备份pg_xlog日志到其他地方,但不要删除。然后删除较早时间的的pg_xlog,有一定空间后再试着启动Postgresql。

pg_clog

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

配置文件中与日志相关的配置项

这些配置项都在配置文件postgresql.conf中。

  • logging_collector = on/off
    是否将日志重定向至文件中,默认是off。
  • log_directory = ‘pg_log’
    日志文件目录,默认是PGDATA的相对路径,即PGDATA的相对路径,即{PGDATA}/pg_log,也可以改为绝对路径。日志文件可能会非常多,建议将日志重定向到其他目录或分区。将此配置修改其他目录时,必须先创建此目录,并修改权限,使得postgres用户对该目录有写权限。
  • log_filename = ‘postgresql-%Y-%m-%d_%H%M%S.log’
    日志文件命名形式,使用默认即可
  • log_rotation_age = 1d
    单个日志文件的生存期,默认1天,在日志文件大小没有达到log_rotation_size时,一天只生成一个日志文件。
  • log_rotation_size = 10MB
    单个日志文件的大小,如果时间没有超过log_rotation_age,一个日志文件最大只能到10M,否则将新生成一个日志文件。
  • log_truncate_on_rotation = off
    当日志文件已存在时,该配置如果为off,新生成的日志将在文件尾部追加,如果为on,则会覆盖原来的日志。
  • log_lock_waits = off
    控制当一个会话等待时间超过deadlock_timeout而被锁时是否产生一个日志信息。在判断一个锁等待是否会影响性能时是有用的,缺省是off。
  • log_statement = ‘none’ # none, ddl, mod, all
    控制记录哪些SQL语句。none不记录,ddl记录所有数据定义命令,比如CREATE,ALTER和DROP 语句。mod记录所有ddl语句,加上数据修改语句INSERT,UPDATE等。all记录所有执行的语句,将此配置设置为all可跟踪整个数据库执行的SQL语句。
  • log_duration = off
    记录每条SQL语句执行完成消耗的时间,将此配置设置为on,用于统计哪些SQL语句耗时较长。
  • log_min_duration_statement = -1
    -1表示关闭记录。0表示记录所有statements的执行时间按,若为>0(单位为ms)的一个值,则记录执行时间大于该值的statements。
    个人更喜欢使用该配置来跟踪那些耗时较长,可能存在性能问题的SQL语句。虽然使用log_statement和log_duration也能够统计SQL语句及耗时,但是SQL语句和耗时统计结果可能相差很多行,或在不同的文件中,但是log_min_duration_statement会将SQL语句和耗时在同一行记录,更方便阅读。
  • log_connections = off
    是否记录连接日志
  • log_disconnections = off
    是否记录连接断开日志
  • log_line_prefix = '%m %p %u %d %r ’
    日志输出格式(%m,%p实际意义配置文件中有解释),可根据自己需要设置(能够记录时间,用户名称,数据库名称,客户端IP和端口,方便定位问题)。
  • log_timezone = ‘Asia/Shanghai’
    日志时区,最好和服务器设置同一个时区,方便问题定位

实例:

只保留一周的日志,进行循环覆盖:

log_filename = ‘postgresql-%a.log’
log_truncate_on_rotation = on
log_rotation_age = 1d
log_rotation_size = 0

日志查看

当查看日志时,由于日志文件的可读性较差,可以通过下面方法将CSV日志导入到数据库表里。
1.调整参数

log_destination = 'csvlog'
logging_collector = on

这两个参数修改后,PG SERVER 需要重启。

2.建表

CREATE TABLE postgres_log
(
	log_time timestamp(3) with time zone --日志生成时间
	user_name text --登陆用户名
	database_name text --数据库名
	process_id integer,
	connection_from text --登陆ip
	session_id text,
	session_line_num bigint,
	command_tag text,
	session_start_time timestamp with time zone,
	virtual_transaction_id text,
	transaction_id bigint,
	error_severity text --日志级别
	sql_state_code text --日志错误代码
	message text --异常信息
	detail text --异常详细信息
	hint text,
	internal_query text,
	internal_query_pos integer,
	context text,
	query text --查询脚本
	query_pos integer,
	location text,
	application_name text --应用名称
	PRIMARY KEY (session_id, session_line_num)
);

3.使用copy命令导入数据,然后就可以通过sql语句进行分析。

COPY postgres_log FROM 'd:\\datafile\\postgresql-2018-04-17_094948.csv' WITH csv;

参考:
1.https://blog.csdn.net/yueludanfeng/article/details/83153523
2.https://906179271.iteye.com/blog/2270652
3.https://blog.csdn.net/shanzhizi/article/details/47616645

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐