日志种类
- PostgreSQL有3种日志
- pg_log(数据库运行日志) 内容可读 默认关闭的,需要设置参数启动
- pg_xlog(WAL 日志,即重做日志) 内容一般不具有可读性 强制开启
- 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是可以被清理删除,压缩打包或者转移,同时并不影响DB的正常运行。
- 应用场景2:当我们有遇到DB无法启动或者更改参数没有生效时,第一个想到的就是查看这个日志。
-
pg_xlog
- 作用:这个日志是记录的Postgresql的WAL信息,也就是一些事务日志信息(transaction log)
- 名称:这种日志形如 ‘00000001000000000000008E’, 包含的是最近失误的数据镜像;
- 应用场景:这些日志会在定时回滚恢复(PITR),流复制(Replication Stream)以及归档时能被用到
- 很重要:这些日志是非常重要的,记录着数据库发生的各种事务信息,不得随意删除或者移动这类日志文件,不然你的数据库会有无法恢复的风险
- 大小:每个日志文件是16M
- 注意:当你的归档或者流复制发生异常的时候,事务日志会不断地生成,有可能会造成你的磁盘空间被塞满,最终导致DB挂掉或者起不来。遇到这种情况不用慌,可以先关闭归档或者流复制功能,备份pg_xlog日志到其他地方,但不要删除。然后删除较早时间的的pg_xlog,有一定空间后再试着启动Postgres。
-
pg_clog
- 概念:pg_clog这个文件也是事务日志文件,但与pg_xlog不同的是它记录的是事务的元数据(metadata),这个日志告诉我们哪些事务完成了,哪些没有完成。这个日志文件一般非常小,但是重要性也是相当高,不得随意删除或者对其更改信息。
总结
- pg_log记录各种Error信息,以及服务器与DB的状态信息,可由用户随意更新删除
- pg_xlog与pg_clog记录数据库的事务信息,不得随意删除更新,做物理备份时要记得备份着两个日志。
参考博客:
http://906179271.iteye.com/blog/2270652
https://www.xuebuyuan.com/1384483.html
配置文件中与日志相关的配置
- logging_collector = on/off
是否将日志重定向至文件中,默认是off
- log_directory = ‘pg_log’
日志文件目录,默认是PGDATA的相对路径,即PGDATA的相对路径,即{PGDATA}/pg_log,也可以改为绝对路径,默认为${PGDATA}/pg_log,即集群目录下,但是日志文件可能会非常多,建议将日志重定向到其他目录或分区。将此配置修改为${PGDATA}/pg_log下,必须先创建此目录,并修改权限,chown postgres:postgres ${PGDATA}/pg_log
3.log_filename = ‘postgresql-%Y-%m-%d_%H%M%S.log’ ---- 日志文件命名形式,使用默认即可
4. log_rotation_age = 1d ---- 单个日志文件的生存期,默认1天,在日志文件大小没有达到log_rotation_size时,一天只生成一个日志文件
5. log_rotation_size = 10MB ---- 单个日志文件的大小,如果时间没有超过log_rotation_age,一个日志文件最大只能到10M,否则将新生成一个日志文件。
6.log_truncate_on_rotation = off ---- 当日志文件已存在时,该配置如果为off,新生成的日志将在文件尾部追加,如果为on,则会覆盖原来的日志。
7.log_lock_waits = off ---- 控制当一个会话等待时间超过deadlock_timeout而被锁时是否产生一个日志信息。在判断一个锁等待是否会影响性能时是有用的,缺省是off。
8.log_statement = ‘none’ # none, ddl, mod, all ---- 控制记录哪些SQL语句。none不记录,ddl记录所有数据定义命令,比如CREATE,ALTER,和DROP 语句。mod记录所有ddl语句,加上数据修改语句INSERT,UPDATE等,all记录所有执行的语句,将此配置设置为all可跟踪整个数据库执行的SQL语句。
9.log_duration = off ---- 记录每条SQL语句执行完成消耗的时间,将此配置设置为on,用于统计哪些SQL语句耗时较长。
10.log_min_duration_statement = -1 # -1 is disabled, 0 logs all statements and their durations, > 0 logs only statements running at least this number of milliseconds
-1表示不可用,0将记录所有SQL语句和它们的耗时,>0只记录那些耗时超过(或等于)这个值(ms)的SQL语句。个人更喜欢使用该配置来跟踪那些耗时较长,可能存在性能问题的SQL语句。虽然使用log_statement和log_duration也能够统计SQL语句及耗时,但是SQL语句和耗时统计结果可能相差很多行,或在不同的文件中,但是log_min_duration_statement会将SQL语句和耗时在同一行记录,更方便阅读。
11.log_connections = off ----是否记录连接日志
12.log_disconnections = off ---- 是否记录连接断开日志
13.log_line_prefix = '%m %p %u %d %r ’ ---- 日志输出格式(%m,%p实际意义配置文件中有解释),可根据自己需要设置(能够记录时间,用户名称,数据库名称,客户端IP和端口,方便定位问题)
14.log_timezone = ‘Asia/Shanghai’ ---- 日志时区,最好和服务器设置同一个时区,方便问题定位
服务器时区设置
[root@localhost ~]# cp -rf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime