ORACLE的联机日志文件

    技术2022-07-11  85

    目录

    一、联机日志文件

    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; --采用日志记录模式

     

     

    Processed: 0.012, SQL: 9