oracle 日志

来源:互联网 发布:mac dock栏消失了 编辑:程序博客网 时间:2024/05/29 02:45

第一部分.基础知识:

可参考oracle 官方文档:Oracle Database Administrator' Guide 9i 10g 11 

一、联机重做日志(online redo log)
   1.联机重做日志     
       记录了数据的所有变化(DML,DDL或管理员对数据所作的结构性更改等); 提供恢复机制(对于意外删除或宕机利用日志文件实现数据恢复); 可以被分组管理       
   2.联机重做日志组
       由一个或多个相同的联机日志文件组成一个联机重做日志组; 至少两个日志组,每组一个成员(建议每组两个成员,分散放开到不同的磁盘);  由LGWR后台进程同时将日志内容写入到一个组的所有成员。LGWR的触发条件是:
        1). 超时(timeout)
       当LGWR处于空闲状态时,它依赖于rdbms ipc message等待,处于休眠状态,直到3秒超时时间到。 如果LGWR发现有redo需要写出,那么LGWR将执行写出操作,log file parallel write等待事件将会出现。
        2). 阈值达到
       只要一个进程在log buffer中分配空间,已经使用的Log buffer的数量将被计算。如果使用的块的数量大于或等于_log_io_size参数设置,那么将会触发LGWR写操作。
       如果此时LGWR未处于活动状态,那么LGWR将被通知去执行后台写操作。 缺省的_log_io_size等于1/3 log buffer大小,上限值为1M,此参数在X$KSPPSV中显示的0值,意为缺省值。也就是,LGWR将在Min(1M,1/3 log buffer size)时触发。 注意此处的log buffer size是以log block来衡量的。此值通常为512 bytes.
        3). 提交
       当一个事物提交时,在redo stream中将记录一个提交标志。 在这些redo被写到磁盘上之前,这个事物是不可恢复的。所以,在事务返回成功标志给用户前,必须等待LGWR写完成。进程通知LGWR写,并且以log file sync事件开始休眠,超时时间为1秒。
       Oracle的隐含参数_wait_for_sync参数可以设置为false避免redo file sync的等待,但是就将无法保证事务的恢复性.注意,在递归调用(recursive calls)中的提交(比如过程中的提交)不需要同步redo直到需要返回响应给用户。因此递归调用仅需要同步返回给用户调用之前的最后一次Commit操作的RBA。
       存在一个SGA变量用以记录redo线程需要同步的log block number。 如果多个提交在唤醒LGWR之前发生,此变量记录最高的log block number,在此之前的所有redo都将被写入磁盘。这有时候被称为组提交(group commit). 
       4). 在DBWR写之前
       如果DBWR将要写出的数据的高RBA超过LGWR的on-Disk RBA,DBWR将post LGWR去执行写出。
       在Oracle8i之前,此时DBWR将等待log file sync事件。 从Oracle8i开始,DBWR把这些Block放入一个defer队列,同时通知LGWR执行redo写出,DBWR可以继续执行无需等待的数据写出。         
   3.联机重做日志成员
       重做日志组内的每一个联机日志文件称为一个成员,  一个组内的每一个成员具有相同的日志序列号(logsequence number),且成员的大小相同。  每次日志切换时,Oracle服务器分配一个新的LSN号给即将写入日志的日志文件组,  LSN号用于唯一区分每一个联机日志组和归档日志。处于归档模式的联机日志,LSN号在归档时也被写入到归档日志之中 。
   4.日志文件的工作方式
       日志文件采用按顺序循环写的方式, 当一组联机日志组写满,LGWR则将日志写入到下一组,当最后一组写满则从第一组开始写入。 写入下一组的过程称为日志切换, 切换时发生检查点过程, 检查点的信息同时写入到控制文件 。
   5.联机日志文件的规划
    总原则
    1).分散放开,多路复用
    2).日志所在的磁盘应当具有较高的I/O
    3)一般日志组大小应满足自动切换间隔至少15-20分钟左右业务需求
    4).建议使用rdo结尾的日志文件名,避免误删日志文件。如redo1.rdo,redo2.rdo
       规划样例
           RedoLogGroup1    RedoLogGroup2    RedoLogGroup3           
           Member1            Member1             Member1           -->Physical Disk 1           
           Member2            Member2             Member2           -->Physical Disk 2           
           Member3            Member3             Member3           -->Physical Disk 3
   6查询表 
    v$log
     Oracle Database uses only one redo log files at a time to store redo records written from the redo log buffer. The redo log file that LGWR is actively writing to is called the current redo log file. Redo log files that are required for instance recovery are called ACTIVE redo log files. Redo log files that are no longer required for instance recovery are called INACTIVE redo log files. If you have enabled archiving (the database is in ARCHIVELOG mode),then the database cannot reuse or overwrite an active online log file until one of the archiver background processes (ARCn) has archived its contents.(在归档模式下,oracle不允许重用或重写一个状态为"ACTIVE"的联机重做日志,直到arcn进程将其内容归档。) If archiving is disabled (the database is in NOARCHIVELOG mode), then when the last redo log file is full, LGWR continues by overwriting the first available active file.

