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