oracle 写入数据文件的过程
2013-01-13 15:10
453 查看
checkpoint 和 commit没什么关系
checkpoint为了保证数据一致性,在下面情况下触发写事件:
a 手工checkpoint,alter system checkpoint
b alter tablespace offline/begin backup;
c 正常shutdown数据库
写事件就是它会将数据文件头和控制文件中写入同一个id,以便于在数据库打开时,通过id知道数据库是否需要恢复
而commit只是当数据提交后,触发将redo buffer写入redo file的事件,从而能在恢复时用到日志文件内容
也就是说commit之后没有写入到datafile,如果insert 了一条数据没有alter system checkpoint并且recover的时候没有copy rodo log,那么这条数据将不能恢复?
那么日常使用数据库数据文件在逐渐增大都是什么时候写入的?
各种后台进程的作用:
Ckpt、lgwr、dbwn之间的协作。
Ckpt:每隔3秒或更频繁写一次,写入控制文件,记录DBWN从SGA写入磁盘的块的位置。
LGWR:每3秒,1/3满buffer,commit,DBWN写之前。将buffer中数据写入物理文件。
DBWN:将SGA中脏块写入datafile。
Oracle 写入数据过程:
Oracle 写数据过程:dml操作一执行,首先在redo buffer中记录语句,在buffer cache中执行更改,修改数据块。然后LGWR进程根据上述规则,将redo buffer中的信息写入到物理文件。此过程比较快(redo log为连续写)。完成后,DBWN会将buffer cache中脏数据块对应的原始数据,复制到undo表空间,然后更新数据。(随机写,比较慢)。期间ckpt进程根据3秒的原则,作检查点,记录哪些脏 数据库写到了data file中(这里的检查点为增量检查点,并不是完全将脏数据写完,只是在控制文件中记录写到哪里了。)。将需要的信息记录在控制文件中。若实例崩溃或需要 错误恢复,从检查点位置以后的redo需要重新应用到datafile(常说的redo过程,前滚)。此时根据事务是否提交了,未提交的事务,根据 undo表空间的数据进行恢复(常说的undo,后滚操作)
另一位网友的介绍:
1、事务开始;
2、在buffer cache中找到需要的数据块,如果没有找到,则从数据文件中载入buffer cache中;
3、事务修改buffer cache的数据块,该数据被标识为“脏数据”,并被写入log buffer中;
4、事务提交,LGWR进程将log buffer中的“脏数据”写入redo log file中;
5、当发生checkpoint,CKPT进程更新所有数据文件的文件头中的信息,DBWn进程则负责将Buffer Cache中的脏数据写入到数据文件中。
附:checkpoint 由ckpt进程触发oracle进行checkpoint动作,将data buffer中的脏块(已经写在redo里记录但是没有写到datafile里的)的内容写入到data file里并释放站用的空间,由dbw后台进程完成,并修改controlfile和datafile的scn.
一般手工执行(alter system checkpoint)是由于要删除某个日志但是该日志里还有没有同步到data file里的内容,就需要手工check point来同步数据,然后就可以drop logfile group n.
DBWn负责将脏块写入磁盘的后台进程。
DBWn会把块写出到所有磁盘,即分散在各个磁盘上,也就是说,DBWn会做大量的分散写(scattered write);
LGWR则是向重做日志完成大量的顺序写(sequential write)。
从理论上讲,如果提交期间Oracle已经将已修改的块物理地写出到磁盘,就可以跳过写在线重做日志文件。但实际上,提交期间,只是由LGWR会把每个事务的重做信息写至在线重做日志,DBWn则在后台将数据库块刷新输出到磁盘。
这么做的原因就是分散写比顺序写慢多了。DBWn 在后台完成它的任务(很慢),而LGWR在用户提交后等待时完成自己的任务(这个任务比较快),就能得到更好的整体性能。尽管从技术上讲这样会使Oracle执行更多不必要的I/O(写日志以及写数据文件)。
The DBWn process writes dirty buffers to disk under the following conditions:
1、
When a server process cannot find a clean reusable buffer after scanning a threshold number of buffers, it signals DBWn to write.
DBWn writes dirty buffers to disk asynchronously if possible while performing other processing.
2、
DBWn periodically writes buffers to advance the checkpoint,
which is the position in the redo thread from which instance recovery begins (see "Overview of Checkpoints").
The log position of the checkpoint is determined by the oldest dirty buffer in the buffer cache.
关于Oracle SGA中内存块,后台进程,相关文件的截图介绍:
checkpoint为了保证数据一致性,在下面情况下触发写事件:
a 手工checkpoint,alter system checkpoint
b alter tablespace offline/begin backup;
c 正常shutdown数据库
写事件就是它会将数据文件头和控制文件中写入同一个id,以便于在数据库打开时,通过id知道数据库是否需要恢复
而commit只是当数据提交后,触发将redo buffer写入redo file的事件,从而能在恢复时用到日志文件内容
也就是说commit之后没有写入到datafile,如果insert 了一条数据没有alter system checkpoint并且recover的时候没有copy rodo log,那么这条数据将不能恢复?
那么日常使用数据库数据文件在逐渐增大都是什么时候写入的?
各种后台进程的作用:
Ckpt、lgwr、dbwn之间的协作。
Ckpt:每隔3秒或更频繁写一次,写入控制文件,记录DBWN从SGA写入磁盘的块的位置。
LGWR:每3秒,1/3满buffer,commit,DBWN写之前。将buffer中数据写入物理文件。
DBWN:将SGA中脏块写入datafile。
Oracle 写入数据过程:
Oracle 写数据过程:dml操作一执行,首先在redo buffer中记录语句,在buffer cache中执行更改,修改数据块。然后LGWR进程根据上述规则,将redo buffer中的信息写入到物理文件。此过程比较快(redo log为连续写)。完成后,DBWN会将buffer cache中脏数据块对应的原始数据,复制到undo表空间,然后更新数据。(随机写,比较慢)。期间ckpt进程根据3秒的原则,作检查点,记录哪些脏 数据库写到了data file中(这里的检查点为增量检查点,并不是完全将脏数据写完,只是在控制文件中记录写到哪里了。)。将需要的信息记录在控制文件中。若实例崩溃或需要 错误恢复,从检查点位置以后的redo需要重新应用到datafile(常说的redo过程,前滚)。此时根据事务是否提交了,未提交的事务,根据 undo表空间的数据进行恢复(常说的undo,后滚操作)
另一位网友的介绍:
1、事务开始;
2、在buffer cache中找到需要的数据块,如果没有找到,则从数据文件中载入buffer cache中;
3、事务修改buffer cache的数据块,该数据被标识为“脏数据”,并被写入log buffer中;
4、事务提交,LGWR进程将log buffer中的“脏数据”写入redo log file中;
5、当发生checkpoint,CKPT进程更新所有数据文件的文件头中的信息,DBWn进程则负责将Buffer Cache中的脏数据写入到数据文件中。
附:checkpoint 由ckpt进程触发oracle进行checkpoint动作,将data buffer中的脏块(已经写在redo里记录但是没有写到datafile里的)的内容写入到data file里并释放站用的空间,由dbw后台进程完成,并修改controlfile和datafile的scn.
一般手工执行(alter system checkpoint)是由于要删除某个日志但是该日志里还有没有同步到data file里的内容,就需要手工check point来同步数据,然后就可以drop logfile group n.
DBWn负责将脏块写入磁盘的后台进程。
DBWn会把块写出到所有磁盘,即分散在各个磁盘上,也就是说,DBWn会做大量的分散写(scattered write);
LGWR则是向重做日志完成大量的顺序写(sequential write)。
从理论上讲,如果提交期间Oracle已经将已修改的块物理地写出到磁盘,就可以跳过写在线重做日志文件。但实际上,提交期间,只是由LGWR会把每个事务的重做信息写至在线重做日志,DBWn则在后台将数据库块刷新输出到磁盘。
这么做的原因就是分散写比顺序写慢多了。DBWn 在后台完成它的任务(很慢),而LGWR在用户提交后等待时完成自己的任务(这个任务比较快),就能得到更好的整体性能。尽管从技术上讲这样会使Oracle执行更多不必要的I/O(写日志以及写数据文件)。
The DBWn process writes dirty buffers to disk under the following conditions:
1、
When a server process cannot find a clean reusable buffer after scanning a threshold number of buffers, it signals DBWn to write.
DBWn writes dirty buffers to disk asynchronously if possible while performing other processing.
2、
DBWn periodically writes buffers to advance the checkpoint,
which is the position in the redo thread from which instance recovery begins (see "Overview of Checkpoints").
The log position of the checkpoint is determined by the oldest dirty buffer in the buffer cache.
关于Oracle SGA中内存块,后台进程,相关文件的截图介绍:
相关文章推荐
- ORACLE 中写入txt文本与从Txt文件中读入数据 修改表结构
- python从oracle读取数据写入到文件里
- 将oracle中blob数据写入文件,再把文件读取插入数据库
- 数据库操作_连接SQL Server数据库示例;连接ACCESS数据库;连接到 Oracle 数据库示例;SqlCommand 执行SQL命令示例;SqlDataReader 读取数据示例;使用DataAdapter填充数据到DataSet;使用DataTable存储数据库表;将数据库数据填充到 XML 文件;10 使用带输入参数的存储过程;11 使用带输入、输出参数的存储过程示;12 获得数据库中表的数目和名称;13 保存图片到SQL Server数据库示例;14 获得插入记录标识号;Exce
- Hadoop学习笔记——1.java读取Oracle中表的数据,创建新文件写入Hdfs
- asp.net(c#)如何读取上传过程中的.txt文件中的数据,并将其写入数据库的
- 测试Oracle 11gr2 RAC 非归档模式下,offline drop数据文件后的数据库的停止与启动测试全过程
- ORACLE 中写入txt文本与从Txt文件中读入数据 修改表结构
- 在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程
- 用oracle utl_file包读取数据写入文件
- 解决 在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程
- oracle查询数据,以asci写入文件
- 在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程
- 系统崩溃后 oracle 9i数据文件恢复过程
- ORACLE移动数据文件到新的分区全过程
- 系统崩溃后 oracle 9i数据文件恢复过程!
- JAVA通过Hibernate将文件写入ORACLE数据的BLOB字段 代码示例
- oracle数据文件recover恢复过程
- [oracle] Oracle存储过程里操作BLOB的字节数据的办法,例如写入32位整数
- oracle 11g 学习笔记 10_31_管理表空间和数据文件