关于脏数据、脏数据块的正确定义,commit的内部机制

有人觉得脏数据是指错误的业务流程在系统中产生的无用异常数据。 产生这种数据的原因可能是因为错误的业务流程或者手动在数据库中制造。

例如在百度百科中,对脏数据的定义是这样的,“脏数据是指源系统中的数据不在给定的范围内或对于实际业务毫无意义,或是数据格式非法,以及在源系统中存在不规范的编码和含糊的业务逻辑”。

无论这种定义是否正确,在oracle中脏数据的定义不是这样的。在oracle中,脏数据是指在内存中而未写入硬盘的数据。脏数据块即为在内存中而未写入硬盘的数据块。

那到底执行了commit语句之后,数据是否就立刻写到硬盘上了哪?事实上不是这样的,因为I/O操作是非常昂贵的,每次commit都写入硬盘会对系统造成巨大的压力。

将内存数据块写入硬盘是一个相当复杂的过程。简单的说DBWn进程会定期将内存数据块写入硬盘,由CKPT后台进程确定写入的时间间隔。但是为了保证安全性,将由LGWR进程将redo日志写入联机日志,以备数据库实例崩溃时,恢复未写入硬盘的数据。

DBWn:database writer—> DBW n是数字,代表unix下多个数据库写进程。

LGWR:Log Writer 将日志缓冲区中的所有记录项写到日志文件中。该进程在启动实例时自动启动。

CKPT: 检验点进程。

文章目录