因为bak文件记录了数据库在压缩放到bak文件前每个数据库文件的路径

因为bak文件记录了数据库在压缩放到bak文件前每个数据库文件的路径

当你确定bak文件所保存的路径(用GUI)或你想将数据库文件放到别的地方 跟原来压缩前的路径不一样

现有完备备份还原,才有差异备份还原,日志备份还原

完备还原-》差备还原-》日备还原

那么移动数据文件是在完备还原的时候移动,差备和日备的bak文件不保存数据库文件路径

RESTORE DATABASE的时候可以用WITH MOVE语句

 1 --返回由备份集内包含的数据库和日志文件列表组成的结果集。
 2 --主要获得逻辑文件名
 3 USE master
 4 RESTORE FILELISTONLY
 5    FROM DISK = 'g:\back.Bak' 
 6 Go
 7 
 8 /*
 9 利用bak恢复数据库,强制还原(REPLACE)
10 STATS = 10 每完成10%显示一条记录
11 DBTest和DBTest_log是上面g:\back.Bak里的逻辑文件
12 */
13 USE master
14 RESTORE DATABASE DB 
15    FROM DISK = 'g:\back.Bak'
16    WITH MOVE 'DBTest' TO 'E:\Program Files\Microsoft SQL Server2005\Data\DB.mdf', 
17    MOVE 'DBTest_log' TO 'E:\Program Files\Microsoft SQL Server2005\Data\DB_log.ldf',
18 STATS = 10, REPLACE
19 GO
20 -------------------------------------------------
21 
22 /*
23 备份数据DB 到.bak文件。然后利用此bak文件恢复一个新的数据库DBTest。
24 */
25 USE master
26 BACKUP DATABASE DB 
27   TO DISK = 'g:\DBBack0930.bak' 
28 RESTORE FILELISTONLY 
29   FROM DISK = 'g:\DBBack0930.bak' 
30 RESTORE DATABASE DBTest 
31   FROM DISK = 'g:\DBBack0930.bak' 
32   WITH MOVE 'DBTest' TO 'E:\Program Files\Microsoft SQL Server2005\Data\DBTest.mdf', 
33   MOVE 'DBTest_log' TO 'E:\Program Files\Microsoft SQL Server2005\Data\DBTest_log.ldf'
34 GO 
35 ---------------------------------------------------

http://www.cnblogs.com/adandelion/archive/2006/09/30/519534.html

 1 USE master
 2 GO
 3 --创建数据库
 4 CREATE DATABASE LogChainTest;
 5 GO
 6 --改为完整恢复模式
 7 ALTER DATABASE LogChainTest SET RECOVERY FULL;
 8 GO
 9 
10 
11 
12 
13 --1、如果数据库在线,那么还原的时候会把原来的数据库文件移动到新路径(实质就是删除数据库,在新路径创建数据库并还原)
14 --2、如果原来的数据库不在了,需要新建一个数据库,那么还原的时候会在在新路径创建数据库并还原缺少了删除原来的数据库那个步骤
15 USE master
16 RESTORE DATABASE LogChainTest 
17    FROM DISK = 'C:\LogChainTest_full1_20131208093555.bak'
18    WITH MOVE 'LogChainTest' TO 'E:\LogChainTest.mdf', 
19    MOVE 'LogChainTest_log' TO 'E:\LogChainTest_log.ldf',
20 STATS = 10, REPLACE
21 GO

