1 : 官方教程
2 :dba-oracle讲解
3 :WIKI redo log
4 :操作 联机重做日志文件 和 组
几乎所有的发生在oracle的内部变化都记录在online redo log file中,oracle使用 这些 redo log groups 去恢复数据库,因此它们是非常的重要。
每一个redo log 是被分配到 组中, oralce 一次值写一个 online redo log 组, 一旦 这个组中的联机重做日志被填满,oracle 将转换写到下一个联机重做日志组中因此oracle在多个组之间写是一个循环操作。
每一个联机重做日志文件被分配一个唯一的序列号(sequence number)。除非重建数据库,否则 联机重做日志文件的序列号不会出现重复。
我们可以有多个 联机重组偶日志文件在一个组中, 这意味着每一个联机重做日志组包含至少两个 联机重做日志文件, 在组中的每一个文件 成为一个member,每一个 member 应该被分配在不同的磁盘,为了包含这些组文件丢失,oracle 往组里面的member中并发的写信息,一个组的联机重做日志文件是一模一样的,通过LGWR 进程向所有 online redo log file 组中写信息。
组中的每一个member 具有相同的大小,oracle数据在往 redo log file 组中写信息的时候首先分配一个 log sequence numbers,多路复用:一个组里至少两个 member ,避免了redo log files 的单点故障 ,redo log files 中 一个组中包含多个 member,每个组都有一个编号。
当数据库创建的时候 联机重做日志文件即被创建,数据库不能缺少联机重做日志文件, 如果 一个组中的所有的member 丢失了, 数据库也就损坏了,因此保存和备份这些文件是非常重要的, 有两种重做日志 , 第一种: 联机重做日志 第二种:归档日志。
联机重做日子文件如何工作:
循环使用, 理解 log switch 的定义。(就是切换不同的组进行写),log switch 引发了 checkpoints 把内存中脏数据回写到数据库文件中叫一个checkpoints
强迫 日志切换(LOG Switches) 和 checkpoints
V$log;这个视图是与联机重做日志文件的视图。
SQL> col member format a50;
SQL> selectgroup#,type,member from v$logfile;
GROUP# TYPE MEMBER
---------- ------- --------------------------------------------------
3 ONLINE D:\APP\TOPWQP\ORADATA\ORCL\REDO03.LOG
2 ONLINE D:\APP\TOPWQP\ORADATA\ORCL\REDO02.LOG
1 ONLINE D:\APP\TOPWQP\ORADATA\ORCL\REDO01.LOG
例如:如下例子 第一次查询 组号为 2 的组的status 是 current , 如下执行了 alter system switch logfile 命令后 再次进行查询 oracle当前写的组号为 3, 表示进行了 log switch 日志组切换操作,这是通过手工的方式进行切换。
SQL> selectgroup#,thread#,sequence#,status from v$log;
GROUP# THREAD# SEQUENCE# STATUS
---------- ---------- ---------- ----------------
1 1 442 INACTIVE
2 1 443 CURRENT
3 1 441 INACTIVE
SQL> alter system switch logfile;
系统已更改。
SQL> selectgroup#,thread#,sequence#,status from v$log;
GROUP# THREAD# SEQUENCE# STATUS
---------- ---------- ---------- ----------------
1 1 442 INACTIVE
2 1 443 ACTIVE
3 1 444 CURRENT
到reference 找这个参数:fast_start_mttr_target 指定快速恢复的最大值,最大时间数,规定DBWn进程在多长时间内必须把redo log file中信息写到数据文件中 ,这个参数影响性能的一个重要值,因为它能触动I/O写
SQL> show parameter fast_start_mttr_target;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
fast_start_mttr_target integer 0
SQL> alter system set fast_start_mttr_target = 60 scope = both;
系统已更改。
SQL> show parameter fast_start_mttr_target;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
fast_start_mttr_target integer 60
经过以上 alter system set fast_start_mttr_target =100 scope = both; 表明已经修改,定DBWn进程在60秒内必须把redo log file中信息写到数据文件
需要手工执行如下命令:
SQL> alter system checkpoint;
系统已更改。
SQL>
如下操作增加了的 redo log 组 组号为4
SQL> selectgroup#,type,member from v$logfile;
GROUP# TYPE MEMBER
---------- ------- --------------------------------------------------
3 ONLINE D:\APP\TOPWQP\ORADATA\ORCL\REDO03.LOG
2 ONLINE D:\APP\TOPWQP\ORADATA\ORCL\REDO02.LOG
1 ONLINE D:\APP\TOPWQP\ORADATA\ORCL\REDO01.LOG
SQL> alterdatabaseadd logfile group 4 ('D:\APP\TOPWQP\ORADATA\ORCL\REDO04.LO
G') size 52429312;
数据库已更改。
SQL> selectgroup#,type,member from v$logfile;
GROUP# TYPE MEMBER
---------- ------- --------------------------------------------------
3 ONLINE D:\APP\TOPWQP\ORADATA\ORCL\REDO03.LOG
2 ONLINE D:\APP\TOPWQP\ORADATA\ORCL\REDO02.LOG
1 ONLINE D:\APP\TOPWQP\ORADATA\ORCL\REDO01.LOG
4 ONLINE D:\APP\TOPWQP\ORADATA\ORCL\REDO04.LOG
SQL>
SQL> ALTERDATABASEADD LOGFILE MEMBER 'D:\APP\TOPWQP\ORADATA\ORCL\REDO05.LOG' T
O GROUP 4;
数据库已更改。
SQL> selectgroup#,type,member from v$logfile;
GROUP# TYPE MEMBER
---------- ------- --------------------------------------------------
3 ONLINE D:\APP\TOPWQP\ORADATA\ORCL\REDO03.LOG
2 ONLINE D:\APP\TOPWQP\ORADATA\ORCL\REDO02.LOG
1 ONLINE D:\APP\TOPWQP\ORADATA\ORCL\REDO01.LOG
4 ONLINE D:\APP\TOPWQP\ORADATA\ORCL\REDO04.LOG
4 ONLINE D:\APP\TOPWQP\ORADATA\ORCL\REDO05.LOG
这是两个 组号 为 4 的两个member 这两个 的 log 文件 的 大小 和内容 完全一样。 可以把两个 member放在不同的 磁盘上 disk 上。
D:\APP\TOPWQP\ORADATA\ORCL\REDO04.LOG
D:\APP\TOPWQP\ORADATA\ORCL\REDO05.LOG
如图: 下图 显示了 group 和 member 的概念 以及显示了 在不同的 磁盘 disk上。
注意要点:
在删除之前保证 一个组里面至少有两个redo log file 即至少有两个member
如果你想删除这样 (一个组里面只有一个member) , 是删除不掉member的
当删除 完成后 ,不是删除文件,而是 在 control file中登记该
redo file member 不存在了,如果想进一步删除,可以使用操作系统命令删除。
首先查询以下 ,然后删除,然后再查询对比一下
命令如下: ALTER DATABASE DROP LOGFILE MEMBER 'D:\APP\TOPWQP\ORADATA\ORCL\REDO05.LOG';
SQL> selectgroup#,type,member from v$logfile;
GROUP# TYPE MEMBER
---------- ------- --------------------------------------------------
3 ONLINE D:\APP\TOPWQP\ORADATA\ORCL\REDO03.LOG
2 ONLINE D:\APP\TOPWQP\ORADATA\ORCL\REDO02.LOG
1 ONLINE D:\APP\TOPWQP\ORADATA\ORCL\REDO01.LOG
4 ONLINE D:\APP\TOPWQP\ORADATA\ORCL\REDO04.LOG
4 ONLINE D:\APP\TOPWQP\ORADATA\ORCL\REDO05.LOG
SQL> ALTERDATABASEDROP LOGFILE MEMBER 'D:\APP\TOPWQP\ORADATA\ORCL\REDO05.LOG';
数据库已更改。
SQL> selectgroup#,type,member from v$logfile;
GROUP# TYPE MEMBER
---------- ------- --------------------------------------------------
3 ONLINE D:\APP\TOPWQP\ORADATA\ORCL\REDO03.LOG
2 ONLINE D:\APP\TOPWQP\ORADATA\ORCL\REDO02.LOG
1 ONLINE D:\APP\TOPWQP\ORADATA\ORCL\REDO01.LOG
4 ONLINE D:\APP\TOPWQP\ORADATA\ORCL\REDO04.LOG
一个active 或者 current 的组不能够删除。
inactive 状态 表示 redo log files中的脏数据已经回写到 数据文件中,
所以是 inactive状态。可以删除改组。
如果你想删除 current 状态的 group 可以通过
alter system switch logfile;
当删除组; 同样这个删除只是在 control file中登记 如果想彻底删除,需要手工用操作系统删除。
alter database drop logfile group 4
命令为: ALTER DATABASE DROP LOGFILE GROUP 4;
SQL> selectgroup#,members,archived,status from v$log;
GROUP# MEMBERS ARC STATUS
---------- ---------- --- ----------------
1 1 NO INACTIVE
2 1 NO INACTIVE
3 1 NOCURRENT
4 1 YES UNUSED
SQL> ALTERDATABASEDROP LOGFILE GROUP 4;
数据库已更改。
SQL> selectgroup#,members,archived,status from v$log;
GROUP# MEMBERS ARC STATUS
---------- ---------- --- ----------------
1 1 NO INACTIVE
2 1 NO INACTIVE
3 1 NOCURRENT
在该redo log file的结构的时候 必须备份数据库。
relocate 之前
1 : 首先 shutdown immediate
2: : 到目录下 然后 拷贝,
3: startup mount
4 : alter database rename file '文件路径文件名' to '文件路径文件名';
参照如下即可:
5. Relocating A redo log Group
You may want to relocate your existing redo log group and change the path of redo log files. Here are the steps to accomplish it
Step 1: Shutdown database
1
|
sql> shutdown immediate ;
|
Step 2: Backup your existing control file and redo log file at operating system level.
Step 3: Move your redo log member to a new location. You may also change the file name if you want.
1
|
# mv /u02/oradata/mydb/redo02.log /u03/oradata/mydb/redo03.log
|
Step 4: Startup in nomount mode
1
|
sql> startup nomount;
|
Step 5: Path of redo log files is kept in control file. You have to update that record by command below:
1
|
sql>
ALTER
DATABASE
RENAME FILE
'/u02/oradata/mydb/redo02.log'
TO
'/u03/oradata/mydb/redo03.log'
|
Control file is modified and the path of redo log member is updated. Now you can open your database.
1
|
sql>
alter
database
open
;
|
10 : 清除 redo files
alterdatabase clear logfile group 2;
redo log file 不归档到数据中,执行如下命令:
alterdatabase clear unarchieved logfile group 2;
一个组group 中只要还有一个member能够工作,数据库instance就能继续工作,所以 一个组中不同的member要放在不同的磁盘上,防止集体被破坏。
如果集体破坏,数据库写就不能工作了。 这个 和数据库 control file有很大不同, 数据库 control file也有很多,如果其中一个破坏了,就不能成功启动数据库了。
关于redo thread 在RAC(real application clusters)环境下,有多少个instance就有多少个 redo thread
概念分析: archived redo log files 归档redo log file就是把 online redo log file进行归档备份。
一旦 data files 文件丢失或损坏了, 可以通过 归档的online redo log files;恢复数据库
所以在生产数据库上,数据库处于归档模式是很重要的。
如何查看数据库是否处于归档模式呢?
SQL> select archiver from v$instance;
ARCHIVE
-------
STOPPED
或者通过以下命令查看:
SQL> select log_mode from v$database;
LOG_MODE
------------
NOARCHIVELOG
归档是通过 ARCn 进程 进行归档,这个进程就是把 online redo log files 信息 写到 归档日志中。
数据库创建的时候默认是不归档的,在正式 的生产环境上,一定要
使数据库处于归档模式。