暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PostgreSQL的日志文件和数据加载

数据和云 2019-07-31
234

墨墨导读:本文主要介绍PostgreSQL的日志文件参数及注意事项,从csv日志中载入数据库。通过灵活的数据加载方式,让SQL在处理很多问题上更加简捷便利。


 运行日志参数



1.1 运行日志主要参数


运行日志主要相关的参数如下,默认没有开启的话没有log目录,开启后会自动生成。



1.2  注意事项


  • 设置csv格式日志的话一定要设置logging_collector 为 on

  • pg10版本的运行日志一般在$PGDATA/log目录下

  • log目录是开启运行日志后自动生成的

  • 可以通过log_rotation_age来设置多久重新生成一个日志文件

  • 可以通过log_rotation_size来设置多大的日志来重新生成日志文件

  • 上面两个都需要配合log_truncate_on_rotation 为 on来使用

  • 可以开启log_duration来记录sql执行时间

  • 可以开启log_statement来记录数据库ddl


1.3  csv日志载入数据库


Oracle有外部表,pg也有fdw。oracle可以用外部表的方式将alert日志载入到数据库中用SQL来查看。PG可以用copy命令将csv日志载入到数据库中用SQL来查看。这种方式都可以很方便得用sql来查询想要的日志内容。这种方式的有点是显而易见的,就是可以很容易得用SQL来查询和过滤日志,pg的日志文件可以截断分割成若干小文件,可以载入自己需要的日志。而Oracle的alert通常会很大。

缺点也是显而易见的,如果数据库挂了就不能用这种方式来查看日志。而且pg的csv日志不容易直接阅读。


1.3.1 创建日志表


