精华内容
下载资源
问答
  • Linux系统是在企业中广泛使用的操作系统,企业亦多基于该操作系统安装数据库。...针对Oracle数据库重做日志文件丢失问题,提出一种非归档模式下的重做日志恢复方法。实验证明,该方法能有效实现重做日志的无备份恢复。
  • 此时可以用数据库之前的备份来做不完全恢复,但是当前日志的数据会丢失掉。 rman target / RMAN> startup mount; RMAN> restore database; RMAN> recover database until sequence 24; 因为是不完全恢复,open的时候...

    此时可以用数据库之前的备份来做不完全恢复,但是当前日志的数据会丢失掉。

    rman target /

    1. RMAN> startup mount;

    2. RMAN> restore database;

    3. RMAN> recover database until sequence 24;

    4. 因为是不完全恢复,open的时候,需要加上resetlogs
    5. SQL> alter database open resetlogs;
    6.  resetlogs的作用---防止陈旧的数据进入数据库(保证数据库的一致性),这也就是为什么在用resetlogs打开数据库,一定要立即对数据库做个全备。

    展开全文
  • 实验说明Oracle重做日志归档日志的作用 2012年11月21日 13:41:25 阅读数:11425更多 个人分类: Oracle备份恢复 版权声明:随意复制转载,走捷径懒省事是中国IT的一大悲哀,继承创新再到原创才是人间正道 ...

     

    实验说明Oracle重做日志与归档日志的作用

    2012年11月21日 13:41:25 阅读数:11425更多

    个人分类: Oracle备份恢复

    版权声明:随意复制转载,走捷径懒省事是中国IT的一大悲哀,继承和创新再到原创才是人间正道 https://blog.csdn.net/IndexMan/article/details/8207447

    最近在学习Oracle 归档日志模式的管理, 特撰写一下学习心得,不足之处还望指出!!!

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

    一 系统环境: 


    1、操作系统:Windows xp sp3
    2、数据库: Oracle 10g 

     

    二 Oracle 重做日志的作用[模拟介质恢复]

    1. 关闭数据库归档模式:

     
    1. SQL> shutdown immediate

    2. 数据库已经关闭。

    3. 已经卸载数据库。

    4. ORACLE 例程已经关闭。

    5. SQL> startup mount

    6. ORACLE 例程已经启动。

    7.  
    8. Total System Global Area 608174080 bytes

    9. Fixed Size 1250404 bytes

    10. Variable Size 159386524 bytes

    11. Database Buffers 440401920 bytes

    12. Redo Buffers 7135232 bytes

    13. 数据库装载完毕。

    14. SQL> alter database noarchivelog;

    15.  
    16. 数据库已更改。

       

    2.创建测试表空间:

     

     
    1. create tablespace test datafile

    2. 'e:\oradata\test.ora' size 5M

    3. AUTOEXTEND ON NEXT 1M MAXSIZE UNLIMITED

    4. default storage (initial 128K next 1M pctincrease 0);

    3.创建测试用户与测试表:

     

     
    1. drop user test cascade;

    2. create user test identified by test default tablespace test;

    3. grant connect,resource to test;

    4. conn test/test

    5.  
    6. create table a(a number);

    7. begin

    8. for i in 1..100000 loop

    9. insert into a values(i);

    10. end loop;

    11. end;

    12.  
    13. commit;

    4. 拷贝test.ora为test1.ora文件。

    5. insert into a select * from a;    --20万条

    6.关闭数据库
      shutdown immediate
     

    7. 将文件test1.ora与test.ora名称互换。

    8. 再次启动数据库
       startup

     

    9. 进行介质恢复:

      

    三 Oracle 归档日志作用: [模拟重做日志丢失]

      1.  紧接着实验二 第9步, 我们开启归档日志:

     

     
    1. SQL> alter database archivelog;

    2.  
    3. 数据库已更改。

    4.  
    5. SQL> alter database open;

    6.  
    7. 数据库已更改。

     

      2. 删除a表部分数据:

     

     
    1. SQL> conn test/test

    2. 已连接。

    3. SQL> delete from a where rownum<=100000;

    4.  
    5. 已删除100000行。

    6.  
    7. SQL> commit;

    8.  
    9. 提交完成。


      3. 做重做日志归档操作,并清空当前在线日志文件:

     

     
    1. SQL> select group#, members, archived, status from v$log;

    2.  
    3. GROUP# MEMBERS ARC STATUS

    4. ---------- ---------- --- ----------------

    5. 1 1 NO CURRENT

    6. 2 1 YES INACTIVE

    7. 3 1 YES ACTIVE

    8.  
    9. SQL> alter system switch logfile;

    10.  
    11. 系统已更改。

    12. SQL> alter system checkpoint;

    13.  
    14. 系统已更改。

    15.  
    16. SQL> alter database clear logfile group 1;

    17.  
    18. 数据库已更改。

    19.  
    20. SQL> shutdown immediate

    21. 数据库已经关闭。

    22. 已经卸载数据库。

    23. ORACLE 例程已经关闭。

    24. SQL> startup

    25. ORACLE 例程已经启动。

    26.  
    27. Total System Global Area  608174080 bytes

    28. Fixed Size                  1250404 bytes

    29. Variable Size             176163740 bytes

    30. Database Buffers          423624704 bytes

    31. Redo Buffers                7135232 bytes

    32. 数据库装载完毕。

    33. ORA-01113: 文件 11 需要介质恢复

    34. ORA-01110: 数据文件 11: 'E:\ORADATA\TEST.ORA'

    35.  
    36.  
    37. SQL> recover database

    38. ORA-00279: 更改 3455649 (在 11/21/2012 13:23:53 生成) 对于线程 1 是必需的

    39. ORA-00289: 建议:

    40. E:\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2012_11_21\O1_MF_1_212_%U_.ARC

    41. ORA-00280: 更改 3455649 (用于线程 1) 在序列 #212 中

    42.  
    43.  
    44. 指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

    45.  
    46. 已应用的日志。

    47. 完成介质恢复。

    48. SQL> alter database open;

    49.  
    50. 数据库已更改。

    51.  
    52.  

     

    4. 以test用户登录查看a表中数据是否还原:

     

     
    1. SQL> select count(1) from a;

    2.  
    3. COUNT(1)

    4. ----------

    5. 100000


     

     

    四  心得:

       Oracle 联机重做日志(ONLINE REDO LOG FILE)主要用于数据库的介质恢复,比如数据文件的损坏。

                    归档日志(ARCHIVED LOG FILE)其实就是对在线日志的备份,毕竟在线日志空间有限而仅能保存一定时间的重做日志数据。

                    归档日志与全库备份文件的结合恢复效果更好。

     

     

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

     

    log buffer及日志管理

    数据块库损坏的情况。比如突然断电、oracle或者操作系统的程序bug导致数据库内部逻辑结构损坏、磁盘介质损坏等,都有可能造成数据库崩溃,从而导致数据丢失的现象发生。

    为了避免,或者说为了修复这些状况所导致的数据丢失现象,oracle引入了日志缓冲区和日志文件的概念。所谓日志,就是将所有数据库中所有改变数据块的操作,都原原本本的记录下来。这些改变数据块的操作不仅包括对数据表的DML或者对数据字典的DDL,还包括对索引的改变、对回滚段数据块的改变、对临时表空间的临时段的改变等。只有将数据库中所有的变化都记录下来,当发生数据库损坏时,才能够从损坏时的那一点开始,将之后数据库中的变化重新运用一遍,从而达到恢复数据库的目的。

    既然是要记录,那就必然引出一个问题,就是如何记录这些变化?比较容易想到的有两种方式。

    第一种是使用逻辑的记录方式,也就是用描述性的语句来记录整个变化过程。比如对于某个update更新操作来说来说,可以记录为两条语句:delete旧值以及insert新值。这种方式的优点是非常节省空间,因为对每个操作,只需要记录几条逻辑上的语句即可。但是缺点也很明显,就是一旦需要进行恢复,就会非常消耗资源。设想一下,某个update操作更新了非常多的数据块,由于buffer cache内存有限,很多脏数据块都已经写入了数据文件。但就在更新快结束时,突然发生断电,所做的更新丢失。那么重新启动实例时,oracle需要应用日志文件里的记录,于是重新发出delete旧值以及insert新值的语句。这个过程需要重新查找数据文件中符合条件的数据块,然后再挑出来进行更新。这个过程将非常消耗时间,而且会占用大量的buffer cache。

    第二种方式是使用物理的记录方式,也就是将每个数据块改变前的镜像和改变后的镜像都记录下来。这种方式优点就是恢复起来速度非常快,直接根据日志文件里所记录的数据块地址和内容更新数据文件中对应的数据块。但是缺点也很明显,就是非常占用磁盘空间。

    而oracle在记录日志的方式上,采用了逻辑和物理相结合的方式。也就是说,oracle针对每个数据块,记录了插入某个值或者删除某个值的描述语句。假如某个update更新了100个数据块,则oracle会针对每个数据块记录一对delete旧值和insert新值的语句,共有100对这样的描述语句。通过这种方式,oracle获得了物理记录方式的快速恢复的优点,同时又获得了逻辑记录方式的节省空间的优点。

    为了临时存放所产生的日志信息,oracle在SGA中开辟了一块内存区域。这块区域就叫做日志缓冲区(log buffer),当满足一定条件以后,oracle会使用名为LGWR的后台进程将log buffer中的日志信息写入联机日志文件里。

    可以使用初始化参数log_buffer来设置日志缓冲区的大小,单位是字节。日志缓冲区会进一步细分为多个块,每个块的尺寸与操作系统的一个块的尺寸相同,基本都是512字节。我们可以用如下方式来获得日志缓冲区的块尺寸。

    SQL> select distinct lebsz asredo_block_size from x$kccle;

     

    REDO_BLOCK_SIZE

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

    512

     

    日志缓冲区只是日志信息临时存放的区域,这块区域是有限的,而且其中的每个块都是能够循环使用的。这也就说明,日志缓冲区中的内容必须要写入磁盘上的文件里,才能永久保留下来,才能在数据库崩溃时能够用来进行恢复。这个文件就叫做联机日志文件(redo日志)。在每个日志缓冲区中的日志块被重用之前,其内容必然已经被写入了磁盘上的联机日志文件中。

    联机日志文件就是日志缓冲区的完全拷贝,组成日志文件的每个日志块的内容都来自于日志缓冲区的日志块。每个日志缓冲区中的日志块都对应到日志文件中的一个日志块。日志缓冲区中的日志块按照发生的先后顺序,放入联机日志文件。由于日志文件在故障恢复中的重要性,建议至少使用两个日志文件组成一个日志文件组。同一个日志文件组中的日志文件内容一摸一样,因为日志缓冲区中的日志块同时会写入日志文件组中的每个日志文件中。每个数据库都必须至少拥有两个日志文件组。这是由于只要数据库一天不停止运行,就会不断产生日志信息,就会不断写入联机日志文件,联机日志文件总会有写满的时候。我们不可能让联机日志文件无限大,也不可能放无限多的联机日志文件,所以联机日志文件必须是循环使用的,在若干个日志文件中轮流的进行写入。一个日志文件写满以后转换到另外一个日志文件继续写的过程叫做日志切换(log switch)。

    当一个联机日志文件写满时,可以选择将其归档为脱机日志文件,通常叫做归档日志文件。归档也就是拷贝,归档的过程也就是将写满的联机日志文件拷贝到预先指定的目录的过程。只有当一个联机日志文件完成归档以后,该联机日志文件才能够被再次循环使用。强烈建议在生产库中选择这种归档方式,只有在测试环境中可以不选择这种归档方式。

    可以说,日志缓冲区和日志文件存在的唯一目的就是为了保证被修改的数据不会被丢失。反过来说,也就是为了能够在数据库崩溃的时候,可以用来将数据库恢复到崩溃的那个时间点上。这也就是说,只有将被修改的数据块的日志信息写入了联机日志文件以后,该被修改的数据块才可以说是安全的。如果日志信息在没有被写入日志文件时发生实例崩溃,这时对数据的修改仍将丢失。由此我们可以看出,将日志缓冲区中的日志信息写入日志文件是一个多么重要的过程,这个过程是由一个名为LGWR的后台进程完成的。LGWR承担了维护系统数据完整性的任务,它保证了数据在任何情况下都不会丢失。

    触发LGWR进程将日志缓冲区中的日志信息写入联机日志文件条件包括以下几种:

    前台进程触发,包括两种情况。最显而易见的一种情况就是用户发出commit或rollback语句进行提交时,需要触发LGWR将内存里的日志信息写入联机日志文件,因为提交的数据必须被保护而不被丢失;另外一种情况就是在日志缓冲区中找不到足够的内存来放日志信息时,也会触发LGWR进程将一些日志信息写入联机日志文件以后,从而释放一些空间出来。

    每隔三秒钟,LGWR启动一次。

    在DBWR启动时,如果发现脏数据块所对应的重做条目还没有写入联机日志文件,则DBWR触发LGWR进程并等待LRWR写完以后才会继续。

    日志信息的数量达到整个日志缓冲区的1/3时,触发LGWR。

    日志信息的数量达到1MB时,触发LGWR。

    发生日志切换时触发LGWR。

     

    1.2 log buffer的内存结构

    我们已经知道,日志缓冲区用来存放事务对数据块的改变的日志信息。那么这里的日志信息到底包含哪些内容,是由哪些结构组成的呢?

    oracle记录数据库变化(也就是记录日志信息)的最小单位是改动向量(change vector)。改动向量用来描述对数据库中任何单个数据块所做的一次改动。改动向量的内容包括:被改动的数据块的版本号、事务操作代码、被改动的数据块的地址等。这里的版本号非常重要,它能够帮助数据块始终能够体现当前最新的状态。oracle在建立改动向量时,会从数据块中拷贝其版本号。而当恢复期间,oracle读取改动向量并将改动应用于相应的数据块以后,被恢复的数据块的版本号加1。这里的数据块可以属于表、也可以数据索引、也可以属于回滚段。但是对于临时表空间里的临时段,不会生成改动向量。

    当多个改动向量按照先后顺序组合在一起,从而完成对数据库的一次改动时,oracle称这组改动向量为重做记录(redo record)。重做记录用来描述对数据库的一个原子改动。所谓原子改动,就是说,当应用改动中的改动向量时,要么全部成功,要么全部失败,不存在部分成功部分失败的情况(可以理解为一个事务操作)。重做记录能够帮助整个数据库体现当前最新的状态。

    一个事务至少产生一个重做记录,也可能产生多个重做记录。而oracle在应用日志记录进行恢复的过程中,以事务作为恢复的最小单位。要么恢复整个事务,要么回滚整个事务。也就是说,要么运用事务中的重做记录里的所有改动向量,要么一个改动向量都不运用。

    因此,日志缓冲区就是许多重做记录按照发生的先后顺序组成的。同时,日志文件也就是由许多重做记录按照先后顺序排列在一起而组成的文件。

    我们举个实例来说明重做记录和改动向量产生的过程。比如我们发出如下更新语句(假设表redo_test的name列上没有建立索引):

     

    SQL> select * from redo_test;

          ID NAME

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

           1 abc

           2 abc

     

    SQL> update redo_test set name='cdf'where id=1;

     

    该语句发出以后,会产生一个重做记录,用来描述对表的数据块的修改。包括下面三个改动向量:

    对回滚段事务表的改动,这发生在回滚段段头。事务表中包含被修改的数据块的地址、该事务的状态(commit或active)、以及存有该事务所使用的回滚段的地址。如果事务表被修改,就会产生针对于它的改动向量。

    对回滚段数据块的改动。将修改前的旧值(abc)存放到回滚段的数据块里。这时回滚段发生改变,于是产生改动向量。

    对redo_test表的数据块所做的改动。将修改后的新值(cdf)存放到表的数据块里。这时数据块发生改变,于是产生改动向量。

    从这个实例可以知道,对于这个update事务,重做记录中会有三个改动向量。当然可能有其他情况会产生新的重做记录,比如修改的列如果有索引,则必须修改索引。这时就会产生第二个重做记录,用来描述对索引数据块的修改。这时候的重做记录还是和第一个重做记录一样,包含多个改动向量。此外,在事务完成之后运行commit或rollback语句时,就会产生第三个重做记录。该重做记录只有一个改动向量,用来记录对回滚段事务表的更改,因为commit或rollback时,需要更新事务表里记录的该事务的状态。

    1.3转储log buffer

    oracle对很多内存结构都提供了转储到平面文件的功能,但是并没有直接提供转储日志缓冲区的功能。但是提供了转储日志文件的功能。我们前面已经知道,日志文件的内容就是日志缓冲区的完全拷贝,因此,转储日志文件就等于转储了日志缓冲区。

    转储日志文件的命令为:

    alter system dump logfile 'logfilename';

    我们的实验过程如下。首先找到当前状态为CURRENT的日志文件是哪一个,以及它的全路径。

    SQL> select group#,status from v$log;

       GROUP# STATUS

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

            1INACTIVE

            2INACTIVE

            3CURRENT

    SQL> select member from v$logfile wheregroup#=3;

    MEMBER

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

    /oracle/oradata/ora10g/redo03.log

    然后,找到我们的redo_test表的object id,并进行更新操作。

    SQL> desc redo_test

     Name                                     Null?   Type

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

     ID                                                NUMBER

     NAME                                              VARCHAR2(10)

    SQL> select object_id from user_objectswhere object_name='REDO_TEST';

     OBJECT_ID

    ----------

        51367

    SQL> select * from redo_test;

           IDNAME

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

            1abc

            2abc

    SQL> update redo_test set name='cdf'where id=1;

    SQL> commit;

                 最后,我们转储出当前使用的日志文件。

    SQL> alter system dump logfile'/oracle/oradata/ora10g/redo03.log';

    打开生成的跟踪文件,从中找到含有51367(表redo_test的object id)的所有相关记录,如下图所示。

     

    我们可以看到,第一行明确说明了,下面的内容都属于同一个重做记录(REDO RECORD)。

    往下可以看到的CHANGE #的字样,这里的CHANGE #就表示改动向量(CHANGE VECTOR),我们可以看到一共生成了四个改动向量(第3、15、18、21行)。正像我们前面所描述的那样,第一个是对回滚段事务表的改动(CHANGE #2),第二个是对回滚段数据块的改动(CHANGE #4),第三个是对redo_test表的数据块的改动(CHANGE #1),第四个是提交时对回滚段事务表的改动(CHANGE #3)。注意,这里的CHANGE #后面的数值并不表示发生顺序,只不过是一个标识而已,发生的先后顺序要以SCN号为准,SCN号越小的表示越早发生。另外一个需要注意的是,在这个例子里,第四个提交时对回滚段事务表的改动(CHANGE #3)的改动向量并没有单独成为一个重做记录,这是因为我们发出update语句以后立即提交了。如果发出update语句以后,不立即提交,而是等待一段时间,然后再提交。这时转储出来的日志文件会显示出两个重做记录,最后的提交时对回滚段事务表的改动的改动向量会单独归到一个重做记录里去。后面会说明原因。

    第8行的slot: 0表示被更新的记录位于数据块中的第一行。这与第35行的slot是一样的。如果我们发出“update redo_test set name='cdf' where id=2”时,就会发现这时slot为1。

    第9行的size: 0表示修改后的值的长度减去修改前的值的长度的结果。而第36行的size表示修改前的值的长度减去修改后的值的长度的结果。由于我们这里修改前后的值的长度都是3,所以差额为0。如果我们发出“update redo_test set name='cdfg' where id=1”时,就会发现第9行的值为1,第36行的值为-1。

    第11行的bdba表示redo_test表的数据块的地址,其实就是第3行的DBA所显示的地址。而hdba则表示redo_test表的segment header的地址。与第38行的值是相同的。第14行的col 1表示被更新的是表的第二列(第一列是col 0)。后面的[3]表示该列的值的长度,单位是字节。它们与第41行的内容是相同的。再后面的63 64 66则表示col 1列被更新后的值。我们来转换一下,如下所示。可以看到这正是我们更新后的“cdf”值。同样我们可以看到第41行的61 62 63,表示更新前的值,也就是“abc”。

    SQL> selectchr(to_number(63,'xx')),chr(to_number(64,'xx')),

     2 chr(to_number(66,'xx')) fromdual;

    C C C

    - - -

    c d f

    第15行的DBA:0x00800009表示回滚段事务表的地址,这与第18行的DBA是一样的。由于回滚段事务表位于回滚段段头里,所以这也就是回滚段段头的地址。008表示文件号乘以4,00009表示数据块地址。我们转储出该段头来看看里面放了些什么。

    SQL> select to_number('008','xxx')/4file#,

     2 to_number('00009','xxxxx')block# from dual;

        FILE#    BLOCK#

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

            2         9

    SQL> alter system dump datafile 2 block9;

    我们打开所生成的跟踪文件,可以看到存放的正是回滚段事务表的信息。如下图二所示。我们可以看到粗体显示的正是我们发出的update语句在事务表中所登记的条目,state为9表示事务已经提交。

     

    第17行的uba:0x0080085a.0075.13表示存放redo_test被更新前旧值的回滚段数据块所在的地址,这与第20行的uba是一样的。0080085a表示回滚段数据块所在的地址,0075表示顺序号,13表示在回滚映射中的最后一个条目。我们只需要关心0080085a即可,其组成部分和前面所介绍过的是一样的,008表示文件号乘以4,0085a表示回滚段数据块的地址。

    SQL> select to_number('008','xxx')/4 asfile#,

     2 to_number('0085a','xxxxx') asblock# from dual;

        FILE#    BLOCK#

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

            2      2138

    SQL> alter system dump datafile 2 block2138;

    然后,打开生成的跟踪文件,找到含有51367(表redo_test的object id)的相关记录,如下图三所示。

     

      图三

    从上图中我们可以看到熟悉的bdba和hdba。以及最后一行的61 6263,这就是更新前的旧值。同时我们还可以注意到KDO Op code: 21,这表示事务所进行的操作的类型代码。因为我是在10g环境下测试的,所以这里显示了代码21,就表示进行的是update操作。如果在10g以前,会显示URP字样。

     

     

     

    log buffer及日志管理深入分析及性能调整(一)

    https://blog.csdn.net/wenzhongyan/article/details/42420267

     

    Redhat7 以上RAC搭建

    https://www.cndba.cn/Marvinn/article/2597

     

     

     

     

     

    展开全文
  • 重做日志归档日志的区别

    千次阅读 2015-07-31 11:29:58
    重做日志归档日志有什么区别? 重做日志redo log file是LGWR进程从Oracle实例中的redo log buffer写入的,是循环利用的。就是说一个redo log file(group) 写满后,才写下一个。 归档日志archive log是当数据库...

    重做日志与归档日志有什么区别?

    重做日志redo log file是LGWR进程从Oracle实例中的redo log buffer写入的,是循环利用的。就是说一个redo log file(group) 写满后,才写下一个。
    归档日志archive log是当数据库运行在归档模式下时,一个redo log file(group)写满后,由ARCn进程将重做日志的内容备份到归档日志文件下,然后这个redo log file(group)才能被下一次使用。

    不管数据库是否是归档模式,重做日志是肯定要写的。而只有数据库在归档模式下,重做日志才会备份,形成归档日志。

    一般来说,归档日志结合全备份,用于数据库出现问题后的恢复使用。

     

    重做日志是循环使用的。比如说,有三个重做日志组A、B、C。那么,当A写满后,系统就调用ARCn进程,将A备份为归档日志,同时B已经开始使用了。
    假设你只有两个组A、B,如果某种情况下,A正在备份,未结束,还不能继续使用,而B也写满了,这个时候,数据库就会出现挂起的情况。所以一般情况下,重做日志最好是三个组或者再多一点,而且大小要适当。
    实际上,一个重做日志组满了后,就开始写入归档日志。不是等ABC都写满了,再归档,这样肯定就是出现挂起的情况了,Oracle不是这样的,
    归档日志和重做日志都是物理上的文件,只是存放的目录不同,而且重做日志的文件名不变,而归档日志的文件名是备份时系统生成的。
    重做日志备份为归档日志后,系统就会把重做日志的内容清空,但文件依然存在,准备下一次使用。


    重做日志纪录了你所有做过的dml语句,重做日志循环使用,写满一轮后就要覆盖前面的。如果你是用热备模式,当重做日志写满一个后就将内容写入归档日志,以备将来恢复数据用。

    只有数据库运行在归档模式并且初始化参数ARCHIVE_LOG_START等于TRUE时,ARCn进程才能被启动,进行自动归档。
    如果数据库运行在归档模式但ARCHIVE_LOG_START等于FALSE时,需要DBA手工归档。(这种方式可能会因为归档不及时导致数据库被迫挂起,不实用!)
    展开全文
  • 一、重做日志文件把对数据文件的修改在写入数据文件之前记录下来。日志文件以一种循环的方式被写入信息。当一个日志组被写满时,回自动向另一个日志组写入。管理员可以手工切换当前日志组。alter system switch log...

    一、

    重做日志文件把对数据文件的修改在写入数据文件之前记录下来。日志文件以一种循环的方式被写入信息。当一个日志组被写满时,回自动向另一个日志组写入。管理员可以手工切换当前日志组。alter system switch logfile可以切换当前的日志组。当日志组发生切换时,oracle向新的重做日志组分配一个日志序列号。当存在大量的事务时必须调整重做日志文件的大小,以避免频繁的日志切换发生。重做日志文件被顺序的写在磁盘上,如果磁盘没有其他活动,I/O将会很快。应该把重做日志文件保存在 单独的磁盘上,以获取良好的性能。尤其不要把经常处于活动状态的SYSTEM,UNDOTBS,SYSAUX的表空间或索引表空间文件保存到同一块磁盘上。因为只有在事务的请求被写到重做日志后,请求才能被完成。最大限度的提高重做日志的吞吐量是oracle性能优化首先考虑的因素。当发生重做日志切换而生成 一个新的检查点时,DBWn就会写脏缓冲器块。这样会影响oracle的性能。可以通过fast_start_mttr_target初始化参数来调整检查点。

    每个数据库都有自己的联机重做日志组,一个联机重做日志组有多个重做日志成员,每个日志成员有单独的操作系统文件。在一个rac配置(这种配置中单个数据库装有多个实例),每个实例有一个联机重做日志线程,每个实例的lgwr进程都写到相同的联机重做日志文件。因此oracle必须跟踪数据库实例修改来自那个实例。

    当多路复用重做日志文件时,应该把一个组的成员保存在不同的磁盘上。以避免单点故障的发生。如果重做日志文件组的所有成员都无法写入数据,oracle将被挂起。Dba可以在创建数据库时创建多个联机重做日志文件的副本。

    对日志的操作如下:

    a.创建新的重做日志组:

    Alter database add logfile

    Group 3 (‘/ora02/oradata/mydb01/redo0301.log’,

    ’/ora03/oradata/mdb01/redo0302.log’) size 10m;

    如果省略group子句,oracle分配一个有效的编号,如下:

    Alter database add logfile

    b.添加新的组成员:

    alter database add logfile member

    ‘/ora04/oradata/mydb01/redo0203.log’to group 2;(向第二组中添加新的成员)

    c.重命名日志成员:

    在重命名日志组成员之前新的目标必须已经存在。Oracle的sql命令只是把控制文件中的内部指针指向新的日志文件。Dba需要用操作系统命令来重命名此日志文件。步骤如下:

    1.关闭数据库

    2.使用操作系统命令重命名或移动日志文件

    3. 启动数据库实例(start mount),重命名控制文件中的日志文        件成员。Alter database rename file‘old_redo_file_name’to‘new_redo_file_name’;

    4.打开数据库alter database open

    5.备份控制文件

    D.删除重做日志组:

    将要被删除的重做日志组不能是活动的日志组。Alter database drop logfile group 3;。当重做日志文件被删除后,相关的操作系统文件也被删除,相关的数据库控制文件也给更新。

    E.使用和删除重做日志组相同的方式,dba可以只删除一个非活动的重做日志组的成员。

    Alter database drop logfile member‘/ora04/oradata/mydb01/redo0203.log’;

    f.创建联机重做日志文件:

    当重做日志组成员遭到破坏时,可以删除并重新添加这个重做日志组或组成员。

    二、

    档案重做日志文件:

    它是联机重做日志文件的一个副本。Lgwr和arcn进程的故障都会引起数据库的挂起。只有当arcn进程把联机重做日志写到归档地后,才可以向此重做日志组成员写入数据。

    设置归档目的地:

    可以在参数初始化文件中的log_archive_dest_n来定义归档目的地。归档目的地可以在本地计算机上,也可在远程的数据库服务器上。定义语法如下:

    LOG_ARCHIVE_DEST_n=“null_string”|

    (service=tnsnames_name |

    LOCATION=‘directory_name’)

    [MANDATORY | OPTIONAL]

    [REOPEN[=integer]]

    例1:

    LOG_ARCHIVE_DEST_1=((LOCATION=’/archive/MYDB01’) MANDATORU REOPEN=60)定义归档日志的位置为/archive/MYDB01,mandatory子句的定义向这个位置写日志的操作必须的成功的。Reopen子句定义在日志写入失败时,下次尝试写入操作的时间间隔。缺省是300秒。

    例2:

    LOG_ARCHIVE_DEST_@=(SERVICE=STDBY01) OPTIONAL REOPEN;语句中的stdby01的连接到远程数据库的oracle net连接串。由于写操作是可选的,所以数据库活动继续,当arcn进程不能写档案日志文件时,进程将立即尝试重新写入(这个动作有reopen子句来定义)。

    Log_archive_min_succeed_dest:定义最少归档日志的副本数量。

    Log_archive_format:定义归档日志文件采用的名称和使用的格式。可以使用预定义变量来构造每个归档日志文件的名称。变量如下:

    %s日志序列号

    %t线程号

    %r复位日志id

    %d数据库id

    定义归档日志名称的变量至少包含%s,%t,%r,当多个数据库实例的归档日志采用相同的归档日志位置时,还必须定义%d。例如:%t_%s_%r.dbf

    展开全文
  • Server 层:主要包括连接器、查询缓存、分析器、优化器、执行器等,所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图,函数等,还有一个通用的日志模块 binglog 日志模块。 存储引擎: 主要负责...
  • alter system switchlogfilealter system archive log current的区别我的理解:1、alter system switch logfile是强制日志切换,不一定就归档当前的重做日志文件(若自动归档打开,就归档当前的重做日志,若自动...
  • 开门见山,先来看张图(PS:这张图是我从网上找的): ...此时的redo log分组,每当一个redo log group写满时,或者发出switch logfile指令时都会触发日志组的切换,当发生日志组切换时,arc进程会将当前的重做日志数...
  • 不仅需要修改500 kcrbaseq 还要修改504 kcrbabno 508 kcrbabof 查看归档日志重做记录的RBA: SQL> oradebug setmypid Statement processed. SQL> oradebug tracefile_name /oracle/app/diag/rdbms/prod/prod/...
  • 重做日志文件和归档日志文件

    千次阅读 2017-02-13 21:53:30
    日志文件分为重做日志文件(redo log file)和归档日志文件(archive log file)。SQL> select group#, status, member from v$logfile;GROUP# STATUS MEMBER ---------- ------- ---------------------------------...
  • 重做日志redo log file是LGWR进程从Oracle实例...归档日志archive log是当数据库运行在归档模式下时,一个redo log file(group)写满后,由ARCn进程将重做日志的内容备份到归档日志文件下,然后这个redo log file(gro...
  • 最近在学习Oracle 归档日志模式的管理, 特撰写一下学习心得,不足之处还望指出!!! ----------------------------------------------------------- 一 系统环境:  1、操作系统:Windows xp sp3 2、数据库...
  • 如何打开归档Oracle 数据库可运行在两种模式下: ARCHIVELOG 模式NOARCHIVELOG 模式。NOARCHIVELOG 模式只能...Oracle 能够将已经写满的重做日志文件在被覆盖之前保存到指定位置上,被保存的重做日志文件的集合称...
  • LogMiner是集成在Oracle8i/Oracle9i数据库产品中的日志分析工具,通过该工具可以分析重做日志和归档日志中的所有事务变化,并能准确地确定各种DML和DDL操作的具体时间和SCN值。文中以Oracle8i(8.1.5)for Windows ...
  • LogMiner是集成在Oracle8i/Oracle9i数据库产品中的日志分析工具,通过该工具可以分析重做日志和归档日志中的所有事务变化,并能准确地确定各种DML和DDL操作的具体时间和SCN值。对重做日志和归档日志进行分析的目 的...
  • oracle RAC集群修改归档日志路径,更改完成后续重启服务
  • 【Oracle数据库存储管理】归档重做日志文件管理的思维导图: https://pan.baidu.com/s/1W2X8iN5cM399SdbSmNaIyg 提取码:r7h4
  • MysQL使用WAL技术解决了这个问题,WAL的全称是Write-Ahead Logging,它的关键点就是先写日志,再写磁盘。 当有一条记录需要更新的时候,InnoDB引擎就会先把记录写到redo log里面,并更新内存,这个时候更新就算完成...
  • 在Oracle中数据一般是存放在数据文件中不过数据库与Oracle最大的区别之一就是数据库可以在数据出错的时候进行恢复这个也就是我们常见的Oracle中的重做日志REDOFILE的功能了在重做日志分成2部分一个是在线重做日志...
  • 日志文件分为重做日志文件(redo log file)和归档日志文件(archive log file)。 重做日志redo log file是LGWR进程从Oracle实例中的redo log buffer写入的,是循环利用的。就是说一个redo log file(group) 写满后...
  • Oracle Archived log 归档重做日志/归档日志详解V$ARCHIVED_LOG此视图显示包含归档日志名的控制文件中的归档日志信息 在联机重做日志成功归档或清除后会插入归档日志记录 如果已清除日志 则名称列为NULL 如果日志...
  • 查看归档状态为非归档 sys@JSL> select log_mode from v$database; LOG_MODE ------------ NOARCHIVELOG archive状态Disabled sys@JSL> archive log list Database log mode No Archive Mode Automatic a
  • 重做日志文件(redo log file)对于Oracle数据库至关重要。它们是数据库的事务日志。通常只用于恢复,不过也可以用于以下工作:q 系统崩溃后的实例恢复q 通过备份恢复数据文件之后恢复介质q 备用(standby)数据库处理q ...
  • 此时的redo log分组,每当一个redo log group写满时,或者发出switch logfile指令时都会触发日志组的切换,当发生日志组切换时,ARC进程会将当前的重做日志数据写入归档日志; LGWR进程是将内存中的数据写入到重做...
  • 【关键术语】Redo log file 重做日志文件Archive log file 归档日志文件SCN(system change number)系统改变号 Checkpoint 检查点Log switch 日志切换 Redo entry 重做条目Log sequence number 日志序列号 Log file ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 22,325
精华内容 8,930
关键字:

归档日志和重做日志