ITPub博客

首页 > 数据库 > Oracle > oracle 关于-日志文件

oracle 关于-日志文件

原创 Oracle 作者:邱东阳 时间:2014-04-02 09:00:17 0 删除 编辑

Oracle数据库中的日志常用的有:

Redo log files      联机日志或重做日志

Archived log files   归档日志

Alert log files      告警日志

Trace files         user_dump_dest    用户信息日志(如跟踪会话日志)

                 Backupground_dump_dest           进程日志

 

 

重做日志文件

重做日志文件会记录对于数据库的任何操作,如利用DML语句或者DDL语句对数据库进行更改,或者数据库

管理员对数据库结构进行更改,都会在重做日志中进行记录。

当数据库被以外的删除或者修改,可以利用重做日志文件进行恢复,出现例程失败或者介质失败的情况下,也可以利用日志文件实现例程恢复或者介质恢复。

在数据库出现故障时,可以根据重做日志文件中记录的内容进行重做与前滚

维护数据库的一致性,对数据的操作都会记录在重组日志中。

只有在归档模式下才能实现重做日志的备份

重做日志的要求:

在重做日志中必须要有两个或以上的组,每个组下面必须要有一个成员。

日志切换:

在重做日志文件中由一个组切换到下一个组的过程,就叫做日志切换。(在切换的时候如果其中一个组没有成员或者成员损坏,

                                                                   那么系统会奔溃。因为LGWR后台进程写入失败发生冲突

导致LGWR中断。所以系统会崩溃)

日志文件时按照循环顺序的方式书写,写满一个组,自动切换另一个组,都写满了在覆盖第一个组。一直循环

 

自动切换---系统自动完成日志切换。

手动切换----执行命令强制进行日志切换。 (alter system switch logfile;)

 

 

redo 日志文件管理:

规划原则: 分散放开到不同的硬盘,日志所在盘的IO要足够,IO读写要快

增加减少日志成员或组

日志状态与监视

处理日志的异常

 

 

日志文件的增加删除

 

 

SQL> select * from v$logfile;

 

    GROUP# STATUS  TYPE    MEMBER                                   IS_

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

         1 STALE   ONLINE  +DATA/fengzi/onlinelog/group_1.271.84218 NO

                           7003

 

         2         ONLINE  +DATA/fengzi/onlinelog/group_2.273.84218 NO

                           7037

 

         3 STALE   ONLINE  +DATA/fengzi/onlinelog/group_3.275.84218 NO

                           7067

 

3 rows selected.

对于v$logfile视图中STATUS列常见值:

INVALID:表明该文件不可访问

STALE: 表示文件内容不全

DELETED:表示该文件已不在使用

空白: 表示正在被使用

 

SQL> select * from v$log;

 

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS  ARC     STATUS

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

FIRST_CHANGE# FIRST_TIME

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

         1          1         34   52428800          1    YES       INACTIVE

       688405 24-MAR-14

 

         2          1         35   52428800          1    NO        CURRENT

       720096 24-MAR-14

 

         3          1         33   52428800          1    YES        INACTIVE

       655563 21-MAR-14

 

 

SQL>

对于V$LOG视图 STATUS 常见的值:

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

CURRENT:表示当前的联机重做日志组,这说明该联机重做日志组是活动的。

ACTIVE:表示联机重做日志组是活动的,但是并不是当前的联机重做日志组。崩溃恢复需要该状态,

可用于块恢复。可能已经归档,也可能未归档。                                                                 

CLEARING:表示在执行ALTER DATABASE CLEAR LOGFILE;命令后正在将该日志重建为一个空日志。日志清楚后状态改为UNUSED.

CLEARING_CURRENT: 表示正在清除当前日志文件中的已关闭线程。如果切换时发生某些故障,则日志可能处于次状态。

INACTIVE:表示例程恢复不在需要次联机重做日志组。可能已归档,也可能未归档。

 

 

 

添加一个日志组

SQL> alter database add logfile group 4 '+data/fengzi/onlinelog/group_4.log' size 50m;

 

Database altered.

 

SQL>

 

SQL> select * from v$log;

 

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS

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

