Oracle联机日志文件管理

日志文件分类: Redo log files -->联机重做日志

Archive log files -->归档日志

Alert log files -->告警日志

Trace files -->跟踪日志

日志文件存储路径:

user_dump_dest -->用户跟踪日志

backupground_dump_dest -->进程跟踪日志

redo_log_file文件作用:

1)维护数据一致性

2)记录了数据库里的更改操作

redo_log_friles以组为单位,一个组下可以有多个成员,顺序循环写,一个数据库要启动至少要有2个日志组,每个组下至少有一个成员,redolog以多工方式工作。

3)联机重做日志

记录了数据的所有变化(DML,DDL或管理员对数据所作的结构性更改等) 提供恢复机制(对于意外删除或宕机利用日志文件实现数据恢复)可以被分组管理。

4)联机重做日志组

由一个或多个相同的联机日志文件组成一个联机重做日志组至少两个日志组,每组一个成员(建议每组两个成员,分散放开到不同的磁盘)由LGWR后台进程同时将日志内容写入到一个组的所有成员。

LGWR的触发条件:

在事务提交的时候(COMMIT)

Redo Log Buffer 三分之一满

Redo Log Buffer 多于一兆的变化记录

在DBWn写入数据文件之前

5)联机重做日志成员

重做日志组内的每一个联机日志文件称为一个成员, 一个组内的每一个成员具有相同的日志序列号(log sequence number),且成员的大小相同,每次日志切换时,Oracle服务器分配一个新的LSN号给即将写入日志的日志文件组, LSN号用于唯一区分每一个联机日志组和归档日志, 处于归档模式的联机日志,LSN号在归档时也被写入到归档日志之中。

6)日志文件的工作方式

日志文件采用按顺序循环写的方式, 当一组联机日志组写满,LGWR则将日志写入到下一组,当最后一组写满则从第一组开始写入, 写入下一组的过程称为日志切换。

切换时发生检查点过程;

检查点的信息同时写入到控制文件。

****日志切换:****从一个组切换到下一个组的过程。

1)自动切换

2)手工切换:SQL>alter system switch logfile;

规划redo_log_file日志:

分散到不同磁盘,磁盘io要够用,io读写都要快。

日志大小问题:要满足数据库自动切换日志的时间间隔在15--20min左右。

1)查询日志文件位置:

SQL>select * from v$logfile;

GROUP# STATUS TYPE MEMBER IS_


1 STALE ONLINE /u01/oracle/oradata/rezin/redo01.log NO

2 STALE ONLINE /u01/oracle/oradata/rezin/redo02.log NO

3 ONLINE /u01/oracle/oradata/rezin/redo03.log NO

SQL> select * from v$log;

GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS


FIRST_CHANGE# FIRST_TIME


1 1 37 52428800 1 YES INACTIVE

642652 16-3? -15

2 1 38 52428800 1 YES INACTIVE

668961 16-3? -15

3 1 39 52428800 1 NO CURRENT

695725 17-3? -15

日志状态:status常见值

unused:表示从未对联机重做日志文件组进行写入,这是刚添加联机重做日志组状态。

current:表示当前正在使用的联机重做日志文件组。

active:表示联机重做日志文件组是活动的,但不是当前正在使用的。崩溃恢复需要该状态,可能归档,也可能没有归档。

clearing:表示执行alter database clear logfile后正在将该日志重建一个空日志,日志清除后,状态为unused。

添加日志组文件:

语法:alter database add logfile [group n1] ('<dir>','<dir>',....) size N,[group n2] ('<dir>','<dir>') size N,.........;

SQL> alter database add logfile group 4 '/u01/oracle/oradata/orcl/redo04.log' size 50m;

Database altered.

SQL> alter database add logfile '/u01/oracle/oradata/orcl/redo05.log' size 50m;

Database altered.

添加组指定多个成员:

SQL> alter database add logfile

('/u01/oracle/oradata/orcl/redo07.log','/u01/oracle/oradata/orcl/redo08.log') size 50m;

Database altered.

SQL> alter database add logfile group 7

('/u01/oracle/oradata/orcl/redo09.log','/u01/oracle/oradata/orcl/redo10.log') size 50m;

