目录
1、SQL日志
用户在 dm.ini 中配置 SVR_LOG 参数后就会打开 SQL 日志。
SQL 日志文件是一个纯文本文件。命名格式为“dmsql_实例名[_模式名][_用户名][_日期_时间].log”。当 sqllog.ini 中存在多个有效模式名时,日志文件名中会添加“_模式名”,否则不添加;当 sqllog.ini 参数 PART_STOR=1 时,日志文件名中会添加“_用户名”,否则不添加;当 sqllog.ini 参数 SWITCH_MODE 不为 0 时,日志文件名中会添加“_日期_时间”,否则不添加。
SQL 日志文件缺省生成在 DM 安装目录的 log 子目录下面,管理员可通过 sqllog.ini 参数 FILE_PATH 设置其生成路径。
SQL 日志内容包含系统各会话执行的 SQL 语句、参数信息、错误信息等。跟踪日志主要用于分析错误和分析性能问题,基于跟踪日志可以对系统运行状态有一个分析,比如,可以挑出系统现在执行速度较慢的 SQL 语句,进而对其进行优化。
系统中 SQL 日志的缓存是分块循环使用,管理员可根据系统执行的语句情况及压力情况设置恰当的日志缓存块大小及预留的缓冲块个数。当预留块不足以记录系统产生的任务时,系统会分配新的用后即弃的缓存块,但是总的空间大小由 sqllog.ini 参数 BUF_TOTAL_SIZE 控制,管理员可根据实际情况进行设置。
打开 SQL 日志会影响系统的性能,因此一般在需要查错和调优的时候才会打开。缺省情况下系统是关闭 SQL 日志的。若用户需要打开 SQL 日志,同时对日志的实时性并没有严格的要求,又希望系统性能好,此时可以从两方面进行改进:一设置 sqllog.ini 参数 SQL_TRACE_MASK 和 MIN_EXEC_TIME 只记录关注的相关记录,减少日志总量;二设置 sqllog.ini 参数 ASYNC_FLUSH 打开 SQL 日志异步刷盘提高系统性能。
用户可以调用系统过程 SP_SET_SQLLOG_INI()或SP_DELETE_SQLLOG_INI_MODE()来动态修改 sqllog.ini 文件的内容,修改后可以调用系统过程 SP_REFRESH_SVR_LOG_CONFIG()更新内存中对应的参数值,以使所做的修改生效。利用动态视图 V$DM_SQLLOG_INI 可以查询 sqllog.ini 文件中的 SQL 日志配置参数,利用动态视图 V$DM_SQLLOG_CONFIG 可以查询内存中的 SQL 日志配置参数。
SQL 日志开启
注意
- 如果需要开启 SQL 日志,则必须配置日志切换模式 SWITCH_MODE 和 FILE_NUM,防止日志无限增长导致磁盘撑爆;
(2)同步日志会影响系统效率,生产环境建议设置为异步日志;
(3)在设置 SQL 过滤规则 SQL_TRACE_MASK 时,建议只设置需要记录的 SQL 掩码,生产环境不要直接设成 1。
创建 SQL 日志存放目录
su - dmdba
mkdir -p /dm/log/logcommit
检查 SVR_LOG 参数
select * from v$parameter where name like 'SVR_LOG';
修改实例路径下 sqllog.ini 文件
如下:设置 sql 日志为异步,按照文件大小进行切换,每个 1024M,20 个文件循环写。
cd /dm/data/DAMENG
vi 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/log/logcommit #sql 日志生成路径
PART_STOR = 0
SWITCH_MODE = 2
SWITCH_LIMIT = 1024 #每个日志文件 1024M
ASYNC_FLUSH = 1
FILE_NUM = 20 #循环收集 20 个可以根据实际情况做调整
ITEMS = 0
SQL_TRACE_MASK = 1
MIN_EXEC_TIME = 0
USER_MODE = 0
USERS =
EXECTIME_PREC_FLAG = 0
[SLOG_ERROR]
SQL_TRACE_MASK = 23
FILE_PATH = ../log
[SLOG_DDL]
SQL_TRACE_MASK = 3
[SLOG_LONG_SQL]
SQL_TRACE_MASK = 25
MIN_EXEC_TIME = 60000
执行调用存储过程生效配置文件,并开启 SQLLOG 日志。
SP_REFRESH_SVR_LOG_CONFIG();
sp_set_para_value(1,'SVR_LOG',1);
--检查 SVR_LOG 参数。
select * from v$parameter where name like 'SVR_LOG';
检查日志生成情况
ls /data/log/logcommit
SQL日志分析
SQL 日志记录了数据库服务器从客户端接收到的 SQL 请求语句,包括 SQL 语句对应的时间戳、用户名、事务号、SQL 文本和执行时间等信息。举例说明:
2022-03-23 15:04:06.926 (EP[0] sess:0000000059587140 thrd:6956 user:SYSDBA trxid:2574604 stmt:00000000595AB938 appname:manager.exe ip:127.0.0.1) [SEL] select COMMENT$ from SYS.SYSCOLUMNCOMMENTS where SCHNAME='SYSDBA' and TVNAME='T11' and COLNAME='STRIP' EXECTIME: 0(ms).
该条信息解读如下:
- 2022-03-23 15:04:06.926 表示该条 SQL 被记录下来的时间;
- sess:0000000059587140 表示该 SQL 对应的 session_id 为 0000000059587140;
- thrd:6956 表示该 SQL 对应的线程 id 为 6956;
- user:SYSDBA 表示执行该 SQL 时所使用的的数据库登录用户为 SYSDBA;
- trxid:2574604 表示该 SQL 对应事务的 trx_id 为 2574604;
- stmt:00000000595AB938 表示该 SQL 对应的会话句柄号为 00000000595AB938;
- appname:manager.exe 表示发出该 SQL 请求对应的应用名称,如果为 NULL 表示应用代码中没有填充应用名称值;
- ip:127.0.0.1 表示发出该 SQL 请求的客户端机器的 IP 地址;
- [SEL] 表示该 SQL 所属类型,SEL 表示该 SQL 为查询语句;
- select COMMENT$ from SYS.SYSCOLUMNCOMMENTS where SCHNAME='SYSDBA' and TVNAME='T11' and COLNAME='STRIP' 表示该 SQL 对应的 SQL 语句完整文本信息;
- EXECTIME: 0(ms)表示该 SQL 的执行耗时;
此外,达梦提供达梦 SQL 日志分析工具 DMLOG。该工具通过分析数据库的 SQL 日志文件,直观地反映 SQL 执行情况。
2、Redo日志
重做日志(即 REDO 日志)指在 DM 数据库中添加、删除、修改对象,或者改变数据,DM 都会按照特定的格式,将这些操作执行的结果写入到当前的重做日志文件中。每个 DM 数据库实例必须至少有 2 个重做日志文件,默认两个日志文件为 DAMENG01.log、DAMENG02.log,这两个文件循环使用。
添加日志文件
ALTER DATABASE ADD LOGFILE 'd:\DAMENG03.log' size 128;
扩展日志文件
ALTER DATABASE RESIZE LOGFILE 'd:\DAMENG03.log' to 256;
查看日志文件
select group_id,
file_id,
path,
create_time,
round(rlog_size/1024/1024,2) as "RLOG_SIZE(MB)"
from v$rlogfile;
SELECT
A.FILE_ID ,
A.PATH ,
A.CLIENT_PATH,
A.RLOG_SIZE ,
B.FREE_SPACE ,
B.TOTAL_SPACE,
B.CUR_FILE
from
(
select * from V$RLOGFILE where true
) A,
(
select * from V$RLOG where true
) B;
redo文件损坏解决
- 创建临时实例
- 将创建好的REDO LOG文件复制到旧环境中
- 使用dmmdf工具修改redo日志的db_magic的值,两个文件都要改,保持和源库一样。
查看:
dmmdf type=1 file=SYSTEM.DBF
修改:
dmmdf type=2 file=DAMENG02.log
- 修改PSEG_RECV参数,默认为3,修改为0,表示跳过回滚活动事务和PURGE已经提交事务的步骤。
- 启动故障实例
- 导出数据,重新导入新实例
3、归档日志
联机配置归档
修改数据库为MOUNT状态,并开启归档模式
ALTER DATABASE MOUNT;
ALTER DATABASE ARCHIVELOG;
配置本地归档
ALTER DATABASE ADD ARCHIVELOG 'DEST = /dmdata/dameng/arch_dsc0, TYPE = local, FILE_SIZE = 1024,SPACE_LIMIT = 2048,ARCH_FLUSH_BUF_SIZE=16,HANG_FLAG=1';
修改数据库为OPEN状态
ALTER DATABASE OPEN;
手动配置归档
- 手动编辑 dmarch.ini 文件
dmarch.ini 文件内容如下:
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = d:\dm_arch\arch
ARCH_FILE_SIZE = 1024
ARCH_SPACE_LIMIT = 2048
- 编辑 dm.ini 文件,设置参数 ARCH_INI=1,保存;
- 重启数据库实例,数据库已运行于归档模式。
归档信息的查看
配置信息查看:
select arch_name,
arch_type,
arch_dest,
arch_file_size,
arch_space_limit,
arch_is_valid,
arch_incoming_path,
arch_curr_dest
from V$DM_ARCH_INI;
归档日志文件的查看:
select * from V$ARCHIVED_LOG ORDER BY FIRST_CHANGE# DESC;
--V$ARCH_FILE中的CLSN和monitor中的CLSN比较可以判断归档是否应用。
select * from V$ARCH_FILE;
清理归档日志
1、通过参数清理
ARCH_SPACE_LIMIT:Redo日志归档空间限制,当同一节点的本地归档文件或远程归档文件达到限制值时,系统自动删除最早生成的归档日志文件。
0表示无空间限制,可手动修改dmarch.ini中ARCH_SPACE_LIMIT参数,也可sql执行。
alter database modify archivelog 'DEST=/data/dmarch, TYPE=LOCAL, FILE_SIZE=128, SPACE_LIMIT=1024';
ARCH_RESERVE_TIME:归档日志保留时间,单位分钟,只对远程归档和本地归档有效,服务器每隔5分钟检查是否存在超过保留时间的归档并删除。默认为0,表示不删除归档。
2、通过存储过程函数清理
SF_ARCHIVELOG_DELETE_BEFORE_TIME
SF_ARCHIVELOG_DELETE_BEFORE_LSN
例:
删除三天之前的归档日志:
SELECT SF_ARCHIVELOG_DELETE_BEFORE_TIME(SYSDATE - 3);
删除 LSN 值小于 95560 的归档日志文件:
SELECT SF_ARCHIVELOG_DELETE_BEFORE_LSN(95560);
4、闪回
查看闪回功能状态
SELECT name,
TYPE,
VALUE,
sys_value,
file_value
FROM v$parameter
WHERE name LIKE '%FLASHBACK%';
或者
SHOW PARAMETER FLASH
SQL> SHOW PARAMETER FLASH
行号 PARA_NAME PARA_VALUE
---------- ---------------- ----------
1 ENABLE_FLASHBACK 0
开启闪回
alter system set 'enable_flashback'=1 both;
或者
SP_SET_PARA_VALUE (1, 'ENABLE_FLASHBACK', 1);
//scope 为 1 表示 dm.ini 文件和内存参数都修改,不需要重启服务器。
//scope 为 2 表示只修改 dm.ini 文件,服务器重启后生效。
//value: 设置的值。
由于回滚段默认每秒种都会自动清理,所以需要延长回滚记录的保留时间,单位是秒。回滚段参数太大容易引发回滚段膨胀,这里设置为 1200s。
ALTER SYSTEM SET 'undo_retention'=1200 BOTH;
SELECT name,
TYPE,
VALUE,
sys_value,
file_value
FROM v$parameter
WHERE name = 'UNDO_RETENTION';
闪回查询
按timestamp查询
SELECT *
FROM dmhr.city
WHEN TIMESTAMP '2020-11-03 09:56:06'
WHERE city_id='CD';
按事务ID查询
使用 versions_endtrxid 伪列查询事务 id 号
SELECT versions_endtrxid, *
FROM dmhr.job VERSIONS BETWEEN TIMESTAMP '2020-11-03 10:30:00' AND SYSDATE
WHERE JOB_ID = 22;
SELECT * FROM dmhr.job WHEN TRXID 58519 WHERE JOB_ID=22;
闪回事务查询
SELECT commit_trxid, operation,table_name,undo_sql FROM V$FLASHBACK_TRX_INFO;
5、其他事件日志
数据库实例日志
一般默认命名为 “dm_实例名称_月份.log”。例如数据库实例日志 “dm_DMSERVER_202203.log”。记录了数据库服务启动、刷检查点、写归档、刷盘等。
DMAP进程日志
命名方式为 “dm_DMAP_日期.log”。例如 DMAP 进程日志 “dm_dmap_202407.log”。记录 DMAP 进程运行情况。
数据库备份日志
命名格式为 “dm_BAKES_日期.log”。例如数据库备份日志 “dm_DMSERVER_202203.log”。记录数据库备份的过程信息,判断备份是否完成的日志。
dmwatcher日志
配置文件dmwatcher.ini
[GRP1]
DW_TYPE = GLOBAL ##全局守护类型
DW_MODE = AUTO ##自动切换模式
DW_ERROR_TIME = 10 ##远程守护进程故障认定时间
INST_RECOVER_TIME = 60 ##主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 10 ##本地实例故障认定时间
INST_OGUID = 453331 ##守护系统唯一OGUID值
INST_INI = /dm/data/DAMENG/dm.ini ##dm.ini配置文件路径
INST_AUTO_RESTART = 0 ##打开实例的自动启动功能
INST_STARTUP_CMD = /dm/bin/dmserver ##命令行方式启动
RLOG_SEND_THRESHOLD = 0 ##指定主库发送日志到备库的时间阈值,默认关闭
RLOG_APPLY_THRESHOLD = 0 ##指定备库重演日志的时间阈值,默认关闭
dmmonitor日志
配置文件dmmonitor.ini
MON_DW_CONFIRM = 1 ##确认监视器模式
MON_LOG_PATH = /dm/data/log ##监视器日志文件存放路径
MON_LOG_INTERVAL = 60 ##每隔60s定时记录系统信息到日志文件
MON_LOG_FILE_SIZE = 32 ##每个日志文件最大32M
MON_LOG_SPACE_LIMIT = 0 ##不限定日志文件总占用空间
[GRP1]
MON_INST_OGUID = 453331 ##组GRP1的唯一OGUID值
##以下配置为监视器到组GRP1的守护进程的连接信息,以“IP:PORT”的形式配置
##IP对应dmmal.ini中的MAL_HOST,PORT对应dmmal.ini中的MAL_DW_PORT
MON_DW_IP = 192.168.169.131:52141
MON_DW_IP = 192.168.169.132:52142
DSC集群日志
例:dm_DSC01_202407.log
事件日志信息格式为:时间 + 日志类型(INFO/WARNING/ERROR/FATAL)+ 进程(database)+ 进程 ID(P 开头)+ 线程(dm_sql_thd/main_thread 等)+ 日志内容。
DSC的CSS日志
例如:dm_CSS1_202212.log
DMCSS 日志是数据库集群监控进程的运行日志,DMCSS 事件日志信息格式为:时间 + 日志类型(INFO/WARNING/ERROR/FATAL)+ 进程(dmcss)+ 进程 ID(P 开头)+ 线程 ID(T 开头)+ 日志内容。
DSC的ASM 集群日志
例如:dm_ASM1_202212.log
DMASM 日志是 DM 分布式文件系统的运行日志,DMASM 事件日志信息格式为:时间 + 日志类型(INFO/WARNING/ERROR/FATAL)+ 进程(dmasmsvr)+ 进程 ID(P 开头)+ 线程 ID(T 开头)+ 日志内容。