200分,SQL Server 2000数据库差异恢复问题!(200分)

  • 主题发起人 主题发起人 philipliu
  • 开始时间 开始时间
P

philipliu

Unregistered / Unconfirmed
GUEST, unregistred user!
差异数据库的恢复,帮助中这样写:
RESTORE DATABASE MyNwind
FROM MyNwind_1
WITH NORECOVERY
GO
RESTORE DATABASE MyNwind
FROM MyNwind_1
WITH FILE = 2,
RECOVERY
GO
问:假如差异恢复中的数据备份不是完全备份后的差异备份,SQL SERVER将会提示出错,
应该怎样判断差异备份是否当前完全备份的差异备份?
 
這個恐怕很難有人能夠回答你﹗

 
你是从设备备份,还是从disk备份的?感觉在备份时,相应保存数据库一个表,记录备份名称,
路径,以及对应的数据库,等等,然后判断了,应该可以吧
 
[red]有简单的方法吗?[/red]
 
这个是MS的数据库的弱点,备份时可以通过但恢复时不一定,不知道他是怎么想的.
 
不会吧,老唐,MS不至于如此吧!

以下摘自help
-------------------
NORECOVERY

指示还原操作不回滚任何未提交的事务。如果需要应用另一个事务日志,则必须指定 NORECOVERY 或 STANDBY 选项。如果 NORECOVERY、RECOVERY 和 STANDBY 均未指定,则默认为 RECOVERY。

当还原数据库备份和多个事务日志时,或在需要多个 RESTORE 语句时(例如在完整数据库备份后进行差异数据库备份),SQL Server 要求在除最后的 RESTORE 语句外的所有其它语句上使用 WITH NORECOVERY 选项。


说明 如果指定 NORECOVERY 选项,数据库将处于这个中间的未恢复状态而不可用。


当用于文件或文件组还原操作时,NORECOVERY 强制数据库在还原操作结束后保持还原状态。这在以下情况中很有用:

还原脚本正在运行并且始终要应用日志。


使用文件还原序列,并且在两次还原操作之间不能使用数据库。
RECOVERY

指示还原操作回滚任何未提交的事务。在恢复进程后即可随时使用数据库。

如果安排了后续 RESTORE 操作(RESTORE LOG 或从差异数据库备份 RESTORE DATABASE),则应改为指定 NORECOVERY 或 STANDBY。

如果 NORECOVERY、RECOVERY 和 STANDBY 均未指定,则默认为 RECOVERY。当从 SQL Server 早期版本中还原备份集时,可能要求将数据库升级。如果指定了 WITH RECOVERY,升级将自动进行。有关更多信息,请参见事务日志备份。

 
我很想帮你(因为我也想再补充一点这方面的知识),不过现在实在比较忙,如果10月8日
前还没有结贴的话,我来帮你解决。
 
唉,有具体方法吗?
 
1、建测试库CY
2、做一次完整备份到文件CY.bak;
3、做一次差异备份到文件CY.bak(追加文件);
4、再做一次差异备份到文件CY.bak(追加文件);
5、做一次完整备份到文件CY.bak;
6、做一次完整备份到文件CY1.bak;

现在,开始测试:

执行,其中CY是数据库名
select backup_set_id,backup_finish_date,name from msdb..backupset where database_name = N'CY' and type='D' order by backup_start_date desc
返回以下:
<
backup_set_id backup_finish_date name
------------- ----------------------- --------
711 2002-09-25 15:53:58.000 CY 备份
708 2002-09-25 15:46:58.000 CY 备份

(所影响的行数为 2 行)
>
这句主要是取得了备份集的id;

执行:
select backup_set_id, backup_start_date,backup_finish_date,name,type,backup_size,position from msdb..backupset where database_name = N'CY' and type !='F'and backup_start_date >= (select backup_start_date from msdb..backupset where backup_set_id = '708') order by backup_start_date
返回以下:
<
backup_set_id backup_start_date backup_finish_date name type backup_size position
------------- ------------------------ ------------------------ -------- ---- ------------ -----------
708 2002-09-25 15:46:58.000 2002-09-25 15:46:58.000 CY 备份 D 4275200 1
709 2002-09-25 15:48:55.000 2002-09-25 15:48:55.000 CY 备份 I 408576 2
710 2002-09-25 15:53:40.000 2002-09-25 15:53:41.000 CY 备份 I 408576 3
711 2002-09-25 15:53:58.000 2002-09-25 15:53:58.000 CY 备份 D 4275200 4
712 2002-09-25 15:54:51.000 2002-09-25 15:54:51.000 CY 备份 I 213504 1

