oracle_重做日志文件--笔记

旧时模样 提交于 2020-02-20 16:47:17

 重做日志文件(redo log file)


 目录
       重做日志文件相关。
       重做日志文件简介。
       查询重做日志文件的信息。
       日志切换。
       管理日志文件组
       增删日志文件组。
       增删日志文件成员。
       归档与非归档模式。




一.重做日志文件相关。
    
    Oracle引入重做日志的目的:数据库的恢复。
    Oracle相关进程:重做日志写进程(LGWR)。
    重做日志性质:联机日志文件,oracle服务器运行时需要管理它们。
    相关数据字典:v$log ; v$logfile。
    操作者权限:具有sys用户或system用户权限。

1.1重做日志文件的规划。
(于网络上收集)
联机日志文件的规划原则如下:
1:分散放开,多路复用。一般会将同一组的不同日志成员文件放到不同的磁盘或不同的裸设备上。以提高安全性。
2:把重做日志放在速度最快的硬盘上(即:日志所在的磁盘应当具有较高的I/O),一般会将日志文件放在裸设备上。
3:把重做日志文件设为合理大小:例如,增大日志文件大小可以加快一些大型的INSERT、UPDATE、DELETE操作,也能降低日志文件切换频率。减少一些日志等待事件。一般根据具体业务情况有所不同。一般日志组大小应满足自动切换间隔至少15-20分钟左右业务需求
4:ORACLE推荐,同一个重做日值组下的所有重做日志文件大小、成员个数一致.


二.重做日志文件简介。
      2.1重做日志
      重做日志文件又叫联机日志文件,记录了对数据库修改的信息,包括用户对数据修改和数据库管理员对数据库结构的修改。

      2.2重做日志的作用。
      它主要用于在oracle发生故障的时候和数据库备份文件配合恢复数据库。
      一般来说,数据库故障丢失数据,有两种情况。
      一是,因为停电或死机,脏块未写入磁盘,造成该数据丢失。
      二是,磁盘损坏,数据全完蛋。
       对应第一种情况,oracle会使用实例恢复,使用重做日志自动恢复数据,不需要用户干预。没错,实例恢复,它是自动的。
       对应第二种情况,便需要DBA使用备份,重做日志,归档日志来恢复数据了。下面有讲恢复的步骤。
       
       2.3重做日志文件的组织概念。

        重做日志是以组为单位管理。每个数据库至少有两个日志文件组,每组至少包含1个或者多个日志文件成员,且日志文件成员的内容大小一致。(多个成员,内容一致的原因是,在日志文件损坏时,能及时提高备份恢复。)

----------------------------------------------------------------------------------------------------------------------------
注意!   组里的日志文件分别存储在不同的分区上, 若有一个日志文件出现问题时,并不会影响其他分区的日志文件。
             oracle只对可用的日志文件写入数据,并将出问题的成员标记为invalid,同时把错误信息记录到控制文件和警告文件去。
             这样对数据库的运行没有影响。        
----------------------------------------------------------------------------------------------------------------------------

      
        联机重做日志文件是循环使用的(见下图)。当第一个日志文件达到一定数量时,就会停止写入,而转向第二个日志文件,第二个满转向第三个日志文件.第三个满就向第一个日志文件写入。
       而第一个日志文件有没有自动备份就涉及到归档或者不归档的问题.当数据库自动对原来的日志文件进行备份的话就叫归档模式,不需要对数据库进行自动备份就叫非归档模式。



----------------------------------------------------------------------------------------------------------------------------
注意!   负责把日志信息写入日志文件的进程,是LGWR    (日志写进程)。每次对数据的DML操作,都会生成日志信息,
             存储在log buffer(日志缓存区) 里,再由一些情况触发LGWR进程把日志信息写入redo logfile。     
----------------------------------------------------------------------------------------------------------------------------

什么情况会触发LGWR    写日志呢?

◆ 当发出commit命令的时候
◆ 当log buffer的空间写满到1/3的时候或者当log buffer的空间写满1MB的记录的时候
◆ 当每3秒钟超时的时候    (周期性)
◆ 当DBWn需要写入数据文件的操作之前的时候  (DBWn,负责把内存区中的数据写入数据文件的进程。重要的一个进程)
◆ 当切换日志文件的时候    


三.查询重做日志文件的信息。      

        相关数据字典:v$log ; v$logfile。

3.1 v$log     记录数据库中有多少个重做日志组,每个组中有多少个成员、日志大小及状态。    

