如果在对数据库进行 *** 作的时候,一般情况写是将数据拿到缓冲区中进行 *** 作,除非你修改一条记录就commit一次,那么如果出现问题,那么缓冲区的数据还在,包括已经修改的数据和没有修改的数据。这样,如果贸然的commit,那么没有修改的数据也会提交到数据库中,这样就出现了错误数据。redo一次就是不管是否修改的数据都重新修改一次,直到没有故障发生时才commit。
个人意见,仅供参考
严重鄙视写代码不带注释
LogFile物理结构
从ib_logfile0和ib_logfile1这两个文件的物理结构可以看出,在LogHeader部分还是有些许差异的,ib_logfile0会多一些额外的信息,主要是checkpoint信息。
并且每个Block的单位是512字节,对应到磁盘每个扇区也是512字节,因此redolog写磁盘是原子写,保证能够写成功,而不像indexpage一样需要doublewrite来保证安全写入。
我们依次从上到下来看每个Block的结构
LogFileHeaderBlock
LogGoupID,可能会配置多个redo组,每个组对应一个id,当前都是0,占用4字节
StartLSN,这个redolog文件开始日志的lsn,占用8字节
LogFileNumber,总是为0,占用4字节
CreatedBy,备份程序所占用的字节数,占用32字节
另外在ib_logfile0中会有两个checkpointblock,分别是LOG_CHECKPOINT_1/LOG_CHECKPOINT_2,两个记录InnoDBCheckpoint信息的字段,分别从文件头的第二个和第四个block开始记录,并且只在每组log的第一个文件中存在,组内其他文件虽然没有checkpoint相关信息,但是也会预留相应的空间出来。这里为什么有两个checkpoint的呢?原因是设计为交替写入,避免因为介质失败而导致无法找到可用的checkpoint的情况。
Logblocks
logblock结构分为日志头段、日志记录、日志尾部
BlockHeader,占用12字节
Data部分
Blocktailer,占用4字节
BlockHeader
这个部分是每个Block的头部,主要记录的块的信息
BlockNumber,表示这是第几个block,占用4字节,是通过LSN计算得来的,占用4字节
Blockdatalen,表示该block中有多少字节已经被使用了,占用2字节
FirstRecoffet,表示该block中作为第一个新的mtr开始的偏移量,占用2字节
Checkpointnumber,表示该logblock最后被写入时的检查点的值,占用4字节
不那么明显的影响是, 由于频繁的io,会潜在的使数据库变慢。
明显的影响是,比如说你只有2组redo。第一组写满了,写第二组。但这时第一组的状态仍然是active的,要等到第一组redo里面记录的 *** 作全都提交了,才会变成inactive的。如果还有未提交的数据,那么第一组redo是不能被覆盖的。然后呢。。。 如果第二组日志这时也写满了,又不能去覆盖第一组,那么所有的数据库 *** 作都会hang在那里。你的客户如果耐心不好,就要砸电脑了。
夸张的影响是,如果你的数据库hang在那里的时候,发生了什么特殊的问题,导致系统进程出了故障,crash也不是不可能的。
以上就是关于书上说:“数据库所做的修改在故障发生时可能还在缓冲区,尚未写进数据库,所以要redo”如何理解全部的内容,包括:书上说:“数据库所做的修改在故障发生时可能还在缓冲区,尚未写进数据库,所以要redo”如何理解、数据库的物理结构设计指的是什么、Oracle里redo文件size小且数量少,切换频繁,会对数据库性能产生怎样影响请讲的具体一些,谢谢你。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)