Oracle数据库中的日志常用的有:
Redo log files 联机日志或重做日志
Archived log files 归档日志
Alert log files 告警日志
Trace files user_dump_dest 用户信息日志(如跟踪会话日志)
Backupground_dump_dest 进程日志
重做日志文件
重做日志文件会记录对于数据库的任何操作,如利用DML语句或者DDL语句对数据库进行更改,或者数据库
管理员对数据库结构进行更改,都会在重做日志中进行记录。
当数据库被以外的删除或者修改,可以利用重做日志文件进行恢复,出现例程失败或者介质失败的情况下,也可以利用日志文件实现例程恢复或者介质恢复。
在数据库出现故障时,可以根据重做日志文件中记录的内容进行重做与前滚
维护数据库的一致性,对数据的操作都会记录在重组日志中。
只有在归档模式下才能实现重做日志的备份
重做日志的要求:
在重做日志中必须要有两个或以上的组,每个组下面必须要有一个成员。
日志切换:
在重做日志文件中由一个组切换到下一个组的过程,就叫做日志切换。(在切换的时候如果其中一个组没有成员或者成员损坏,
那么系统会奔溃。因为LGWR后台进程写入失败发生冲突
导致LGWR中断。所以系统会崩溃)
日志文件时按照循环顺序的方式书写,写满一个组,自动切换另一个组,都写满了在覆盖第一个组。一直循环
自动切换---系统自动完成日志切换。
手动切换----执行命令强制进行日志切换。 (alter system switch logfile;)
redo 日志文件管理:
规划原则: 分散放开到不同的硬盘,日志所在盘的IO要足够,IO读写要快
增加减少日志成员或组
日志状态与监视
处理日志的异常
日志文件的增加删除
SQL> select * from v$logfile;
GROUP# STATUS TYPE MEMBER IS_ ---------- ------- ------- ---------------------------------------- --- 1 STALE ONLINE +DATA/fengzi/onlinelog/group_1.271.84218 NO 7003
2 ONLINE +DATA/fengzi/onlinelog/group_2.273.84218 NO 7037
3 STALE ONLINE +DATA/fengzi/onlinelog/group_3.275.84218 NO 7067
3 rows selected. 对于v$logfile视图中STATUS列常见值: INVALID:表明该文件不可访问 STALE: 表示文件内容不全 DELETED:表示该文件已不在使用 空白: 表示正在被使用
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS ---------- ---------- ---------- ---------- ---------- --- ---------------- FIRST_CHANGE# FIRST_TIME ------------- ------------ 1 1 34 52428800 1 YES INACTIVE 688405 24-MAR-14
2 1 35 52428800 1 NO CURRENT 720096 24-MAR-14
3 1 33 52428800 1 YES INACTIVE 655563 21-MAR-14
SQL> 对于V$LOG视图 中STATUS列 常见的值: UNUSED: 表示从未对联机重做日志文件组进行写入,这是刚添加的联机重做日志文件状态。 CURRENT:表示当前的联机重做日志组,这说明该联机重做日志组是活动的。 ACTIVE:表示联机重做日志组是活动的,但是并不是当前的联机重做日志组。崩溃恢复需要该状态, 可用于块恢复。可能已经归档,也可能未归档。 CLEARING:表示在执行ALTER DATABASE CLEAR LOGFILE;命令后正在将该日志重建为一个空日志。日志清楚后状态改为UNUSED. CLEARING_CURRENT: 表示正在清除当前日志文件中的已关闭线程。如果切换时发生某些故障,则日志可能处于次状态。 INACTIVE:表示例程恢复不在需要次联机重做日志组。可能已归档,也可能未归档。
添加一个日志组 SQL> alter database add logfile group 4 '+data/fengzi/onlinelog/group_4.log' size 50m;
Database altered.
SQL>
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS ---------- ---------- ---------- ---------- ---------- --- ---------------- FIRST_CHANGE# FIRST_TIME ------------- ------------ 1 1 34 52428800 1 YES INACTIVE 688405 24-MAR-14
2 1 35 52428800 1 NO CURRENT 720096 24-MAR-14
3 1 33 52428800 1 YES INACTIVE 655563 21-MAR-14
4 1 0 52428800 1 YES UNUSED 0 进行日志切换时 优先选择使用 UNUSED状态的组
添加一个日志组,指定2个成员 SQL> alter database add logfile group 5 ('+data/fengzi/onlinelog/group_5_1.log','+data/fengzi/onlinelog/group_5_2.log') size 50m; Database altered.
SQL>select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS ---------- ---------- ---------- ---------- ---------- --- ---------------- FIRST_CHANGE# FIRST_TIME ------------- ------------ 1 1 34 52428800 1 YES INACTIVE 688405 24-MAR-14
2 1 35 52428800 1 NO CURRENT 720096 24-MAR-14
3 1 33 52428800 1 YES INACTIVE 655563 21-MAR-14
4 1 0 52428800 1 YES UNUSED 0
5 1 0 52428800 2 YES UNUSED 0 SQL> 发现新添加的group 5 成员有两个
一次添加多个组 一个组一个成员一个组多个成员 SQL> alter database add logfile group 6 '+data/fengzi/onlinelog/group_6.log' size 50m, group 7 ('+data/fengzi/onlinelog/group_7_1.log','+data/fengzi/onlinelog/group_7_2.log') size 50m;
向组中添加成员 SQL> alter database add logfile member '+data/fengzi/onlinelog/group_4.log' to group 4;
新添加的成员的大小与组中成员的大小是一致的,会自动分配。
向多组添加成员 SQL> alter database add logfile member '+data/fengzi/onlinelog/group_1.log' to group 1, '+data/fengzi/onlinelog/group_2.log' to group 2;
删除组 SQL> alter database drop logfile group 4; --查询v$LOG视图的状态为CURRENT与ACTIVE是删除不掉的,因为在循环之内 Database altered. –想要删除,需要手动切换日志,切换到可以删除的状态alter system switch logfile
SQL> 删除多个组 SQL> alter database drop logfile group 4,group 5;
删除组中的某一个成员 SQL> alter database drop logfile member '+data/fengzi/onlinelog/group_5_1.log';
Database altered.
SQL> 删除两个组中不同成员 SQL>alter database drop logfile member '+DATA/fengzi/onlinelog/group_1.log ', '+DATA/fengzi/onlinelog/group_2.log';
一个组下必须有一个成员,所以不能把所有成员删除,想要删除只能删除组,系统中必须要有两个组。 |
日志文件的重命名
数据库必须处于归档模式 (想在非归档模式下进行修改需要一致性关闭数据库启动到mount状态)
当文件处于CURRENT状态时是不能被修改的
alter system switch logfile 切换日志,直到能重命名为止
文件系统 重命名redo logfile 为 /u01/app/oracle/oradata/fengzi/redo03.log的日志文件 SQL> ho cp /u01/app/oracle/oradata/fengzi/redo03.log /u01/app/oracle/oradata/fengzi/fengziredo1.log 老的文件 新的文件 SQL> alter database rename file ‘/u01/app/oracle/oradata/fengzi/redo03.log’ to ‘/u01/app/oracle/oradata/fengzi/fengziredo1.log’
ASM ASM可以直接使用asmcmd工具中的mkalias命令对文件进行重命名 [oracle@dongyang ~]$ echo $ORACLE_SID +ASM [oracle@dongyang ~]$ asmcmd ASMCMD> ll commands: -------- cd du find help ls lsct lsdg mkalias mkdir pwd rm rmalias ASMCMD> ASMCMD> cd data/fengzi/onlinelog ASMCMD> ls group_1.271.842187003 group_1.272.842187017 group_2.273.842187037 group_2.274.842187053 group_3.275.842187067 group_3.276.842187083 group_4.304.843302545 group_4.log ASMCMD> mkalias group_1.271.842187003 redo02.log ASMCMD> ls group_1.271.842187003 group_1.272.842187017 group_2.273.842187037 group_2.274.842187053 group_3.275.842187067 group_3.276.842187083 group_4.304.843302545 group_4.log redo02.log ASMCMD>
SQL> alter database rename file '+DATA/fengzi/onlinelog/group_1.271.842187003' to '+DATA/fengzi/onlinelog/redo02.log';
Database altered.
SQL> select * from v$logfile;
GROUP# STATUS TYPE MEMBER IS_ ---------- ------- ------- ---------------------------------------- --- 1 STALE ONLINE +DATA/fengzi/onlinelog/redo02.log NO 1 STALE ONLINE +DATA/fengzi/onlinelog/group_1.272.84218 YES 7017
2 ONLINE +DATA/fengzi/onlinelog/group_2.273.84218 NO 7037
2 ONLINE +DATA/fengzi/onlinelog/group_2.274.84218 YES 7053
3 STALE ONLINE +DATA/fengzi/onlinelog/group_3.275.84218 NO
GROUP# STATUS TYPE MEMBER IS_ ---------- ------- ------- ---------------------------------------- --- 7067
3 STALE ONLINE +DATA/fengzi/onlinelog/group_3.276.84218 YES 7083
6 rows selected.
SQL> |
日志文件状态与监视
所谓的监视就是查看位置在哪,是否存在
查看磁盘空间是否足够
看日志组下是否有多个成员
监视日志切换间隔时间
首先要查看日志文件在不在 SQL> select member from v$logfile;
MEMBER -------------------------------------------------------------------------------- +DATA/fengzi/onlinelog/redo02.log +DATA/fengzi/onlinelog/group_1.272.842187017 +DATA/fengzi/onlinelog/group_2.273.842187037 +DATA/fengzi/onlinelog/group_2.274.842187053 +DATA/fengzi/onlinelog/group_3.275.842187067 +DATA/fengzi/onlinelog/group_3.276.842187083
6 rows selected.
SQL> [oracle@dongyang ~]$ echo $ORACLE_SID +ASM [oracle@dongyang ~]$ asmcmd ASMCMD> cd data/fengzi/onlinelog ASMCMD> ls group_1.271.842187003 group_1.272.842187017 group_2.273.842187037 group_2.274.842187053 group_3.275.842187067 group_3.276.842187083 redo02.log ASMCMD> 查看磁盘空间 ASMCMD> lsdg State Type Rebal Unbal Sector Block AU Total_MB Free_MB Req_mir_free_MB Usable_file_MB Offline_disks Name MOUNTED NORMAL N N 512 4096 1048576 16376 9057 4094 2481 0 DATA/ ASMCMD>
查看日志文件切换间隔时间 SQL> select to_char(first_time,'YYYY-MM-DD HH24:MI:SS'),GROUP# from v$log;
TO_CHAR(FIRST_TIME, GROUP# ------------------- ---------- 2014-03-24 09:03:31 1 2014-03-24 13:39:46 2 2014-03-23 11:26:40 3
SQL> 如果间隔时间不满足15分钟到20分钟之间就应该修改日志文件的大小。
改变日志文件大小 SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS ---------- ---------- ---------- ---------- ---------- --- ---------------- FIRST_CHANGE# FIRST_TIME ------------- ------------ 1 1 34 52428800 2 YES INACTIVE 688405 24-MAR-14
2 1 35 52428800 2 NO CURRENT --当前使用 720096 24-MAR-14
3 1 33 52428800 2 YES INACTIVE 655563 21-MAR-14 SQL> 将日志组大小改为100m 需要先删除组,在删除组物理文件。最后重建 (只能1个组1个组的删,必须保留2个组,只能删除循环之外的) SQL> alter database drop logfile group 3;
Database altered.
SQL> ASMCMD> ls group_1.271.842187003 group_1.272.842187017 group_2.273.842187037 group_2.274.842187053 group_3.262.842184305 group_3.263.842184319 redo02.log ASMCMD> rm group_3.263.842184319 ASMCMD> rm group_3.262.842184305 重建组与成员 SQL> alter database add logfile group 3 ('+data/fengzi/onlinelog/group_3_1.log','+data/fengzi/onlinelog/group_3_2.log') size 100m; 删除另一个循环之外组 SQL> alter database drop logfile group 1; Database altered.
SQL> ASMCMD> ls group_1.271.842187003 group_1.272.842187017 group_2.273.842187037 group_2.274.842187053 group_3.262.843384567 group_3.263.843384577 group_3_1.log group_3_2.log redo02.log ASMCMD> rm group_1.271.842187003 ASMCMD> rm group_1.272.842187017
SQL> alter database add logfile group 1 ('+data/fengzi/onlinelog/group_1_1.log','+data/fengzi/onlinelog/group_1_2.log') size 100m;
Database altered.
SQL> 删除当前使用的组必须切换日志 一直切换日志,直到切换到组2为INACTIVE为止 SQL> alter system switch logfile;
System altered.
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS ---------- ---------- ---------- ---------- ---------- --- ---------------- FIRST_CHANGE# FIRST_TIME ------------- ------------ 1 1 42 104857600 2 YES INACTIVE 771647 28-MAR-14
2 1 41 52428800 2 YES INACTIVE 771612 28-MAR-14
3 1 43 104857600 2 NO CURRENT 771651 28-MAR-14
SQL> 切换完成删除重建组2 SQL> alter database drop logfile group 2;
Database altered.
SQL> ASMCMD> rm group_2.273.842187037 asmcmd: entry 'group_2.273.842187037' does not exist in directory '+data/fengzi/onlinelog/' ASMCMD> ls --发现组2物理文件已经不在 group_1.271.843385069 group_1.304.843385081 group_1_1.log group_1_2.log group_3.262.843384567 group_3.263.843384577 group_3_1.log group_3_2.log ASMCMD>
SQL> alter database add logfile group 2 ('+data/fengzi/onlinelog/group_2_1.log','+data/fengzi/onlinelog/group_2_2.log') size 100m;
Database altered.
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS ---------- ---------- ---------- ---------- ---------- --- ---------------- FIRST_CHANGE# FIRST_TIME ------------- ------------ 1 1 42 104857600 2 YES INACTIVE 771647 28-MAR-14
2 1 0 104857600 2 YES UNUSED 0
3 1 43 104857600 2 NO CURRENT 771651 28-MAR-14
SQL> OK 修改日志文件大小成功 |
日志文件的异常处理
首先查看告警日志确认错误原因
对于日志文件的不一致(只有在数据库启动时报错日志文件不一致才能使用下面命令)
第一种方法:清空不一致的日志组 (只能清除一个循环之外的组也就是 INACTIVE状态) SQL>alter database clear logfile group <N>;
另一种方法: 清除日志,可以清除 ACTIVE 状态的组 SQL>alter database clear unarchived logfile group <N>; 对于CURRENT状态是不能清除的,只需要切换日志就可以清除
|
对于日志文件丢失与损坏 (要看数据库是否是一致性关闭的)
如果是一致性关闭的数据库可以使用清空指令 (发现清空之后日志文件会自动生成) SQL>alter database clear logfile group <N>; SQL>alter database open; 如果非一致性关闭数据库的是清空不了的
可以使用欺骗手段恢复数据库(在归档模式下是可以使用这种方法)
SQL> recover database using backup controlfile; Specify log: --直接回车什么都不做
SQL> alter database open resetlogs; SQL> recover database; SQL> alter database open resetlogs;
还可以直接使用隐藏参数解决 (这个隐藏参数的作用是忽略一致性的验证) SQL> alter system set "_allow_resetlogs_corruption" =true scope=spfile;
SQL> startup force mount SQL>alter database open resetlogs; SQL> alter system reset " _allow_resetlogs_corruption" scope=spfile sid='*'; (用完之后一定要干掉隐藏参数)
在非归档模式下可以组合以上方法解决 SQL> alter system set "_allow_resetlogs_corruption" =true scope=spfile; SQL> recover database using backup controlfile; Specify log: --直接回车什么都不做
SQL> alter database open resetlogs; SQL>shutdown immediate; SQL>startup SQL> alter database open resetlogs; SQL> alter system reset " _allow_resetlogs_corruption" scope=spfile sid='*'; |
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29532781/viewspace-1134340/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29532781/viewspace-1134340/