SQL> desc v$log
 Name                                  
 ----------------------------
 GROUP#                                   --日志文件组号#        
 THREAD#                                  
 SEQUENCE#                              --序号       
 BYTES                                        --大小      
 BLOCKSIZE                                       
 MEMBERS                                  --组成员数量          
 ARCHIVED                                           
 STATUS                                     --状态        
 FIRST_CHANGE#                                     
 FIRST_TIME                                         
 NEXT_CHANGE#                                     
 NEXT_TIME   

SQL> select group#,sequence#,bytes/1024/1024 sizeMB,members,status from v$log;

    GROUP#  SEQUENCE#     SIZEMB    MEMBERS STATUS
---------- ---------- ---------- ---------- ----------------
         1         28         50          1 INACTIVE
         2         29         50          1 CURRENT
         3         27         50          1 INACTIVE


status     -----状态表示的含义。

         inactive:表示实例恢复已不再需要这组联机重做日志组了。
         active:表示该组是活动的但不是当前组,实例恢复时需要这组日志。
         current:表示该组日志是当前组,该联机重做日志组是活动的。
         unused:表示该日志组从未写过,是重做日志刚刚添加到状态。




3.2  v$logfile    如名,记录着每个日志组成员的属性。路径,文件名,状态等。

SQL> desc v$logfile
 Name                                      
 ------------------------
 GROUP#                                 ----文件组      
 STATUS                                   ----状态                      (与v$log不同)          
 TYPE                                        ---类型       
 MEMBER                                  ---成员数量           
 IS_RECOVERY_DEST_FILE                          

 
SQL> select group#,status,type,member from v$logfile;

    GROUP# STATUS  TYPE    MEMBER
---------- ------- ------- ---------------------------------------------
         3         ONLINE  /home/app/oracle/oradata/orcl/redo03.log
         2         ONLINE  /home/app/oracle/oradata/orcl/redo02.log
         1         ONLINE  /home/app/oracle/oradata/orcl/redo01.log

status     -----状态表示的含义。

       空白:表示该文正在使用。
       stale:表示该文件中的内容是不完全的。
        invalid:表示该文件是不可以被访问的。
       deleted:表示该文件已不再有用了。


四。日志切换。

上面提到重做日志是循环使用的,当一组联机重做日志文件被写满时,LGWR将开始写下一组日志文件,这被称为日志切换。
你也可以任何时候,手动日志切换。

强制重做日志切换命令: alter system switch logfile;  

------------
实验!
------------
1.当前的日志组是3。
SQL> select group#,sequence#,bytes/1024/1024 MB,members,status,first_change# from v$log;
    GROUP#  SEQUENCE#         MB    MEMBERS STATUS           FIRST_CHANGE#
---------- ---------- ---------- ---------- ---------------- -------------
         1         28         50          1 INACTIVE               1164439
         2         29         50          1 INACTIVE               1188272
         3         30         50          1 CURRENT                1192137




2.alter system switch logfile 日志切换后、(注意!日志切换,SCN(system change number)会发生改变。)
SQL> select group#,sequence#,bytes/1024/1024 MB,members,status,first_change# from v$log;
    GROUP#  SEQUENCE#         MB    MEMBERS STATUS           FIRST_CHANGE#
---------- ---------- ---------- ---------- ---------------- -------------
         1         31         50          1 CURRENT                1193775
         2         29         50          1 INACTIVE               1188272
         3         30         50          1 ACTIVE                 1192137




五。管理日志文件组。

5.1增加和删除日志组。

5.1.1增加一个日志组。

新添加一个日志组的语句:
    alter database add logfile group {组编号}      --不加group 参数,会默认依序编号. 
    ('路径01.log','路径02.log','路径03.log')
    size 大小
 
下面是一个实例:
SQL> alter database add logfile group 4
  2  ('/oracle1/redo4_01.log','/oracle1/redo4_02.log')
  3  size 10m
  4  /
----添加了日志组4,有两个个成员,大小统一10m。

5.1.2删除一个日志组。

删除日志组的语句:
alter database drop logfile group [组号];

下面是一个实例:
SQL> alter database drop logfile group 4;
Database altered.

----------------------------------------------------------------------------------------------------------------------------
注意!   1.日志组被删除时,并同时删除日志文件,要手动在操作系统上删除。不然,只会留下一堆垃圾文件占用磁盘。
             2.CURRENT  状态的日志组不能被删除,必须手动切换当前日志组才能删除。
             3.确保你的oracle上至少拥有两组以上的日志组。
             4.生产环境中,删除日志组时,确保你的日志组先归档。