FIRST_CHANGE# FIRST_TIME

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

         1          1         34   52428800          1 YES INACTIVE

       688405 24-MAR-14

 

         2          1         35   52428800          1 NO  CURRENT

       720096 24-MAR-14

 

         3          1         33   52428800          1 YES INACTIVE

       655563 21-MAR-14

 

         4          1          0   52428800          1 YES UNUSED

            0

进行日志切换时 优先选择使用 UNUSED状态的组

 

添加一个日志组,指定2个成员

SQL> alter database add logfile group 5 ('+data/fengzi/onlinelog/group_5_1.log','+data/fengzi/onlinelog/group_5_2.log') size 50m;

Database altered.

 

SQL>select * from v$log;

 

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS

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

FIRST_CHANGE# FIRST_TIME

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

         1          1         34   52428800          1 YES INACTIVE

       688405 24-MAR-14

 

         2          1         35   52428800          1 NO  CURRENT

       720096 24-MAR-14

 

         3          1         33   52428800          1 YES INACTIVE

       655563 21-MAR-14

 

         4          1          0   52428800          1 YES UNUSED

            0

 

         5          1          0   52428800          2 YES UNUSED

            0

SQL>

发现新添加的group 5 成员有两个

 

 

一次添加多个组 一个组一个成员一个组多个成员

SQL> alter database add logfile group 6 '+data/fengzi/onlinelog/group_6.log' size 50m,

group 7 ('+data/fengzi/onlinelog/group_7_1.log','+data/fengzi/onlinelog/group_7_2.log') size 50m;

 

 

向组中添加成员

SQL> alter database add logfile member '+data/fengzi/onlinelog/group_4.log' to group 4;

 

新添加的成员的大小与组中成员的大小是一致的,会自动分配。

 

向多组添加成员

SQL> alter database add logfile member '+data/fengzi/onlinelog/group_1.log' to group 1 '+data/fengzi/onlinelog/group_2.log' to group 2;

 

 

删除组

SQL> alter database drop logfile group 4;   --查询v$LOG视图的状态为CURRENTACTIVE是删除不掉的,因为在循环之内

Database altered.                       –想要删除,需要手动切换日志,切换到可以删除的状态alter system switch logfile

 

SQL>

删除多个组

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

 

 

删除组中的某一个成员

SQL> alter database drop logfile member '+data/fengzi/onlinelog/group_5_1.log';

 

Database altered.

 

SQL>

删除两个组中不同成员

SQL>alter  database  drop  logfile   member  '+DATA/fengzi/onlinelog/group_1.log ',

'+DATA/fengzi/onlinelog/group_2.log';

 

一个组下必须有一个成员,所以不能把所有成员删除,想要删除只能删除组,系统中必须要有两个组。

 

日志文件的重命名

数据库必须处于归档模式 (想在非归档模式下进行修改需要一致性关闭数据库启动到mount状态)

当文件处于CURRENT状态时是不能被修改的

alter system switch logfile 切换日志,直到能重命名为止

 

 

文件系统

重命名redo logfile /u01/app/oracle/oradata/fengzi/redo03.log的日志文件

SQL> ho cp  /u01/app/oracle/oradata/fengzi/redo03.log  /u01/app/oracle/oradata/fengzi/fengziredo1.log

                                老的文件                                     新的文件

SQL> alter database rename file ‘/u01/app/oracle/oradata/fengzi/redo03.log’

to /u01/app/oracle/oradata/fengzi/fengziredo1.log

 

 

ASM

ASM可以直接使用asmcmd工具中的mkalias命令对文件进行重命名

[oracle@dongyang ~]$ echo $ORACLE_SID

+ASM

[oracle@dongyang ~]$ asmcmd

ASMCMD> ll

        commands:

        -------- 

        cd

        du

        find

        help

        ls

        lsct

        lsdg

        mkalias

        mkdir

        pwd

        rm

        rmalias

ASMCMD>

ASMCMD> cd data/fengzi/onlinelog

ASMCMD> ls

group_1.271.842187003

group_1.272.842187017

group_2.273.842187037

group_2.274.842187053

group_3.275.842187067

group_3.276.842187083

group_4.304.843302545

group_4.log

ASMCMD> mkalias group_1.271.842187003 redo02.log

ASMCMD> ls

group_1.271.842187003

group_1.272.842187017

group_2.273.842187037

group_2.274.842187053

group_3.275.842187067

group_3.276.842187083

group_4.304.843302545

group_4.log