(所影响的行数为 5 行)
>
这句得到从某个备份集的id起,到最近的备份集记录信息,其中可以看出,type字段为D的,是完整备份记录,
为I的,是差异备份记录,这点,从备份长度也可看出,

在Enterprise Manager中执行差异恢复,可以发现,当选中一个差异备份记录集时,Enterprise Manager会自
动将其之前最近的完整备份记录集选择上,在执行恢复时,会看到两次恢复的进度,所以,如果在做差异备份
之前没有做过完整备份,是无法恢复的,当然,因为备份记录是可以被清除的(记录在msdb库中),所以无法
限制用户不做完整备份就直接做差异备份的操作。

在选择了正确的恢复记录后执行:
RESTORE DATABASE [CY] FROM DISK = N'G:/CY.BAK' WITH FILE = 1, NOUNLOAD , STATS = 10, NORECOVERY
RESTORE DATABASE [CY] FROM DISK = N'G:/CY.BAK' WITH FILE = 3, NOUNLOAD , STATS = 10, RECOVERY
就完成了差异恢复了。

以上的恢复方式是从数据库中读取备份记录来恢复的,如果从设备恢复,选择恢复文件后,执行:
RESTORE HEADERONLY FROM DISK = N'G:/CY.BAK' WITH NOUNLOAD
RESTORE HEADERONLY FROM DISK = N'G:/CY1.BAK' WITH NOUNLOAD
返回:
<
BackupName BackupDescription BackupType ExpirationDate Compressed Position DeviceType UserName ServerName DatabaseName DatabaseVersion DatabaseCreationDate BackupSize FirstLsn LastLsn CheckpointLsn DifferentialBaseLsn BackupStartDate BackupFinishDate SortOrder CodePage UnicodeLocaleId UnicodeComparisonStyle CompatibilityLevel SoftwareVendorId SoftwareVersionMajor SoftwareVersionMinor SoftwareVersionBuild MachineName Flags BindingId RecoveryForkId Collation
----------- ------------------ ---------- --------------- ---------- -------- ---------- --------- ----------- ------------- --------------- ------------------------ ----------- ------------------ ------------------ ------------------ -------------------- ------------------------ ----------------------- --------- -------- --------------- ---------------------- ------------------ ---------------- -------------------- -------------------- -------------------- ------------ ------ -------------------------------------- -------------------------------------- -----------------
CY 备份 NULL 1 NULL 0 1 2 sa aaa CY 539 2002-09-25 15:36:56.000 4270080 280000000014300001 280000000014500001 280000000014300003 280000000013100003 2002-09-25 15:46:58.000 2002-09-25 15:46:58.000 0 168 2052 196609 80 4608 8 0 194 aaa 0 {D9850F4C-7EC5-42B2-93B2-993F0C99D8D8} {D635B923-D53F-4D39-A801-4A527ACCFB25} Chinese_PRC_CI_AS
CY 备份 NULL 5 NULL 0 2 2 sa aaa CY 539 2002-09-25 15:36:56.000 403456 280000000015000001 280000000015200001 280000000015000001 280000000014300003 2002-09-25 15:48:55.000 2002-09-25 15:48:55.000 0 168 2052 196609 80 4608 8 0 194 aaa 0 {D9850F4C-7EC5-42B2-93B2-993F0C99D8D8} {D635B923-D53F-4D39-A801-4A527ACCFB25} Chinese_PRC_CI_AS
CY 备份 NULL 5 NULL 0 3 2 sa aaa CY 539 2002-09-25 15:36:56.000 403456 280000000015200001 280000000015400001 280000000015200001 280000000014300003 2002-09-25 15:53:40.000 2002-09-25 15:53:41.000 0 168 2052 196609 80 4608 8 0 194 aaa 0 {D9850F4C-7EC5-42B2-93B2-993F0C99D8D8} {D635B923-D53F-4D39-A801-4A527ACCFB25} Chinese_PRC_CI_AS
CY 备份 NULL 1 NULL 0 4 2 sa aaa CY 539 2002-09-25 15:36:56.000 4270080 280000000015400001 280000000015600001 280000000015400003 280000000014300003 2002-09-25 15:53:58.000 2002-09-25 15:53:58.000 0 168 2052 196609 80 4608 8 0 194 aaa 0 {D9850F4C-7EC5-42B2-93B2-993F0C99D8D8} {D635B923-D53F-4D39-A801-4A527ACCFB25} Chinese_PRC_CI_AS

