Redo Log概念
规划Redo Log
创建Redo Log组和成员
重新分配、命名Redo Log成员
删除Redo Log组和成员
强制切换日志
验证Redo Log文件块
清理Redo Log 文件
Redo Log字典视图
Redo Log 概念
Redo Threads
redo log相对于每一个数据库实例都有一个redo线程。典型配置中,仅一个数据库实例访问数据库,所以仅出现一个redo 线程。但在RAC环境中,两个或更多的实例并行访问一个数据库,每一个实例都拥有它自己的redo 线程。分离的redo线程为避免在一个redo log file集上产生竞争,因此这种预估的潜在的瓶颈导致我们需要了解如何对redo log进程配置和管理。
Redo Log Contents
redo records(redo记录)被写入至redo log file中,一条redo记录,通常也称为redo entry,是由一组change vectors组成,每一组改变扇区描述数据库的单个块的改动情况。比如,你改变employee表中的一条salary的值,这个改变就包含了改变扇区,其中描述了表的数据段的块、undo段的数据块、和事务表的undo段。
Redo条目记录数据可以用来重构所有数据库的改变,包括undo段。因此,redo log也用于保护回滚数据。当我们通过redo 数据恢复数据库时,数据库读redo记录中的改变扇区以及应用与这些改变相关的块。
Redo记录的缓冲位于SGA的一个循环刷新区成为redo log buffer,这些缓存被LGWR进程写到redo log file中,不管事务何时提交,LGWR都将redo 记录的事务写入到redo log file中。并分配一个SCN(系统改变号)作为每一条已提交事务的redo记录点。
Redo记录也可以在相应事务提交前写入redo log file中,如果redo log buffer已满,或其他事务提交,LGWR将buffer所有的redo log条目刷到redo log file中。即使一些redo记录没及时提交。如果有必要,数据库可以回滚这些改变。
Oracle数据库怎样写Redo log
数据库中的redo log通常由一或多个的文件组成。数据库至少保证两个文件中一个总是可以写的,另一个用于归档(当数据库处于归档模式)。
LGWR进程循环刷写redo log文件,当某一个正在使用的redo log写满后,进程会切换到下一个可用的redo log文件中。当最后一个redo log 文件写满后,会切换回第一个redo log 文件进行记录。如下图所示:
如果在NOARCHIVELOG模式,一个满载的redo log需要等到其中的改变记录均被写入到数据文件中后才可以重用。
如果在ARCHIVELOG模式,则需要等待改变记录被写到数据文件并归档后才可重用。
redo log的活动(当前)和非活动状态
LGWR正在写的redo log文件的状态显示为current,redo log 文件可用于实例恢复的被称为active状态。如果不在需要被用于实例恢复的则为inactive状态。
如果在ARCHIVELOG模式下,直到归档进程(ARCn)完成归档前数据库都不能对该redo log文件重用或覆盖。而在NOARCHIVELOG模式下,LGWR则会等到redo log处于inactive状态时重写该redo log。
log switch和log sequence number
日志切换指出数据库停止和开始写的redo log文件。通常,日志切换发送在正在使用的redo log被写满,必须切换到下一个redo log文件。当然也可以配置日志切换的间隔。还可以通过手动进行日志切换。
oracle分配给每个日志文件一个序列号,每当发送切换时LGWR进程就安装顺序写这些日志文件,当归档日志产生时,泽泻归档获取该日志序列号。
规划Redo log
多Redo Log 文件
放置Redo Log成员至不同磁盘
规划Redo Log文件大小
规划Redo Log文件的块大小
选择Redo Log文件的数量
控制归档延迟
多Redo Log 文件
多日志文件用于保护redo log自身,相当于为自己增加了一份拷贝。oracle可以自动分开维护这些日志文件。最好的习惯是,将日志拷贝放在不同的磁盘中。即使主日志和拷贝日志放在同一磁盘中,拷贝日志也能起到保护I/O错误,预防主日志文件损坏等问题,当一组日志存在多个成员时,LGWR将相同的Redo Log信息并行的写入这些成员中。以防止单点故障。
上图中A_LOG1和B_LOG1日志为group1的成员,A_LOG2和B_LOG2日志为group2的成员,一个组的成员必须是同大小的。且每一个组的成员状态也是一致的,即LGWR在写group1是,不会出现A_LOG1和A_LOG2同时被写的情况。
如果LGWR不能将信息写入某个组的成员。那么数据库会将该成员标记为INVALID,并将报错信息记录到关于LGWR进程的跟踪文件和告警日志中。以下列表列出了继红不可写入的情况:
条件 | 动作 |
LGWR可以将信息至少写入日志组中的一个成员 | 写进程正常,LGWR写可用该日志成员忽略不可用的成员。 |
当发生日志切换时,因为下一个日志组正在归档导致LGWR不能写该日志组 | 数据库操作进程临时挂起直到该组可用或该组归档完毕。 |
因为介质失效导致日志切换时LGWR不能访问下一个组的所有成员 | 数据库返回错误,并关闭实例。这种情况需要从丢失的redo log 文件中进行介质恢复。 如果数据库的checkpoint值超过了丢失redo log,不在需要介质恢复,因为redo中的数据记录已被写入到数据文件中。你只需要删除不可访问的日志组,如果数据库没有多这个故障日志进行归档,删除前使用ALTER DATABASE CLEAR LOGFILE UNARCHIVED来关闭对该日志组的归档。 |
所有组中的成员均不可访问 | 数据库返回错误,并关闭实例。这种情况下,如果媒介包含的日志实际上未丢失,需要进行介质恢复。 |
合法和非法的配置
通常情况下,一个组可以有多个成员,且每个组成员数对称。但数据库也允许不对称的情况,即group1只有一个成员,但group2可以有多个成员。以上情况都属于合法的配置,而数据库要求至少有两个组,否则不合法。
放置Redo Log成员至不同磁盘
规划Redo Log文件大小
Redo Log最小文件大小为4MB
规划Redo Log文件的块大小
与数据块不同,日志块的大小总是固定等于物理扇区的大小512B,一些高级的磁盘驱动提供4K的扇区用于增加ECC能力和改进格式效率。大多数数据库平台都可以根据这类磁盘驱动将日志的单个块增大到4K。
虽则单个块的增大。也存在redo浪费的情况。事实上,4K的块相对于512B块的redo浪费更值得关注。redo wastage的信息被记录在V$SESSTAT和V$SYSSTAT视图中。
SELECT NAME,VALUE FROM V$SYSSTAT WHERE NAME='REDO WASTAGE';
可以在CREATE DATABASE,ALTER DATABASE和CREATE CONTROLFILE语句中指定BLOCKSIZE关键字来指定日志块的大小,允许的大小为512、1024和4096
ALTER DATABASE orcl ADD LOGFILE GROUP 4('/u01/oracle/orcl/redo04a.log','/u01/logs/orcl/redo04b.log') SIZE 100M BLOCKSIZE 512 REUSE;
要确认日志的块大小用以下语句
SQL> SELECT BLOCKSIZE FROM V$LOG;
选择Redo Log文件的数量
在CREATE DATABASE语句中使用MAXLOGFILES参数来决定创建几个redo log组。组的取值范围是1到MAXLOGFILES,也可以根据需求超过MAXLOGFILES的限制
在CREATE DATABASE语句中使用MAXLOGMEMBERS参数来决定组中的最大成员数,要超过MAXLOGMEMBERS上限的唯一方法是重建数据库或控制文件,因此在创建数据库前,需要考虑清楚。
控制归档延迟
可以强制所有可用的日志线程有规律的切换,在一个主备库的配置中,这种改变对备库是可用的,主库通过归档日志传输到备库进行应用。这种情况存在一定的滞后。因为备库必须等待主库归档并传输归档日志到备库。延迟可以通过设置ARCHIVE_LAG_TARGET初始化参数来限定,单位为秒。
ARCHIVE_LAG_TARGET的时间取决于当前日志创建和归档当前日志消耗时间的合计。
影响ARCHIVE_LAG_TARGET因素
日志切换的最长时间
日志切换会发生频率
备库能够容忍的日志丢失数
创建日志组和成员
创建组的方式1:
SQL> ALTER DATABASE ADD LOGFILE ('/oracle/dbs/log1c.rdo', '/oracle/dbs/log2c.rdo') SIZE 100M;
创建组的方式2:
SQL> ALTER DATABASE ADD LOGFILE GROUP 10 ('/oracle/dbs/log1c.rdo', '/oracle/dbs/log2c.rdo') SIZE 100M BLOCKSIZE 512;
为组增加成员:
SQL> ALTER DATABASE ADD LOGFILE MEMBER '/oracle/dbs/log2b.rdo' TO GROUP 2;
方法2:
SQL> ALTER DATABASE ADD LOGFILE MEMBER '/oracle/dbs/log2c.rdo' TO ('/oracle/dbs/log2a.rdo', '/oracle/dbs/log2b.rdo');
重定位和命名日志成员
SQL> SHUTDOWN IMMEDIATEmv /diska/logs/log1a.rdo /diskc/logs/log1c.rdomv /diska/logs/log2a.rdo /diskc/logs/log2c.rdoSQL> CONNECT / as SYSDBASQL> STARTUP MOUNTSQL> ALTER DATABASE RENAME FILE '/diska/logs/log1a.rdo', '/diska/logs/log2a.rdo' TO '/diskc/logs/log1c.rdo', '/diskc/logs/log2c.rdo';SQL> ALTER DATABASE OPEN;
删除Redo Log组和成员
SQL> SELECT GROUP#, ARCHIVED, STATUS FROM V$LOG;SQL> ALTER DATABASE DROP LOGFILE GROUP 3;SQL> ALTER DATABASE DROP LOGFILE MEMBER '/oracle/dbs/log3c.rdo';
强制日志切换
ALTER SYSTEM SWITCH LOGFILE;
验证日志的块
在ALTER SYSTEM语句中使用DB_BLOCK_CHECKSUM参数
清理日志文件
ALTER DATABASE CLEAR LOGFILE GROUP 3;
对未归档日志清理
ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP 3;
日志数据字典视图
The following views provide information on redo logs.
View | Description |
---|---|
V$LOG | 显示从控制文件中获取的日志信息 |
V$LOGFILE | 验证日志组、成员和成员状态 |
V$LOG_HISTORY | 包含日志历史信息 |
SQL> col group# for 999999SQL> col next_change# for 9999999999999999SQL> select * from v$log; GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME------- ---------- ---------- ---------- ---------- ---------- --- ---------- ------------- --------- ----------------- --------- 1 1 2429 52428800 512 2 YES INACTIVE 5523932 21-JUL-15 5525184 21-JUL-15 2 1 2431 52428800 512 2 NO CURRENT 5526351 21-JUL-15 281474976710655 3 1 2430 52428800 512 2 YES INACTIVE 5525184 21-JUL-15 5526351 21-JUL-15
SQL> col member for a30SQL> select * from v$logfile; GROUP# STATUS TYPE MEMBER IS_------- ---------- ------- ------------------------------ --- 2 ONLINE /u01/oradata/sss/redo02.log NO 1 ONLINE /u01/oradata/sss/redo01.log NO 2 ONLINE /u01/oradata/sss/redo03.log NO 1 ONLINE /u01/oradata/sss/redo04.log NO 3 ONLINE /u01/oradata/sss/redo05.log NO 3 ONLINE /u01/oradata/sss/redo06.log NO
参考:http://docs.oracle.com/database/121/ADMIN/onlineredo.htm