以下易容翻译自oracle dba官方文档,不足之处还望指出。
管理重做日志文件
学习目标:1.解释重做日志文件的目的
2.描述重做日志文件的结构
3.学会控制日志切换与检查点
4.多元化管理重做日志文件
5.使用OMF管理重做日志文件
1.概念介绍:
重做日志文件通过记录数据的所有改变情况对系统或介质故障提供恢复机制。
1)重做日志文件以组的形式存在
2)一个oracle数据库至少需要两组,每组至少有一文件
3)在一组里的每一重做日志文件叫做成员
The redo log files are used only for recovery.
2.重做日志文件结构:
1)重做日志文件组
a.一组相同的副本联机重做日志文件被称为一个联机重做日志组。
b.LGWR进程并发的往日志组里所有重做日志文件写入相同信息
2)重做日志文件
a.一个组每个成员用于同一log sequence numbers和相同的大小
b.每次oracle服务器开始写入日志组时分配日志序列号来唯一标识每个重做日志文件
c.当前的日志序列号存储在控制文件和所有数据文件的头部
3.重做日志如何工作?
1)重做日志以循环的方式使用
2)当一个重做日志文件写满,LGWR进程将移动到下一日志组
a.这一步骤叫做log switch
b.checkpoint在此时发生
c.信息被写入控制文件中
3)以下情况将触发LGWR进程写操作:
a.当commit事务发生
b.当redo log buffer存储达到1/3
c.当重做日志缓冲区有超过一个兆字节的更改记录
d.在DBWn将buffer cache修改过的数据块的信息写入到数据文件之前
4) 以下情况发生check point:
a.每次日志切换时
b.实例通过normal,transactional,immediate选项关闭时
c.通过设置初始化参数FAST_START_MTTR_TARGET强制发生
d.数据库管理员手工设置ALTER SYSTEM CHECKPOINT、alter tablespace ,datafile offline
e.使用alter tablespace[OFFLINE NORMAL|READ ONLY|BEGIN BACKUP] 语句导致指定数据文件发生检查点
注:如果参数LOG_CHECKPOINTS_TO_ALERT 设置为true,则每次检查点信息将记录在alert_SID.log文件中.
4.如何增加、删除重做日志文件(组)?
a.增加重做日志文件组:
ALTER DATABASE ADD LOGFILE GROUP 3 ('$HOME/ORADATA/u01/log3a.rdo',
'$HOME/ORADATA/u02/log3b.rdo') SIZE 1M;
b.增加重做日志文件:
ALTER DATABASE ADD LOGFILE MEMBER
'$HOME/ORADATA/u04/log1c.rdo' TO GROUP 1,
'$HOME/ORADATA/u04/log2c.rdo' TO GROUP 2,
'$HOME/ORADATA/u04/log3c.rdo' TO GROUP 3;
c.删除重做日志文件组:
ALTER DATABASE DROP LOGFILE GROUP 3;
d.删除重做日志文件:
ALTER DATABASE DROP LOGFILE MEMBER '$HOME/ORADATA/u04/log3c.rdo';
5.清理,重新分布或重命名重做日志文件?
a.清理重做日志文件
ALTER DATABASE CLEAR LOGFILE '$HOME/ORADATA/u01/log2a.rdo';
b.重新分布或重命名重做日志文件
通过删除旧日志文件,新增新日志文件实现。
6.如何获取oracle数据库日志组和成员信息?
△V$LOG
△V$LOGFILE
从控制文件获取重做日志文件信息:
SELECT group#, sequence#, bytes, members, status
FROM v$log;
7.详细语句见下方:
------------------------------------------------------
[转载]
1:查看数据库在线重做日志文件的归档方式
ARCHIVE LOG list;
2:查看日志组
SELECT * FROM v$log;
3:查看日志组成员
SELECT * FROM v$logfile;
--备注:经分系统BONCBI数据库日志没做归档就不说了,既然只有3个日志组,而且既然每个日志组只有一个成员,悲剧啊!
4:新增一个日志组:
ALTER DATABASE ADD LOGFILE GROUP 4 ('/dev/rlv_vgdb9_data22','/dev/rlv_vgdb9_data23','/dev/rlv_vgdb9_data24') SIZE 8191m;
--这样,就最增一个日志组,且这个日志组里有3个成员每个成员8191MB大小。
5:给某个日志组新增一个成员
ALTER DATABASE ADD LOGFILE MEMBER '/dev/rlv_vgdb9_data25' TO GROUP 4;
--注意,这里不需要指定日志组成员的大小。
6:删除日志组
ALTER DATABASE DROP LOGFILE GROUP 4;
--注意:当前日志组不能删,活动的日志组不能删,没有归档的日志组不能删。
7:删除日志组成员
ALTER DATABASE DROP LOGFILE MEMBER '/dev/rlv_vgdb9_data25';
--注意:每个组至少要保留一个成员;
8:两个概念需要注意:
8.1:日志切换
ALTER SYSTEM SWITCH LOGFILE;
--所谓日志切换就是停止写当前组,转而写一个新组,系统可以自动发生,也可以手工完成。
--当发生SWITCH LOGFILE时,系统会在后台完成CHECKPOINT的操作
--手动切换日志组
--日志组A:当前正在写。
--日志组B:可写。
--CHECKPOINT保证控制文件,数据文件头,日志文件头的SCN一致是数据库保持数据完整性的一个重要机制
--手动切换日志组后,ORACLE开始往日志组B写日志,并进行一次CHECKPOINT,把日志组A里没有经过CHECKPOINT的那部分日志对应的DIRTY BUFFER从BUFFER CACHE里写到
--数据文件里。CHECKPOING完成后
--日志组A:可写。
--日志组B:当前正在写。
--另外,ALTER TABLESPACE USER BEGIN BACKUP,DROP TABLE,TRUNCATE TABLE都会引发CHECKPOINT操作
--除了以上所手动,及自动CHECKPOINT之外,还可以通过一些参数来控制CHECKPOINT
--FAST_START_MTTR_TARGET(MTTR:数据恢复的时间间隔)
--checkpoints用来同步,同步频率越高,发生系统错误时所需RECOVERY时间越短
--同步相关的参数:FAST_START_MTTR_TARGET(数据库通过它来改变后面3个参数),fast_start_io_target,log_checkpoint_interval,log_checkpoint_timeout
9:初始化日志文件
ALTER DATABASE CLEAR LOGFILE GROUP 1;
ALTER DATABASE CLEAR LOGFILE '/dev/rlv_vgdb9_data25';
ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP 5(清空没有归档的日志文件,实际备份产生断点)
10:重命名日志文件
1>:在操作系统上把文件改名或移动(如果有OMF就不需要这样做了)
2>:ALTER DATABASE RENAME FILE '/dev/rlv_vgdb9_data25' TO '/dev/rlv_vgdb9_data26';
11:通过OMF管理REDO LOG 文件
SHOW PARAEMTERS DB_CREATE_ONLINE
ALTER SYSTEM SET DB_CREATE_ONLINE_LOG_DEST_1='/ORACLE/ORALOG/OMF';
ALTER DATABASE ADD LOGFILE GROUP 6;(名子由ORACLE派生,大小100M)
ALTER DATABASE DROP LOGFILE GROUP 6;(自己删除)
两个专题
一:查看oracle数据库是否归档和修改归档模式
首先查看数据库现有模式可使用以下语句
select name,log_mode from v$database;
也可以用下面的语句
archive log list;(该方法需要as sysdba)
对于非归档模式的数据库该为归档模式(主要以Oracle 10g为参考通过OMF来管理)使用以下步骤:
1. SQL> alter system set log_archive_dest_1='location=/oracle/oracle10g/log/archive_log';
该语句含义是确定归档日志的路径,实际上Oracle 10g可以生成多份一样的日志,保存多个位置,以防不测
例如再添加一个日志位置可使用以下语句
SQL>alter system set log_archive_dest_2='location=/oracle/oracle10g/log2/archive_log';
2.关闭数据库
SQL> shutdown immediate
3.启动数据mount状态:
SQL> startup mount;
4、修改数据库为归档模式:
SQL> alter database archivelog;
5、打开数据库,查询:
SQL> alter database open;
修改日志文件命名格式:
SQL> alter system set log_archive_max_processes = 5;
SQL> alter system set log_archive_format = "archive_%t_%s_%r.log" scope=spfile;
修改完成后可以查看日志模式是否修改成功!
特别指出的是在Oracle 9i中还要修改参数log_archive_start = true才能生效,oracle 10g中已经废除了该参数,所以不需要设置该参数。
二:修改oracle日志文件大小
1、创建2个新的日志组
alter database add logfile group 4 ('D:ORACLEORADATAORADBREDO04_1.LOG') size 1024k;
alter database add logfile group 5 ('D:ORACLEORADATAORADBREDO05_1.LOG') size 1024k;
2、切换当前日志到新的日志组
alter system switch logfile;
alter system switch logfile;
3、删除旧的日志组
alter database drop logfile group 1;
alter database drop logfile group 2;
alter database drop logfile group 3;
4、操作系统下删除原日志组1、2、3中的文件
5、重建日志组1、2、3
alter database add logfile group 1 ('D:ORACLEORADATAORADBREDO01_1.LOG') size 10M;
alter database add logfile group 2 ('D:ORACLEORADATAORADBREDO02_1.LOG') size 10M;
alter database add logfile group 3 ('D:ORACLEORADATAORADBREDO03_1.LOG') size 10M;
6、切换日志组
alter system switch logfile;
alter system switch logfile;
alter system switch logfile;
7、删除中间过渡用的日志组4、5
alter database drop logfile group 4;
alter database drop logfile group 5;
8、到操作系统下删除原日志组4、5中的文件
9、备份当前的最新的控制文件
SQL> connect / as sysdba
SQL> alter database backup controlfile to trace resetlogs
made by dylan.