Chinaunix首页 | 论坛 | 博客
  • 博客访问: 563322
  • 博文数量: 67
  • 博客积分: 2792
  • 博客等级: 少校
  • 技术积分: 1038
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-13 19:00
文章分类

全部博文(67)

文章存档

2014年(2)

2013年(7)

2012年(1)

2011年(1)

2010年(56)

分类: WINDOWS

2010-04-23 18:51:58

一、数据库备份和还原的概念:
    我们在实际生活工作中,经常会遇到一些数据丢失或损坏的事情。而导致数据丢失或损坏的原因可能是各方面的。比如:电脑中毒、硬盘损坏、系统崩溃等一些原因。我们丢失或损坏的数据有些是对我们来说不重要的,但是有些是对我们非常重要的。而重要的数据丢失或损坏对于我们来说是有一定损失或者损失是非常大的。对于我们个人来说损失再大也应该大不到哪去,但是对于公司的重要数据丢失或损坏是非常难以接受的。因为重要数据的损坏对公司的利益影响是非常大的。尤其是一些大公司的数据库数据更为重要。像9.11事件中世贸大厦中那些个大公司的数据,有的公司就因为公司的数据没有备份而导致破产、倒闭。所以我们经常会把一些东西进行备份,比如:系统和对于我们来说比较重要的数据。而公司中就更不用说了,数据库管理员的主要职责之一就是实施和规划一个妥善的备份和还原策略来保护数据库,避免由于各种故障造成损坏而丢失数据,以在系统失效后尽快还原。下面我们来说一下造成数据丢失的具体原因有哪几类:
1.灾难。这个我也就不说了,这几年发生的地震就是最明显的例子了。
2.人为错误。这是指管理员和一些人员的误操作而造成的错误等。
3.计算机失败。如,系统崩溃。计算机的硬件和软件发生故障而引起的错误。
4.磁盘失败。磁盘失败可能是由于磁盘读写磁头损坏,或者是磁盘物理块损坏。
5.程序错误。例如:程序异常终止或逻辑错误等。
二、SQL Server数据库的备份类型:
    在Access、FoxPro这样的桌面型数据库中,备份就是将数据库文件复制到另一个安全的地方,还原则是将这些文件复制回原来的位置。而SQL Server数据库则不仅仅是复制文件这么简单。
下面我们来介绍一下SQL Server三种常用的备份类型:
1.完整备份:
    完整备份也就是对整个数据库、部分事务日志、数据库结构和文件结构的备份。它代表的是备份完成时刻的数据库。完整备份是备份的基础,它提供了任何其他备份的基准。也就是其他备份只有在执行了完整备份之后才能被执行。例如:要使用差异备份的话,首先你得先使用完整备份完你才可以进行差异备份。
2.差异备份:
    差异备份是指对上一次完整备份之后所有更改的数据作备份。备份过程能够识别出数据哪些数据被改变了,它就对哪些数据进行备份。例如:我首先执行了一个完整备份把某个数据库备份了一下,然后我在这个数据库里面添加了一个表。然后我又进行差异备份,那么差异备份只备份这个数据库完整备份以后更改的数据,也就是只备份那个表。差异备份的优势是速度,备份数据库所需的时间很少,但差异备份要求事先已执行过一次完整备份。
3.事务日志备份:
    事务日志备份也是建立在完整备份的基础上的。只有事先至少执行过一次完整备份以后,它才能对数据库进行事务日志备份。事务日志备份是对数据库的事务日志进行备份,也就是从完整备份以后对数据为的事务日志进行备份。当再执行下一次事务日志备份时,它只备份第一次事务日志备份以后的事务日志。而不是从完整备份以后开始备份(就是下面的第二次日志备份,它只备份11点到12点之间的日志,而11点之前的就不进行备份了)。事务日志支持时间点还原,并且可以把日志未完成的日志也进行备份。这个意思就是说:例如,我的系统在10点、11点和12点钟时分别做了备份。10点时我是进行的完整备份,11点时候我又进行了第一次日志备份,12点时候我进行了第二次日志备份。但是当1点时候我的系统挂了-_-!然后我开始修复系统。当修复好系统后,我立刻进行第三次事务日志备份。这个第三次事务日志备份就是备份12点——12:59之间的事务日志。即使是最后一个日志没有执行成功,我的第三次日志备份也把它备份下来。也就是备份12点——12:59之间“所有的”备份。记住是“所有的”。而支持时间点还原的意思就是我想还原12:58分时候的数据也可以(具体操作就是把完整备份+第一次日志备份+第二次日志备份+第三次日志备份进行还原)。