二、归档日志 archive log
       在线重做日志大小毕竟是有限的,当都写满了的时候,就面临着两个选择,第一个就是把以前在线重做日志从头擦除开始继续写,第二种就是把以前的在线重做日志先进行备份,然后对被备份的日志擦除开始写新的在线Redo File。这种备份的在线重做日志就是归档日志。而数据库如果采用这种生成归档日志的模式的话,就是归档日志模式(ARCHIVELOG模式),反之如果不生成归档日志,就是非归档日志模式(NOARCHIVELOG模式)。

      归档日志(Archive Log)是非活动的重做日志备份.通过使用归档日志,可以保留所有重做历史记录,当数据库处于ARCHIVELOG模式并进行日志切换式,后台进程ARCH会将重做日志的内容保存到归档日志中.当数据库出现介质失败时,使用数据文件备份,归档日志和重做日志可以完全恢复数据库。

     归档进程 arch被触发的条件:

       1. 如果设置了自动归档模式,则日志切换时,由LGWR进程触发ARCH进程进行归档。这是最常见的方式。
       2. 可以手工进行归档。使用命令:SQL>ALTER SYSTEM ARCHIVE LOG CURRENT; 表示启动ARCH进程,从而对当前的日志文件进行归档。
       3. 如果ARCH进程在5分钟以后还没有接收到LGWR的通知,则发生超时,于是ARCH被唤醒以检查是否存在需要归档的日志文件。ARCH通过读取控制文件中的信息来决定是否需要归档以及应该归档哪些日志文件。但是在进行实例恢复或者介质恢复的过程中,ARCH进程不会启动。    

第二部分 实践操作

查看数据库是否归档:
select name,log_mode from v$database;
或者以sys登录后:
SQL> archive log list  (有时不能正确反应当前状态,推荐用上一种方法查询)
数据库日志模式             非存档模式
自动存档             禁用
存档终点            E:\oracle\ora92\\RDBMS(如果是oracle 10g,则为USE_DB_RECOVERY_FILE_DEST,默认大小是2GB)
最早的概要日志序列     616
当前日志序列           618

2将数据库设置为归档模式:

SQL>SHUTDOWN NORMAL/IMMEDIATE;SQL>STARTUP MOUNT;--将数据库改为归档模式SQL>ALTER DATABASE ARCHIVELOG;  SQL>ALTER DATABASE OPEN;

3将数据库改为非归档模式

SQL>SHUTDOWN NORMAL/IMMEDIATE;SQL>START MOUNT;--将数据库改为非归档模式SQL>ALTER DATABASE NOARCHIVELOG;  SQL>ALTER DATABASE OPEN;

4配置档模式(Ensure that the database is mounted but not open.请确保数据库状态为:mounted)
查看归档的方式:show parameter log_archive_start   true为自动归档,false为手动归档

---手动归档模式(重启后生效)SQL> ALTER SYSTEM SET LOG_ARCHIVE_START=FALSE scope=spfile;---自动归档模式(重启后生效)SQL>ALTER SYSTEM SET LOG_ARCHIVE_START= TRUE scope=spfile;   ---打开/关闭归档SQL>ALTER SYSTEM ARCHIVE LOG START/STOP;  
注:以上命令在oracle 9i中适用,log_archive_start 参数在oracle 10 及以上版本已经被废弃,只要开启归档,默认为自动归档,如果要指定手动归档则需要在执行了alter database archivelog命令之后,为了保持兼容性,可以在10g中执行:
SQL>ALTER DATABASE ARCHIVELOG MANUAL; --将数据库改为手工方式。
如果在10g对log_archive_start参数进行设置,则在数据库启动时会出现错误 :ORA-32004: obsolete and/or deprecated parameter(s) specified。解决方法:
SQL>ALTER SYSTEM RESET LOG_ARCHIVE_START SCOPE=SPFILE SID='*';--重启数据库
PS:changing archive log this way doest last when the databass is restart. It will read the initial file log archive start to determine archive start. 数据库重启后会以log_archive_start参数为基准。
--修改最大归档线程数量SQL>ALTER SYSTEM SET LOG_ARCHIVE_MAX_PROCESSES=3; ----to specify a primary archive destination SQL>ALTER SYSTEM SET LOG_ARCHIVE_DEST='/DISK2/ARCHIVE';-- to specify an optional secondary archive destinationSQL>ALTER SYSTEM SET LOG_ARCHIVE_DUPLEX_DEST = '/disk2/archive';

