实例:
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
数据文件已经恢复!