金仓数据库KingbaseES 慢查询日志的获取(一)
关键字:
KingbaseES、慢查询日志、log、人大金仓、KingbaseES、
一、慢查询日志概述
慢查询日志可以记录所有执行时间超过一定阈值(1s)的SQL语句。通过分析慢查询日志可以找出哪些查询比较耗时,然后在进行优化。获取慢查询日志的方法有两种:
- 开启慢查询日志。
- 使用sys_stat_statements扩展。
下面详细介绍开启慢查询日志的方法。
二、开启慢查询日志
如果想开启慢查询日志,首先需要在kingbase.conf中配置开启慢查询日志需要的参数。在kingbase.conf中,开启慢查询日志相关的参数有三种:
- 在哪里写日志
(1)log_destination参数值的类型为string,有效值包括stderr、csvlog和syslog。设置这个参数为一个由想要的日志目的地列表,之间用逗号分隔。默认值是只记录到stderr
如果csvlog被包括在log_destination中,日志项会以CSV格式被输出,这样可以很方便地把日志载入到程序中。要产生 CSV 格式的日志输出,必须启用logging_collector。默认值为:log_destination = 'stderr'。
(2)logging_collector参数值的类型为boolean,这个参数用于启用日志收集器,它是一个捕捉被发送到stderr或csvlog的日志消息的后台进程,并且它会将这些消息重定向到日志文件中。这种方法比记录到syslog通常更有用,因为某些类型的消息不会在syslog输出中出现。这个参数只能在服务器启动时设置,并且重启生效。默认值为:logging_collector = on。
(3)log_directory参数值类型为string,当logging_collector被启用时,这个参数决定日志文件将被在哪个目录下创建。该目录可以为一个绝对路径,也可以为一个KBDATA的相对路径。默认值为sys_log:log_directory = 'sys_log'。
(4)log_filename参数值类型为string,当logging_collector被启用时,这个参数设置被创建的日志文件的文件名。该值被视为一种strftime模式,因此%转义可以被用来指定根据时间变化的文件名(注意如果有任何时区独立的%转义,计算将在由log_timezone指定的时区中完成)。默认值为:log_filename = 'kingbase-%Y-%m-%d_%H%M%S.log'。
(5)log_file_mode参数值类型为integer,在 Unix 系统上,当logging_collector被启用时,这个参数设置日志文件的权限(在Windows 上这个参数将被忽略)。 默认的权限是0600:log_file_mode = 0600,表示只有服务器拥有者才能读取或写入日志文件。其他常用的设置是0640,它允许拥有者的组成员读取文件。
(6)log_rotation_age 参数值类型为integer,当logging_collector被启用时,这个参数决定使用一个单个日志文件的最大时间量,之后将创立一个新的日志文件。 如果指定值时没有单位,则以分钟为单位。默认为24小时:log_rotation_age = 1d。
(7)log_rotation_size 参数值类型为integer,当logging_collector被启用时,这个参数决定一个单个日志文件的最大尺寸。 当这些数据量被发送到一个日志文件后,将创建一个新的日志文件。默认值为:log_rotation_size = 10MB。
(8)log_truncate_on_rotation 参数值类型为boolean。当logging_collector被启用时,这个参数将导致Kingbase截断(覆盖而不是追加)任何已有的同名日志文件。不过,截断只在一个新文件由于基于时间的轮转被打开时发生,在服务器启动或基于尺寸的轮转时不会发生。如果被关闭,在所有情况下以前存在的文件将被追加:log_truncate_on_rotation = off。
- 记录什么到日志
(1)log_statement参数值类型为enum。控制哪些SQL语句被记录。有效值是 none (off)、ddl、mod和 all(所有语句)。ddl记录所有数据定义语句,例如CREATE、ALTER和 DROP语句。mod记录所有ddl语句,外加数据修改语句例如INSERT, UPDATE、DELETE、TRUNCATE和COPY FROM。参数默认值为none:log_statement = 'none'。
3. 什么时候记录日志
(1)log_min_duration_statement参数值类型为integer,该参数设置写入日志的慢查询语句的最小执行时长。如果没有指定单位,默认以毫秒为单位。将这个参数设置为0将打印所有语句的执行时间。 设置为-1(默认值)将停止记录语句持续时间: log_min_duration_statement 。
三、举例说明
(1)在kingbase.conf中,配置以下参数:
logging_collector = on
log_directory = 'sys_log'
log_timezone = 'Asia/Shanghai'
log_min_duration_statement = 0
重新启动,使上述参数设置生效。
(2)在Kingbase数据库中输入任一sql命令,例如:
test=# \set SQLTERM /
test=# delete from xml_test;
test-# declare
test-# lxmldata xmltype;
test-# begin
test-# lxmldata := dbms_xmlgen.getxmltype('select * from xmldemo');
test-# insert into xml_test values(lxmldata);
test-# end;
test-# select * from xml_test;
test-# /
DELETE 0
ANONYMOUS BLOCK
result
-----------------
<rowset> +
<row> +
<a>1</a> +
<b>first</b> +
<c>壹</c> +
</row> +
<row> +
<a>2</a> +
<b>second</b>+
<c>贰</c> +
</row> +
<row> +
<a>3</a> +
<c>叁</c> +
</row> +
</rowset> +
(1 行记录)
(3)查看日志文件名称和内容。
1)日志文件名称:
2)日志文件内容:
2023-10-27 12:40:37.895 CST [2877358] LOG: 执行时间: 3.654 ms 语句: delete from xml_test;
declare
lxmldata xmltype;
begin
lxmldata := dbms_xmlgen.getxmltype('select * from xmldemo');
insert into xml_test values(lxmldata);
end;
select * from xml_test;
2023-10-27 12:40:37.897 CST [2877358] LOG: 执行时间: 1.082 ms 语句: select dbms_output.send_print(10)
2023-10-27 12:40:37.897 CST [2877358] LOG: 执行时间: 0.739 ms 语句: call dbms_output.clear_cache();




