说起数据库的日志,一般有redo日志、归档日志、错误日志、审计日志等,不同的数据库为了满足其特定的功能会有不同类型的日志。在ORACLE的日常运维中,可能接触得最多的就是redo日志、归档日志、告警日志、闪回日志这几种日志。在ORACLE知识体系中,一般把redo、undo、checkpoint这几个知识点放在一起,这也是更好的学习数据库的路线。但我更想从MySQL的视角,把数据库的各种日志放在一起做个总结。
一、redo日志
搞数据库的都知道,redo日志的功能主要是用来clash recovery(崩溃恢复),保证数据的一致性。在ORACLE中,Redo的功能主要通过三个组件来实现:Redo Log Buffer、LGWR后台进程和Redo Log File。Oracle通过后台进程LGWR不断的把Redo Log Buffer的内容写到Redo Log File中,下图说明了三者的关系。
数据库会默认创建三个redo log日志组,在数据目录下可以看到有三个redo0x.log文件。当一个日志文件写满之后,会切换到另外一个日志文件,这个切换过程称为Log Switch,因此Log Switch会出发一个checkpoint确保该日志文件对应的变更数据落盘。通过v$log可以查看查看当前redo日志组的状态。其中STATUS列显示了日志文件的状态:当状态为CURRENT,指的是当前的日志文件是活动的,当前正在被使用的;当状态为ACTIVE,指的是活动的非当前日志,检查点尚未完成,该日志在clash recovery也会被用到;当状态为INACTIVE,指该日志非活动,对应的变更数据都已落盘,非活动日志在实例恢复时已经不再需要。
为了让用户可以快速提交,日志快速落盘,已提交的数据不丢,保证数据的一致性,LGWR进程写日志触发条件有以下几个:每3秒超时;Redo Log Buffer1/3满;Redo Log Buffer中有1M脏数据;用户提交;在DBWR进程写之前。
二、归档日志
当redo log 文件写满后,新的redo log会重用之前的redo log文件,因此原来的记录会被直接覆盖,为了保证日志的连续性,可以在ORACLE数据库中开启归档模式,就是将经写满的重做日志文件通过复制方式保存到指定的位置,也就是归档日志。开启归档后,会启动后台进程ARCN,在日志切换时,LGWR进程写之前备份历史日志。对于生产环境的数据库系统都应该开启归档模式,以便数据库能支持热备,并提供数据库完全恢复和不完全恢复。非归档只适用某种静态库、测试库、或者可以通过其他方式恢复数据的数据库,非归档模式只能冷备, 且仅能还原最后一次全备。而归档模式可以恢复到最后一次commit。
通过archive log list或v$database视图可以查看数据库是否开启了归档模式:
通过参数log_archive_dest_n可以设置ORACLE数据库的多个归档路径,n可以是1~31。如果在参数中指定了service:alter system set log_archive_dest_2='service=standby', 那么则代表把日志归档到服务名standby为远程的服务器。log_archive_format参数用来定义归档日志的命名格式,一般默认为%t_%s_%r.dbf,%t代表日志线程号、%s代表日志序列号、%r代表数据库的周期。
开启归档模式,是需要重启数据库,并在mount状态开启归档模式,以下是数据库开启归档的步骤:
#创建归档目录 mkdir -p /u01/oracle/arch chown -R oracle:oinstall /u01/oracle/arch #设置归档目录参数 alter system set log_archive_dest_1='location=/u01/oracle/arch'; #正常关库,然后启动到mount状态 shutdown immediate; startup mount; archive log list; #开启归档,启动数据库 alter database archivelog; alter database open; archive log list;
三、告警日志
告警日志是日常排查数据库问题使用最多的方式之一,记录着数据库的“编年史”,在MySQL中这个日志叫错误日志。ORACLE的告警日志位于$ORACLE_HOME/diag/rdbms/ORACLE_SID/ORACLE_SID/trace目录下,在ORACLE中可以通过v$dig_info视图查看告警日志的存放路径。
可以看到,在告警日志目录下,除了告警日志文件alert_orcl.log,还有很多trc和trm文件。trc文件即trace collection file,它是系统的跟踪文件,trc文件中包含了大量且详细的诊断和调试信息。trm文件即trace map file,称为元数据跟踪文件,记录了描述trc文件跟踪记录的元数据信息。在SQL的优化与分析中,可以通过alter session set sql_trace=true命令开启会话的跟踪,这样会话执行SQL的执行计划、执行流程中的各方面信息比如物理读,cpu消耗等将会详细记录在trc文件中,这样将可以排查出一条SQL具体慢在哪里。通过TKPROF工具可以格式化trc文件,增强可读性。此外,在$ORACLE_HOME/diag/rdbms/ORACLE_SID/ORACLE_SID/alert目录下还有一个log.xml文件,这个就是XML格式的警告日志,其实内容和alert_orcl.log是一样,XML文件主要是方便一些工具来生成报告,dba实际排查问题看alert_orcl.log文件还是更方便一些。
四、闪回日志
闪回日志是为了支持flash database而引入的,闪回日志中包含数据块被修改之前的映像,可以用于将数据库恢复到某个时间点之前的状态。这里就不过多赘述了,后面准备专门写一篇总结ORACLE的闪回技术。
五、总结
从数据库几种常用的日志来看,ORACLE和MySQL差别还是很大。MySQL记录数据变化的日志除了redo还有binlog,而MySQL的redo无法归档,只能用来crash recovery。在MySQL中,通过binlog完成主从复制和保证日志连续性,这种记录数据逻辑变化的日志也特别方便异构数据的复制,衍生了canel等开源数据同步工具。ORACLE告警日志更详细,还可以通过跟踪文件提供更详细的数据库诊断信息,相比而言MySQL的errorlog就显得太简单了,MySQL中遇到异常崩溃通常需要收集coredump信息跟踪源码才能更好的定位问题。
标签:log,DBA,数据库,MySQL,归档,ORACLE,日志,redo From: https://www.cnblogs.com/coygfly/p/18231885