达梦数据库开启SQL日志记录

达梦数据库开启SQL日志记录

在达梦数据库中可以通过开启记录sql日志,方便分析慢SQL。可以根据数据库用户、SQL语句类型、执行时间来设置需要记录的SQL,并且可以配置SQL日志记录中那些内容需要记录比如:执行时间、执行用户、客户端IP,客户端工具等会话信息。

配置文件参数说明

与SQL日志相关的配置文件:dm.ini 、sqllog.ini
文件路径位于CONFIG_PATH

dm.ini

参数名称缺省值属性说明
SQL_TRACE_MASK1动态,系统级LOG记录的语句类型掩码,是一个格式化的字符串,表示一个32位整数上哪一位将被置为1,置为1的位则表示该类型的语句要记录,格式为:位号:位号:位号。列如:3:5:7表示第3,第5,第7位上的值被置为1。每一位的含义见下面说明(2~17前提是:SQL标记位24也要置):
1 全部记录(全部记录并不包含原始语句)
2 全部 DML 类型语句
3 全部 DDL 类型语句
4 UPDATE 类型语句(更新)
5 DELETE 类型语句(删除)
6 INSERT 类型语句(插入)
7 SELECT 类型语句(查询)
8 COMMIT 类型语句(提交)
9 ROLLBACK 类型语句(回滚)
10 CALL 类型语句(过程调用)
11 BACKUP 类型语句(备份)
12 RESTORE 类型语句(恢复)
13 创建对象操作(CREATE DDL)
14 修改对象操作(ALTER DDL)
15 删除对象操作(DROP DDL)
16 授权操作(GRANT DDL)
17 回收操作(REVOKE DDL)
22 绑定参数
23 存在错误的语句(语法错误,语义分析错误等)
24 是否需要记录执行语句
25 是否需要打印计划和语句和执行的时间
26 是否需要记录执行语句的时间
27 原始语句(服务器从客户端收到的未加分析的语句)
28 是否记录参数信息,包括参数的序号、数据类型和值
29 是否记录事务相关事件
SVR_LOG_FILE_NUM0动态,系统级总共记录多少个日志文件,当日志文件达到这个设定值以后,再生成新的文件时,会删除最早的那个日志文件,日志文件的命令格式为LOG_COMMIT_时间.LOG。当这个参数配置成0时,则按传统的日志文件记录,也就是LOG_COMMIT01.LOG和LOG_COMMIT02.LOG相互切换着记录。有效值范围(0~1024)
SVR_LOG0动态,系统级是否打开SQL日志功能, 0:表示关闭;1:表示打开;2:按文件中记录数量切换日志文件,日志记录为详细模式;3:不切换日志文件,日志记录为简单模式,只记录时间和原始语句
SVR_LOG_NAMESLOG_ALL动态,系统级使用SQLLOG.INI中预设的模式的名称
SVR_LOG_SWITCH_COUNT100000动态,系统级一个日志文件中的SQL记录条数达到多少条之后系统会自动将日志切换到另一个文件中。有效值范围(1000~ 10000000)
SVR_LOG_ASYNC_FLUSH0动态,系统级是否打开异步SQL日志功能, 0:表示关闭; 1:表示打开
SVR_LOG_MIN_EXEC_TIME0动态,系统级详细模式下,记录的最小语句执行时间,单位为毫秒。执行时间小于该值的语句不记录在日志文件中。有效值范围(0~4294967294)
SVR_LOG_FILE_PATH…\LOG动态,系统级日志文件所在的文件夹路径

sqllog.ini

sqllog.ini用于sql日志的配置。 当把INI参数SVR_LOG置为1,才会打开SQL日志。
如果在服务器启动过程中,修改了sqllog.ini文件。修改之后的文件,只要调用过程SP_REFRESH_SVR_LOG_CONFIG() 就会对后面新的会话生效。

