• PostgreSQL日志配置记录


    日志审计 

    审计是值记录用户的登陆退出以及登陆后在数据库里的行为操作,可以根据安全等级不一样设置不一样级别的审计, 

    此处涉及的参数文件有:

    logging_collector      --是否开启日志收集开关,默认off,开启要重启DB

    log_destination    --日志记录类型,默认是stderr,只记录错误输出

    log_directory      --日志路径,默认是$PGDATA/pg_log, 这个目录最好不要和数据文件的目录放在一起, 目录需要给启动postgres的操作系统用户写权限.

    log_filename       --日志名称,默认是postgresql-%Y-%m-%d_%H%M%S.log

    log_file_mode   --日志文件类型,默认为0600

    log_truncate_on_rotation  --默认为off,设置为on的话,如果新建了一个同名的日志文件,则会清空原来的文件,再写入日志,而不是在后面附加。

    log_rotation_age   --保留单个文件的最大时长,默认是1d,也有1h,1min,1s,个人觉得不实用

    log_rotation_size  --保留单个文件的最大尺寸,默认是10MB

    log_error_verbosity --默认为default,verbose表示冗长的

    log_connections    --用户session登陆时是否写入日志,默认off

    log_disconnections --用户session退出时是否写入日志,默认off

    【推荐的日志配置】

    logging_collector = on
    log_destination = 'csvlog'
    log_truncate_on_rotation = on
    log_connections = off
    log_disconnections = off
    log_error_verbosity = verbose
    log_statement = ddl
    log_min_duration_statement = 3s
    log_checkpoints = on
    log_lock_waits = on
    deadlock_timeout = 1s

    1.记录级别

    记录用户登陆数据库后的各种操作,postgres日志里分成了3类,通过参数pg_statement来控制,默认的pg_statement参数值是none,即不记录,可以设置ddl(记录create,drop和alter)、mod(记录ddl+insert,delete,update和truncate)和all(mod+select)。

    log_statement = ddl

    一般的OLTP系统审计级别设置为ddl就够了,因为记录输出各种SQL对性能的影响还是蛮大的,安全级别高一点的也可以设置mod模式,有条件也可以不在数据库层面做,而是购买设备放在网络层监控解析。

    如果这里设置为none,在 log_min_duration_statement设置为60s,那么log_min_duration_statement也会生效,将执行时间超过60s的SQL打印到日志。

    按不同情况进行配置审计级别:

    1)审计用户hm连到数据库hm 的所有SQL.

    alter role hm in database hm set log_statement='all';

    2) 审计用户hm 的所有SQL.

    alter role hm set log_statement='all';

    3) 审计任何用户连接到数据库hm 的所有SQL.

     alter database hm set log_statement='all';

    2.定位慢查询SQL 

    可以设置一定时长的参数(log_min_duration_statement),来记录超过该时长的所有SQL,对找出当前数据库的慢查询很有效。 比如log_min_duration_statement = 2s,记录超过2秒的SQL,改完需要reload 

    log_min_duration_statement = 2s

    3.监控数据库的checkpoint 

    当数据库进行一项大更新操作时,如果参数设置不当,会在日志里留下大量的告警信息,频繁的做checkpoint会导致系统变慢,不用设置都会有。

    但是不会记录系统正常的checkpoint,如果你想看系统一天之类发生了多少次checkpoint,以及每次checkpoint的一些详细信息,比如buffer,sync等,就可以通过设置log_checkpoints,该参数默认值是off。

    log_checkpoints = on 

    4.监控数据库的锁 

    数据库的锁通常可以在pg_locks这个系统表里找,但这只是当前的锁表/行信息,如果你想看一天内有多少个超过死锁时间的锁发生,可以在日志里设置并查看,log_lock_waits 默认是off,可以设置开启。这个可以区分SQL慢是资源紧张还是锁等待的问题。

    log_lock_waits=on

    deadlock_timeout=1

    还有一些Debug功能,适合修改源码调试,一般的的系统上并不需要,暂时比较关注的就这些。

    5.可以在表上设置触发器,来审计

    6.可以使用插件pg_log_userqueries 来做,没有必要

    【注意事项】

    1. 超级用户可以修改这些配置项, 所以被审计的用户最好是普通用户. 否则用户连上来可以修改这些审计项.

    2. 程序用的数据库账号和个人用的数据库账号分开, 对于程序用的数据库账号可以只审计DDL操作, 而对于个人使用的数据库账号, 建议审计所有的SQL.

    3. 变量优先级(事务>会话>database/role>启动参数>配置文件) 

    某些全局变量可以动态修改,例如本文提到的log_statement。修改后reload之后,所有会话都会读到最新的变量

    2020-03-26补充:

    为了让日志文件自动覆盖,达到保留多少日志的目的,可以进行如下设置:

    log_truncate_on_rotation = on

    log_filename = 'postgresql-%I.log' #最多保存12小时的日志,每小时一个文件
    log_filename = 'postgresql-%H.log' #最多保存24小时的日志,每小时一个文件
    log_filename = 'postgresql-%w.log' #最多保存一周的日志,每天一个文件
    log_filename = 'postgresql-%d.log' #最多保存一个月的日志,每天一个文件
    log_filename = 'postgresql-%j.log' #最多保存一年的日志,每天一个文件

  • 相关阅读:
    Mapreduce 进阶
    Exception in thread "main" java.lang.UnsatisfiedLinkError: org.apache.hadoop.io .nativeio.NativeIO$Windows.createDirectoryWithMode0(Ljava/lang/String;I)V
    hive INSERT OVERWRITE table could not be cleaned up.
    flume 多chanel配置
    java jar包与配置文件的写法
    CDH 修改配置注意事项
    Scala 闭包
    Error: Java heap space
    Spark Streaming 执行流程
    python统计字符串中每个单词出现的个数【一行】
  • 原文地址:https://www.cnblogs.com/kuang17/p/6902122.html
Copyright © 2020-2023  润新知