redo日志最重要重做日志

一、理论

1.在线日志

backup备份

restore还原:针对备份的逆操作,copy

recover恢复:需要用到日志做前滚,一定要用日志

盘上的日志:重做日志,归档日志,最多恢复到最后一次提交

特征:

记录数据库变化 dml,ddl

用于数据块的recover

以组的方式管理recover_file,最少两组redo,循环使用

和数据文件存放到不同磁盘上,需读写速度快的磁盘

2.归档日志

2.1归档与非归档的区别

  • 归档在切换日志时,备份历史日志,用于OLTP,进行冷备份和热备份,可以实现数据库完全恢复和不完全恢复
  • 归档启用后台arcn进程,占用磁盘空间
  • 非归档用于OLAP/DSS,只能冷备份,只能恢复到最后一次备份状态

2.2查看归档模式

archive log list;

2.3设置归档模式
 

shutdown immediate;

startup mount; mount状态,数据库已经打开参数文件,控制文件,故而归档信息是记录在控制文件中的

alter database noarchivelog;切成非归档

archive log list;检查数据库非归档状态

alter database archivelog;切成归档状态

alter database open;打开数据库
#归档位置信息存储在参数文件
SQL> alter system set log_archive_dest='/oracle/product/19.0/db_1/dbs/arch';

System altered.

#但是归档信息存储在控制文件中
SQL> archive log list;
ORA-01507: database not mounted

2.4归档日志的路径和命名方法

若log_archive_dest_n为空,归档日志文件目录为log_archive_dest,如果log_archive_dest值也为空,则默认是db_recover_file_dest参数指定的位置。缺省安装后db_recover_file_dest指向了flash_recover_area

指定log_archive_dest参数并不意味着取消闪回恢复区的参数,因为这个闪回恢复区不仅归档日志,还有rman备份与闪回日志。

参数详解如下

log_archive_dest_n (n:1-10)表示可以有10个目标路径存放归档日志(镜像关系)
可以多路复用10个归档日志的备份。

若只使用了log_archive_dest_1,说明只有一套归档日志的备份,没有做镜像,若是生产系统最好能再加一个指定。

alter system set log_archive_dest_1='location=/u01/disk1/timran';
//把历史日志归档到本机目录下(location代表本机)

alter system set log_archive_dest_2='service=standby';
//远程备份,把归档日志备份到服务名为standby的另外的数据库上(service代表远程)

alter system set log_archive_dest_1='location=/u01/disk1/timran mandatory';
//mandatory强制归档:只有在归档成功后,重做日志在可以被覆盖,在设置时至少有一个本地
//默认optional,即使归档没有成功也可以覆盖联机日志文件。

log_archive_format 定义命名格式,使用以下三个模板

%t,thread#,日志线程号

%s,sequence,日志序列号

%r,resetlog,代表数据库的周期

alter system set log_archive_format='arch_%t_%s_%r.log' scope=spfile;

log_archive_dest

log_archive_duplex_dest

如果都定义了可以完成两路复用,但只能指定本机location,无法指定远程。

一旦指定log_archive_dest_n,log_archive_dest参数就失效了,log_archive_dest与log_archive_dest_n互斥。

详细实验见 文章《log_archive_dest_n,log_archive_dest区分》

添加日志文件

#添加日志文件
alter database add logfile '/u01/app/oracle/oradata/SINGLE02/onlinelog/redo04.log' size 200M;
#添加镜像成员,添加日志组成员

alter database add logfile member 
'/u01/app/oracle/oradata/SINGLE03/onlinelog_b/redo01b.log' to group 1,
'/u01/app/oracle/oradata/SINGLE03/onlinelog_b/redo02b.log' to group 2,
'/u01/app/oracle/oradata/SINGLE03/onlinelog_b/redo03b.log' to group 3,
'/u01/app/oracle/oradata/SINGLE03/onlinelog_b/redo04b.log' to group 4;

删除日志组成员

alter database drop logfile member '/u01/app/oracle/oradata/SINGLE03/onlinelog_b/redo03b.log';

删除在线重做日志文件

alter database drop logfile '/u01/app/oracle/oradata/SINGLE02/onlinelog/redo04.log'

二、实践

1.v$log

select * from v$log;

SQL> select * from v$log;

GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME     CON_ID