创建了一个数据库和新的表来载入日志

    postgres=# create database test;
    CREATE DATABASE
    postgres=# \c test
    You are now connected to database "test" as user "pg12".
    test=# CREATE TABLE pg_log
    test-# (
    test(# log_time timestamp(3) with time zone,
    test(# user_name text,
    test(# database_name text,
    test(# process_id integer,
    test(# connection_from text,
    test(# session_id text,
    test(# session_line_num bigint,
    test(# command_tag text,
    test(# session_start_time timestamp with time zone,
    test(# virtual_transaction_id text,
    test(# transaction_id bigint,
    test(# error_severity text,
    test(# sql_state_code text,
    test(# message text,
    test(# detail text,
    test(# hint text,
    test(# internal_query text,
    test(# internal_query_pos integer,
    test(# context text,
    test(# query text,
    test(# query_pos integer,
    test(# location text,
    test(# application_name text,
    test(# PRIMARY KEY (session_id, session_line_num)
    test(# );


    CREATE TABLE
    test=#
    复制


    1.3.2 查看日志文件名字


      [pg12@whf307 ~]$ cd $PGDATA/log
      [pg12@whf307 log]$ ls -rtl
      total 24
      -rw------- 1 pg12 pg12 166 May 30 13:32 postgresql-2019-05-30_133202.log
      -rw------- 1 pg12 pg12 496 May 30 13:32 postgresql-2019-05-30_133202.csv
      -rw------- 1 pg12 pg12 0 May 30 13:32 postgresql-2019-05-30_133254.log
      -rw------- 1 pg12 pg12 170 May 30 13:32 postgresql-2019-05-30_133254.csv
      -rw------- 1 pg12 pg12 166 May 30 13:33 postgresql-2019-05-30_133324.log
      -rw------- 1 pg12 pg12 6566 May 30 16:16 postgresql-2019-05-30_133324.csv
      -rw------- 1 pg12 pg12 0 May 31 00:00 postgresql-2019-05-31_000000.log
      -rw------- 1 pg12 pg12 0 May 31 00:00 postgresql-2019-05-31_000000.csv
      [pg12@whf307 log]$


      [pg12@whf307 log]$ pwd
      /soft/pg_data/log
      [pg12@whf307 log]$
      复制


      1.3.3 载入到数据库

        [pg12@whf307 log]$ psql  test
        psql (12beta1)
        Type "help" for help.


        test=# \d
        List of relations
        Schema | Name | Type | Owner
        --------+--------+-------+-------
        public | pg_log | table | pg12
        (1 row)


        test=# copy pg_log from '/soft/pg_data/log/postgresql-2019-05-30_133324.csv' with csv;
        COPY 32
        复制


        1.3.4 查看日志


        这样就可以用sql来查看了。执行一个普通查询

          test=# select relfilenode from pg_class where relname='pg_log';
          relfilenode
          -------------
          16385
          (1 row)
          复制


          载入最新的日志。这里可以重复载入,不会覆盖之前的数据。

            [pg12@whf307 log]$ ls -rtl
            total 32
            -rw------- 1 pg12 pg12 166 May 30 13:32 postgresql-2019-05-30_133202.log
            -rw------- 1 pg12 pg12 496 May 30 13:32 postgresql-2019-05-30_133202.csv
            -rw------- 1 pg12 pg12 0 May 30 13:32 postgresql-2019-05-30_133254.log
            -rw------- 1 pg12 pg12 170 May 30 13:32 postgresql-2019-05-30_133254.csv
            -rw------- 1 pg12 pg12 166 May 30 13:33 postgresql-2019-05-30_133324.log
            -rw------- 1 pg12 pg12 6566 May 30 16:16 postgresql-2019-05-30_133324.csv
            -rw------- 1 pg12 pg12 0 May 31 00:00 postgresql-2019-05-31_000000.log
            -rw------- 1 pg12 pg12 4545 May 31 00:37 postgresql-2019-05-31_000000.csv
            [pg12@whf307 log]$ psql test
            psql (12beta1)
            Type "help" for help.


            test=# copy pg_log from '/soft/pg_data/log/postgresql-2019-05-31_000000.csv' with csv;
            COPY 28
            复制


            次查看日志

              test=# SELECT COUNT(*) FROM PG_LOG;
              count
              -------
              60
              (1 row)


              test=# select log_time at time zone 'UTC' ,database_name,connection_from,query from pg_log where log_time>to_timestamp('2019-05-31 14:35:00','yyyy-mm-dd hh24:mi:ss');
              timezone | database_name | connection_from | query
              -------------------------+---------------+-----------------+-----------------------------------------------------------
              2019-05-31 06:35:42.843 | test | [local] |
              2019-05-31 06:35:57.582 | test | [local] |
              2019-05-31 06:36:54.369 | test | [local] | selectt relfilenode from pg_class where relname='pg_log';
              2019-05-31 06:36:58.002 | test | [local] |
              2019-05-31 06:37:00.192 | test | [local] |
              2019-05-31 06:37:11.651 | | [local] |
              2019-05-31 06:37:11.651 | test | [local] |
              (7 rows)
              复制


              可以看到记录数变成了60,之前的记录没有被覆盖,我们可以一直使用该表,可以用sql来查看sql,数据库,登录时间等等的所有日志。


              查看日志起始结束时间:

                test=# select min(log_time)  at time zone 'UTC',max(log_time)  at time zone 'UTC' from pg_log;
                timezone | timezone
                -------------------------+-------------------------
                2019-05-30 19:33:24.892 | 2019-05-31 06:37:11.651
                (1 row)
                复制


                有了灵活的数据加载方式,让SQL处理很多问题更加简捷便利。



                扩展阅读



                1. 《PostgreSQL 指南:内幕探索》之基础备份与时间点恢复(上)

                2. 《PostgreSQL 指南:内幕探索》之基础备份与时间点恢复(下)

                3. 解读年度数据库PostgreSQL:如何处理并发控制(一)

                4. “王者对战”之 MySQL 8 vs PostgreSQL 10

                5. 大象起舞:用PostgreSQL解海盗分金问题

                6. 解读年度数据库PostgreSQL:如何巧妙地实现缓冲区管理器

                7. 解读年度数据库PostgreSQL:如何处理并发控制(一)

                8. 数据和云,半年文章精选(文末赠书)

                9. 美女DBA带你了解PostgreSQL用户及角色

                10. 从Oracle到PostgreSQL:最全控制文件


                数据和云

                ID:OraNews

                如有收获,请划至底部,点击“在看”,谢谢!


                云和恩墨大讲堂 | 一个分享交流的地方

                长按,识别二维码,加入万人交流社群


                请备注:云和恩墨大讲堂

                文章转载自数据和云,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                评论