数据库故障的种类
1.事务内部的故障
- 可以通过事务程序本身发现并处理的故障
- 非预期的故障(不能由应用程序发现) 如:运算溢出、并发事务发生死锁二被选中撤销该事务、违反了某些完整性限制等
事务故障仅指非预期故障
2.系统故障:软故障
系统故障是指造成系统停止运转、要重启的故障 如:CPU故障、操作系统故障、程序代码错误、断电等,是的系统必须重新启动
系统故障的特征:影响所有正在运行的事务,但不破坏数据库。他们可引起缓冲区内容丢失,并使所有正在运行的事务不能到达预期终点
系统故障发生时,可能使数据库出于不一致状态:
一方面,有些非正常终止事务的结果可能已经写入数据库,在系统下次启动时,恢复程序必须回滚这些非正常终止的事务,撤销这些事务对数据库的影响。
另一方面,有些已完成事务的结果可能部分或全部留在缓冲区,而尚未写回磁盘上的数据库中。在系统下次启动时,恢复数据库必须重做(REDO)所有已提交的事务,将数据库真正恢复到一致状态。
3.介质故障:硬故障 如:磁盘损坏、磁头碰撞、强磁场干扰等
这类故障发生概率很小,但破坏性极大,将破坏部分甚至整个数据库的内容,并影响使用相应数据的所有事务。
4.计算机病毒 破坏性大,极易传播
数据库恢复
数据库恢复的基本原理:冗余
数据库恢复的机制: ①建立冗余数据(数据转储、登记日志文件) ②利用冗余数据实施数据库恢复
数据备份是指定期或不定期地对数据库数据进行复制,备份的介质可是是磁带也可以是磁盘
备份数据库应备份数据库中的:
- 表(结构),包含系统表、用户定义的表
- 数据库用户(包括用户和用户操作权)
- 用户定义的数据库对象和数据库中的全部数据
- 数据库日志等内容
恢复策略:
- 事务故障的恢复
事务故障是指事务在运行到正常结束前被终止
事务故障的恢复是由系统自动完成的,对用户是透明的
恢复的过程为:①反向扫描日志文件并执行相应操作的逆操作,比如日志中记录的是“删除”操作,就进行“插入”
②若是修改操作,则用更新前的值替换更新后的值 - 系统故障的恢复
系统故障的恢复是系统在重新启动时自动完成的,不需要用户干预。
系统故障恢复过程为: ①正向扫描日志文件,找出故障发生前已提交的事务,将其重做
②同时找出故障发生时未完成的事务,并撤销这些事务 - 介质故障的恢复
介质故障发生后,磁盘上的物理数据和日志文件均遭破坏
恢复的方法是:①重装数据库,使数据库管理系统能正常运行
②利用介质损坏前对数据库已做的备份或利用镜像设备恢复数据库
数据库恢复方法
利用数据库备份、事务日志备份可以将数据库从出错状态恢复到最近的正确状态
- 利用备份技术
由DBA定期对数据库进行备份,当发生错误时,利用备份(文件)将数据库恢复到备份完成时的数据库状态 - 利用事务日志
日志记录了对数据库数据的全部更新操作(插入、删除、修改)
利用事务日志可以恢复执行不完整的事务,既从不完整的事务的当前值按事务日志记录的顺序反做,知道事务开始时的数据库值为止
利用事务日志的恢复一般是系统自动完成的 - 利用镜像技术
镜像就是在不同的设备上同时存有两份数据库,我们把其中一个设备称为主设备,把另一个称为镜像设备。
每当主数据库更新时,DBMS自动把更新后的数据复制到另一个镜像设备上,保证主设备上的数据库与镜像设备上的数据库一致
数据库镜像功能可用于有效地恢复磁盘介质的故障
备份数据库
备份设备:
- 永久备份设备:灾备份之前需要预先建立
- 临时备份设备:不需要预先建立,在备份时直接使用
方法:①在SSMS工具上备份
②用T-SQL语句创建备份设备
创建一个名为bk2的磁盘备份设备,物理存储及文件名为E:\学习\数据库\大二\上机\备份\bk2.bak
EXEC sp_addumpdevice 'disk', 'bk2',
'E:\学习\数据库\大二\上机\备份\bk2.bak'
备份类型:
- 完整备份:备份数据文件、数据库对象和数据的信息;备份备份过程中发生的活动
- 差异备份:备份从上次完整备份之后改变的内容;比完整备份节约时间
- 事务日志备份:备份从上次日志备份之后的日志记录;备份完成后要截断日志
备份策略
- 完整备份
适用于数据库数据不是很大,而且数据更改不是很频繁的情况
- 完整备份+日志备份
如果不允许丢失太多的数据,而且又不希望经常地进行完整备份,则可以在完整备份中间加一些日志备份 - 完整备份+差异备份+日志备份
实现备份:
①SSMS实现备份:
②T-SQL语句备份数据库
BACKUP DATABASE 数据库名
TO 备份设备 WITH [DIFFERENTIAL or INIT or NOINIT]
DIFFERENTIAL:进行差异备份
INIT:本次备份数据库将重写备份设备
NOINIT:本次本分数据库将追加到备份设备上
日志备份:
BACKUP LOG 数据库名
TO 备份设备 WITH INIT or NOINIT , NO_LOG or TRUNCATE_ONLY or NO_TRUNCATE
NO_LOG和TRUNCATE_ONLY:备份完日志后截断不活动日志。
NO_TRUNCATE:备份完日志后不截断不活动日志。
对DBTest数据库进行完整备份,备份到bk2备份设备上,并覆盖掉该备份设备上已有的内容
BACKUP DATABASE DBTest
TO bk2 WITH INIT
对DBTest数据库进行差异备份,备份到bk2备份设备上,并保留掉该备份设备上已有的内容
BACKUP DATABASE DBTest
TO bk2 WITH DIFFERENTIAL ,NOINIT
对DBTest数据库进行一次失误日志备份,直接备份到E:\学习\数据库\大二\上机\备份下
BACKUP LOG DBTest
TO DISK='E:\学习\数据库\大二\上机\备份\DBTest_log.bak'
恢复数据库
恢复的顺序:
- 恢复最近的完整备份
- 恢复最近的差异备份(如果有)
- 恢复自差异备份之后的所有日志备份(按备份的先后顺序)
恢复数据库:
①SSMS工具
②T-SQL恢复数据库
RESTORE DATABASE 数据库名
FROM 备份设备名 WITH FILE = 文件名 , NORECOVERY , RECOVERY
FILE = 文件号:标识要还原的备份,文件号为1表示备份设备上的第一个备份。
NORECOVERY:表明对数据库的恢复操作还没完成。使用此选项恢复的数据库是不可用的,但可以继续恢复后续的备份。
RECOVERY:表明对数据库的恢复操作已经完成。
设对students数据库进行了下述备份过程
恢复顺序:
- 首先恢复完整备份
- 然后恢复差异备份
- 最后恢复日志备份
恢复完整备份
RESTORE DATABASE Students FROM bk1
WITH FILE=1, NORECOVERY
恢复差异备份
RESTORE DATABASE Students FROM bk1
WITH FILE=2, NORECOVERY
恢复日志备份
RESTORE LOG Students FROM bk2