oracle12c 管理联机重做日志

时间:2022-10-16 08:10:41
管理联机重做日志
联机重做日志存储了数据库中已出现的事务的记录。这些日志有一下作用:
1、为数据库提供记录更改的机制,这样当发生介质失效事件时,就有办法恢复事务
2、确保出现整个实例失败的时间时,即使已提交的数据更改还没有写数据文件,也能够恢复已提交
的事务(崩溃恢复)
3、使管理员能够通过oracle的logjminer使用程序,检查数据库事务的历史记录
4、可以使用oracle工具(goldengate)读取联机重做日志,可以使用oracle工具(如streams)复制
联机重做日志
至少应为数据库创建两个联机重做日志组,每个组至少应含有一个联机重做日志成员。这种成员是位于磁盘上的物理文件。可以在每个联机重做日志组中创建多个成员,这称为多路复用的联机重做日志组。
日志写进程负责将重做日志缓冲区(SGA中的)的事务信息,写入联机重做日志(在磁盘上)。当出现下列情况时,会触发日志写:
1、执行commit
2、出现日志切换
3、过了3秒钟
4、重做日志缓冲区被占用了1/3
5、重做日志缓冲区的已用空间达到1MB
因为联机重做日志组的数量有限,所以所有联机重做日志组的内容都会被覆盖。如果想要保存事务的历史记录,就必须使数据库处于归档日志模式。每当出现日志切换,归档后台进程就会将联机重做日志的内容复制到归档重做日志文件中。出现故障时,使用归档重做日志文件可以恢复最新数据库备份后的所有已出现的事务。
------------------------------------------------------------------------------------------------------
显示联机重做日志信息
V$LOG显示存储在控制文件中的联机重做日志组的信息
V$LOGFILE显示联机重做日志文件成员信息
以上两个视图可以显示联机重做日志组及其成员的相关信息
例如:
select group# ,thread# status# member# bytes# from v$log as a,v$logfile as b
where a.group=b.group oeder by a.group,b.member
oracle12c 管理联机重做日志

oracle12c 管理联机重做日志
注:V$LOG视图的STATUS列反映的是日志组的状态,V$LOGFILE视图的STATUS列反映的是联机重做日志物理文件的状态.。
-------------------------------------------------------------------------------------------------------------
确认联机重做日志组的最优尺寸
查看日志每小时的切换频率:
select count(*),to_char(first_time,'YYYY:MM:DD:HH24') from v$log_history
group by to_char(first_time,'YYYY:MM:DD:HH24')
order by 2;
v$log_history视图通过控制文件获取数据。每当出现日志切换时,该视图就会记录下一个条目,其中含有切换事件和系统改变号(SCN)之类的详细信息。

使用ARCHIVE_LAG_TARGET初始化参数可以设置日志切换的最大时间间隔(以秒为单位)
还可以查询V$INSTANCE_RECOVERY视图的OPTIMAL_LOGFILE_SIZE列,确认是否正确设置了联机重做日志文件的尺寸:
select optimal_logfile_size from v$instance_recovery;
oracle建议将所有联机重做日志文件的尺寸,都设置的不低于optimal_logfile_size列的值
---------------------------------------------------------------------------------------------------------------
确定重做日志组的最优数量
日志发生切换时,oracle都会初始化一个检查点,作为检查点的组成部分,数据库写进程会将SGA中的所有已修改(脏)块写入磁盘上的数据文件中。联机重做日志数据也会以循环方式被写入,最终日志中的信息都会被覆盖。日志写进程覆盖联机重做日志中的信息前,SGA中所有与联机重做日有关的脏块,都必须写入数据文件。在oracle覆盖联机重做日志中的信息前,它会确保由联机重做日志保护的块已写入磁盘。如果没有写盘,oracle就会暂停处理过程,直到写盘为止。使用下列方法可以解决这个问题:
1、增加联机重做日志组
2、降低FAST_START_MTTR_TARGET参数值,这样会使数据库写进程,一更短的时间间隔将较旧的已修改块写入磁盘。
3、调整数据库写进程(修改DB_WRITER_PROCESSES参数)
1)如果数据库经常出现 checkpoint not complete,建议增加日志组。为数据库写进程争取更多时间,将数据库高速缓冲区中的已修改块写入数据文件,
2)如果增加联机重做日志组无法解决,应谨慎调低FAST_START_MTTR_TARGET值。这样可能会出现更多I/O操作,因为数据库写进程会更积极地将脏块写入数据文件。
3)要 修改DB_WRITER_PROCESSES参数必须停止并重启数据库。
增加日志组拥有两个成员:
alter database add logfile group3
(‘/U01/ORAREDO/O12C/REDO03A.RDO’,
‘/U02/ORAREDO/O12C/REDO03B.RDO’) SIZE 50m
----------------------------------------------------------------------------------------------------------------
调整联机重做日志组的尺寸和删除联机重做日志组
要调整联机重做日志的尺寸,必须先增加想要尺寸的联机日志组,然后删除旧的联机重做日志
alter database add logfile group 4
('/u01/oraredo/o12c/redo04a.rdo',
'/u02/oraredo/o12c/redo04b.rdo') SIZE 200m;
增加新尺寸的日志文件后,就可以删除旧的联机重做日志了。删除之前必须使之处于INACTIVE状态。可以使用一下命令检查日志组状态:
selet group#,status,archived,thread#,sequence# from v$log;----------查看状态
alter system switch logfile;----------切换日志组
alter system checkpoint;--------------使日志组变为不活动
alter database drop logfile group <组号>;---------删除日志组
select member form v$logfile;--------------查看哪些联机重做日志文件正在被使用
-----------------------------------------------------------------------------------------------------------
向日志组增加联机重做日志文件
alter database add logfile member '/u02/oraredo/o12c/redo01b.rdo' to group 1;
从日志组删除联机重做日志文件(无法尝试删除CURRENT状态日志组中的日志文件)
alter database drop logfile member '/u01/oraredo/o12c/redo04a.rdo'
------------------------------------------------------------------------------------------------------
移动或重命名重做日志文件
方法一、在新位置增加新的日志文件,然后删除旧的日志文件。
方法二、通过OS重命名屋里文件。
当数据库关闭状态时:
1、mv /u02/oraredo/o12c/redo01b.rdo /u01/oraredo/o12c/redo01b.rdo
2、startup mount
3、更新控制文件: alter database rename file '/u02/oraredo/o12c/redo01b.rdo'
to '/u01/oraredo/o12c/redo01b.rdo'
4、打开数据库: alter database open;
查看v$logfile视图验证联机重做日志文件是否移动到新位置