只有完整备份才可以移动数据库文件

  1 USE master
  2 GO
  3 --创建数据库
  4 CREATE DATABASE LogChainTest;
  5 GO
  6 --改为完整恢复模式
  7 ALTER DATABASE LogChainTest SET RECOVERY FULL;
  8 GO
  9 
 10 
 11 --------------------------------------------------------------------
 12 --备份
 13 --第一个完整备份
 14 USE master
 15 GO
 16 DECLARE @strbackup NVARCHAR(100)
 17 --改为日期加时间的
 18 SET @strbackup = 'C:\LogChainTest_full1_'
 19     + REPLACE(REPLACE(REPLACE(CONVERT(VARCHAR, GETDATE(), 120), '-', ''), ' ',
 20                       ''), ':', '') + '.bak'
 21 BACKUP DATABASE LogChainTest TO DISK = @strbackup WITH INIT;
 22 GO
 23 
 24 
 25 
 26 --第一个日志备份
 27 USE LogChainTest
 28 GO
 29 CREATE TABLE tt(id INT)
 30 INSERT INTO tt
 31 SELECT 1
 32 DECLARE @strbackup NVARCHAR(100)
 33 --改为日期加时间的
 34 SET @strbackup = 'C:\LogChainTest_log1_'
 35     + REPLACE(REPLACE(REPLACE(CONVERT(VARCHAR, GETDATE(), 120), '-', ''), ' ',
 36                       ''), ':', '') + '.bak'
 37 BACKUP LOG LogChainTest TO DISK = @strbackup WITH INIT;
 38 GO
 39 
 40 
 41 
 42 --第一个差异备份
 43 USE LogChainTest
 44 GO
 45 INSERT INTO tt
 46 SELECT 1
 47 DECLARE @strbackup NVARCHAR(100)
 48 --改为日期加时间的
 49 SET @strbackup = 'C:\LogChainTest_diff1_'
 50     + REPLACE(REPLACE(REPLACE(CONVERT(VARCHAR, GETDATE(), 120), '-', ''), ' ',
 51                       ''), ':', '') + '.bak'
 52 BACKUP DATABASE LogChainTest TO DISK = @strbackup WITH INIT, DIFFERENTIAL;
 53 GO
 54 ------------------------------------------------------------------------
 55 
 56 
 57 --------------------------------------------------------------------------
 58 --还原
 59 USE master
 60 GO
 61 RESTORE DATABASE LogChainTest 
 62    FROM DISK = 'C:\LogChainTest_full1_20131208093555.bak'
 63    WITH MOVE 'LogChainTest' TO 'E:\LogChainTest.mdf', 
 64    MOVE 'LogChainTest_log' TO 'E:\LogChainTest_log.ldf',
 65   REPLACE
 66 GO
 67 
 68 USE master
 69 GO
 70 --只有完备备份还原才可以移动数据库文件
 71 RESTORE DATABASE LogChainTest FROM DISK='C:\LogChainTest_full1_20131208100145.bak' 
 72    WITH MOVE 'LogChainTest' TO 'E:\LogChainTest.mdf', 
 73    MOVE 'LogChainTest_log' TO 'E:\LogChainTest_log.ldf',
 74   NORECOVERY
 75 GO
 76 
 77 
 78 RESTORE DATABASE LogChainTest FROM DISK='c:\LogChainTest_log1_20131208100151.bak' 
 79    WITH MOVE 'LogChainTest' TO 'E:\LogChainTest.mdf', 
 80    MOVE 'LogChainTest_log' TO 'E:\LogChainTest_log.ldf',
 81   NORECOVERY
 82 GO 
 83 --日志还原
 84 消息 3174,级别 16,状态 1,第 1 85RESTORE 操作无法移动文件 'LogChainTest' 86 消息 3174,级别 16,状态 2,第 1 87RESTORE 操作无法移动文件 'LogChainTest_log' 88 消息 3119,级别 16,状态 1,第 1 89 在计划 RESTORE 语句时发现了问题。以前的消息提供了详细信息。
 90 消息 3013,级别 16,状态 1,第 1 91 RESTORE DATABASE 正在异常终止。
 92 
 93 RESTORE DATABASE LogChainTest FROM DISK='c:\LogChainTest_diff1_20131208100251.bak' 
 94    WITH MOVE 'LogChainTest' TO 'E:\LogChainTest.mdf', 
 95    MOVE 'LogChainTest_log' TO 'E:\LogChainTest_log.ldf',
 96   NORECOVERY
 97 GO
 98 --差异还原
 99 消息 3174,级别 16,状态 1,第 1100RESTORE 操作无法移动文件 'LogChainTest'101 消息 3119,级别 16,状态 1,第 1102 在计划 RESTORE 语句时发现了问题。以前的消息提供了详细信息。