---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------- ------------ --------- ----------

         1          1          0  209715200        512          1 YES UNUSED                 7243430 22-JUL-21      7321605 22-JUL-21          0

         2          1          0  209715200        512          1 YES UNUSED                 7321605 22-JUL-21   9.2954E+18                    0

         3          2          0  209715200        512          1 YES UNUSED                 7321614 22-JUL-21   9.2954E+18                    0

         4          2          0  209715200        512          1 YES UNUSED                 7020945 21-JUL-21      7021117 21-JUL-21          0

         5          1          0  209715200        512          1 YES UNUSED                 7021136 21-JUL-21      7243430 22-JUL-21          0

         6          2          0  209715200        512          1 YES UNUSED                 7021117 21-JUL-21      7321614 22-JUL-21          0


6 rows selected.

说明:status为空说明没有问题

select group#,member,status from v$log;

GROUP#  MEMBER   STATUS
------  ----------------------------------------------------- ----------

4 /u01/app/oracle/oradata/SINGLE02/onlinelog_b/redo04b.log  INVALID

当有valid时,需要手动切日志(alter system switch logfile),将invalid状态值变为空(正常值)

SQL> select * from v$log;


    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARC STATUS     FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME     CON_ID

---------- ---------- ---------- ---------- ---------- ---------- --- ---------- ------------- --------- ------------ --------- ----------

         1          1          5  209715200        512          2 YES ACTIVE           3155184 19-JUL-21      3155196 19-JUL-21          0

         2          1          6  209715200        512          2 NO  CURRENT          3155196 19-JUL-21   9.2954E+18                    0

         3          1          3  209715200        512          2 YES INACTIVE         3146337 19-JUL-21      3154268 19-JUL-21          0

         4          1          4  209715200        512          2 YES ACTIVE           3154268 19-JUL-21      3155184 19-JUL-21          0

说明:

current:当前正在被使用,实例恢复前滚

active:日治已经归档,但是日志对应的脏块即对应的数据文件仍然在内存中,还未通过dbwr写入磁盘

inactive:等待上一个日志写满

member字段为一个组的不同成员

2.v$logfile

select group#,member,status from v$logfile;

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

    GROUP# MEMBER                                                       STATUS
---------- ------------------------------------------------------------ -------
         5 /u01/app/oracle/oradata/vddb/group_5.276.1075890543
         2 /u01/app/oracle/oradata/vddb/group_2.259.1075890543
         1 /u01/app/oracle/oradata/vddb/group_1.260.1075890543
         3 /u01/app/oracle/oradata/vddb/group_3.258.1075891545
         4 /u01/app/oracle/oradata/vddb/group_4.297.1075891547
         6 /u01/app/oracle/oradata/vddb/group_6.291.1075891551
         7 /u01/app/oracle/oradata/vddb/standbyreo01.log
         8 /u01/app/oracle/oradata/vddb/standbyreo02.log
         9 /u01/app/oracle/oradata/vddb/standbyreo03.log
        10 /u01/app/oracle/oradata/vddb/standbyreo04.log
        11 /u01/app/oracle/oradata/vddb/standbyreo05.log

    GROUP# MEMBER                                                       STATUS
---------- ------------------------------------------------------------ -------
        12 /u01/app/oracle/oradata/vddb/standbyreo06.log
        13 /u01/app/oracle/oradata/vddb/standbyreo07.log
        14 /u01/app/oracle/oradata/vddb/standbyreo08.log

14 rows selected.

3.切归档和checkpoint

SQL> alter system switch logfile;

System altered.

SQL> select group#,thread#,sequence#,members,archived,status from v$log;

    GROUP#    THREAD#  SEQUENCE#    MEMBERS ARC STATUS
---------- ---------- ---------- ---------- --- ----------------
         1          1         36          3 NO  CURRENT
         2          1         34          3 YES INACTIVE
         3          1         35          3 YES ACTIVE

SQL> alter system checkpoint;

System altered.

SQL> select group#,thread#,sequence#,members,archived,status from v$log;

    GROUP#    THREAD#  SEQUENCE#    MEMBERS ARC STATUS
---------- ---------- ---------- ---------- --- ----------------
         1          1         36          3 NO  CURRENT
         2          1         34          3 YES INACTIVE
         3          1         35          3 YES INACTIVE