oracle 11g归档日志研究_1

oracle的数据库操作都会被记录在redo log中,用来进行undo(回滚)或在数据库异常的时候redo(重做)。redo log又分为online(在线日志)和archive(归档日志)两部分。

oracle默认有3个在线日志文件,通常它们是按顺序写满一个再写下一个,而写满的在线日志文件会被整理为归档日志。在每个在线日志内部,可能按顺序或随机填写数据。

在线日志和归档日志一样,都是由很多块组成,文件第1块作为文件头,包含块大小、块总数等信息,第2块作为数据库头,包含数据库信息(如版本号、数据库ID、文件序号等)。默认情况下,块大小为512bytes,也可能有1k、2k等的情况(我还没遇到),所以redo log文件大小一定是512字节的整数倍。

第1块的数据格式:

typedef struct fh0 {
    uint32_t unknown0;
    uint32_t unknown1;
    uint32_t unknown2;
    uint32_t unknown3;
    uint32_t unknown4;
    uint32_t blocksize;     //每块大小(字节), 512/1024...
    uint32_t blockcount;    //当前文件的总块数(不包括第一块)
    uint32_t unknown5;
    uint8_t nouse[480];
}Redo_fh0;

Redo_fh0

第2块的数据格式:

typedef struct scn {
    uint32_t scnbase;
    uint16_t scnwrapper;
    uint16_t filler;
}Redo_scn;

typedef struct fh1 {
    Redo_bh blockhead;
    uint32_t unknown0;
    uint32_t comvsn;        //Compatibility Vsn
    uint32_t dbid;
    uint8_t dbname[8];      //"ORCL"(sid)
    uint32_t controlseq;
    uint32_t filesize;
    uint32_t blocksize;
    uint16_t filenum;
    uint16_t filetype;
    uint32_t activid;
    uint8_t nouse0[36];     //0
    uint8_t descript[64];
    uint32_t nab;           //next available block
    uint32_t resetcount;
    Redo_scn resetscn;
    uint32_t hws;           //后3字节为0
    uint32_t thread;
    Redo_scn lowscn;
    uint32_t lowscntime;
    Redo_scn nextscn;
    uint32_t nextscntime;
    uint32_t unknown11;
    Redo_scn enablescn;
    uint32_t enablescntime;
    Redo_scn thrclosescn;
    uint32_t thrclosescntime;
    uint8_t unknown13[52];
    Redo_scn prevresetscn;
    uint32_t prevresetcount;
    uint8_t nouse1[152];    //0
    uint8_t unknown14[36];
    uint8_t nouse2[28];     //0
}Redo_fh1;

Redo_fh1

第1块与其他块完全不同,它不含有块头,也不被包含在块总数之内。从第2块开始,所有的数据块的前16个字节为块头,格式:

typedef struct bh {
    uint32_t signature;     //签名
    uint32_t blocknum;      //块号
    uint32_t sequence;      //顺序号
    uint16_t offset;        //最高位1需过滤掉
    uint16_t checksum;
}Redo_bh;

Redo_bh

下面详细研究归档日志。

时间: 2024-08-01 22:47:58

oracle 11g归档日志研究_1的相关文章

oracle 11g归档日志研究_2

从第3块开始,块里面存储着oracle的所有操作记录.块结构很简单,只有块头和块体: typedef struct bk { Redo_bh blockhead; uint8_t buf[496]; }Redo_bk; Redo_bk 块头与上一篇介绍过的一致: typedef struct bh { uint32_t signature; //签名 uint32_t blocknum; //块号 uint32_t sequence; //顺序号 uint16_t offset; //最高位1需

oracle 11g归档日志研究_3

记录头(record head)格式: typedef struct rh0 { uint32_t recordlen; uint8_t VLD; //直接决定整个record head大小 uint8_t unknown0; uint16_t rhscnwrapper; uint32_t rhscnbase; uint16_t subscn; }Redo_rh0; typedef struct rh1 { uint8_t unknown1[10]; }Redo_rh24; //VLD = 0x

oracle修改归档日志路径

一:先查询数据库是否开启归档模式: SQL> archive log list;                                                                    ----已经开启归档模式Database log mode        Archive ModeAutomatic archival        EnabledArchive destination        USE_DB_RECOVERY_FILE_DEST----修改此归

oracle清理归档日志

我们都都知道在controlfile中记录着每一个archivelog的相关信息,当然们在OS下把这些物理文件delete掉后,在我们的 controlfile中仍然记录着这些archivelog的信息,在oracle的OEM管理器中有可视化的日志展现出,当我们手工清除archive目录下的文件后,这些记录并没有被我们从controlfile中清除掉,也就是oracle并不知道这些文件已经不存在了!这时候我们要做手工的清除的话,下面我经过实验,可以尝试这种方法: 1. 进入rman 2. con

oracle 11g 更改日志组大小

1.创建新的日志组 1.alter database add logfile group 4 ('/u01/app/oracle/oradata/jian/redo04.log') size 1024k; 2.alter database add logfile group 5 ('/u01/app/oracle/oradata/jian/redo05.log') size 1024k; 2.切换当前日志到新的日志组 1.alter system switch logfile; 2.alter

Oracle 11g   归档模式基本操作

在Oracle 11g,开启archive log模式时,默认归档目录为db_recovery_file_dest指定.此参数在pfile/spfile中可以指定: show parameter db_recovery_file_dest db_recovery_file_dest=/oracle/11g/flash_recovery_area 更改归档模式 需要在mount状态下,更改归档模式. SQL> shutdown immediate; SQL> startup mount SQL&

oracle 删除归档日志的正确方式

在使用plsql使用游标的%rowcount时,导致了一个死循环,手动终止后数据库无法连接,服务重启后依然不行.windows日志管理器报归档日志相关的错误,最终手动启动到mount状态,禁用归档日志后,数据库正常.由于是本机的实验数据库,所以希望把归档日志删掉: 以下摘自这里ORACLE正确删除归档并回收空间的方法 一个ORACLE归档日志经常满,表现为/oraarchive 这个文件空间占用100%大家一定抱怨ORACLE为何没有归档维护工具,很多人直接删除了事,错了,ORACLE有,而且很

Oracle 11g R2 日志结构总结

Oracle从11g开始,对日志结构做了比较大的调整,日志存放目录和存储格式有都有了变化.下面总结了Oracle Database.Oracle监听.ASM和Oracle GI各日志的存放目录和目录结构. 1.Oracle Database日志 Oracle Database日志存放在$ORACLE_BASE/diag/rdbms/<db_unique_name>/<oracle_sid>目录中. $ORACLE_BASE/diag/rdbms/<db_name>/&l

oracle之归档日志是个什么鬼?

我们的oracle数据库默认采用的是非归档模式,假如说一共有三个重做日志组,当三个日志组全部写满之后将从第一个日志组开始循环记录,并且第一个日志组中的内容将被彻底覆盖,这样,如果数据库崩溃了,想要恢复很早之前的数据,那就坑比了. 怎么办? 你问我啊,我告诉你.切换数据库日志模式为归档模式就OK了,这样写入日志循环的时候,会先把日志组中的数据写入到归档日志中,然后才会被覆盖.你看,问题解决了吧? 有人可能会问:哎,那究竟什么时候应该采用归档模式呢? 这要看数据库对应的应用系统是什么样的要求了,如果