参数名缺省值属性说明
SQL_TRACE_MASK1动态,系统级LOG记录的语句类型掩码,是一个格式化的字符串,表示一个32位整数上哪一位将被置为1,置为1的位则表示该类型的语句要记录,格式为:位号:位号:位号。列如:3:5:7 表示第3,第5,第7位上的值被置为1。每一位的含义见下面说明(2~17前提是:SQL标记位24也要置):
1 全部记录(全部记录并不包含原始语句)
2 全部DML类型语句
3 全部DDL类型语句
4 UPDATE类型语句(更新)
5 DELETE类型语句(删除)
6 INSERT类型语句(插入)
7 SELECT类型语句(查询)
8 COMMIT类型语句(提交)
9 ROLLBACK类型语句(回滚)
10 CALL类型语句(过程调用)
11 BACKUP类型语句(备份)
12 RESTORE类型语句(恢复)
13 创建对象操作(CREATE DDL)
14 修改对象操作(ALTER DDL)
15 删除对象操作(DROP DDL)
16 授权操作(GRANT DDL)
17 回收操作(REVOKE DDL)
22 绑定参数
23 存在错误的语句(语法错误,语义分析错误等)
24 是否需要记录执行语句
25 是否需要打印计划和语句和执行的时间
26 是否需要记录执行语句的时间
27 原始语句(服务器从客户端收到的未加分析 的语句)
28 是否记录参数信息,包括参数的序号、数据类型和值
29 是否记录事务相关事件
FILE_NUM0动态,系统级总共记录多少个日志文件,当日志文件达到这个设定值以后,再生成新的文件时,会删除最早的那个日志文件,日志文件的命令格式为DMSQL_实例名_日期时间.LOG。当这个参数配置成0时,只会生成两个日志相互切换着记录。有效值范围(0~1024)。例如,当FILE_NUM=0,实例名为PDM时,根据当时的日期时间,生成的日志名称为:DMSQL_PDM_20180719_163701.LOG,DMSQL_PDM_20180719_163702.LOG
SWITCH_MODE0手动表示SQL日志文件切换的模式: 0:不切换 1:按文件中记录数量切换 2:按文件大小切换 3:按时间间隔切换
SWITCH_LIMIT100000动态,系统级不同切换模式SWITCH_MODE下,意义不同: 按数量切换时,一个日志文件中的SQL记录条数达到多少条之后系统会自动将日志切换到另一个文件中。一个日志文件中的SQL记录 条数达到多少条之后系统会自动将日志切换到另一个文件中。有效值范围(1000-10000000)按文件大小切换时,一个日志文件达到该大小后,系统自动将日志切换到另一个文件中,单位为M。有效值范围(1-2000)按时间间隔切换时,每个指定的时间间隔,按文件新建时间进行文件切换,单位为分钟。有效值范围(1-30000)
ASYNC_FLUSH0动态,系统级是否打开异步SQL日志功能。0:表示关闭;1:表示打开
MIN_EXEC_TIME0动态,系统级详细模式下,记录的最小语句执行时间,单位为毫秒。执行时间小于该值的语句不记录在日志文件中。有效值范围(0~ 4294967294)
FILE_PATH…\LOG动态,系统级日志文件所在的文件夹路径
BUF_TOTAL_SIZE10240动态,系统级SQL日志BUFFER占用空间的上限,单位为KB,取值范围(1024~1024000)
BUF_SIZE1024动态,系统级一块SQL日志BUFFER的空间大小,单位为KB,取值范围(50~409600)
BUF_KEEP_CNT6动态,系统级系统保留的SQL日志缓存的个数,有效值范围(1~100)
PART_STOR0手动SQL日志分区存储,表示SQL日志进行分区存储的划分条件。0表示不划分;1表示USER:根据不同用户分布存储
ITEMS0手动配置SQL日志记录中的那些列要被记录。该参数是一个格式化的字符串,表示一个记录中的那些项目要被记录,格式为:列号:列号:列号。列如:3:5:7表示第3,第5,第7列要被记录。
0 表示记录所有的列
1 TIME 执行的时间
2 SEQNO 服务器的站点号
3 SESS 操作的SESS地址
4 USER 执行的用户
5 TRXID 事务ID
6 STMT 语句地址
7 APPNAME 客户端工具
8 IP 客户端IP
9 STMT_TYPE 语句类型
10 INFO 记录内容
11 RESULT 运行结果,包括运行用时和影响行数(可能没有)
USER_MODE0手动SQL日志按用户过滤时的过滤模式,取值 0:关闭用户过滤 1:白名单模式,只记录列出的用户操作的SQL日志 2:黑名单模式,列出的用户不记录SQL日志
USERS空串手动打开SVR_LOG_USER_MODE时指定的

