目录
在使用达梦过程中,客户需要开启登录日志、操作日志、运行日志,并保留6个月日志数据,在处理问题过程中做以下记录:
1、开启审计记录
1.1、查看审计日志大小限制
DBA用户
查看审计日志大小,AUDIT_MAX_FILE_SIZE为系统动态参数
SELECT SF_GET_PARA_VALUE(1,'AUDIT_MAX_FILE_SIZE');
DBA用户
修改审计日志大小,默认100M,范围:1-40960M
,AUDIT_MAX_FILE_SIZE系统动态参数
SP_SET_PARA_VALUE(1,'AUDIT_MAX_FILE_SIZE',200)
1.2、开启审计日志开关
SYSAUDITOR用户
开启审计日志开关,0:关闭审计,1:打开普通审计,2:打开普通审计和实时审计
SP_SET_ENABLE_AUDIT (1);
1.3、设置审计规则
SYSAUDITOR用户
设置审计规则,以用户需求为准,SYSDBA和常用用户(如:SCMWSAPI、EULER)建议设置CONNET
\DELETE TABLE
粒度
SP_AUDIT_STMT('DELETE TABLE', 'SYSDBA', 'ALL');
SP_AUDIT_STMT('CONNECT', 'SYSDBA', 'ALL');
SP_AUDIT_STMT('DELETE TABLE', 'SCMWSAPI', 'ALL');
SP_AUDIT_STMT('CONNECT', 'SCMWSAPI', 'ALL');
SP_AUDIT_STMT('DELETE TABLE', 'EULER', 'ALL');
SP_AUDIT_STMT('CONNECT', 'EULER', 'ALL');
也可以图像化设置: 达梦数据库审计功能开启及审计记录查看
2、查看审计记录
SYSAUDITOR用户
查看审计记录
select * from v$AUDITRECORDS ORDER BY OPTIME DESC;
3、删除审计记录
3.1、删除指定日期之前的审计记录-手动
SYSAUDITOR用户
删除指定日期之前的审计日志,0 表示删除普通审计文件,1 表示删除实时审计文件
SP_DROP_AUDIT_FILE('2024-8-23 14:30:00',0);
3.2、删除指定日期之前的审计记录-定时作业(作废
)
使用SYSDBA用户创建作业,执行作业会提示:没有审计权限
前提初始化代理
,倘若未初始化代理,请用SYSDBA(DBA)执行函数创建系统作业表
SP_INIT_JOB_SYS(1);
DBA用户
设置,保留半年的审计日志,即6个月。
call SP_CREATE_JOB('PURGE_AUDIT',1,0,'',0,0,'',0,'清理6个月前的审计文件');
call SP_JOB_CONFIG_START('PURGE_AUDIT');
call SP_ADD_JOB_STEP('PURGE_AUDIT', 'STEP1', 0, 'SP_DROP_AUDIT_FILE(now()-180,0)', 1, 2, 0, 0, NULL, 0);
call SP_ADD_JOB_SCHEDULE('PURGE_AUDIT', 'purge1', 1, 1, 1, 0, 0, '23:30:00', NULL, '2024-02-23 00:00:00', NULL, '');
call SP_JOB_CONFIG_COMMIT('PURGE_AUDIT');
如创建失败,可删除作业
call SP_DROP_JOB('PURGE_AUDIT');
参考链接: 定期清理审计日志
3.3、使用shell脚本删除
#!/bin/bash
#############################脚本描述,区域开始##############################
## Filename :
## Write by lpb
## Descript : 删除6个月前的审计日志,本脚本必须以dmdba用户执行
#############################脚本描述,区域结束##############################
#############################配置路径信息-必填##############################
#指定日志文件存储的目录
search_dir="/dmdata/DAMENG"
#############################配置路径信息-必填##############################
#############################内部逻辑处理##############################
# 检查是否为dmdba用户
if [ ! "x$(whoami)" = "xdmdba" ]; then
echo "必须以dmdba用户执行此脚本!" >&2
exit 1
fi
# 切换到该目录(如果它存在的话)
if [ -d "$search_dir" ]; then
cd "$search_dir" || exit 1 # 如果cd失败,则退出脚本
else
echo "Directory $search_dir does not exist."
exit 1
fi
# 计算6个月前的日期(仅年份和月份)
six_months_ago=$(date -d "6 months ago" +%Y-%m)
# 使用find命令在当前目录下搜索符合条件的文件
find . -type f -name "AUDIT*.log" | while read file; do
# 注意:这里的$file已经是相对路径了
# 使用正则表达式匹配并捕获日期部分
if [[ "$file" =~ AUDIT_[^_]*_[^_]*_([0-9]{4})-([0-9]{1,2})-[^_]*\.log$ ]]; then
# 提取年份和月份
year="${BASH_REMATCH[1]}"
month="${BASH_REMATCH[2]}"
# 格式化月份(虽然在这个比较中可能不是必需的)
month=$(printf "%02d" "$month")
# 构造要比较的年月字符串
file_year_month="${year}-${month}"
# 比较年月
if [[ "$file_year_month" < "$six_months_ago" ]]; then
# 删除文件
rm "$file"
echo "Deleted: $file"
fi
fi
done
4、其他
删除ELOG文件
#删除文件名为”dm_DMSEVER_202209.log”的本地日志文件:
SP_ELOG_FILE_DELETE('DM_DMSEVER_202209.LOG');
#删除文件名为”dm_DMSEVER_202209.log”的站点为0的服务器日志文件:
SP_ELOG_FILE_DELETE(0,'DM_DMSEVER_202209.LOG');
#查看ELOG文件
select * from v$ELOG_FILE;
或者使用shell脚本
#!/bin/bash
#############################脚本描述,区域开始##############################
## Filename :
## Write by lpb
## Descript : 删除6个月前的运行日志,本脚本必须以dmdba用户执行
#############################脚本描述,区域结束##############################
#############################配置路径信息-必填##############################
#指定日志文件存储的目录
LOG_DIR="/home/dmdba/dmdbms/log"
#############################配置路径信息-必填##############################
#############################内部逻辑处理##############################
# 检查是否为dmdba用户
if [ ! "x$(whoami)" = "xdmdba" ]; then
echo "必须以dmdba用户执行此脚本!" >&2
exit 1
fi
# 进入日志文件目录
if [ -d "$LOG_DIR" ]; then
cd "$LOG_DIR" || exit 1 # 如果cd失败,则退出脚本
else
echo "Directory $LOG_DIR does not exist."
exit 1
fi
# 计算6个月前的日期(仅年份和月份)
SIX_MONTHS_AGO=$(date -d "6 months ago" +%Y%m)
# 查找并删除符合条件的日志文件
find . -type f -name "*.log" | while read file; do
# 提取文件名中的日期部分(YYYYMM)
if [[ "$file" =~ dm_.*_([0-9]{4})([0-9]{2})\.log$ ]]; then
file_date="${BASH_REMATCH[1]}${BASH_REMATCH[2]}"
# 比较文件日期与6个月前的日期
if [ "$file_date" "<" "$SIX_MONTHS_AGO" ]; then
# 删除文件
rm "$file"
echo "Deleted: $file"
fi
fi
done