103 消息 3013,级别 16,状态 1,第 1104 RESTORE DATABASE 正在异常终止。

 还原日志备份的时候使用restore log 或restore database都是一样的

而还原差异备份的时候使用restore log就会报错

 1 USE master
 2 GO
 3 --创建数据库
 4 CREATE DATABASE LogChainTest;
 5 GO
 6 --改为完整恢复模式
 7 ALTER DATABASE LogChainTest SET RECOVERY FULL;
 8 GO
 9 
10 
11 --------------------------------------------------------------------
12 --备份
13 --第一个完整备份
14 USE master
15 GO
16 DECLARE @strbackup NVARCHAR(100)
17 --改为日期加时间的
18 SET @strbackup = 'C:\LogChainTest_full1_'
19     + REPLACE(REPLACE(REPLACE(CONVERT(VARCHAR, GETDATE(), 120), '-', ''), ' ',
20                       ''), ':', '') + '.bak'
21 BACKUP DATABASE LogChainTest TO DISK = @strbackup WITH INIT;
22 GO
23 
24 
25 
26 --第一个日志备份
27 USE LogChainTest
28 GO
29 CREATE TABLE tt(id INT)
30 INSERT INTO tt
31 SELECT 1
32 DECLARE @strbackup NVARCHAR(100)
33 --改为日期加时间的
34 SET @strbackup = 'C:\LogChainTest_log1_'
35     + REPLACE(REPLACE(REPLACE(CONVERT(VARCHAR, GETDATE(), 120), '-', ''), ' ',
36                       ''), ':', '') + '.bak'
37 BACKUP LOG LogChainTest TO DISK = @strbackup WITH INIT;
38 GO
39 
40 
41 
42 --第一个差异备份
43 USE LogChainTest
44 GO
45 INSERT INTO tt
46 SELECT 2
47 DECLARE @strbackup NVARCHAR(100)
48 --改为日期加时间的
49 SET @strbackup = 'C:\LogChainTest_diff1_'
50     + REPLACE(REPLACE(REPLACE(CONVERT(VARCHAR, GETDATE(), 120), '-', ''), ' ',
51                       ''), ':', '') + '.bak'
52 BACKUP DATABASE LogChainTest TO DISK = @strbackup WITH INIT, DIFFERENTIAL;
53 GO
54 ------------------------------------------------------------------------
55 
56 
57 --------------------------------------------------------------------------
58 --还原
59 
60 
61 
62 USE master
63 GO
64 --只有完备备份还原才可以移动数据库文件
65 RESTORE DATABASE LogChainTest FROM DISK='C:\LogChainTest_full1_20131208100145.bak' 
66    WITH MOVE 'LogChainTest' TO 'E:\LogChainTest.mdf', 
67    MOVE 'LogChainTest_log' TO 'E:\LogChainTest_log.ldf',
68   NORECOVERY ,REPLACE
69 GO
70 
71 
72 RESTORE LOG LogChainTest FROM DISK='c:\LogChainTest_log1_20131208100151.bak' 
73    WITH MOVE 'LogChainTest' TO 'E:\LogChainTest.mdf', 
74    MOVE 'LogChainTest_log' TO 'E:\LogChainTest_log.ldf',
75   NORECOVERY
76 GO 
77 -------------------------------------------------
78 RESTORE DATABASE LogChainTest FROM DISK='c:\LogChainTest_log1_20131208100151.bak' 
79    WITH MOVE 'LogChainTest' TO 'E:\LogChainTest.mdf', 
80    MOVE 'LogChainTest_log' TO 'E:\LogChainTest_log.ldf',
81   NORECOVERY
82 GO 
83 
84 
85 RESTORE DATABASE LogChainTest FROM DISK='c:\LogChainTest_diff1_20131208100251.bak' 
86    WITH MOVE 'LogChainTest' TO 'E:\LogChainTest.mdf', 
87    MOVE 'LogChainTest_log' TO 'E:\LogChainTest_log.ldf',
88   RECOVERY
89 GO
90 
91 USE [LogChainTest]
92 GO
93 SELECT * FROM [dbo].[tt]

 

posted @ 2013-12-08 09:28  桦仔  阅读(2006)  评论(0编辑  收藏  举报