注意:在简单恢复模式下不能备份事务日志(下面我们会说到恢复模式的种类)。如果没有与其相一到的数据库备份,则不能恢复事务日志。此外,事务日志备份主要是T-SQL语句,而不是整个数据库结构、文件结构或是数据。
三、SQL Server恢复模式:
    不管是备份还是还原,都是在一定的恢复模式中进行的,恢复模式是数据库的一种特性,它控制着数据库备份和还原的基本行为。数据库管理员应根据企业系统实际动作的需求以及对数据库可用性和恢复的需求,来选择合适的恢复模式。
    SQL Server提供了以下三种恢复模式:
1.简单恢复模式:
    简单恢复模式主要用于小型数据库和不经常更改的数据库。在简单恢复模式下,不活动的日志将被删除,所以不需要事务日志备份。这也就是为什么在简单恢复模式下不能使用事务日志备份的原因。
2.完整恢复模式:
    对于十分重要的实际数据库,如银行、电信系统,在发生故障时可能要求恢复到历史上某个时刻。一旦发生故障时,必须保障数据不丢失,保障数据能够恢复到发生故障时的状态。这样,就必须采用完整恢复模式。完整恢复模式可在最大范围内防止出现故障时丢失数据,它包括数据库备份和事务日志备份,并提供全面保护,使数据库免受媒体故障的影响。这个模式使用数据库和所有日志的备份去恢复数据库,如果日志没有损坏,SQL Server可以恢复所有的数据。除了在失败那一时刻的事务。
3.大容量日志恢复模式:
    DBA在某些场合需要对数据库执行一些大批量的数据插入、更新或删除操作。例如:一次性导入上百万条数据。如果在完整恢复模式下,当导入这些个数据时,这些操作将会产生大量的日志记录,这样就导致了数据库的性能很低,在这种情况下就需要切换到大容量日志恢复模式下来进行操作来提高性能。虽然大容量日志恢复模式会完整地记录其他事务,但它只对大容量操作进行最小记录。这样就造成了这种模式下增加了大容量复制操作丢失数据的风险,因为最小的日志记录大容量操作不会逐个记录事务,所以说大容量模式是对完整模式的补充,提供了良好的性能。举个例子来说就是:当我们把一个Excel表中的一些个数据要导入SQL Server数据库里时,假如这个EXCEL表中有很多条数据,这个时候我们如果使用完整恢复模式进行导入的话,那么Excel表中的第一条数据都会生成一个相对应的日志。这个时候如果Excel表中如果有几万条数据的话,那么导入的时候就会有几万条对应的日志产生,这样就降低了数据库的性能。所以我们的恢复模式切换成大容量日志模式时,导入的时候就只会产生小量的日志。如在几百条时候生成一条日志,再在几千条的时候生成另一条日志。它不会第条都记录,这样就提高了数据库的性能。所以我们要学会完整模式和大容量模式结合使用。这样能提高数据库的性能。
    更改恢复模式的方法是:找到你的数据库右击选择“属性”——“选项”——“恢复模式”来修改。
四、备份设备:
    我们在实际工作中会用到的备份设备有两种:一种是磁盘设备,另一种是磁带设备。磁盘是最常用的存储设备,磁带备份的用法与磁盘设备基本相同。但在以下方面存在一定的差异:
1.磁带设备必须物理连接到运行SQL Server实例的计算机上,不支持备份到远程磁带设备上。
2.如果磁带备份设备在备份操作过程中已满,但还需要写入一些数据,SQL Server将提示更换新磁带并继续备份操作。
3.磁带的可用性和耐久性高于磁盘,但是由于磁带机价格较高,目前普及程度不高。
4.使用磁带机的一个好处就是可以把它放在一个远离服务器且安全的地方,以防止灾难的发生。
五、备份和还原策略
    在实际生工作中,针对不同的数据库,数据库的三种基本备份方式往往是相互结合起来使用的。以下是一些最常用的类型组合:
1.完整备份和还原:
    这种策略适合小型数据库或者是数据库很少改变或者只读(就是不往里写东西只用来使用),等到数据改变以后,就是时间很久了改变了一下数据库,这个时候就得做好次完整备份。在以上的情况下我们使用完整备份。
    完整备份的还原就是当发生意外时,直接还原最后一次完整备份就OK了!这种备份策略不支持时间点还原。
2.完整备份+差异备份与还原:
    这种策略是用在数据库有一定的规模,数据库定期更改,但是不频繁,如果每次做完整备份的话占用的时间比较长,所以就可以使用这种策略定期做完整备份,之后再定期做差异备份来保证数据库数据的安全。这种策略还原时候就是你最近的一次完整备份加上这次完整备份以后的差异备份。比如:我昨天1点进行了一次完整备份,然后在2点的时候做了一次差异备份,然后我又再今天1点时候做了一次完整备份,今天2点做了一次差异备份,3点的时候又做了一次差异备份。如果我的数据库在4点时候坏了。我只需要把“今天1点时候做的那次完整备份+2点时候做的那次差异备份+3点时候的那次差异备份”就可以恢复数据库了。而昨天那些备份就与我们没关系了。有人也许会问为什么会加上2点时候那个差异备份呢?这是因为3点时候那个差异备份是建立在2点那次的基础上的。如果不加2点的话那么1点到2点时间段内改变的部分就得不到恢复了。
3.完整备份+事务日志备份与还原:
    在数据库频繁更改且要保持数据库的高可用性的情况下,做差异或者完整备份占用数据库时间比较长,影响正常工作,不怎么适用。所以就采用这种定期做事务日志备份,更长时间做定期完整备份。当然也可以在他们中间加上差异备份。比如:正常工作期间每小时做一次事务日志备份,每天晚上闲的时候做差异备份,第周日晚上闲的时候做完整备份。它还原就是最后一次完整备份加上这次完整备份以后所有的日志备份来还原。具体举例好像我在介绍事务日志备份时候已经说过了,这里就不再提了。需要注意的是在进行事务日志备份时要把恢复模式改成正常模式或者是大容量事务日志模式。建议选择正常恢复模式。
六、备份系统数据库:
    在SQL Server数据库中,系统数据库占据着非常重要的位置。一般来说如果用户数据库坏了,可以通过还原用户数据库备份来达到恢复用户数据库的目的。而如果系统数据库中的master数据库要损坏了,那么用户将无法正常启动SQL Server来还原其他用户数据库。所以我们一定要保证系统数据库的正常工作。
    在SQL Server数据库中,安装SQL Server后,自动建立了四个系统数据库。它们分别是master数据库、model数据库、tempdb数据库和msdb数据库。当服务器配置为复制分发服务器时,系统数据库还包括了distribution数据库。SQL Server依靠这些数据库来运行,这些数据库中的每个库都在服务器上执行特定的功能。下面我们来说说这几个系统数据库在SQL Server中的各自的作用:
1.master数据库:它从整体上控制SQL Server的所有方面。这个数据库中包括所有的配置信息、用户登录信息、当前正在服务器中运行的信息等等。它是整个系统中最重要的数据库。如果丢失master数据库,恢复所有用户数据库将会变得非常困难。SQL Server在运行时所做的第一件事就是寻找master数据库并打开它。所以在创建了任何用户定义的对象后,都要备份它。
2.model数据库:它是为新数据库提供模板和原型。当用户建立一个新的数据库时,SQL Server会把model数据库中的所有对象建立一份拷贝并转移到新数据库中,然后把新数据库的所有多余空间用空页添满。
3.tempdb数据库:它是一个特殊的数据库,它提供所有访问SQL Server的用户使用。这个数据库用来保存所有的临时表、存储过程和其他SQL Server建立的临时对象。每次SQL Server重新启动,都会清空tempdb数据库并重建。因此请朋友们千万不要在tempdb中建立需要永久保存的表。那样会很惨。。。-_-!
4.msdb数据库:它是SQL Server中的一个用户数据库的特例。所有的任务调度、报警操作才存储在msdb数据库中。该库的另一个功能是存储所有备份历史。
    从以上这几种系统数据库来看,我们除了tempdb不需要备份外,其他的都很重要。我们都应该及时备份其他三种系统数据库。下面我来讲一下备份与恢复master数据库(因为就数它最重要嘛!^_^):
