《数据库原理10-第6章》由会员分享,可在线阅读,更多相关《数据库原理10-第6章(83页珍藏版)》请在金锄头文库上搜索。
1、管理学院 信息管理系 肖 洁,数据库原理及应用,第6章 数据库的管理,本章要点,事务及其并发调度;封锁技术;数据库系统的故障及其恢复方法;完整性约束的定义、检查和处理;数据库安全性控制方法。,一、事务的概念,1、事务的定义事务是数据库的逻辑工作单位,由用户定义的一组操作序列组成,序列中的操作要么全做要么全不做。事务的开始:隐含的事务的结束:COMMIT TRANSACTIONROLLBACK TRANSACTION 事务举例,2、事务的特性(1)原子性:一个事务中的所有操作是不可分割的,要么全部执行,要么全部不执行。(2)一致性:一个被成功执行的事务,必须能使数据库从一个一致性状态变为另一个一
2、致性状态。(3)隔离性:当多个事务并发执行时,任一事务的执行不会受到其他事务的干扰,多个事务并发执行的结果与分别执行单个事务的结果是完全一样的。(4)持续性:事务被提交后,不管DBMS发生什么故障, 该事务对数据库的所有更新操作都会永远被保留在数据库中,不会丢失。,DBMS事务管理子系统,编写事务的应用程序员,DBMS并发控制子系统,DBMS事务管理子系统和恢复管理子系统,调度:事务的执行次序。 串行调度:多个事务按照某一次序串行地执行。 并行调度:多个事务同时交叉地并行执行。两个事务T1和T2:read(X); /*读出标准房的剩余数量X*/X=X-3; /*订了3间标准房,X-3*/wri
3、te(X); /*将新的标准房的剩余数量X写回数据库*/read(Y); /*读出商务房的剩余数量Y*/Y=Y-1; /*订了1间商务房,Y-1*/write(Y); /*将新的商务房的剩余数量Y写回数据库*/,二、数据库的并发控制,串行调度,并发调度,可串行化,(一)事务并发执行所带来的问题1、丢失更新问题,2、不可重复读问题,3、读“脏”数据问题,(二)封锁并发控制的主要技术封锁:事务T在对某个数据对象(如关系、元组等) 进行查询或更新操作以前,应先向系统发出对该数据对象 进行加锁的请求,否则就不可以进行相应的操作,而事务 在获得了对该数据对象的锁以后,其他的事务就不能查询 或更新此数据对
4、象,直到相应的锁被释放为止。,1、排它锁和共享锁排它锁(X锁):事务T对数据对象既可读,也可更新。共享锁(S锁):事务T对数据对象可读,但不能更新。锁相容矩阵:,2、封锁协议(1)一级封锁协议:事务T在更新数据对象以前,必须对该数据对象加排它锁,并且直到事务T结束时才可以释放该锁。,一级封锁协议不能防止不可重复读问题,一级封锁协议不能防止读“脏”数据问题,(2)二级封锁协议:规定事务T在更新数据对象以前必须 对数据对象加X锁,且直到事务T结束时才可以释放该锁, 还规定事务T在读取数据对象以前必须对数据对象加共享锁 (S锁),读完后即可释放S锁。可以防止丢失更新、读“脏”数据问题,但不能防止不可
5、重复读问题。,二级封锁协议不能防止不可重复读问题,(3)三级封锁协议:规定事务T在更新数据对象以前, 必须对数据对象加X锁,且直到事务T结束时才可以释放 该锁,还规定事务T在读取数据对象以前必须对数据对象 加S锁,并且S锁也必须在事务T结束时才可释放。可以防止丢失更新、读“脏”数据、不可重复读问题。,3、活锁和死锁(1)活锁:在多个事务并发执行的过程中,可能会存在某个尽管总有机会获得锁的事务却永远也没得到锁,这种现象称为活锁。(2)死锁:多个并发事务处于相互等待状态,其中的每一个事务都在等待它们中的另一个事务释放封锁,这样才可以继续执行下去,但任何一个事务都没有释放自己已获得的锁,也无法获得其
6、他事务已拥有的锁,所以只好相互等待下去。,(3)活锁的预防:“先来先服务”策略 (4)死锁的预防: 每个事务必须一次性地将所有要使用的数据加锁或必须按照一个预先约定的加锁顺序对使用到的数据加锁。 每当处于等待状态的事务有可能导致死锁时,就不再等待下去,强行回滚该事务。 (5)死锁的检测:“事务依赖图” (6)死锁恢复:从发生死锁的事务中选择一个回滚代价最小的事务,将其彻底回滚,或回滚到可以解除死锁处,释放该事务所持有的锁,使其他事务可以获得相应的锁而得以继续运行下去。,SQL Server 2008锁的类型,三、数据库的恢复技术,(一)数据库系统的故障1、事务故障:由于事务内部的逻辑错误(如运
7、算溢出、数据输入错、记录找不到等)或系统错误(如并发事务发生死锁而被选中撤销等)所引起的,使事务在未达到规定的终点以前就被迫中止的任何事件。2、系统故障:由硬件故障、软件故障(操作系统故障、DBMS代码错等)、停电等原因造成的、使系统停止运转、必须重新启动的任何事件。3、介质故障:用于存放数据库的磁盘在物理上受到了损坏,使得数据库中的数据无法读出而引起的故障。,系统自动恢复,DBA,(二)故障恢复技术1、数据转储由DBA定期地将物理数据库中的数据复制到另外的磁盘保存起来的过程。(1)数据转储状态 静态转储 :在系统中无任何运行事务时所进行的数据转储。优点:简单,且得到的一定是一个正确的后备副本
8、。 动态转储:可以与并发事务同时进行的数据转储。必须将转储期间事务对数据库的更新操作登记在日志文件中,以备恢复之用。,(2)数据转储方式 海量转储 :每次转储全部数据库。优点:恢复更方便。 增量转储:每次只转储上一次转储后更新过的数据。优点:更实用更有效。,数据转储分类,2、日志文件日志是以事务为单位记录数据库的每一次更新活动的文件,由系统自动记录。(1)日志文件的格式和内容日志文件的格式: 以记录为单位的日志文件 以数据块为单位的日志文件,日志文件的内容:,(2)利用日志文件撤销事务或重做事务两个基本操作: UNDO(Ti):撤销事务Ti REDO(Ti):重做事务Ti UNDO(Ti)的具
9、体步骤: 反向扫描日志文件,找到需要撤销的事务的更新操作。 对事务Ti的更新操作执行逆操作,即将日志文件中“更新前的值”写入数据库。 继续反向查找该事务的其他更新操作,并执行逆操作。 重复执行步骤(3),直到遇到该事务的事务开始记录。,REDO(Ti)的具体步骤: 正向扫描日志文件,找到需要重做的事务的更新 操作。 对事务Ti重新执行日志文件登记的操作,即将日志 文件中 “更新后的值”写入数据库。 继续正向查找该事务的其他更新操作,并重新执 行,将日志文件中的“更新后的值”写入数据库。 重复执行步骤(3),直到遇到该事务的事务提交 记录。,(3)日志文件的登记登记日志文件时必须遵循以下两条原则
10、: 登记的次序严格按并发事务执行的时间次序。 必须先写日志文件,后写数据库。,3、检查点技术提高日志文件技术的效率检查点方法:在日志文件中再增加一个检查点记录,同 时还增加一个重新启动文件。系统在运行的过程中会周期性 地产生一个检查点,以保存数据库的状态。 检查点恢复只对事务故障和系统故障有效,对于介质故 障,日志的扫描从备份点开始。,T1,T2,T3,T4,T5,检查点,系统故障,ti时刻,tj时刻,时间,不用恢复,REDO,UNDO,REDO,UNDO,利用检查点方法的恢复步骤:(1)根据日志文件建立事务重做队列和撤销队列。从检查点开始,正向扫描日志文件,找出在故障发生前已经提交的事务,放
11、入事务重做队列;故障发生时尚未完成的事务,放入事务撤销队列。 (2)对重做队列做REDO处理,对撤销队列做UNDO处理。,4、数据库镜像根据DBA的要求,自动把整个数据库或其中的关 键数据复制到另一个磁盘上。每当主数据库更新时, DBMS自动把更新后的数据复制过去,即DBMS自动保 证镜像数据与主数据库的一致性。,(三)故障恢复策略 1、事务故障的恢复撤销UNDO 2、系统故障的恢复 日志文件中有事务开始记录,没有事务提交记录撤销UNDO 日志文件中既有事务开始记录,也有事务提交记录重做REDO,系统故障恢复的具体步骤: (1)正向扫描日志文件,找出系统故障发生前未完成的事务,将它们的事务标志
12、记入撤销(UNDO)队 列;找出系统故障发生前已经完成的事务,将它们的事务标志记入重做(REDO)队列。 (2)对UNDO队列中的各事务实行撤销(UNDO)操作。 (3)对REDO队列中的各事务实行重做(REDO)操作。,3、介质故障的恢复利用数据转储后产生的后备副本与日志文件进行恢复。 具体步骤:(1)装入最近一次转储的后备副本,将数据库恢复到最近一次转储时的一致性状态。 静态转储:只要装入后备副本即可; 动态转储:还必须同时装入转储开始时刻的日志文件副本,利用系统故障恢复的方法(REDO+UNDO),将数据库恢复到最近一次转储时的一致性状态。(2)装入转储结束时刻的日志文件副本,重做已完成
13、的事务。,SQL Server 2008数据库的三种恢复模型 1、完整恢复模型SQL Server 2008数据库将忠实、完整地记录所有的日志 2、大容量日志记录恢复模型当需要执行大容量日志记录操作(如大批量的数据录入、更新或删除)时,切换到大容量日志记录恢复模型。 3、简单恢复模型虽然会记录下所有的日志操作,但检查点进程的发生会自动截断日志中的不活动部分(已经完成的部分)。可能会导致无法恢复到历史上某个时刻的情况。,三种恢复模型的选择,SQL Server 2008中数据的备份与恢复提供了四种数据库备份与恢复的方式: 完整数据库备份和恢复:备份整个数据库。 差异数据库备份和恢复:仅备份自上次
14、完全数据库备 份后被修改过的内容。 事务日志备份和恢复:备份日志文件。 文件组备份和恢复:对组成数据库的文件或文件组进行单独的备份。,DBA在实践中最常用的备份和恢复方法: 完整数据库备份与恢复 完整差异数据库备份与恢复 完整日志数据库备份与恢复,完整数据库备份与恢复举例:假设现在有3个完全数据备份: 10:00时完整数据库备份1。 11:00时完整数据库备份2 。 12:00时完整数据库备份3 。 恢复: 恢复到10:00 恢复到11:00 恢复到12:00,完整差异数据库备份与恢复举例:假设现在有2个完整数据库备份: 10:00时完整数据库备份1。 12:00时完整数据库备份2 。还有3个
15、差异数据库备份: 10:30时差异数据库备份1,在完整数据库备份1基础上。 11:00时差异数据库备份2,在完整数据库备份1基础上。 12:30时差异数据库备份3,在完整数据库备份2基础上。 恢复: 11:00时的状态:完整数据库备份1差异数据库备份2 12:30时的状态:完整数据库备份2差异数据库备份3,完整日志数据库备份与恢复举例:假设现在有2个完整数据库备份: 10:00时完整数据库备份1。 12:00时完整数据库备份2 。还有3个日志数据库备份: 10:30时日志数据库备份1。 11:00时日志数据库备份2。 12:30时日志数据库备份3。,恢复:11:00时的状态:完整数据库备份1日
16、志数据库备份1日志数据库备份212:30时的状态:完整数据库备份2日志数据库备份3 或:完整数据库备份1日志数据库备份1日志数据库备份2日志数据库备份3,恢复到12:45时的状态: 完全数据库备份2日志数据库备份3当前日志备份(12:30以后的日志的事务不要做完,而指定做到12:45,即时点恢复就可以) 。 完全数据库备份1日志数据库备份1日志数据库备份2日志数据库备份3当前日志备份(12:30以后的日志的事务不要做完,而指定做到12:45,即时点恢复就可以)。,恢复到10:45时的状态:完全数据库备份1日志数据库备份1 日志数据库备份2(10:3011:00之间的事务不做完,而是指定做到10:45,即时点恢复就可以)。,例1: 对“StudManage”数据库做一次全库备份,备份名字为 “StudManage backup”,备份设备是“mybak”本地磁 盘设备,此备份将覆盖以前所有的备份。BACKUP DATABASE StudManageTO DISK mybakWITH INIT, /*重写设备上所有的备份集数据 */NAME=StudManage backup,