PostgreSQL慢查询SQL收集和解析

打印 上一主题 下一主题

主题 821|帖子 821|积分 2463

postgresql通过log_statement参数记录慢SQL语句

PostgreSQL可以不借助任何扩展实现对SQL日志的记录,主要依靠于两个参数,也即log_statement和log_min_duration_statement,
1,记录的sql范例
log_statement='all' 可以是none, ddl, mod, all
2,记录的sql执行时间阈值
log_min_duration_statement='1000',单位毫秒,记录超出该单位时间的log_statement中定义范例的SQL
以上两个参数规定了记录超出log_min_duration_statement时间的log_statement范例的SQL语句到日志文件中
3,PostgreSQL日志行前缀的格式,
log_line_prefix = '%m [%p] '        # special values:
                                                                             # %a = application name
                                                                            # %u = user name
                                                                            # %d = database name
                                                                            # %r = remote host and port
                                                                            # %h = remote host
                                                                            # %b = backend type
                                                                            # %p = process ID
                                                                            # %P = process ID of parallel group leader
                                                                            # %t = timestamp without milliseconds
                                                                            # %m = timestamp with milliseconds
                                                                            # %n = timestamp with milliseconds (as a Unix epoch)
                                                                            # %Q = query ID (0 if none or not computed)
                                                                            # %i = command tag
                                                                            # %e = SQL state
                                                                            # %c = session ID
                                                                            # %l = session line number
                                                                            # %s = session start timestamp
                                                                            # %v = virtual transaction ID
                                                                            # %x = transaction ID (0 if none)
                                                                            # %q = stop here in non-session
                                                                            # processes
                                                                            # %% = '%'
                                                                            # e.g. ' '
需要注意的是,PostgreSQL慢日志信息是一个过程,有多行文本构成,每个步调在日志里都是一行文本信息,大概步调如下,
step 1,执行开始前,即被记入日志(log_statement生效)
step 2,语句执行的过程中,会涉及绑定变量解析等等
step 3,语句执行完成后,将duration记入日志
由于以上过程存在并发Session交织写入的情况,因此要考虑如何解析(记录足够具体的log_line_prefix )。由于慢日志都以文本的方式分行存储,以上日志会存在交织存储的场景,也即session1和Session2会并行地往log里写入日志信息,从而导致两者的日志交织写入,雷同于如下如许,真正写代码做过解析的都知道(如果不记录SessionID)这个难点。
  1.     session1 begin
  2.     session2 begin
  3.     session1 execute
  4.     session3 begin
  5.     session2 execute
  6.     session2 end
  7.     session1 end
  8.     session3 end
  9.     :param file_name:
  10.     :return
复制代码
因此为了方便解析,需要记录尽可能具体的一些信息,比如远程主机名,session ID等信息,可以判断判断那些信息是某个客户端的某个session发起的。
 
通过auto_explain扩展记录慢查询日志

尽管可以通过log_statement记录到所谓的慢查询日志,但auto_explain可以记录慢查询的SQL语句以及执行计划信息,为了异常的诊断提供了更多的参考依据。
auto_explain 并没有 .sql 、.control 文件,所以是无法通过 create extension 来完成。需要通过设置 shared_preload_librariess 参数预先加载auto_explain到某些或者所有会话中。
###查看已加载的扩展
如果setting字段是否有auto_explain
    select name, setting, pending_restart FROM pg_settings WHERE name = 'shared_preload_libraries';
###临时加载
      ###session级打开auto_plain,需要超等用户权限
      load 'auto_explain';
      ###设置SQL记录执行计划的时间阈值
      set auto_explain.log_min_duration = '200000'
      set auto_explain.log_analyze = true;
      固然如果是动态加载auto_explain,退出当前sql session则auto_explain失效。
###全局加载
          ##编辑设置文件$ vi postgresql.conf
                  shared_preload_libraries = 'auto_explain'        # (change requires restart),shared_preload_libraries 的修改需要重启数据库
  1. ##配置项
  2. #------------------------------------------------------------------------------
  3. # CUSTOMIZED OPTIONS
  4. #------------------------------------------------------------------------------
  5. # Add settings for extensions here
  6. # auto_explain
  7. auto_explain.log_min_duration = '100'
  8. auto_explain.log_timing = on
  9. auto_explain.log_verbose = on
复制代码
###如何取消auto_explain
      根据上面设置,做反向操作,也即取消shared_preload_libraries中的auto_explain设置,取消auto_explain干系设置项,同样需要重启
 
pgbadger解析慢日志