redo02.log

ASMCMD>

 

SQL> alter database rename file '+DATA/fengzi/onlinelog/group_1.271.842187003' to '+DATA/fengzi/onlinelog/redo02.log';

 

 

Database altered.

 

SQL> select * from v$logfile;

 

    GROUP# STATUS  TYPE    MEMBER                                   IS_

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

         1 STALE   ONLINE  +DATA/fengzi/onlinelog/redo02.log        NO

         1 STALE   ONLINE  +DATA/fengzi/onlinelog/group_1.272.84218 YES

                           7017

 

         2         ONLINE  +DATA/fengzi/onlinelog/group_2.273.84218 NO

                           7037

 

         2         ONLINE  +DATA/fengzi/onlinelog/group_2.274.84218 YES

                           7053

 

         3 STALE   ONLINE  +DATA/fengzi/onlinelog/group_3.275.84218 NO

 

    GROUP# STATUS  TYPE    MEMBER                                   IS_

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

                           7067

 

         3 STALE   ONLINE  +DATA/fengzi/onlinelog/group_3.276.84218 YES

                           7083

 

 

6 rows selected.

 

SQL>

 

日志文件状态与监视

所谓的监视就是查看位置在哪,是否存在

查看磁盘空间是否足够

看日志组下是否有多个成员

监视日志切换间隔时间

 

首先要查看日志文件在不在

SQL> select member from v$logfile;

 

MEMBER

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

+DATA/fengzi/onlinelog/redo02.log

+DATA/fengzi/onlinelog/group_1.272.842187017

+DATA/fengzi/onlinelog/group_2.273.842187037

+DATA/fengzi/onlinelog/group_2.274.842187053

+DATA/fengzi/onlinelog/group_3.275.842187067

+DATA/fengzi/onlinelog/group_3.276.842187083

 

6 rows selected.

 

SQL>

[oracle@dongyang ~]$ echo $ORACLE_SID

+ASM

[oracle@dongyang ~]$ asmcmd

ASMCMD> cd data/fengzi/onlinelog

ASMCMD> ls

group_1.271.842187003

group_1.272.842187017

group_2.273.842187037

group_2.274.842187053

group_3.275.842187067

group_3.276.842187083

redo02.log

ASMCMD>

查看磁盘空间

ASMCMD> lsdg

State    Type    Rebal  Unbal  Sector  Block       AU  Total_MB  Free_MB  Req_mir_free_MB  Usable_file_MB  Offline_disks  Name

MOUNTED  NORMAL  N      N         512   4096  1048576     16376     9057             4094            2481              0  DATA/

ASMCMD>

 

查看日志文件切换间隔时间

SQL> select to_char(first_time,'YYYY-MM-DD HH24:MI:SS'),GROUP# from v$log;

 

