块分裂

块分裂原理

执行begin bacckup之后,oracle会把将要备份的数据文件都标记为hot-backup-in-progress,锁定所要备份的datafile header的scn,例如此时scn=100,同时redolog中会记住这个scn,其他数据文件正常使用,scn会继续增长。之后再备份所要备份的数据文件过程中,数据文件是允许写入和checkpoint,而且可能不止一次checkpoint,而这个过程中的所有操作和checkpoint也会正常记录到redolog与archivelog中。

假如oracle系统数据文件最小存储单元是数据块,比如8192bytes,而操作系统的最小存储单元os块为固定的512bytes,这样问题就产生了。

在oracle执行begin backup之后进行copy操作,这个copy操作底层属于操作系统的命令,每次只能copy一个os block,假如oracle数据块的block单位为8192bytes,那么这个oracle block就由16个os block组成,这里为了方便理解,我们把他们标记为1-16个os block。copy命令对于数据块的拷贝时没有顺序的,也就是说第一次可能copy 1号block,而第二次可能就会copy 16号block。而在这个copy过程中,对于oracle热备份机制来说对oracle整个的block是允许读写的,这样就会产生如下的问题,例如:执行begin backup,oracle锁定datafile header的scn,假设此时oracle block中存储的数据是10,敲copy进行复制,系统就会将这个oracle block中的16个os block一个一个地拷贝到备份目录,假如拷贝到第五个os block时候,如果数据写入,例如需要将这个数据块中的数据update为20,oracle就会调用dbwr进程对这个数据块进行数据修改,同样dbwr进程也是不顺序地将数据写入这16个os block,所以他就有可能从已经拷贝完的哪五个os块中开始写数据,也有可能从剩下的11个os block中开始写数据。如果从剩下的11个os block中开始写入的话,就会带来一个严重的后果,热备份copy正在进行,而剩下的11个block其中的几个有可能数据已经改变,这样copy出来的备份文件肯定会不一致,copy出来的备份文件对于这个oracle block来说前5个block是原来存储数据10的信息,而后来copy的11个block就有可能存储的是update之后的数据20的信息,这样是绝对不允许的。

(自己的理解:

块分裂:数据库1个块相当于操作系统16个块,在转储时,数据文件改变,导致16个系统块中前5个的scn为2000,后11个scn为2001,也就是说前后不一致,对应的数据库块,既不是更新前的数据,也不是更新后的数据。

解决方法:

将update之前的镜像对os块进行覆盖,在用日志对其恢复。)

因此,oracle做了这样的一个机制,在copy过程中如果需要有数据update,dbwr进程告诉oracle我要update,这时候oracle就会通知备份系统,先把所要写入的那个Oracle black完全镜像到redo中,redo记录的是整个数据块的镜像,而不是一条信息。之后dbwr在开始向这个oracle block中的16个os block随机写入数据。这样,在数据恢复的时候,oracle检查是从被锁定的那个scn时刻起开始恢复,如果检查到那个时间点上的某个oracle block出现上述所说的那种"损坏的block‘,他就会将redo中的镜像在完全copy到这个oracle block,这样,这个数据块就是begin backup的那个时间点时候的完整的数据库了,之后redo就可以从这个scn进行向后的恢复工作。

这个过程也就解释了为什么在热备过程中有时候redo会急剧增加的现象。

结束热备end backup之后,oracle解锁备份的datafile header的scn,自动同系统当前的scn同步,例如此时的scn已经变为1000,那么备份文件的scn会与系统自动同步到1000.

因为在备份过程中数据文件及redo是允许写入的,因此备份的数据文件不仅包含scn=100以前的数据,而且还包含scn在100和1000之间的所有操作数据。这就是上述所说的“损坏的block”。

时间: 2024-08-09 04:13:42

块分裂的相关文章

Mongodb支持关闭自动的分片和迁移功能,支持手动配置分片,数据块分裂和数据迁移

有相关资料,求分享

bzoj4697: 猪