MethodInitialization ParameterHostExample1LOG_ARCHIVE_DEST_n

where: n is an integer from 1 to 10

Local or remoteLOG_ARCHIVE_DEST_1 = 'LOCATION=/disk1/arc'

LOG_ARCHIVE_DEST_2 = 'SERVICE=standby1'

2LOG_ARCHIVE_DEST and

LOG_ARCHIVE_DUPLEX_DEST

Local onlyLOG_ARCHIVE_DEST = '/disk1/arc'

LOG_ARCHIVE_DUPLEX_DEST = '/disk2/arc'

在指定的时候只能任选其一,有时候会发现以下情况:

SQL> show parameter log_archive_destNAME                                 TYPE        VALUE------------------------------------ ----------- -------log_archive_dest                     stringlog_archive_dest_1                   stringlog_archive_dest_10                  stringlog_archive_dest_2                   stringlog_archive_dest_3                   stringlog_archive_dest_4                   stringlog_archive_dest_5                   stringlog_archive_dest_6                   stringlog_archive_dest_7                   stringlog_archive_dest_8                   stringlog_archive_dest_9                   stringlog_archive_dest_state_1             string      enablelog_archive_dest_state_10            string      enablelog_archive_dest_state_2             string      enablelog_archive_dest_state_3             string      enablelog_archive_dest_state_4             string      enablelog_archive_dest_state_5             string      enablelog_archive_dest_state_6             string      enablelog_archive_dest_state_7             string      enablelog_archive_dest_state_8             string      enablelog_archive_dest_state_9             string      enable
这表示归档日志存储在默认位置 ,在9i中路径是:$ORACLE_HOME/rdbms/,在10g中,归档日志的存储路径是USE_DB_RECOVERY_FILE_DEST,如果想要自定义需要对 log_archive_dest_n进行设置,注意log_archive_dest 效果与log_archvie_dest_n效果不同,前面的会保存两份,一份在DB_RECOVERY_FILE_DEST,一份在log_archive_dest,后面只会在log_archvie_dest_n中保存。
SQL> alter system set log_archive_dest_1='location=/u01/app/oracle/...' scope=both;

5查看online redo log联机日志文件

SQL> select GROUP#,THREAD#,BYTES,MEMBERS,ARCHIVED,STATUS,FIRST_CHANGE# from v$log;--- ARC字段表示是否已经归档,NO表示还没有进行归档,YES表示已经归档。当系统在归档模式下时,只有当ARC为YES且STATUS为INACTIVE时这个联机日志文件才能被重用。GROUP# THREAD#  SEQUENCE#      BYTES  MEMBERS ARC STATUS    FIRST_CHANGE# ------ ------- ---------- ----------  ------- --- --------- -------------      1       1        620  104857600        1 NO  CURRENT       155230794      2       1        618  104857600        1 NO  INACTIVE      154934381      3       1        619  104857600        1 NO  ACTIVE        155121032 --切换当前日志文件SQL>ALTER SYSTEM SWITCH LOGFILE;

This command is fast to return to the invoking program because the writing of the redo log to the OS filesystem is done in the background. 
 1.It issues database checkpoint. 触发一个检查点。
 2.It immediately starts writing to the next redo log.立刻写下一个联机日志文件
 3.In the background, the “switch logfile” command tells the ARCH background process to copy the “old” redo log file to the redo log filesystem. 

归档 online redo log

在默认情况下Oracle会等一组联机重做日志文件被写满之后再触发归档操作,当然DBA也可以通过执行命令,手动进行归档。

--归档一个已满,但没有归档的联机重做日志SQL> archive log next;--归档所有已满或者未满的online redo log SQL> archive log all;--归档当前日志文件SQL>ALTER SYSTEM ARCHIVE LOG CURRENT;

     This command waits until the online redo log has completed the writing of the redo log file to the filesystem.If you are running RAC, the ALTER SYSTEM ARCHIVELOG CURRENTwill switch the logs on all RAC nodes (instances), whereas ALTER SYSTEM SWITCH LOGFILE will only switch he logfile on the instance where you issue the switch command.  Hence, ALTER SYSTEM ARCHIVELOG CURRENT is a best practice for RAC systems.(在RAC环境中推荐使用该命令)


原创粉丝点击