打开SQL日志记录功能

  • 如果sqllog.ini文件存在,且相关配置无错误(sqllog.ini文件默认存在),且数据库SVR_LOG_NAME参数的值与sqllog.ini中模块名相同(默认为SLOG_ALL) ,将数据库SVR_LOG参数设置为1打开SQL日志,此时记录SQL日志属性以sqllog.ini中配置的为准。
  • 如果sqllog.ini文件不存在或者 sqllog.ini 配置错误,SVR_LOG参数设置为1打开SQL日志,SQL日志属性以dm.ini里面配置的相关参数为准。

方式1:配置sqllog.ini

1、查看数据库相关参数

SQL> SELECT para_name,para_value,sess_value,file_value FROM V$DM_INI where para_name in ('SVR_LOG','SVR_LOG_NAME');

行号     PARA_NAME    PARA_VALUE SESS_VALUE FILE_VALUE
---------- ------------ ---------- ---------- ----------
1          SVR_LOG_NAME SLOG_ALL   SLOG_ALL   SLOG_ALL
2          SVR_LOG      0          0          0

#SVR_LOG=0表示未打开SQL日志

2、配置sqllog.ini

为避免对性能产生影响,采用异步记录SQL日志,记录所有用户执行超过28ms的SELECT语句包括绑定参数,执行计划,执行时间,参数的序号、数据类型和值。sql日志文件放在/dm/dmdbms/log下(DMSQL_实例名_日期时间.LOG),单个日志文件达到100M后切换到新的日志文件,总共记录20个日志文件,当达到20个日志文件后,会删除最早的那个日志文件。

sqllog.ini配置文件内容如下:

BUF_TOTAL_SIZE          = 10240         #SQLs Log Buffer Total Size(K)(1024~1024000)
BUF_SIZE                = 1024          #SQLs Log Buffer Size(K)(50~409600)
BUF_KEEP_CNT            = 6             #SQLs Log buffer keeped count(1~100)

[SLOG_ALL]
    FILE_PATH    = /dm/dmdbms/log
    PART_STOR    = 0
    SWITCH_MODE  = 2
    SWITCH_LIMIT   = 100                  
    ASYNC_FLUSH   = 1                     #表示异步记录SQL日志
    FILE_NUM = 20          
    ITEMS    = 0 
    SQL_TRACE_MASK  = 7:22:25:28          #表示记录SQL的类型
    MIN_EXEC_TIME = 28                    #表示记录执行时间超过28ms的SQL语句
    USER_MODE   = 0 
    USERS =

注意:只有把 INI 参数 SVR_LOG 置为 1, 且 SVR_LOG_NAME 为 SLOG_ALL 时,sqllog.ini 中名称为 SLOG_ALL 的配置块才会生效。 若 SVR_LOG 为 1,但不存在sqllog.ini 或 sqllog.ini 配置错误,则仍旧使用 dm.ini 中的相关参数.

3、设置SVR_LOG参数为1,打开SQL日志

SP_SET_PARA_VALUE(1,'SVR_LOG',1);

4、在线修改sqllog.ini文件后,可以调用过程SP_REFRESH_SVR_LOG_CONFIG() 对后面新的会话生效。

方式2:配置dm.ini

除了配置sqllog.ini 以外,还可以配置dm.ini中相关数据库参数。但是需要注意的是,如果sqllog.ini配置文件存在且配置正确,那么SQL日志以sqllog.ini中的配置来记录符合条件的SQL信息。