----------------------------------------------------------------------------------------------------------------------------


5.2增加和删除和移动日志成员。

5.2.1增加一个日志成员。

语句:
alter database 
add logfile member '路径.log'
to group {组号}


下面一个实列:
SQL> alter database
  2  add logfile member '/oracle1/redo4_o3.log'
  3  to group 3
  4  /

---给日志组3,添加了一个日志成员。不需要指定size,oracle会根据其他成员大小默认。


5.2.2删除一个日志成员。
语句:
alter database
drop logfile member '路径,log';

下面一个实例:
SQL> alter database
  2  drop logfile member '/oracle1/redo4_o3.log'
  3  /
Database altered.

-----删除了一个成员,但其日志文件并未被删除,如下所示。要在操作系统内手动删除。
SQL> ! ls /oracle1
control01.ctl  redo4_o3.log  test01.dbf

SQL> ! rm -r /oracle1/redo4_o3.log



注意!
删除日志成员时要注意以下几点!
1.日志成员处于current状态不能被删除。
2.删除时,要保证日志组至少拥有一个成员。
3.因故障需要删除成员后,需要立刻补加成员,以保证镜像关系。
4.删除成员时,其日志文件并未被删除,要在操作系统上手动删除。


5.3移动重做日志文件。

1.关闭数据库,重启mount模式。
SQL> shutdown immediate
SQL> startup mount

2.移动重做日志文件到所需位置。
SQL> ! mv /home/app/oracle/oradata/orcl/redo02.log /oracle1

3.重命名日志文件。
SQL> alter database rename file
  2  '/home/app/oracle/oradata/orcl/redo02.log'
  3  to
  4  '/oracle1/redo02.log'
  5  /
Database altered.

4.启动数据库。


六.归档与不归档模式。

当数据库自动对原来的日志文件进行压缩备份的话就叫归档模式。
没有对数据库日志文件进行自动压缩备份就叫非归档模式。

不归档模式                                归档模式
只能冷备份。(关闭数据库才能备份)                                           可以热备份,增量备份,部分恢复。
恢复可能不尽全。                                                                        可以做完全恢复而且可以将数据库恢复到特定的点。


6.1.查询当前数据库是否归档模式
6.1.1   archive log list 显示数据库是否归档模式和联机重做文件组的信息。----权限SYSDBA

SQL> archive log list
Database log mode              No Archive Mode                 ------不归档模式。
Automatic archival             Disabled                                 -------自动存档             禁用
Archive destination            USE_DB_RECOVERY_FILE_DEST       --存档终点            
Oldest online log sequence     30                                          ----最早联机日志序号
Current log sequence           32                                             ----当前日志序号

6.1.2 v$database    ----system权限可以查询,其log_mode列记录了数据库是否处于归档模式。

SQL> select name,log_mode from v$database;

NAME      LOG_MODE
--------- ------------
ORCL      NOARCHIVELOG

6.2 查询归档日志文件的信息。
6.2.1 v$log_history    记录已归档日志文件的序列号,SCN等信息。

SQL> desc v$log_history
 Name                                    
 -------------------------------
 RECID                                              
 STAMP                                           
 THREAD#                                           
 SEQUENCE#                                       
 FIRST_CHANGE#                                     
 FIRST_TIME                                       
 NEXT_CHANGE#                                    
 RESETLOGS_CHANGE#                       
 RESETLOGS_TIME         

6.2.2 v$archived_log 同是记录归档日志文件的信息,更详细。

自行desc,熟悉一下,如何?

6.2.3 归档日志存放的目录。---(db_recovery_file_dest 参数记录着归档日志的路径)
----如何更改归档日志存放的路径?----详见6.4
SQL> show parameter db_recovery_file_dest

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest                string      /home/app/oracle/flash_recover
                                                 y_area


6.3切换归档模式

由6.1.1知道,我的oracle并没有开启归档模式,现在手动开启归档模式。

1.关闭数据库。
SQL> shutdown immediate

2.重启mount模式。(不加载数据文件,只加载控制,日志文件模式。)
SQL> startup mount

3.查看数据库当前模式。
SQL> archive log list
Database log mode              No Archive Mode
Automatic archival             Disabled
Archive destination            USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     30
Current log sequence           32

4.设置数据库为归档模式。
SQL> alter database archivelog;

5.加载数据文件。
SQL> alter database open;

6.查看日志归档模式。
SQL> archive log list
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     30
Next log sequence to archive   32
Current log sequence           32



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!