2017年的OOW大会上,Oracle推出自治数据库—Oracle 18C,宣告关系型数据库产品进入一个崭新的时代。
就像当年乔布斯推出划时代的IPhone手机,其使用的并非全新的技术一样,号称自治的Oracle 18C数据库,其中很多的技术也并不是一夜之间冒出来的,而是经过不断的迭代逐步完善和成熟起来的。
今天我们就来看看Oracle数据库的日志管理是如何逐步实现自治管理的。
在数据库运维管理中,经常出现的,和日志管理相关的主要问题有:
日志文件暴增,导致文件系统使用率增加触发告警,甚至出现文件系统使用率100%,数据库因为不能写入日志而夯住的情况;
个别日志文件过大,引发性能问题。比如,早先版本中因为监听日志文件过大,导致数据库连接异常;
分析数据库故障时,经常需要从海量的日志中寻找和故障问题相关的日志,影响故障诊断效率。
Oracle数据库日志可以分成以下几类:
后台进程日志
内核转储日志
用户日志
监听日志
如果是RAC环境,还包括一系列RAC相关后台进程的日志。
为了更好的管理繁多的数据库日志,Oracle自11g开始逐步改进日志管理机制。
Pre-11g日志管理
在11g之前,Oracle数据库日志目录结构如下:
数据库相关日志:$ORACLE_BASE/instance_name/bdump、cdump、udump等目录
监听日志:$ORACLE_HOME/network/log
RAC相关的日志:$CRS_HOME/log
数据库自身没有提供任何手段管理日志,只能靠人工的定期清理。
11g日志管理
自11g开始,Oracle引入自动诊断库(Automatic Diagnostic Repository)架构,重新规划了数据库日志目录结构,将整个数据库环境中各个组件的日志统一整合到$ORACLE_BASE/diag目录下,并提供了一个全新的工具—adrci,用于日志管理。
图一: ADR目录结构
adrci提供了很多的命令用于帮助管理数据库日志,比如:
show problem/incident
该命令可以显示数据库日志中记录的问题,和相关问题发生的次数(事件)。使用这个命令,我们不用手工在alert日志中去查找ORA-等错误了。
adrci> show problem
ADR Home =/u01/app/oracle/diag/rdbms/ora12c/ora12c:
*************************************************************************
PROBLEM_ID PROBLEM_KEY LAST_INCIDENT LASTINC_TIME
--------------------------------------------------------------------------------------------------- ----------------------------------------
1 ORA 7445[ksws_switch_svc] 106059 2018-05-02 15:39:29.750000+08:00
2 ORA 700 [kskvmstatact:excessive swapping observed] 108117 2018-05-03 11:38:04.033000+08:00
2 rows fetched
adrci> show incident
ADR Home =/u01/app/oracle/diag/rdbms/ora12c/ora12c:
*************************************************************************
INCIDENT_ID PROBLEM_KEY CREATE_TIME
-----------------------------------------------------------------------------------------------------------------------
108116 ORA 700 [kskvmstatact: excessiveswapping observed] 2018-05-0310:37:52.996000 +08:00
108117 ORA 700 [kskvmstatact: excessiveswapping observed] 2018-05-03 11:38:04.033000 +08:00
2 rows fetched
Ips命令
该命令可以帮助我们将与某事件或故障相关的日志打包,不用再一个个的文件去找了。
adrci> ips pack incident 108117;
Generated package 1 in file/home/ora12c/ORA700ksk_20180512160558_COM_1.zip, mode complete
Purge命令
该命令可以帮助我们清理相关的数据库日志,比如我们制定一个时间周期,即可清理掉时间周期之外的相关日志。
adrci> purge -age 60 -type incident
日志自动清理机制
11g支持两种日志保留策略:
SHORTP_POLICY,指定短生命周期文件的保留时间,如dump文件,默认30天;
LONGP_POLICY,指定长生命周期文件的保留时间,如事件日志,默认365天。
set control (SHORTP_POLICY = 1440)
12c日志管理
虽然指定日志文件的保留时间,但仍然存在因为日志文件的暴增撑满文件系统的隐患。基于11g的ADR架构,12c进一步增强了数据库日志自动清理机制,引入了基于文件大小的保存策略,只需要指定系统允许保存的最大日志文件大小,Oracle自动进行日志文件的清理。
此外,12c adrci还支持使用SQL语句查询日志文件信息。^_^黑科技有木有
select * from problem where"PROBLEM_KEY like '%600%'"
通过上述的介绍我们不难发现,Oracle数据库的日志管理已经从之前的纯人工管理,逐步进化到自动管理。我们是否可以说12c的Oracle数据库,已经实现了日志管理的自治呢?