TO_CHAR(FIRST_TIME,     GROUP#

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

2014-03-24 09:03:31          1

2014-03-24 13:39:46          2

2014-03-23 11:26:40          3

 

SQL>

如果间隔时间不满足15分钟到20分钟之间就应该修改日志文件的大小。

 

改变日志文件大小

SQL> select * from v$log;

 

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS

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

FIRST_CHANGE# FIRST_TIME

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

         1          1         34   52428800          2 YES INACTIVE

       688405 24-MAR-14

 

         2          1         35   52428800          2 NO  CURRENT  --当前使用

       720096 24-MAR-14

 

         3          1         33   52428800          2 YES INACTIVE

       655563 21-MAR-14

SQL>

将日志组大小改为100m 需要先删除组,在删除组物理文件。最后重建

(只能1个组1个组的删,必须保留2个组,只能删除循环之外的)

SQL> alter database drop logfile group 3;

 

Database altered.

 

SQL>

ASMCMD> ls

group_1.271.842187003

group_1.272.842187017

group_2.273.842187037

group_2.274.842187053

group_3.262.842184305

group_3.263.842184319

redo02.log

ASMCMD> rm group_3.263.842184319

ASMCMD> rm group_3.262.842184305

重建组与成员

SQL> alter database add logfile group 3 ('+data/fengzi/onlinelog/group_3_1.log','+data/fengzi/onlinelog/group_3_2.log') size 100m;

删除另一个循环之外组

SQL> alter database drop logfile group 1;

Database altered.

 

SQL>

ASMCMD> ls

group_1.271.842187003

group_1.272.842187017

group_2.273.842187037

group_2.274.842187053

group_3.262.843384567

group_3.263.843384577

group_3_1.log 

group_3_2.log

redo02.log

ASMCMD> rm group_1.271.842187003

ASMCMD> rm group_1.272.842187017

 

SQL> alter database add logfile group 1 ('+data/fengzi/onlinelog/group_1_1.log','+data/fengzi/onlinelog/group_1_2.log') size 100m;

 

Database altered.

 

SQL>

删除当前使用的组必须切换日志

一直切换日志,直到切换到组2INACTIVE为止

SQL> alter system switch logfile;

 

System altered.

 

SQL> select * from v$log;

 

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS

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

FIRST_CHANGE# FIRST_TIME

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

         1          1         42  104857600          2 YES INACTIVE

       771647 28-MAR-14

 

         2          1         41   52428800          2 YES INACTIVE

       771612 28-MAR-14

 

         3          1         43  104857600          2 NO  CURRENT

       771651 28-MAR-14

 

 

SQL>

切换完成删除重建组2

SQL> alter database drop logfile group 2;

 

Database altered.

 

SQL>

ASMCMD> rm group_2.273.842187037

asmcmd: entry 'group_2.273.842187037' does not exist in directory '+data/fengzi/onlinelog/'

ASMCMD> ls     --发现组2物理文件已经不在

group_1.271.843385069

group_1.304.843385081

group_1_1.log

group_1_2.log

group_3.262.843384567

group_3.263.843384577

group_3_1.log

group_3_2.log

ASMCMD>

 

SQL> alter database add logfile group 2 ('+data/fengzi/onlinelog/group_2_1.log','+data/fengzi/onlinelog/group_2_2.log') size 100m;

 

Database altered.

 

SQL> select * from v$log;

 

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS

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

FIRST_CHANGE# FIRST_TIME

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

         1          1         42  104857600          2 YES INACTIVE

       771647 28-MAR-14

 

         2          1          0  104857600          2 YES UNUSED

            0

 

         3          1         43  104857600          2 NO  CURRENT

       771651 28-MAR-14

 

                 

SQL>                          OK 修改日志文件大小成功

 

日志文件的异常处理

首先查看告警日志确认错误原因

 

对于日志文件的不一致(只有在数据库启动时报错日志文件不一致才能使用下面命令)

 

第一种方法:清空不一致的日志组 (只能清除一个循环之外的组也就是 INACTIVE状态)

SQL>alter database clear logfile group <N>;

 

另一种方法: 清除日志,可以清除 ACTIVE 状态的组

SQL>alter database clear unarchived logfile group <N>;

对于CURRENT状态是不能清除的,只需要切换日志就可以清除

 

 

对于日志文件丢失与损坏  (要看数据库是否是一致性关闭的)

 

如果是一致性关闭的数据库可以使用清空指令 (发现清空之后日志文件会自动生成)

SQL>alter database clear logfile group <N>;

SQL>alter database open;

如果非一致性关闭数据库的是清空不了的

 

可以使用欺骗手段恢复数据库(在归档模式下是可以使用这种方法)

 

SQL> recover database using backup controlfile;

Specify log             --直接回车什么都不做

 

SQL> alter database open resetlogs; 

SQL> recover database;  

SQL> alter database open resetlogs;

 

还可以直接使用隐藏参数解决 (这个隐藏参数的作用是忽略一致性的验证)

SQL> alter system set "_allow_resetlogs_corruption" =true scope=spfile;

 

SQL> startup force mount     

SQL>alter database open resetlogs;

SQL> alter system reset " _allow_resetlogs_corruption" scope=spfile sid='*';  (用完之后一定要干掉隐藏参数)

 

 

在非归档模式下可以组合以上方法解决

SQL> alter system set "_allow_resetlogs_corruption" =true scope=spfile;

SQL> recover database using backup controlfile;

Specify log             --直接回车什么都不做

 

SQL> alter database open resetlogs; 

SQL>shutdown immediate;

SQL>startup

SQL> alter database open resetlogs; 

SQL> alter system reset  " _allow_resetlogs_corruption" scope=spfile sid='*';

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29532781/viewspace-1134340/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2014-03-11

  • 博文量
    38
  • 访问量
    174702