Database altered.

一条语句添加多个日志组:

SQL> alter database add logfile group 7 '/u01/oracle/oradata/orcl/redo11.log' size 50m,group 8 '/u01/oracle/oradata/orcl/redo12.log' size 50m;

Database altered.

添加日志组成员:

SQL>alter database add member '<dir1>' to group N, '<dir1>' to group N;

SQL> alter database add logfile member '/u01/oracle/oradata/orcl/redo13.log' to group 8;

Database altered.

给多个组添加成员:

SQL> alter database add logfile member '/u01/oracle/oradata/rezin/redo014.log' to group 1,'/u01/oracle/oradata/rezin/redo015.log' to group 2;

invalid:要么日志文件不存在,要么是新添加的成员而另一个为用过的成员。

删除日志组:alter database drop logfile group n1,group n2;

日志状态为active、current状态的不能删除,需要手工切换日志直到可以删除为止;

一个实例至少需要两个联机日志文件组;

组内成员状态有NULL 值或INVALID状态并存,组不可删除;

日志组被删除后,物理文件需要手动删除(对于非OMF)。

SQL>alter database drop logfile group 9;

SQL>alter database drop logfile group 5,group 6;

删除成员指令: alter database drop logfile member '<dir1>','<dir2>';

不能删除组内的唯一一个成员;

不能删除处于active 和current 状态组内的成员;

删除处于active 和current 状态组内的成员,应使用日志切换使其处于INACTIVE状态后再删除;

对于组内如果一个成员为NULL 值,一个为INVALID,且组处入INACTIVE,仅能删除INVALID状态成员;

删除日志成员,物理文件并没有真正删除,需要手动删除;

删除日志文件后,控制文件被更新;

对于处于归档模式下的数据库,删除成员时确保日志已被归档,查看v$log视图获得归档信息。

SQL>alter database drop logfile member '/u01/oracle/oradata/orcl/redo07.log';

SQL>alter database drop logfile member

'/u01/oracle/oradata/orcl/redo01.log', '/u01/oracle/oradata/orcl/redo02.log';

附加:删不掉切换日志。

日志重命名:相当于更改路径,只有current不可以重命名。

所需权限: ALTER DATABASE 系统权限;

复制文件到目的位置操作系统权限(写权限);

CURRENT状态组内的成员不能被重命名;

建议该行为之前备份数据库;

重命名或重定位之后建议立即备份控制文件;

重定位及重命名的两种方法:

添加一个新成员到日志组,然后删除一个旧的成员;

使用ALTER DATABASE RENAME FILE 命令(不区分归档与非归档模式)。

复制联机日志文件到新路径:ho cp <oldfile> <newfile>,执行ALTER DATABASE RENAME FILE '<oldfile>' TO '<newfile>'。

对于处于CURRENT状态的需要改名且不切换的情况下 办法是切换到MOUNT状态下再执行上述操作。

语法:#cp <oldfile> <newfile>

SQL>alter database rename file '<oldfilename>' to '<newfilename>';

SQL> ho cp /u01/oracle/oradata/orcl/redo11.log /u01/oracle/oradata/rezin/redo11.log

SQL> ho ls /u01/oracle/oradata/rezin/redo11.log

/u01/oracle/oradata/rezin/redo11.log

SQL> alter database rename file '/u01/oracle/oradata/orcl/redo11.log' to

'/u01/oracle/oradata/rezin/redo11.log';

联机重做日志文件重命名:不能是current,只能oracle在mount和open状态使用。

语法:alter database rename file '<oldfilename>' to '<newoldfile>';

数据库的状态监控:

状态:inactive(循环之外),active,current(循环之内)

监控:select 'ho ls '||member from v$logfile;

'HOLS'||MEMBER


ho ls /u01/oracle/oradata/rezin/redo01.log

ho ls /u01/oracle/oradata/rezin/redo02.log

ho ls /u01/oracle/oradata/rezin/redo03.log

查询在不在:

SQL> ho ls /u01/oracle/oradata/rezin/redo01.log

/u01/oracle/oradata/rezin/redo01.log

查看磁盘空间够不够用:

