如果需要对达梦日志进行采集保存并分析,就需要对其位置、内容、生成等方面进行全面控制,以下对日志的控制生成和内容分析进行讲解。
达梦sql日志开关,需要修改初始化参数SVR_LOG,可使用以下存储过程
开启 SQL 日志:SP_SET_PARA_VALUE(1, ‘SVR_LOG’, 1);
关闭 SQL 日志:SP_SET_PARA_VALUE(1, ‘SVR_LOG’, 0);
达梦数据库安装完成后会在 安装目录/data/数据库名/下生成sqllog.ini文件,用于控制sql日志文件路径、文件数、文件切换模式、日志内容、执行时长限制等。
示例配置如下:
BUF_TOTAL_SIZE = 10240 #SQLs Log Buffer Total Size(K)(1024~1024000)
BUF_SIZE = 1024 #SQLs Log Buffer Size(K)(50~102400)
BUF_KEEP_CNT = 6 #SQLs Log buffer keeped count(1~100)
[SLOG_ALL]
FILE_PATH = ../log # 日志路径
PART_STOR = 0 # SQL 日志分区存储,表示 SQL 日志进行分区存储的划分条件。 0 表示不划分;1 表示 user:根据不同用户分布存储
SWITCH_MODE = 2 # 表示 SQL 日志文件切换的模式: 0:不切换 1:按文件中记录数量切换 2:按文件大小切换 3:按时间间隔切换
SWITCH_LIMIT = 128 # 不同切换模式 SWITCH_MODE 下,意义不同,查看下方参考
ASYNC_FLUSH = 1 # 是否打开 SQL 日志异步刷盘功能。0:否,采用实时刷盘( 确保数据绝对安全,但性能会有20%-50%的下降(取决于磁盘速度));1:是,采用异步刷盘 (显著提升性能(特别是IO密集型场景) 降低高并发下的响应延迟 适合对性能要求高于数据安全性的场景
FILE_NUM = 5 # 总共记录多少个日志文件,超出后删除最早文件,取值范围 2~1024
ITEMS = 0 # (重要)指定一条 SQL 日志中应包含的内容,根据日志使用用途进行调整,具体内容参考达梦文档。
SQL_TRACE_MASK = 1 # (重要)指定 SQL 日志中需要被记录的语句类型。为了避免日志量过大,建议用户根据实际需要有选择地指定,而非一律全部指定。具体内容参考达梦文档。
MIN_EXEC_TIME = 0 # 记录的最小语句执行时间,单位毫秒。执行时间小于该值的语句不记录在日志文件中。取值范围 0~2147483647
USER_MODE = 0 # 和users配置一同使用。SQL日志按用户过滤时的过滤模式,取值 0:关闭用户过滤 1:白名单模式,只记录列出的用户操作的 SQL 日志 2:黑名单模式,列出的用户不记录 SQL 日志。可根据要求对不同用户进行过滤
USERS = # 打开 USER_MODE 时指定的用户列表。格式为:用户名:用户名:用户名
EXECTIME_PREC_FLAG = 0 # 设置 SQL 日志中执行时间 exectime 的时间单位。0:单位为毫秒 ms;1:单位为微秒 us
[SLOG_ERROR] #错误日志记录内容
SQL_TRACE_MASK = 23
FILE_PATH = ../log
[SLOG_DDL] #数据定义sql日志记录内容
SQL_TRACE_MASK = 3
[SLOG_LONG_SQL] #慢日志日志记录内容
SQL_TRACE_MASK = 25
MIN_EXEC_TIME = 60000
其具体配置项取值和含义可以参考达梦文档:达梦技术文档-物理存储结构-sqllog.ini
日志配置为:
ITEMS = 0 SQL_TRACE_MASK = 2:3:23:25
时,日志内容如下:
2025-05-08 15:59:07.441 (EP[0] sess:0x7fe8a80111f8 thrd:468161 user:CDB_PORTAL trxid:0 stmt:0x7fe8a80341f8 appname: ip:::ffff:10.0.4.22) [SEL] select 1 from dual EXECTIME: 0(ms) ROWCOUNT: 1(rows).
2025-05-08 15:59:07.441 sql记录时间
(
EP[0] SEQNO 服务器的站点号
sess:0x7fe8a80111f8 SESS 操作的 SESS 地址
thrd:468161 THRD 线程地址
user:TEST USER 执行的用户
trxid:0 TRXID 事务 ID
stmt:0x7fe8a80341f8 STMT 语句地址
appname: ip:::ffff:10.0.4.22 APPNAME 客户端工具
)
[SEL] STMT_TYPE 语句类型 分别为[ORA]表示原始语句(服务器从客户端收到的未加分析的语句) 、[DDL]表示 DDL 语句、[INS]表示 INSERT 语句、[DML]表示 DML 语句、[CAL]表示 CALL 语句、[UPD] 表示 UPDATE 语句、[DEL] 表示 DELETE 语句、[SEL]表示 SELECT 语句、[LGN]表示登录登出语句
select 1 from dual 记录当前执行的 SQL 语句 使用manager工具或者DM web 版数据库管理工具(DEM)进行sql执行时,根据不同版本可能会在sql前添加类似/***MANAGER***/或/***DEM***/,可以以此区分sql在哪里进行了执行,没标注时可认为是jdbc驱动操作。
EXECTIME: 0(ms) sql执行时长
ROWCOUNT: 1(rows). 影响行数
可以使用正则表达式对日志内容进行提取, 例如从上述日志行中提取用户, user:([^\s)]+), 使用正则表达式提取内容, 用于日志数据保存.
使用第三方工具采集解析sql日志时注意日志的时间,默认情况下时间精度为毫秒,在采集日志过程中应记录采集的时间以用于相同执行时间sql的排序,确保日志采集顺序和后续使用的稳定。
如果设置了items=11 运行结果,包括运行用时、影响行数和 EXEC_ID(可能没有),可以通过EXEC_ID==-1判断sql执行失败,用于区分执行结果,强调不同数据库版本EXEC_ID可能没有,要做好相关处理。
日志当中的慢sql可以通过修改数据库慢日志最短执行时长来进行统一设置 call SP_SET_LONG_TIME(#{time}); SELECT SF_GET_LONG_TIME();以此进行通用的超过指定时长慢日志查询和分析。
注:sql日志不是审计日志,两者有本质区别,不要混淆。
sql日志的记录对于应用的运行过程、慢sql分析、故障检查有重要意义,应该妥善保存和分析。
文章
阅读量
获赞