(所影响的行数为 4 行)

BackupName BackupDescription BackupType ExpirationDate Compressed Position DeviceType UserName ServerName DatabaseName DatabaseVersion DatabaseCreationDate BackupSize FirstLsn LastLsn CheckpointLsn DifferentialBaseLsn BackupStartDate BackupFinishDate SortOrder CodePage UnicodeLocaleId UnicodeComparisonStyle CompatibilityLevel SoftwareVendorId SoftwareVersionMajor SoftwareVersionMinor SoftwareVersionBuild MachineName Flags BindingId RecoveryForkId Collation
----------- ------------------ ---------- --------------- ---------- -------- ---------- --------- ----------- ------------- --------------- ------------------------ ----------- ------------------ ------------------ ------------------ -------------------- ------------------------ ----------------------- --------- -------- --------------- ---------------------- ------------------ ---------------- -------------------- -------------------- -------------------- ----------- ------- -------------------------------------- -------------------------------------- -----------------
CY 备份 NULL 5 NULL 0 1 2 sa aaa CY 539 2002-09-25 15:36:56.000 208384 280000000015900001 280000000016100001 280000000015900001 280000000015400003 2002-09-25 15:54:51.000 2002-09-25 15:54:51.000 0 168 2052 196609 80 4608 8 0 194 aaa 0 {D9850F4C-7EC5-42B2-93B2-993F0C99D8D8} {D635B923-D53F-4D39-A801-4A527ACCFB25} Chinese_PRC_CI_AS

(所影响的行数为 1 行)
>
可以看出,BackupType字段用于区分完整、差异备份,1为完整备份,5为差异备份,这点Enterprise Manager似
乎做的不够好,在它的选择器中无法多选,这就导致无法在Enterprise Manager中对备份的设备进行差异恢复,
但是,如果自己编写一个程序,在RESTORE HEADERONLY获得设备中的备份记录后,像前面一样控制其选择项,最
终转换为

RESTORE DATABASE [CY] FROM DISK = N'G:/CY.BAK' WITH FILE = 1, NOUNLOAD , STATS = 10, NORECOVERY
RESTORE DATABASE [CY] FROM DISK = N'G:/CY.BAK' WITH FILE = 3, NOUNLOAD , STATS = 10, RECOVERY

语句,同样可以进行从设备的差异恢复,但我想,MS没有这么做也许有他的道理,可能是从设备进行恢复,无法
确定备份集之间的关系。

以上是差异恢复的主要步骤的命令,其中缺少一些过渡性的命令,像获取设备文件名之类的,我想你应该是知道
的,就不写了。

liu_sir说的不错,是需要记录,所以从数据库恢复,就可以做差异恢复,因为在一个SQL Server系统中,可以保
证备份记录集之间的关系,但离开了SQL Server系统,设备文件是没有什么记录可以保证设备中备份集之间的关
系的(也不可能有),这就是Enterprise Manager中不能对从设备恢复做差异恢复的原因,既然如此(我不认同唐太宗的观点,
其他的数据库系统应该也是有同样的问题的),我想,如果是从设备恢复,是没有什么办法“判断差异备份是否
当前完全备份的差异备份”的,如果是从数据库记录恢复,则只需根据备份记录的先后顺序去判断即可。

唉,本来想工作告一段落再做这件事,看你这么急,自己又手痒,今天就做了,终于完成了,花了我大半个下午
去分析、测试、总结,今天的编程进度是完不成了,而明天经理就要出差回来了……

看来今晚只有疯狂加班了……………………………………………………
 
辛苦dirt,放分。
 
后退
顶部