首页 > 数据库 >Oracle REDO Log详解

Oracle REDO Log详解

时间:2024-03-13 20:24:06浏览次数:20  
标签:文件 Log 写入 归档 Oracle 日志 REDO

Redo日志文件是Oracle数据库中的非常重要的文件,它记录了对数据库所做的所有更改操作,当事务对数据库进行修改时,Oracle首先将更改写入到REDO日志文件,然后再修改应用到数据文件中。这样可以确保在发生故障时,Oracle可以使用REDO日志来恢复已提交的事务。

  • REDO日志和Archive日志区别

    1. REDO日志:
      REDO日志(也称为在线REDO日志或重做日志)是一组循环使用的文件,用于记录已提交的事务对数据库所做的所有更改。当事务对数据库进行修改时,Oracle首先将更改写入REDO日志文件,然后才将修改应用到数据文件中。REDO日志可用于实例故障恢复和实例恢复。
    2. 归档日志:
      归档日志(也称为归档的REDO日志)是REDO日志的副本,它们包含了数据库在某个时间点之前的所有REDO信息。当REDO日志文件被Oracle实例填满时,如果数据库处于归档模式,Oracle会自动将该REDO日志文件复制到另一个称为"归档日志"的文件中。归档日志可用于介质恢复和不完全恢复。
  • REDO日志和Archive日志关系

    • REDO日志是在线的,用于记录正在进行的数据库更改。
    • 当REDO日志文件被填满时,如果启用了归档模式,Oracle会自动将其复制到归档日志中。
    • 归档日志是REDO日志的历史副本,用于介质恢复(如磁盘失败或损坏)和不完全恢复(如用户错误)。
    • 在数据库恢复过程中,Oracle首先应用归档日志,然后应用未归档的REDO日志(如果有)。
  • 日志查询

    • 查看在线日志

      select l.STATUS, lf.MEMBER from v$log l, v$logfile lf where l.GROUP# = lf.GROUP#;

    • 查询已归档日志

      select recid, stamp, thread#, sequence#, name from v$archived_log;

    • 查看默认归档路径

      show parameter db_recovery_file_dest;

    • REDO文件状态

      1. CURRENT
        • 表示该REDO日志文件是当前正在使用的日志文件。
        • 数据库实例正在向该日志文件写入REDO记录。
        • 在任一时刻只有一个REDO日志文件处于CURRENT状态。
      2. ACTIVE
        • 表示该REDO日志文件没有被使用,可以在日志组切换时被循环使用。
        • ACTIVE状态的日志文件不包含任何需要的REDO记录,可以被安全地覆写。
        • 当需要切换到新的日志组时,Oracle会从ACTIVE状态的日志文件中选择一个作为新的CURRENT日志文件。
      3. INACTIVE
        • 表示该REDO日志文件已经不再是当前日志文件,数据库实例已停止向该日志文件写入新的REDO记录。
        • INACTIVE日志文件需要等待归档(如果启用了归档模式)或覆写(如果没有启用归档模式)。
        • 当该日志文件被归档或覆写后,它将重新变为ACTIVE状态。
      4. INVALIDATED
        • 表示该REDO日志文件已经失效,不能被使用。
        • 这可能是由于日志文件损坏或者其他原因导致的。
        • INVALIDATED状态的日志文件需要被重建。
  • 其他补充

    1. Oracle归档模式

      1. 归档模式查询

        archive log list;

        select log_mode from v$database;

      2. 归档模式修改

        开启

        SQL> shutdown immediate;

        SQL> startup mount

        SQL> alter database archivelog;

        SQL> alter database open;

        SQL> archive log list;


        关闭

        SQL> shutdown immediate;

        SQL> startup mount

        SQL> alter database noarchivelog;

        SQL> alter database open;

    2. REDO刷入时机

      在Oracle数据库中,REDO日志的写入和事务提交遵循以下顺序:

      1. 事务开始时,更改会首先在内存中的REDO日志缓冲区中记录下来。
      2. 当事务执行DML操作(如INSERT、UPDATE、DELETE)时,相应的REDO记录会立即写入REDO日志缓冲区中。
      3. 当事务准备提交时,Oracle会强制将REDO日志缓冲区中所有未持久化的REDO记录写入当前REDO日志文件中。这个过程称为"日志切换"。
      4. 日志切换完成后,Oracle会将事务修改后的数据文件块写入数据文件。
      5. 最后,Oracle会将事务状态标记为已提交,该过程包括生成一个COMMIT记录并将其写入REDO日志文件。

      总的来说,写入REDO日志的顺序是:

      1. 更新REDO日志缓冲区
      2. 写入REDO日志文件(日志切换)
      3. 写入数据文件
      4. 记录COMMIT记录到REDO日志文件

      这种先写REDO日志,后写数据文件的方式被称为"写前日志记录(Write-Ahead Logging, WAL)"。它确保了在任何时候,REDO日志中都包含了足够的信息来重做已提交的修改,从而保证了数据库的可恢复性。

      如果在写入数据文件之前发生了实例崩溃,Oracle可以使用REDO日志来恢复所有已提交的事务。但如果在写入REDO日志之前发生崩溃,则这些未提交的事务将会自动回滚。

      通过这种方式,Oracle既确保了已提交事务的持久性,又避免了部分提交的数据导致数据库不一致的问题。

    3. REDO和UNDO区别

      1. REDO日志:
        • REDO日志用于记录对数据库所做的所有永久性更改,如INSERT、UPDATE、DELETE等。
        • 当事务对数据库进行修改时,Oracle首先将更改写入REDO日志文件,然后再将修改应用到数据文件中。
        • REDO日志的主要作用是用于数据库恢复,如实例故障恢复和介质恢复。在发生故障后,Oracle可以使用REDO日志来重新应用已提交的事务。
        • REDO日志是循环使用的,旧的REDO日志会被覆盖或者归档。
      2. UNDO数据:
        • UNDO数据用于维护读一致性和回滚未提交的事务。
        • 当事务对数据库进行修改时,Oracle会在UNDO段中保存原始数据的副本,以便在事务回滚时能够恢复到原始状态。
        • UNDO数据还用于提供读一致性视图,允许其他事务在未提交的事务修改数据时仍能看到原始数据。
        • UNDO数据存储在UNDO表空间中,并且是只写入的,不会被覆盖。

      总的来说,REDO日志和UNDO数据有以下区别:

      1. 作用不同:REDO用于恢复已提交的事务,而UNDO用于回滚未提交的事务和维护读一致性。
      2. 存储位置不同:REDO日志存储在REDO日志文件中,而UNDO数据存储在UNDO表空间中。
      3. 数据写入方式不同:REDO日志是循环写入的,而UNDO数据是只写入的。
    4. REDO日志管理和维护

      1. REDO日志文件组

        • REDO日志文件通常被划分为多个日志文件组。
        • 每个日志文件组至少包含一个REDO日志文件成员。
        • 通过增加日志文件组的数量和每个组中成员的数量,可以提高REDO日志的写入性能。
      2. REDO日志文件大小

        • REDO日志文件的大小会影响REDO日志的切换频率。
        • 太小的日志文件会导致频繁切换,增加系统开销。太大的日志文件则会增加故障恢复时间。
        • 适当调整REDO日志文件大小对系统性能和恢复时间都很重要。
      3. REDO日志文件监控

        • 使用V$LOG和V$LOG_FILE视图监控REDO日志文件的状态、大小和使用情况。

          V$LOG(提供了有关REDO日志组的信息)

          • GROUP# - 日志组编号

          • THREAD# - 线程编号

          • SEQUENCE# - 日志序列号

          • BYTES - 日志组大小(字节)

          • MEMBERS - 日志组成员数量

          • ARCHIVED - 标识日志组是否已归档

          • STATUS - 日志组当前状态

          V$LOGFILE(提供了有关单个REDO日志文件成员的详细信息)

          • GROUP# - 日志组编号
          • THREAD# - 线程编号
          • SEQUENCE# - 日志序列号
          • MEMBERS - 日志组成员编号
          • BYTES - 日志文件大小(字节)
          • BLOCKSIZE - 日志文件块大小
          • MEMBER - 日志文件成员名称(路径)
          • STATUS - 日志文件当前状态
        • 定期检查是否有INACTIVE状态的日志文件,并及时进行归档或覆写。

        • 监控REDO日志生成速率,判断是否需要增加日志文件组的数量。

      4. 日志切换操作

        • 在高并发场景下,REDO日志可能需要频繁切换。
        • 可以通过ALTER SYSTEM SWITCH LOGFILE语句手动触发日志切换。
        • 还可以设置MAX_LOGFILE_SIZE参数自动触发日志切换。
      5. REDO日志清理

        • 如果REDO日志文件由于损坏或其他原因进入INVALIDATED状态,需要通过重建来清理。
        • 当数据库处于归档模式时,归档的REDO日志文件需要定期删除或备份,以释放磁盘空间。
      6. REDO日志备份

        • 及时备份REDO日志文件对于数据库恢复非常重要。
        • 在发生介质故障时,如果没有可用的REDO日志,将无法进行恢复。
        • 建议将REDO日志文件和数据文件分开存储,并定期备份。

