第15章 备份与恢复数据库 日志文件 基本概念 恢复数据库的基本原理 数据库故障的种类 备份数据库 备份的内容和时间 备份的一般方法 SQL Server的数据库备份 日志文件 恢复数据库 恢复策略 SQL Server的数据库恢复
基本概念 故障是不可避免的 系统故障:计算机软、硬件故障 人为故障:操作员的失误、恶意的破坏等。 数据库的备份 备份是指将数据库复制到磁带或另一个磁盘上保存起来的过程。 数据库的恢复 把数据库从错误状态恢复到某一已知的正确状态(亦称为一致状态或完整状态)
恢复操作的基本原理 恢复操作的基本原理:冗余 利用备份在系统其它地方的冗余数据来重建数据库中已被破坏或不正确的那部分数据 恢复机制涉及的关键问题 如何建立冗余数据 数据备份(backup) 日志文件(logging) 如何利用这些冗余数据实施数据库恢复
数据库故障的种类 事务内部的故障 系统故障 介质故障 计算机病毒引起的故障或破坏
事务内部的故障 可以通过事务程序本身发现的故障 非预期的事务故障
通过事务程序本身发现的事务故障举例 例如,银行转账事务,这个事务把一笔金额从一个账户甲转给另一个账户乙。 BEGIN TRANSACTION 读账户甲的余额BALANCE; BALANCE=BALANCE-AMOUNT;(AMOUNT 为转账金额) 写回BALANCE; IF(BALANCE < 0 ) THEN { 打印'金额不足,不能转账'; ROLLBACK;(撤销刚才的修改,恢复事务) } ELSE 读账户乙的余额BALANCE1; BALANCE1=BALANCE1+AMOUNT; 写回BALANCE1; COMMIT;
通过事务程序本身发现的事务故障举例 这个例子所包括的两个更新操作要么全部完成要么全部不做。否则就会使数据库处于不一致状态,例如只把账户甲的余额减少了而没有把账户乙的余额增加。 在这段程序中若产生账户甲余额不足的情况,应用程序可以发现并让事务滚回,撤销已作的修改,恢复数据库到正确状态。
非预期的事务内部故障 事务内部更多的故障是非预期的,是不能由应用程序处理的。 运算溢出 并发事务发生死锁而被选中撤销该事务 违反了某些完整性限制等 以后,事务故障仅指这类非预期的故障
系统故障 系统故障称为软故障,是指造成系统停止运转的任何事件,使得系统要重新启动。 系统故障特点 整个系统的正常运行突然被破坏 所有正在运行的事务都非正常终止 不破坏数据库 内存中数据库缓冲区的信息全部丢失
系统故障的常见原因 特定类型的硬件错误(如CPU故障) 操作系统故障 DBMS代码错误 系统断电
介质故障 介质故障称为硬故障,指外存故障 磁盘损坏 磁头碰撞 操作系统的某种潜在错误 瞬时强磁场干扰
计算机病毒 一种人为的故障或破坏,是一些恶作剧者研制的一种计算机程序 可以繁殖和传播 危害 破坏、盗窃系统中的数据 破坏系统文件
故障小结 各类故障,对数据库的影响有两种可能性 一是数据库没有被破坏,但数据可能不正确,这是由于事务的运行被非正常终止造成的。 二是数据库本身被破坏
备份数据库 指定期或不定期地对数据库数据进行复制。复制的数据称作后备副本。 备份的位置可以是本地机器也可以是它计算机。 备份的介质可以是磁盘也可以是磁带。 数据库遭到破坏后可以将后备副本重新装入,重装只能将数据库恢复到备份时的某一状态。
备份的内容和时间 在制定备份策略时,应考虑如下几个方面: 备份的内容 备份频率 系统数据库:修改之后备份 用户数据库:周期性备份 系统数据库
备份的一般方法 静态备份与动态备份 海量备份与增量备份 备份方法小结
静态备份 在系统中无运行事务时进行的备份操作 备份开始时数据库处于一致性状态 备份期间不允许对数据库的任何存取、修改活动 得到的一定是一个数据一致性的副本 优点:实现简单 缺点:降低了数据库的可用性 备份必须等待正运行的用户事务结束 新的事务必须等备份结束
动态备份 备份操作与用户事务并发进行 备份期间允许对数据库进行存取或修改 优点 不用等待正在运行的用户事务结束 不会影响新事务的运行 动态备份的缺点 不能保证副本中的数据正确有效 恢复难度增大 [例]在转储期间的某个时刻Tc,系统把数据A=100转储到磁带上,而在下一时刻Td, 某一事务将A改为200。转储结束后,后备 副本上的A已是过时的数据了。
利用动态备份得到的副本进行故障恢复 需要把动态备份期间各事务对数据库的修改 活动登记下来,建立日志文件 后备副本加上日志文件才能把数据库恢复到 某一时刻的正确状态
海量备份与增量备份 海量备份: 每次备份全部数据库 增量备份: 只备份上次备份后更新过的数据 海量备份与增量备份比较 从恢复角度看,使用海量备份得到的后备副本进行恢复往往更方便 但如果数据库很大,事务处理又十分频繁,则增量备份方式更实用更有效
备份方法小结 备份状态 动态备份 静态备份 备份方式 海量备份 动态海量备份 静态海量备份 增量备份 动态增量备份 静态增量备份
日志文件 日志文件的格式和内容 日志文件的作用 登记日志文件
1.日志文件的格式和内容 什么是日志文件 日志文件(log)是用来记录事务对数据库的更新操作的文件 日志文件的格式 以记录为单位的日志文件 以数据块为单位的日志文件
日志文件的格式和内容(续) 以记录为单位的日志文件,每条日志记录的内容 事务标识(标明是哪个事务) 操作类型(插入、删除或修改) 操作对象(记录内部标识) 更新前数据的旧值(对插入操作而言,此项为空值) 更新后数据的新值(对删除操作而言, 此项为空值)
日志文件的格式和内容(续) 以数据块为单位的日志文件,每条日志记录的内容 事务标识(标明是那个事务) 被更新的数据块
2.日志文件的作用 进行事务故障恢复 进行系统故障恢复 协助后备副本进行介质故障恢复
恢复数据库 恢复策略 事务故障的恢复 系统故障的恢复 介质故障的恢复 恢复方法 利用备份技术 利用事务日志
恢复策略 1.事务故障的恢复 恢复方法:由恢复子系统应利用日志文件撤消(UNDO)此事务已对数据库进行的修改 事务故障的恢复由系统自动完成,对用户是透明的,不需要用户干预
恢复策略 事务故障的恢复步骤 反向扫描文件日志(即从最后向前扫描日志文件),查找该事务的更新操作。 对该事务的更新操作执行逆操作。即将日志记录中“更新前的值” 写入数据库。 插入操作, “更新前的值”为空,则相当于做删除操作 删除操作,“更新后的值”为空,则相当于做插入操作 若是修改操作,则相当于用修改前值代替修改后值 继续反向扫描日志文件,查找该事务的其他更新操作,并做同样处理。 如此处理下去,直至读到此事务的开始标记,事务故障恢复就完成了。
恢复策略 2.系统故障的恢复 未完成事务对数据库的更新已写入数据库 已提交事务对数据库的更新还留在缓冲区没来得及写入数据库 系统故障造成数据库不一致状态的原因 未完成事务对数据库的更新已写入数据库 已提交事务对数据库的更新还留在缓冲区没来得及写入数据库 恢复方法 Undo 故障发生时未完成的事务 Redo 已完成的事务 系统故障的恢复由系统在重新启动时自动完成,不需要用户干预
恢复策略 系统故障的恢复步骤 正向扫描日志文件(即从头扫描日志文件) 重做(REDO) 队列: 在故障发生前已经提交的事务 这些事务既有BEGIN TRANSACTION记录,也有COMMIT记录 撤销 (Undo)队列:故障发生时尚未完成的事务 这些事务只有BEGIN TRANSACTION记录,无相应的COMMIT记录 对撤销(Undo)队列事务进行撤销(UNDO)处理 反向扫描日志文件,对每个UNDO事务的更新操作执行逆操作 即将日志记录中“更新前的值”写入数据库 对重做(Redo)队列事务进行重做(REDO)处理 正向扫描日志文件,对每个REDO事务重新执行登记的操作 即将日志记录中“更新后的值”写入数据库
恢复策略 3.介质故障的恢复 介质故障的恢复需要DBA介入 重装数据库 重做已完成的事务 DBA的工作 重装最近转储的数据库副本和有关的各日志文件副本 执行系统提供的恢复命令 具体的恢复操作仍由DBMS完成
恢复策略 介质故障恢复步骤 装入最新的后备数据库副本(离故障发生时刻最近的转储副本) ,使数据库恢复到最近一次转储时的一致性状态。 对于静态转储的数据库副本,装入后数据库即处于一致性状态 对于动态转储的数据库副本,还须同时装入转储时刻的日志文件副本,利用与恢复系统故障的方法(即REDO+UNDO),才能将数据库恢复到一致性状态。 装入有关的日志文件副本(转储结束时刻的日志文件副本) ,重做已完成的事务。 首先扫描日志文件,找出故障发生时已提交的事务的标识,将其记入重做队列。 然后正向扫描日志文件,对重做队列中的所有事务进行重做处理。即将日志记录中“更新后的值”写入数据库。
恢复方法 利用数据库备份、事务日志备份可以将数据库从出错状态恢复到最近的正确状态。 利用备份技术:由DBA定期对数据库进行备份,当发生错误时,利用备份(文件)可以将数据库恢复到备份完成时的数据库状态。 利用事务日志:利用事务日志恢复非完整事务。
利用静态备份副本和日志文件进行恢复 静态备份 运行事务 正常运行 ─┼───────┼───────────── └──────────── 静态备份 运行事务 正常运行 ─┼───────┼───────────── Ta Tb Tf └──────────── 重装后备副本 利用日志文件恢复 继续运行 恢复 ─┼───────┼┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┼──── ↓ 登记日志文件
利用静态转储副本和日志文件进行恢复(续) 上图中: 系统在Ta时刻停止运行事务,进行数据库转储 在Tb时刻转储完毕,得到Tb时刻的数据库一致性副本 系统运行到Tf时刻发生故障 为恢复数据库,首先由DBA重装数据库后备副本,将数据库恢复至Tb时刻的状态 重新运行自Tb~Tf时刻的所有更新事务,把数据库恢复到故障发生前的一致状态
SQL Server的备份设备 永久备份设备 在备份之前需要预先建立 临时备份设备 不需要预先建立,在备份时直接使用 创建备份设备 使用企业管理器
SQL Server的备份类型 完全备份 差异备份 日志备份 文件和文件组备份(略)
完全备份 完全备份:这是最常用的的种方式,它可以备份整个数据库,包含用户表、系统表、索引、视图和存储过程等所有数据库对象。 使用这种类型来备份数据库需要花费更多的时间和空间,所以,备份频率不能太高,如一周做一次完全备份。 完全备份是恢复的基线
差异备份 差异备份:也叫增量备份。使用这种类型的备份只会备份数据库的一部分 它比最初的完全备份小,因为它只包含自上次完全备份以来所改变的数据库。 优点是存储和恢复速度快。 可以考虑每天做一次差异备份。
日志备份 事务日志备份:事务日志是一个单独的文件,它记录数据库的改变。 备份的时候只需要复制自上次备份以来对数据库所做的改变,所以只需要很少的时间。 为了使数据库具有连续性,推荐每小时甚至更频繁的备份事务日志。 备份完成后要截断日志。
备份策略 完全备份 完全备份 + 日志备份 完全备份 + 差异备份 + 日志备份
完全备份 适合于数据库数据不是很大,而且数据更改不是很频繁的情况。 Sunday Monday Tuesday Data Log
完全备份 + 日志备份 如果不允许丢失太多的数据,而且又不希望经常地进行完全备份,则可以在完全备份中间加一些日志备份。 Sunday Monday 完全备份 Log Data
完全备份 + 差异备份 + 日志备份 Monday Tuesday 完全备份 差异备份 ... Log Data
实现备份 使用企业管理器备份数据库 使用Transact-SQL语句备份数据库 备份媒体集
使用企业管理器备份数据库 在要备份的数据库上右击鼠标,在弹出的菜单中选择“所有任务”,然后再选择“备份数据库”命令。
使用Transact-SQL语句备份数据库 BACKUP DATABASE 数据库名 TO { < 备份设备名 > } | { DISK | TAPE } = {‘物理备份文件名’} [ WITH [ DIFFERENTIAL ] [ [ , ] { INIT | NOINIT } ]
备份日志 BACKUP LOG 数据库名 TO { < 备份设备名 > } | { DISK | TAPE } = {‘物理备份文件名’} [ WITH [ { INIT | NOINIT } ] [ { [ , ] NO_LOG | TRUNCATE_ONLY | NO_TRUNCATE } ] ]
示例 例1.对“students” 数据库进行完全备份,并备份到MyBK_1备份设备上(假设此备份设备已创建好)。 BACKUP DATABASE students TO MyBK_1 例2.对“pubs”数据库进行完全备份,备份到MyBK_1备份设备上,并覆盖掉该备份设备上已有的内容。 BACKUP DATABASE pubs TO MyBK_1 WITH INIT 例3.对“pubs”进行一次事务日志备份,并备份到MyBKLog1备份设备上。 BACKUP LOG pubs TO MyBKLog1
备份媒体集 当数据库很大时,一个备份设备的空间可能不能满足要求,这时就可以将数据库备份到多个不同的备份设备上(每个备份设备可建立在不同的磁盘上)。 使用多个备份设备同时进行备份时的备份设备就叫做备份媒体集。 当某个备份设备作为备份媒体集中的一个成员时,这个备份设备就只能在这个备份媒体集中使用,不能再单独使用,除非消除了备份媒体集。
恢复数据库 恢复前的准备 恢复的顺序 实现恢复
恢复前的准备 设置限制访问数据库选项 t 完全备份1 完全备份2 完全备份3 图12-6 完全备份策略 周日0:00 周一0:00 周二0:00
恢复的顺序 1. 恢复最近的完全备份; 2. 恢复最近的差异备份(如果有); 3. 恢复自差异备份之后的所有日志备份(按备份的先后顺序)。
实现恢复 用企业管理器恢复数据库 用Transact-SQL语句恢复数据库
用企业管理器恢复数据库 在任何一个数据库名上右击鼠标,在弹出的菜单上选择“所有任务”下的“还原数据库” 。
用Transact-SQL语句恢复数据库 RESTORE DATABASE 数据库名 FROM 备份设备名 [ WITH FILE = 文件号 [ , ] NORECOVERY [ , ] RECOVERY ]
恢复日志 RESTORE LOG 数据库名 FROM 备份设备名 [ WITH FILE = 文件号 [ , ] NORECOVERY [ , ] RECOVERY ]
示例1 例1.假设已对pubs数据库进行了完全备份,并备份到MyBK_1备份设备上,假设此备份设备只含有对pubs数据库的完全备份。则恢复pubs数据库的语句为: RESTORE DATABASE pubs FROM MyBK_1
示例2 t RESTORE DATABASE 学生管理 FROM MyBK_2 WITH FILE=1, NORECOVERY 日志备份到MyBKLog1设备上上 t RESTORE DATABASE 学生管理 FROM MyBK_2 WITH FILE=1, NORECOVERY WITH FILE=2, NORECOVERY RESTORE LOG 学生管理 FROM MyBKLog1
数据备份与恢复 概述 数据备份 数据恢复 数据库的维护
数据备份与恢复概述 数据库系统在运行时,可能会出现各式各样的故障,如磁盘损坏、电源故障、软件错误、计算机病毒等。 当故障发生时,很可能丢失数据库中的数据。 要使数据库具有可恢复性,基本原理就是“冗余”,即数据重复存储。 在故障发生前,平时做好两件事:数据库备份和建立日志;一旦发生数据库故障,则根据故障的具体情况分别进行处理。严重故障需要利用备份数据进行数据库恢复。
数据备份 备份概念 SQL Server 2000四种备份方式 创建与删除备份设备 备份数据库
备份概念 备份就是对SQL Server数据库或事务日志进行备份,数据库备份记录了在进行备份这一操作时数据库中所有数据的状态,以便在数据库遭到破坏时能够及时地将其恢复。
SQL Server 2000四种备份方式 完全数据库备份 差异备份或称增量备份 事务日志备份 数据库文件和文件组备份
完全备份 这是最常用的的种方式,它可以备份整个数据库,包含用户表、系统表、索引、视图和存储过程等所有数据库对象。 使用这种类型来备份数据库需要花费更多的时间和空间,所以,备份频率不能太高,如一周做一次完全备份。 完全备份是恢复的基线。
事务日志备份 事务日志是一个单独的文件,它记录数据库的改变。 备份的时候只需要复制自上次备份事务日志备份以来对数据库所做的改变,所以只需要很少的时间。 为了使数据库具有连续性,推荐每小时甚至更频繁的备份事务日志。 备份完成后要截断日志。
差异备份 差异备份也叫增量备份。使用这种类型的备份只会备份数据库的一部分。 它比完全备份占用更少的空间,因为它只包含自上次完全备份以来所改变的数据库。 优点是存储和恢复速度快。 可以考虑每天做一次差异备份。
文件和文件组备份 当数据库非常庞大时,可执行数据库文件或文件组备份。 这种备份策略使用户只恢复已损坏的文件或文件组。而不用恢复数据库的其余部分,所以,文件和文件组的备份及恢复是一种相对较完善的备份和恢复过程。
创建与删除备份设备 创建备份设备 删除备份设备(略)
创建备份设备 备份设备是用来存储数据库、事务日志或文件和文件组备份的存储介质,备份设备可以是硬盘、磁带等。 SQL Server备份数据库是将数据库备份到备份设备上,因此在进行备份以前首先必须指定或创建备份设备。 当使用磁盘作为备份设备时,SQL Server允许将本地主机硬盘和远程主机上的硬盘作为备份设备,备份设备在硬盘中是以文件的方式存储的。 创建备份设备时,需要指定备份设备对应的操作系统文件和文件的存放位置。
创建备份设备的两种方法 使用SQL Server 企业管理器创建备份设备 使用系统存储过程(sp_addumpdevice)创建备份设备
使用企业管理器创建备份设备
输入备份设备属性对话框 备份设备的默认存储位置为: C:\Program Files\Microsoft SQL Server\MSSQL\BACKUP\
新备份设备
备份数据库 SQL Server系统提供了三种数据库备份操作的方法: SQL Server 企业管理器 备份向导(略) Transact-SQL语句
使用企业管理器备份数据库
使用Transact-SQL语句备份数据库 其语法形式如下: Backup database {database_name|@database_name_var} to <backup_file>[,…n] [with [[,]format] [[,]{init|noinit}] [[,]restart] ] <backup_file>::={backup_file_name|@backup_file_evar}|{disk|tape|pipe} ={temp_file_name|@temp_file_name_evar}
数据恢复 恢复概述 利用企业管理器恢复数据库 利用Transact-SQL语句恢复数据库
恢复概述 数据库备份后,一旦系统发生崩溃或者执行了错误的数据库操作,就可以从备份文件中恢复数据库。 数据库恢复是指将数据库备份加载到系统中的过程。 系统在恢复数据库的过程中,自动执行安全性检查、重建数据库结构以及完整数据库内容。
利用企业管理器恢复数据库
使用Transact-SQL语句恢复数据库 Restore database [from <backup_device[],…n>] [with [[,]file=file_number] [[,]move ‘logical_file_name’ to ‘operating_system_file_name’] [[,]replace] [[,]{norecovery|recovery|standby=undo_file_name}] ] <backup_device>::={{backup_device_name|@backup_device_name_evar} |{disk|tape|pipe} ={temp_backup_device|@temp_backup_device_var}
数据库的维护 利用数据库的维护计划向导可以方便地设置数据库的核心维护任务,以便于定期地执行这些任务,其创建数据库维护计划的步骤如下:
图1 选择数据库维护计划对话框
图2 欢迎使用维护计划向导对话框
图3 选择数据库对话框
图4 更新数据优化信息对话框
图5 编辑循环作业调度对话框
图6 检查数据库完整性对话框
图7 指定数据库备份计划对话框
图8 指定数据库备份文件存放目录对话框
图9 指定事务日志备份计划对话框
图10 指定事务志文件备份存放目录对话框
图11 维护计划生成报表对话框
图12 指定维护计划历史记录存放位置对话框
图13 指定数据库维护计划名称对话框
图14 数据库维护计划对象选择对话框