通过以上两种方式,可以将PostgreSQL中会将慢日志写入PostgreSQL log文件中,但是PostgreSQL日志中也包含系统日志等一系列信息,因此解析PostgreSQL日志并不是一个太容易的工作。
                这里接纳pgBDger这个工具来实现日志的解析,pgbadger的安装和利用都非常简单,更多详情参考https://github.com/darold/pgbadger
  1. 1.###自行安装相关依赖包
  2. ......
  3. 2.###下载最新版的pgbadger
  4. wget https://github.com/darold/pgbadger/archive/refs/tags/v12.4.tar.gz
  5. 3.###解压缩
  6. tar -xzvf v12.4.tar.gz
  7. 4.###Makefile PL创建Makefile文件
  8. cd pgbadger-12.4
  9. /pgbadger-12.4# perl Makefile.PL
  10.     Checking if your kit is complete...
  11.     Looks good
  12.     Generating a Unix-style Makefile
  13.     Writing Makefile for pgBadger
  14.     Writing MYMETA.yml and MYMETA.json
  15. 5.###编译安装   
  16. /pgbadger-12.4# perl Makefile.PL
  17.     Checking if your kit is complete...
  18.     Looks good
  19.     Generating a Unix-style Makefile
  20.     Writing Makefile for pgBadger
  21.     Writing MYMETA.yml and MYMETA.json
  22.     root@VM-20-15-ubuntu:/usr/local/postgresql_install_package/pgbadger-12.4# make && make install
  23.     Makefile:899: You must install pod2markdown to generate README.md from doc/pgBadger.pod
  24.     cp pgbadger blib/script/pgbadger
  25.     "/usr/bin/perl" -MExtUtils::MY -e 'MY->fixin(shift)' -- blib/script/pgbadger
  26.     echo "=head1 SYNOPSIS" > doc/synopsis.pod
  27.     ./pgbadger --help >> doc/synopsis.pod
  28.     echo "=head1 DESCRIPTION" >> doc/synopsis.pod
  29.     sed -i.bak 's/ +$//g' doc/synopsis.pod
  30.     rm doc/synopsis.pod.bak
  31.     sed -i.bak '/^=head1 SYNOPSIS/,/^=head1 DESCRIPTION/d' doc/pgBadger.pod
  32.     sed -i.bak '4r doc/synopsis.pod' doc/pgBadger.pod
  33.     rm doc/pgBadger.pod.bak
  34.     Manifying 1 pod document
  35.     rm doc/synopsis.pod
  36.     Makefile:899: You must install pod2markdown to generate README.md from doc/pgBadger.pod
  37.     echo "=head1 SYNOPSIS" > doc/synopsis.pod
  38.     ./pgbadger --help >> doc/synopsis.pod
  39.     echo "=head1 DESCRIPTION" >> doc/synopsis.pod
  40.     sed -i.bak 's/ +$//g' doc/synopsis.pod
  41.     rm doc/synopsis.pod.bak
  42.     sed -i.bak '/^=head1 SYNOPSIS/,/^=head1 DESCRIPTION/d' doc/pgBadger.pod
  43.     sed -i.bak '4r doc/synopsis.pod' doc/pgBadger.pod
  44.     rm doc/pgBadger.pod.bak
  45.     Manifying 1 pod document
  46.     Installing /usr/local/man/man1/pgbadger.1p
  47.     Installing /usr/local/bin/pgbadger
  48.     Appending installation info to /usr/local/lib/x86_64-linux-gnu/perl/5.34.0/perllocal.pod
  49.     rm doc/synopsis.pod
复制代码
  1. 6.###默认安装路径
  2. /pgbadger-12.4# whereis pgbadger
  3.     pgbadger: /usr/local/bin/pgbadger
  4. 7.###切换到PostgreSQL日志目录
  5. /local/pgsql16/pg9000/log# ll
  6. total 1204
  7. drwxr-x--- 2 postgres postgres    4096 Oct 17 16:54 ./
  8. drwxr-x--- 4 postgres postgres    4096 Oct 15 13:42 ../
  9. -rw-r--r-- 1 root     root     1179610 Oct 17 16:54 out.html
  10. -rwxr-x--- 1 postgres postgres    1443 Oct 15 14:01 pgsql.log*
  11. -rw------- 1 postgres postgres    2877 Oct 15 21:19 postgresql-2024-10-15_142057.log
  12. -rw------- 1 postgres postgres   16708 Oct 16 23:57 postgresql-2024-10-16_000000.log
  13. -rw------- 1 postgres postgres    8273 Oct 17 16:02 postgresql-2024-10-17_000000.log
  14. 8.###运行pgbadger,后面可以跟一个或者多个PostgreSQL日志文件
  15. /local/pgsql16/pg9000/log# pgbadger postgresql-2024-10-15_142057.log postgresql-2024-10-16_000000.log postgresql-2024-10-17_000000.log
  16. [========================>] Parsed 27858 bytes of 27858 (100.00%), queries: 0, events: 69
  17. LOG: Ok, generating html report...
  18. 9.###会将日志报告生成在当前目录下
复制代码
可以看到pgbadger解析出来的日志报告非常具体,这里是auto_explain捕捉到的慢查询的结果,包含了执行计划信息

这个是错误日志,包括SQL错误信息(解析失败,执行失败等等等等)

pgbadger解析出来的日志有多种维护的汇总和呈现,不限于以上两种截图中的内容,可以为日志分析提供给多个维度的参考。
 
以上扼要总结了PostgreSQL中慢查询日志的记录和解析过程,通过对慢查询日志的记录和分析,可以为系统异常诊断提供可参考依据。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

写过一篇

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表