标签:文件,Log,写入,归档,Oracle,日志,REDO
From: https://www.cnblogs.com/whl-lin/p/18071431

相关文章

  • Oracle表空间扩展
    1、查看所有表空间使用情况selectb.file_id文件ID号,b.tablespace_name表空间名,b.bytes/1024/1024||'M'字节数,(b.bytes-sum(nvl(a.bytes,0)))/1024/1024||'M'已使用,sum(nvl(a.bytes,0))/1024/1024||'M'剩余空间,100-sum(nvl(......
  • Oracle创建用户,授权,取消授权常用语句整理
    --删除用户及及用户下的所有数据dropuserxxxcascade;--创建用户赋予密码createuserxxxidentifiedby1234;--赋予权限grantdbatoxxx;--删除权限revokedbafromxxx;--赋予用户登录数据库的权限grantcreatesessiontoxxx;--授予用户操作表的权限gran......
  • Springcloud学习笔记62---log.error()打印内容区别
    1. log.error(“异常信息:”+e.getMessage)没有异常信息,没有堆栈信息@PostMapping("/logtest")publicvoidlogtest(){try{inti=1/0;}catch(Exceptione){log.error("异常信息:"+e.getMessage());}......
  • Python爬虫实战系列1:博客园cnblogs热门新闻采集
    实战案例:博客园热门新闻采集一、分析页面打开博客园网址https://www.cnblogs.com/,点击【新闻】再点击【本周】本次采集,我们以页面新闻标题为案例来采集。这里可以看到标题“李彦宏:以后不会存在“程序员”这种职业了”。1.1、分析请求F12打开开发者模式,然后点击Network后点......
  • Vscode-Verilog开发工具
    ICdesign时,有的公司是在linux环境下进行,虽然很多推荐用vim/gvim进行coding,但是在linuxvscode下coding也很多,因为vscode插件很多,看个人习惯吧,我喜欢在vscode下Coding。另外FPGA开发一般也就在windows环境下进行,所以也可以用Vscode进行Coding。个人使用的插件如下:1.代码补全,代码......
  • Oracle传送表空间(XTTS)
    传送表空间的限制条件:1、源数据库和目标数据库必须具有相同的字符集;                    2、与传送数据库不同,传送表空间源数据库服务器和目标数据库服务器可以属于不同的endian架构;                ......
  • Oracle2PostgreSQL - Precheck
    selectcol.column_id,col.ownerasschema_name,col.table_name,col.column_name,col.data_type,col.data_length,col.data_precision,col.data_scale,col.nullablefromsys.dba_tab_columnscoli......
  • oracle 存储过程
    createorreplaceprocedureinst_XXXisiint;--定义变量internal_keynumber(15);seq_novarchar2(35);barnchvarchar2(8);begin--开始 i:=1;---变量赋值internal_key:=1;whilei<100000LOOP;---while循环seq_no:='A'||TO_CHAR(i); ---字符拼接用||   int......
  • SimpleUI [12/Mar/2024 19:32:11] "GET /admin/logout/ HTTP/1.1" 405 0 Method Not
    Django使用SimpleUI后,登出报错[12/Mar/202419:32:11]"GET/admin/logout/HTTP/1.1"4050MethodNotAllowed(GET):/admin/logout/MethodNotAllowed:/admin/logout/[12/Mar/202419:36:20]"GET/admin/logout/HTTP/1.1"4050原因升级到5.0后不......
  • YUNBEE云贝-热烈祝贺Guo同学成功通过Oracle 19c OCP认证考试!
    恭喜Guo同学在#Oracle19cOCP考试中取得了OCP证书!该认证是Oracle公司的权威技术标准,适用于有资格为Oracle核心产品提供服务和支持的专业人员。尽管OCP认证考题随着版本变化,并且是全英文考试,对中文习惯的人来说有一定的难度,但是在云贝考OCP则相对容易,因为它有专门的OCP课程和......