七、备份与恢复master数据库:
     因为master数据库非常重要,所以我们要对它进行备份。但是备份之后假如master数据库以某种方式被损坏,可能无法启动SQL Server实例。这种情况下,我们必须重建master数据库,然后从备份中还原数据库。在执行任何语句或系统过程更改master数据库中的信息(如更改服务器的配置选项)后,应考虑备份master数据库。如果master数据库更改后没有及时进行备份,任何自上次备份后的更改都将在还原备份时丢失。比如:在备份master后创建了一个用户数据库,并将表和数据添加到该数据库中。如果后来因硬盘故障而还原master,则该用户数据库对SQL Server将是未知的,因为在已还原的master数据库中没有关于此新用户数据库的条目。在这种情况下,如果组成这个用户数据库的所有数据库文件仍在磁盘上,可以通过附加这些数据库文件创建该用户数据库。
注意:建议不要在master数据库中创建用户对象,否则需要每次创建用户后备份master数据库。
导致master数据库更新并需要执行备份的操作类型包括如下几种:
1.创建或删除用户数据库。
2.如果用户数据库自动增长以便容纳新数据,这不会影响master数据库。删除文件和文件组不影响master。
3.添加登录或执行其他与登录安全有关的操作。
4.数据库安全操作(如向数据库中添加用户)对master数据库没有影响。
5.更改任何服务器范围的配置选项或数据库配置选项。
6.创建或删除逻辑备份设备。
7.将服务器配置为分布式查询和远程过程调用,如添加链接服务器或远程登录。
下面我们来模拟一下master的备份及恢复实验:
如果master数据库以某种方式被损坏,而且损失很严重,则可能无法启动SQL Server实例时必须重新生成损坏的master数据库,然后进入单用户模式进行还原。
1.首先我们要把master数据库进行备份,备份的方法是直接找到“master”数据库选项右击选择“任务”——“备份”来进行备份master数据库。
2.我们可以先把SQL Server服务停止了,然后把master数据库的名称改一下,比如改成“master1”(修改的方法是到“C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data”里面重命名"master"就OK了)。注意:必须停止服务才能给master重命名。
3.修改完后SQL Server就处于损坏状态,然后我们来对它进行还原。
4.上面说过了,假如master数据库损坏了的话,那么SQL Server就会无法启动。

5.然后我们就得重新生成一个master数据库。语法结构如下:
start /wait setup.exe /qn INSTANCENAME= REINSTALL=SQL_Engine REBUILDDATABASE=1  SAPWD=这些语法中:
INSTANCENAME:指定实例名,默认的实例则用mssqlserver表示。
REINSTALL:指定引擎,如果是SQL Server服务,则输入SQL_Engine.
Setup.exe:指定光盘1中根目录下的文件。
/qn开关用于取消所有安装程序对话框和错误消息。
我的SQL Server的第一张光盘是在D盘下放着呢,所以我重新生成master数据库的语句是:
Start /wait D:\setup.exe /qn INSTANCENAME=mssqlserver REINSTALL=SQL_Engine REBUILDDATABASE=1 SAPWD=abc123~这些命令是在“开始”输入“cmd”之后的命令行下输入的。

6.重新生成后,就会在“C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data”里面生成一个“master”数据库。

7.生成master数据库之后还不可以直接登录进SQL Server里面进行直接还原。还必须进入单用户模式,进入CMD命令行窗口,进入目录“C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Binn”里执行命令“sqlserver.exe -c -m”如下图:

8.执行完上述命令后,别把CMD命令窗口关了。你直接登录SSMS后连接进去,然后断开连接。
9.断开连接后,新建查询并连接后,输入如下命令并执行:
USE master
GO
RESTORE DATABASE master
FROM disk='C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Backup\master.bak'
WITH REPLACE

10.重启SQL Server服务,然后登录SSMS验证master数据库是否还原。

OK!!!终于做完了-_-!弄这个实验弄了一天了,好累。。。12点整了,得睡觉去了!这一天过得还是比较充实的^_^。。。。。。
阅读(4037) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~