1、设置相关数据库参数

#记录SQL的类型
SF_SET_SYSTEM_PARA_VALUE('SQL_TRACE_MASK','7:22:25:28',0,1); 
#异步记录SQL日志
SF_SET_SYSTEM_PARA_VALUE('SVR_LOG_ASYNC_FLUSH',1,0,1);
#记录执行时间超过20ms的SQL语句
SF_SET_SYSTEM_PARA_VALUE('SVR_LOG_MIN_EXEC_TIME',20,0,1);  
#总共记录多少个日志文件
SF_SET_SYSTEM_PARA_VALUE('SVR_LOG_FILE_NUM',20,0,1);

SF_SET_SYSTEM_PARA_VALUE用与修改系统整型、double、varchar的静态配置参数或动态配置参数。
有4个参数:
第一个参数为ini 参数的参数名
第二个参数为要设置的新值
第三个参数为是否立即生效。为 0 表示当前 session 修改的参数立即生效,为 1 表示当前 session 不生效,后续再生效,默认为 0。
第四个参数为scope,取值为 0、1、2 。0表示修改内存中的参数值,1表示修改内存和INI文件中参数值,0和1都只能修改动态的配置参数。2表示修改INI文件中参数,此时可用来修改静态配置参数和动态配置参数。

2、设置SVR_LOG参数为1,打开SQL日志

SP_SET_PARA_VALUE(1,'SVR_LOG',1);

测试验证

首先,按照上面的方式同时配置sqllog.ini和dm.ini相关参数,进行测试验证。
其中sqllog.ini中是记录执行时间超过28ms的SELECT语句,dm.ini中是记录超过20ms的SELECT语句。
因为上面的配置只记录超过执行时间的SELECT查询语句,所以我们可以先验证DDL操作和增删改操作是否会被记录,配置正确的话应该都不会被记录到日志。

1、测试DDL和增删改操作

---执行SQL
SQL> drop table test ;
操作已执行
已用时间: 87.225(毫秒). 执行号:382.
SQL> create table test (id int);
操作已执行
已用时间: 3.109(毫秒). 执行号:383.
SQL> insert into test values(1);
影响行数 1

已用时间: 0.837(毫秒). 执行号:384.
SQL> commit;
操作已执行
已用时间: 0.886(毫秒). 执行号:385.
SQL> update test set id=2 where id=1;
影响行数 1

已用时间: 5.547(毫秒). 执行号:387.
SQL> commit;
操作已执行
已用时间: 0.881(毫秒). 执行号:388.
SQL> delete from test;
影响行数 1

已用时间: 0.739(毫秒). 执行号:389.
SQL> commit;
操作已执行
已用时间: 1.003(毫秒). 执行号:390.
SQL> 

—查看dmsql日志
image-20200722164940736可以看到dmsql并未记录上述非SELECT操作,说明SQL语句记录类型的配置是正确生效的。

2、测试SELECT操作

执行几条查询语句:
image-20200722182616196
查看SQL日志:
image-20200722222354036
经过上面简单测试,可以验证配置是生效的。而且也验证了SQL日志优先使用sqllog.ini中的配置(相关的单独测试这里未记录)。

总结

经过测试,SQL日志优先使用sqllog.ini中的配置,可以在线修改sqllog.ini文件后,通过执行SP_REFRESH_SVR_LOG_CONFIG() 立即对后面新的会话生效。

在测试时,发现sqllog.ini配置的执行时间MIN_EXEC_TIME条件与disql中返回的执行已用时间有时候存在大概1ms内的误差,对于功能上来说可以忽略这点影响。

对于系统上线之前或者用于短时间的测试的情况,可以执行SP_SET_PARA_VALUE(1,‘SVR_LOG’,1);打开SQL日志,默认会捕获全部语句的全部记录,再通过相关工具导入SQL日志进行分析。

更多资讯请上达梦技术社区了解:https://eco.dameng.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值