目录
一、联机日志文件
1.1概念相关
1.1.1联机重做日志
1.1.2联机重做日志组
1.1.3联机重做日志成员
1.1.4日志文件的工作方式
1.1.5联机日志文件的规划
1.1.6日志切换和检查点切换
1.1.7添加日志文件组
1.1.8添加日志成员
1.1.9删除日志成员
1.1.10删除日志组
1.1.11清空日志文件组
1.2与日志有关的动态性能视图
1.2.1 v$log中的status释义
1.2.2 v$logfile中status的释义
1.3主库和备库redo文件和standby redo的修改
1.4 联机重做日志文件的记录模式
1.4.1日志记录模式
1.4.2日志记录模式与归档模式及非归档模式之间的关系
1.4.3日志记录的优先级
1.4.4日志记录模式的使用情况
一、联机日志文件
1.1概念相关
1.1.1联机重做日志
(1)记录了数据的所有变化(DML,DDL或管理员对数据所作的结构性更改等); (2)提供恢复机制(对于意外删除或宕机利用日志文件实现数据恢复); (3)可以分组管理
1.1.2联机重做日志组
(1)由一个或多个相同的联机日志文件组成一个联机重做日志组; (2)至少两个日志组,每组一个成员(建议每组两个成员,分散放开到不同的磁盘) (3)由LGWR后台进程同时将日志内容写入到一个组的所有成员
1.1.3联机重做日志成员
(1)重做日志组内的每一个联机日志文件称为一个成员; (2)一个组内的每一个成员具有相同的日志序列号(log sequence number),且成员的大小相同; (3)每次日志切换时,Oracle服务器分配一个新的LSN号给即将写入日志的日志文件组; (4)LSN号用于唯一区分每一个联机日志组和归档日志; (5)处于归档模式的联机日志,LSN号在归档时也被写入到归档日志之中。
1.1.4日志文件的工作方式
(1)日志文件采用按顺序循环写的方式 (2)当一组联机日志组写满,LGWR则将日志写入到下一组,当最后一组写满则从第一组开始写入; (3)写入下一组的过程称为日志切换,切换时发生检查点过程,检查点的信息同时写入到控制文件。
1.1.5联机日志文件的规划
(1)总原则,分散放开,多路复用; (2)日志所在的磁盘应当具有较高的I/O (3)一般日志组大小应满足自动切换间隔至少15-20分钟左右的业务需求; (4)建议使用rdo结尾的日志文件名,避免误删除日志文件。
1.1.6日志切换和检查点切换
(1)ALTER SYSTEM SWITCH LOGFILE; --手动切换日志 (2)ALTER SYSTEM CHECKPOINT; --检查点切换 (3)ALTER SYSTEM SET FAST_START_MTTR_TARGET = n; --强制设置检查点间隔
1.1.7添加日志文件组
ALTER DATABASE ADD LOGFILE [GROUP n]
('$ORACLE_BASE/oradata/u01/logn1.rdo',
'$ORACLE_BASE/oradata/u01/logn2.rdo'
)SIZE mM;
1.1.8添加日志成员
ALTER DATABASE ADD LOGFILE MEMBER
'$ORACLE_BASE/oradata/u01/logn1.rdo' TO GROUP 1,'$ORACLE_BASE/oradata/u01/logn2.rdo' TO GROUP 2;
1.1.9删除日志成员
(1)不能删除组内的唯一一个成员; (2)不能删除处于active 和current 状态组内的成员; (3)删除处于active 和current 状态组内的成员,应使用日志切换使其处于INACTIVE状态后再删除; (4)对于组内如果一个成员为NULL值,一个为INVALID,且组处于INACTIVE,仅能删除INVALID状态成员; (5)删除日志成员,物理文件并没有真正删除,需要手动删除; (6)删除日志文件后,控制文件被更新; (7)对于处于归档模式下的数据库,删除成员时确保日志已被归档,查看v$log视图获得归档信息; (8)ALTER DATABASE DROP LOGFILE MEMBER '$ORACLE_BASE/oradata/u01/logn1.rdo'
1.1.10删除日志组
(1) 一个实例至少需要两个联机日志文件组; (2)活动或当前的日志组不能被删除; (3)组内成员状态有NULL值或INVALID状态并存,组不可删除; (4)日志组被删除后,物理文件需要手动删除; (5) ALTER DATABASE DROP LOGFILE GROUP n;
1.1.11清空日志文件组
ALTER DATABASE CLEAR LOGIFLE GROUP n;
ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP n; --使用unarchived 避免归档
1.2与日志有关的动态性能视图
1.2.1 v$log中的status释义
v$log中的status的状态值解释:
UNUSED: 从未对该联机日志写入任何内容,一般为新增加联机日志文件或是使用resetlog后的状态
CURRENT:当前重做日志文件,表示该重做日志文件为活动状态,能够被打开和关闭
ACTIVE:处于活动状态,不属于当前日志,崩溃恢复需要该状态,可用于块恢复,可能归档,也可能未归档
CLEARING:表示在执行alter database clear logfile命令后正将该日志重建为一个空日志,重建后状态变为unused
CLEARING_CURRENT:当前日志处于关闭线程的清除状态。如日志某些故障或写入新日志标头时发生I/O错误
INACTIVE:实例恢复不在需要联机重做文件日志组,可能归档也可能未归档。
select GROUP#,thread#,SEQUENCE#,MEMBERS,ARCHIVED,STATUS from v$log;
1.2.2 v$logfile中status的释义
V$LOGFILE中STATUS的状态值解释:
INVALID :表明该文件不可访问
STALE :表明文件内容不完全
DELETED : 表明该文件不再使用
NULL :表明文件正在使用。
set line 300
col member for a100
select group#,status,type,member from v$logfile;
1.3主库和备库redo文件和standby redo的修改
(1)切换几次日志,看主备同步状态
alter system switch logfile;
alter system switch logfile;
alter system switch logfile;
alter system checkpoint;
--查看主备日志应用
SELECT AL.THRD "Thread",
ALMAX "Last Seq Received",
LHMAX "Last Seq Applied"
FROM (SELECT THREAD# THRD, MAX(SEQUENCE#) ALMAX
FROM V$ARCHIVED_LOG
WHERE RESETLOGS_CHANGE# =
(SELECT RESETLOGS_CHANGE# FROM V$DATABASE)
GROUP BY THREAD#) AL,
(SELECT THREAD# THRD, MAX(SEQUENCE#) LHMAX
FROM V$LOG_HISTORY
WHERE RESETLOGS_CHANGE# =
(SELECT RESETLOGS_CHANGE# FROM V$DATABASE)
GROUP BY THREAD#) LH
WHERE AL.THRD = LH.THRD;
(2)如果主备日志同步正常,先取消备库的实时应用,设置主库和备库的standby_file_management参数为manual
备库上先取消实时应用:
alter database recover managed standby database cancel;
主备库执行:
alter system set standby_file_management='manual';
(3)查看主库redo日志的情况
select GROUP#,THREAD#,STATUS from v$log;
可以删除状态为inactive的redo log
--删除日志组
alter database drop logfile group 3;
--oracle数据库规定必须要剩下两组redo log,所以可以先添加新的,在进行其他组的删除
alter database add logfile thread 1 group 3 ('/U01/app/oracle/oradata/oracletest/redo03.rdo') size 2G reuse;
--主库的redo日志修改完成后,进行standby log的修改,直接删除在添加即可
alter database drop logfile group 9;
alter database drop logfile group 10;
alter database drop logfile group 11;
alter database drop logfile group 12;
--添加standby redo log
alter database add standby logfile thread 1 group 20 ('/U01/app/oracle/oradata/oracletest/standbyredo20.rdo') size 2G reuse;
alter database add standby logfile thread 1 group 21 ('/U01/app/oracle/oradata/oracletest/standbyredo21.rdo') size 2G reuse;
alter database add standby logfile thread 1 group 22 ('/U01/app/oracle/oradata/oracletest/standbyredo22.rdo') size 2G reuse;
alter database add standby logfile thread 1 group 23 ('/U01/app/oracle/oradata/oracletest/standbyredo23.rdo') size 2G reuse;
alter database add standby logfile thread 1 group 24 ('/U01/app/oracle/oradata/oracletest/standbyredo24.rdo') size 2G reuse;
添加完成后,查看下redo log和standby log是否都修改完成,并且standby log是否比redo log多一组
--查看redo和standby log
set lines 200 pages 9999 LONG 5000
col member for a80
select a.thread#,a.group#,b.member,b.type,a.bytes/1024/1024 MB from v$log a,v$logfile b where a.group#=b.group#
union all
select a.thread#,a.group#,b.member,b.type,a.bytes/1024/1024 MB from v$standby_log a,v$logfile b where a.group#=b.group#;
--检查无误,需要将物理文件删除
ll *a.rdo
rm -rf *a.rdo
(4)修改备库的redo log
直接删除redo log不行,需要先设置log_file_name_convert参数
alter system set log_file_name_convert ='/U01/app/oracle/oradata/oracletest/','/U01/app/oracle/oradata/oracletest/' scope=spfile;
shutdown immediate
--关闭主备同步的监听,不让文件进行传输了
startup
--此时注意备库的实时应用是否打开,如果打开需要关闭
备库上先取消实时应用:
alter database recover managed standby database cancel;
查看standby_file_management参数的值是否为manual
--查看redo log
select group#,status from v$log;
先clear 在drop
alter database clear logfile group 1;
alter database drop logfile group 1;
--添加新的redo log
alter database add logfile thread 1 group 4 ('/U01/app/oracle/oradata/oracletest/redo04.rdo') size 2G reuse;
--最后会剩下一组redo log是current的,不能删除,需要在主库上进行日志切换,等到他不在是current的进行clear,drop
--先开启备库的实时应用
alter database recover managed standby database using current logfile disconnect;
确认主备同步正常,在主库上进行日志切换
alter system switch logfile;
alter system switch logfile;
alter system switch logfile;
alter system checkpoint;
等到备库的redo log状态不是current.取消实时应用
alter database recover managed standby database cancel;
alter database clear logfile group 2;
alter database drop logfile group 2;
(5)最后处理备库的standby log
直接删除后重建
alter database drop logfile group 9;
alter database drop logfile group 10;
alter database drop logfile group 11;
alter database drop logfile group 12;
alter database add standby logfile thread 1 group 20 ('/U01/app/oracle/oradata/oracletest/standbyredo20.rdo') size 2G reuse;
alter database add standby logfile thread 1 group 21 ('/U01/app/oracle/oradata/oracletest/standbyredo21.rdo') size 2G reuse;
alter database add standby logfile thread 1 group 22 ('/U01/app/oracle/oradata/oracletest/standbyredo22.rdo') size 2G reuse;
alter database add standby logfile thread 1 group 23 ('/U01/app/oracle/oradata/oracletest/standbyredo23.rdo') size 2G reuse;
alter database add standby logfile thread 1 group 24 ('/U01/app/oracle/oradata/oracletest/standbyredo24.rdo') size 2G reuse;
--确认信息
--查看redo和standby log
set lines 200 pages 9999 LONG 5000
col member for a80
select a.thread#,a.group#,b.member,b.type,a.bytes/1024/1024 MB from v$log a,v$logfile b where a.group#=b.group#
union all
select a.thread#,a.group#,b.member,b.type,a.bytes/1024/1024 MB from v$standby_log a,v$logfile b where a.group#=b.group#;
--删除备库的物理文件,同上
(6)打开备库的实时应用,设置主备参数standby_file_management
alter database recover managed standby database using current logfile disconnect;
alter system set standby_file_management='AUTO';
(7)查看日志应用情况和dg的状态是否正常。
在这一次的操作后,dg的状态不对,会提示参数不一致,原因是备库修改了参数log_file_name_convert,但是主库没有修改。
解决方法:
在备库上设置log_file_name_convert参数:
alter system set log_file_name_convert ='' scope=spfile;
应该先备份pfile
create pfile from spfile; (但是我这次做没有这样备份,直接shutdown)
shutdown immediate
startup 报错,参数文件中log_file_name_convert参数有问题
解决:
因为spfile是二进制,没法打开,可以使用strings命令解析spfile文件然后重定向到一个文件起名pfile.ora
strings spfile >pfile.ora
编辑pfile.ora文件,将里面的格式弄好,并且删除log_file_name_convert这个参数的设置项
sqlplus / as sysdba
startup nomount;
create spfile from pfile='路径/pfile.ora';
startup force
1.4 联机重做日志文件的记录模式
1.4.1日志记录模式
日志记录模式有三种,分别是,(LOGGING 、FORCE LOGGING 、NOLOGGING)。
LOGGING:当创建一个数据库对象时将记录日志信息到联机重做日志文件。LOGGING实际上是对象的一个属性,用来表示在创建对象时是否记录REDO日志,包括在做DML时是否记录REDO日志。一般表上不建议使用NOLOGGING,在创建索引或做大量数据导入时,可以使用 NOLOGGING 。 FORCE LOGGING:简言之,强制记录日志,即对数据库中的所有操作都产生日志信息,并将该信息写入到联机重做日志文件。
NOLOGGING:正好与LOGGING、FORCE LOGGING 相反,尽可能的记录最少日志信息到联机日志文件。
需要注意的是NOLOGGING并不是不记录日志信息,而是记录最少的日志信息。
FORCE LOGGING可以在数据库级别、表空间级别进行设定、而LOGGING与NOLOGGING可以在数据对象级别设定。
在使用DATA GUARD 时,要求使用强制记录日志模式。注:FORCE LOGGING并不比一般的LOGGING记录的日志多,数据库在FORCE LOGGING状态下,NOLOGGING选项将无效,因为NOLOGGING将破坏DATAGUARD的可恢复性.FORCE LOGGING强制数据库在任何状态下必须记录日志。
1.4.2日志记录模式与归档模式及非归档模式之间的关系
日志记录模式与归档模式之间并不能等同,归档模式是指对系统产生的日志是否进行归档或不归档。
归档模式下,将日志记录到日志文件,并进行归档。非归档模式下,同样将日志记录到日志文件,只不过不归档而已,容易丢失日志。
日志的记录模式则不论是否处于归档或非归档,都可以对日志进行记录,强制记录,或少记录日志。
归档模式中的LOGGING或FORCE LOGGING 支持介质恢复,而NOLOGGING 模式不支持介质恢复。
基于NOLOGGING模式操作所产生的日志远小于LOGGING模式产生的日志,即NOLOGGING模式最小化日志记录。
1.4.3日志记录的优先级
当数据库使用FORCE LOGGING时,具有最高优先级别,其次是表空间级别的FORCE LOGGING。即使当一个对象指定NOLOGGING时,而表空间或数据库级别的日志模式为FORCE LOGGING,则该选项不起作用,直到表空间或数据库级别的FORCE LOGGING解除。
一般建议将整个数据库设置为FORCE LOGGING或基于表空间级别设定FORCE LOGGING,而不建议两者都设置为FORCE LOGGING。
当数据库或表空间使用非强制日志模式时,则日记记录优先级别由低到高为:数据库、表空间、数据对象。
1.4.4日志记录模式的使用情况
(1)LOGGING模式 这是日志记录的缺省模式,无论数据库是否处于归档模式,这并不改变表空间与对象级别上的缺省的日志记录模式。对于临时表空间将不记录日志到联机重做日志文件。
(2)NOLOGGING模式 此模式不是不记录日志,而是最小化日志产生的数量,通常在下列情况下使用NOLOGGING。
SQL*Loader in direct mode
INSERT /*+APPEND*/ ...
create table ... as select ...
ALTER TABLE statements (move/add/split/merge partitions)
CREATE INDEX
ALTER INDEX statements (move/add/split/merge partitions)
(3)FORCE LOGGING模式 设定数据库为Force Logging模式后,数据库将会记录除临时表空间或临时回滚段外所有的操作,而忽略类似NOLOGGING之类的指定参数。
通过下面的操作来修改
ALTER DATABASE FORCE LOGGING;
ALTER TABLESPACE tablespace_name FORCE LOGGING;
取消FORCE LOGGING模式
ALTER DATABASE NO FORCE LOGGING;
ALTER TABLESPACE tablespace_name NO FORCE LOGGING;
(4)查看不同级别的日志模式
查看数据库级别日志的归档模式、记录模式
select log_mode,force_logging from v$database;
查看表空间级别的日志记录模式
select tablespace_name,logging,force_logging from dba_tablespaces;
查看对象级别的日志记录模式
select table_name,logging from user_tables;
(5)日志记录模式的转换
数据库从非强制日志模式切换到强制日志模式
alter database force logging;
数据库从强制日志模式切换到非强制日志模式
alter database no force logging;
表空间级别从强制日志模式切换到非强制日志模式
alter tablespace tablespace_name no force logging;
对象级别日志记录模式
alter table table_name nologging; --不记录日志模式
alter table table_name logging; --采用日志记录模式