改变自己
我可以改变世界 改变自己

实例:

1.         创建数据DBTEST

2.         创建表TBL_TEST

3.         在表TBL_TEST中插入100条数据

4.         备份现有的数据库

5.         再次向表TBL_TEST中插入50条数据

6.         记录下当前正确数据的时间d1

7.         2分钟后模拟数据文件损坏

8.         备份数据库尾日志

9.         将数据库恢复到d1时间

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

下面开始实施

1)      创建数据DBTEST
CREATE DATABASE DBTEST

2)      创建表TBL_TEST
CREATE TABLE TBL_TEST

(

   ID [int] NOT NULL PRIMARY KEY,

   NAME [datetime] NOT NULL,

   ADDRESS varchar(50) NOT NULL

)
3)      在表TBL_TEST中插入100条数据
use DBTEST

declare @i int

set @i=1

while(@i<=100)

begin

   INSERT INTO TBL_TEST VALUES (@i,getdate(),'ADDRESS ' + convert(varchar(50),@i))

   set @i=@i+1

end

查看数据

select * from TBL_TEST
4)      备份现有的数据库

--做一次完整数据库备份

backup database DBTEST to disk =N'C:\DBTEST.bak'
5)      再次向表TBL_TEST中插入50条数据
use DBTEST

declare @i int

set @i=101

while(@i<=150)

begin

   INSERT INTO TBL_TEST VALUES (@i,getdate(),'ADDRESS ' + convert(varchar(50),@i))

   set @i=@i+1

end

查看数据

select * from TBL_TEST

6)      记录下当前正确数据的时间d1
当前时间为:2009-9-21 20:34:35
7) 2分钟后模拟数据文件损坏
停止SQL SERVER 服务 net stop mysqlserver

删除DBTEST.mdf 文件

新建文本文件,并重命名为:DBTEST.mdf

启动SQL SERVER 服务 net stop mysqlserver

数据库DBTEST无法打开,证明已损坏
8)      备份数据库尾日志
启动 sqlcmd 管理工具

备份尾日志

backup log DBTEST to disk=N'c:\aaaa.bak' with no_truncate

解释一下no_truncate的作用:

如果数据库处于离线状态并且无法启动。
尝试执行尾日志备份。由于此时不会发生任何事务,所以 WITH NORECOVERY 是可选的。如果数据库受损,请使用

WITH CONTINUE_AFTER_ERROR 或 WITH NO_TRUNCATE。
BACKUP LOG database_name TO <backup_device> [WITH { CONTINUE_AFTER_ERROR | NO_TRUNCATE }
重要提示:
除非数据库受损,否则不建议使用 NO_TRUNCATE。
具体的用法参看MSDN
9)      将数据库恢复到d1时间
--恢复最后一次正常配置

在sqlcmd中执行如下语句进行恢复

restore database dbtest from disk='c:"dbtest.bak' with norecovery

restore log dbtest from disk='c:"aaaa.bak' with recovery

解释一下 with norecovery 和 with recovery的作用
NORECOVERY
每当您准备对数据库继续执行还原操作时,请使用 NORECOVERY。NORECOVERY 使数据库进入还原状态。这确保了数

据库在尾日志备份后不会更改。
RECOVERY
将数据库从恢复状态改变到正常状态
具体参看MSDN

数据文件已经恢复!

posted on 2009-09-21 20:56  dashan  阅读(947)  评论(0编辑  收藏  举报