Redo Log概念数据库
规划Redo Log缓存
建立Redo Log组和成员bash
从新分配、命名Redo Log成员oracle
删除Redo Log组和成员ide
强制切换日志this
验证Redo Log文件块spa
清理Redo Log 文件线程
Redo Log字典视图日志
Redo Log 概念code
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关键字来指定日志块的大小,容许的大小为5十二、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 IMMEDIATE mv /diska/logs/log1a.rdo /diskc/logs/log1c.rdo mv /diska/logs/log2a.rdo /diskc/logs/log2c.rdo SQL> CONNECT / as SYSDBA SQL> STARTUP MOUNT SQL> 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 999999 SQL> col next_change# for 9999999999999999 SQL> 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 a30 SQL> 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