oracle\]#dh -f 日志切换间隔时间:查看时间间隔是否在15到20分钟之间。 SQL\> select group#,to_char(first_time,'yyyy-mm-dd hh24:mi:ss') as first_time from v$log; GROUP# FIRST_TIME ---------- -------------------------------------------------------------- 1 2015-03-17 08:54:07 2 2015-03-17 08:53:10 3 2015-03-17 08:53:22 4 2015-03-17 10:41:49 5 2015-03-17 15:07:24 6 2015-03-17 16:12:48 日志组下必须有多个成员,不是多个成员组,修改成多个成员组。 ****修改日志文件大小:****先删掉已有日志组及其物理文件,然后再重新建立组并修改成相应大小即可。 ****清空日志文件组:**** 1)SQL\>ALTER DATABASE CLEAR LOGIFLE GROUP n; 2)SQL\>ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP n; --使用unarchived 避免归档 ****联机重做日志异常(日志不一致、丢失、损坏)处理:**** 1)日志文件不一致:清空不一致日志组,oracle数据库一致性关闭的可以在启动时清空日志文件。 SQL\> alter database clear logfile group n; ---\>inactive可清空 或 SQL\> alter database clear unarchived logfile group n; ----\>active可清空 2)日志文件丢失: 方法一:数据库一致性关闭的,如果日志文件丢失可以通过清空日志文件的办法恢复,步骤同上。 方法二:数据库非一致性关闭 1)加隐藏参数:同control_file里的_allow_resetlog_corruption隐藏参数解决问题。 2)如果归档模式可以通过recover指令恢复:欺骗的手段 sql\>recover database using backup controlfile; sql\>alter database open resetlogs; 3)非归档模式下,加隐藏参数忽略数据库一致性,可以起到很大的作用,但不支持使用。 ****与日志有关的动态性能视图**** V$LOG V$LOGFILE ------------------------------------------------------------------------------------------------------------------------------ V$LOG中STATUS的状态值: UNUSED: 从未对该联机日志写入任何内容,一般为新增加联机日志文件或是使用resetlog后的状态 CURRENT:当前重做日志文件,表示该重做日志文件为活动状态,能够被打开和关闭 ACTIVE:处于活动状态,不属于当前日志,崩溃恢复需要该状态,可用于块恢复,可能归档,也可能未归档 CLEARING:表示在执行alter database clear logfile命令后正将该日志重建为一个空日志,重建后状态变为unused CLEARING_CURRENT:当前日志处于关闭线程的清除状态。如日志某些故障或写入新日志标头时发生I/O错误 INACTIVE:实例恢复不在需要联机重做文件日志组,可能归档也可能未归档 ------------------------------------------------------------------------------------------------------------------------------ V$LOGFILE中STATUS的状态值: INVALID :表明该文件不可访问 STALE :表明文件内容不完全 DELETED : 表明该文件不再使用 NULL :表明文件正在使用

相关推荐
Justice link3 分钟前
企业级NoSql数据库Redis集群
数据库·redis·缓存
爱的叹息3 分钟前
主流数据库的存储引擎/存储机制的详细对比分析,涵盖关系型数据库、NoSQL数据库和分布式数据库
数据库·分布式·nosql
XiaoLeisj38 分钟前
【MyBatis】深入解析 MyBatis XML 开发:增删改查操作和方法命名规范、@Param 重命名参数、XML 返回自增主键方法
xml·java·数据库·spring boot·sql·intellij-idea·mybatis
dleei1 小时前
MySql安装及SQL语句
数据库·后端·mysql
WannaRunning2 小时前
浅谈Tomcat数据源连接池
java·oracle·tomcat
信徒_2 小时前
Mysql 在什么样的情况下会产生死锁?
android·数据库·mysql
嘴对嘴编程3 小时前
oracle数据泵操作
数据库·oracle
·薯条大王9 小时前
MySQL联合查询
数据库·mysql
morris13111 小时前
【redis】redis实现分布式锁
数据库·redis·缓存·分布式锁
hycccccch11 小时前
Canal+RabbitMQ实现MySQL数据增量同步
java·数据库·后端·rabbitmq