Description 红学姐和黄学长是好朋友.红学姐有一只宠物,叫魔法猪.黄学长也有一只宠物,叫小奇.有 n 个猪圈排成一排 ,魔法猪藏在某个猪圈中.为了找到魔法猪,小奇会向你询问一些猪圈中猪的个数和.在询问的过程中,魔法猪可 能会释放魔法来改变这些猪圈. 共有 m 次操作.每次操作是以下三种之一. Q x y 询问从左到右第 x 个猪圈到第 y 个猪圈中猪的个数和. C x y 将从左到右第 x 个猪圈中猪的个数变为 y. M x y 将从左到右第 x 个猪圈移动到第 y 个猪圈的位置,并将

(转载)Oracle AWR报告指标全解析

Oracle AWR报告指标全解析 2014-10-16 14:48:04 分类: Oracle [性能调优]Oracle AWR报告指标全解析 2013/08/31 BY MACLEAN LIU 26条评论 [性能调优]Oracle AWR报告指标全解析 开Oracle调优鹰眼,深入理解AWR性能报告:http://www.askmaclean.com/archives/awr-hawk-eyes-training.html 开Oracle调优鹰眼,深入理解AWR性能报告 第二讲: http:

申请内存的函数有哪些

申请内存的函数有哪些,以及其特点 其实总结起来,申请内存的函数主要有kmalloc,vmalloc,__get_free_page,malloc函数族,alloca.下面分别介绍: 1. vmalloc:内核态的内存申请函数,也是基于slab机制.申请的物理内存并不连续,速度相比于kmalloc要慢.用于申请大块内存.其分配的内存在内核空间中的动态映射区.Vmalloc能分配的内存较大,可以通过命令"cat /proc/meminfo | grep Vmalloc"来看.通过下图可以看

伙伴系统之伙伴系统概述--Linux内存管理(十四)

日期 内核版本 架构 作者 GitHub CSDN 2016-09-02 Linux-4.7 X86 & arm gatieme LinuxDeviceDrivers Linux内存管理 1 前景回顾 1.1 Linux内存管理的层次结构 Linux把物理内存划分为三个层次来管理 层次 描述 存储节点(Node) CPU被划分为多个节点(node), 内存则被分簇, 每个CPU对应一个本地物理内存, 即一个CPU-node对应一个内存簇bank,即每个内存簇被认为是一个节点 管理区(Zone)

Oracle AWR报告指标解析一例

啥是AWR? ===================================================================================================== AWR (Automatic Workload Repository) 一堆历史性能数据,放在SYSAUX表空间上, AWR和SYSAUX都是10g出现的,是Oracle调优的关键特性: 大约1999年左右开始开发,已经有15年历史 默认快照间隔1小时,10g保存7天.11g保存8

oracle 索引基本原理

一.索引基本概念 oracle提供了两种方式:从表中读取所有行(即全表扫描),或者通过ROWID一次读取一行. 如果只访问大数据量表中的5%的行,并且使用索引标识需要读取的数据块,这样话费的I/O较少. 索引对性能改进的程度:1.取决于数据的选择性 2.数据在表的数据块中的分布方式 当数据分散在表的多个数据块中时,最好是不使用索引,而是选择全表扫描.执行全表扫描时,oracle使用多块读取以快速扫描表,基于索引的读是单块读.因此在使用索引时的目标是减少完成查询所需的单块读的数量. 增强索引会降低

【块状链表】AutSky_JadeK的块状链表模板+总结(STL版)

Part 1.块状链表.   定位 插入 删除 数组 O(1) O(n) O(n) 链表 O(n) O(1) O(1) 对于线性表的以上常见操作来说,数组和链表都无法有效地解决.但是,若我们将链表的每个节点存成一个数组,使得链表里每个节点的数据拼接起来就是原先的线性表中的内容(即块状链表),并且数组的大小合适的话,以上的操作都能比较好地解决了.根据均值不等式,若每个块的大小定为sqrt(n)左右最优,此时块数也是sqrt(n)左右,易证.以下是块状链表的基础操作的思想.复杂度和代码. 一.声明.

mongodb分片部署和管理

一.部署分片集群 在3.2版本中,官方建议对所有生产的config server和shard server都使用复制集.其中config server对复制集有如下要求: 1.必须没有仲裁节点 2.必须没有延时节点 3.必须创建索引,即没有节点配置buildIndex为false 我们这里用来测试就搭建复制集了. 新部署一个分片集群包括4步骤: 1.部署config server 2.部署mongos实例 3.部署mongod server 4.将mongod server添加到集群 5.为集群