10.0版本PostgreSQL,存在三种日志
WAL日志,即重做日志,一般不可读
- 日志对应目录为 $PGDATA/pg_xlog
事务提交日志,记录的是事务的元数据
- 日志对应目录为 $PGDATA/pg_clog
数据库运行日志
- 日志对应目录为$PGDATA/pg_log
前两种日志,虽然仍然非常重要,但却是不可读的,我们日常使用不多。
本次重点说明第三种日志。
数据库运行日志的相关配置
1.logging_collector = on/off
是否将日志重定向至文件中,默认是off(该配置修改后,需要重启DB服务)
2.log_directory = 'pg_log' ---- 日志文件目录,默认是PGDATA的相对路径,即{PGDATA}/pg_log,也可以改为绝对路径
3.log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' ---- 日志文件命名形式,其中格式化格式与linux date格式化相同。
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_duration = off ---- 记录每条SQL语句执行完成消耗的时间,将此配置设置为on,用于统计哪些SQL语句耗时较长。
9.log_statement
设置日志记录内容--log_statement:none, ddl, mod, and all 。
None表示不记录(默认项)
ddl记录所有数据定义命令,比如CREATE,ALTER,和DROP语句。
mod记录所有ddl语句,加上数据修改语句INSERT,UPDATE等。
all记录所有执行的语句,将此配置设置为all可跟踪整个数据库执行的SQL语句,但会对数据库性能产生较大影响,生产环境不建议配置此值。
postgres=# alter system set log_statement=ddl;
ALTER SYSTEM
# show log_statement仍然显示原来的设置,需要退出,执行pg_ctl reload才能生效
postgres=# show log_statement;
log_statement
---------------
mod
(1 row)
postgres=# \q
[postgres@localhost data]$ pg_ctl reload
server signaled
[postgres@localhost data]$ psql
psql (10.7)
Type "help" for help.
postgres=# show log_statement;
log_statement
---------------
ddl
(1 row)
postgres=#
注:此处未记录select查询语句(log_min_duration_statement=-1 此处为默认值)。当同时设置log_statement=’mod’和log_min_duration_statement=0后,也会记录select。
highgo=#alter system set log_statement=mod;
ALTERSYSTEM
highgo=#alter system set log_min_duration_statement=0;
ALTERSYSTEM
highgo=#\q
[highgo@sourcedbdata]$ pg_ctl reload
serversignaled
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和端口,方便定位问题)
#log_line_prefix = '%m [%p] '
# special value
# %a = application name
# %u = user name
# %d = database name
# %r = remote host and port
# %h = remote host
# %p = process ID
# %t = timestamp without milliseconds
# %m = timestamp with millisecond#
# %n = timestamp with milliseconds (as a Unix epoch)
# %i = command tag
# %e = SQL state
14.log_timezone = 'Asia/Shanghai' ---- 日志时区,最好和服务器设置同一个时区,方便问题定位
--视图pg_timezone_names保存了所有可供选择的时区
select * from pg_timezone_names;
服务器时区设置
[root@localhost ~]# cp -rf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime