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中不能对从设备恢复做差异恢复的原因,既然如此(我不认同唐太宗的观点,
其他的数据库系统应该也是有同样的问题的),我想,如果是从设备恢复,是没有什么办法“判断差异备份是否
当前完全备份的差异备份”的,如果是从数据库记录恢复,则只需根据备份记录的先后顺序去判断即可。
唉,本来想工作告一段落再做这件事,看你这么急,自己又手痒,今天就做了,终于完成了,花了我大半个下午
去分析、测试、总结,今天的编程进度是完不成了,而明天经理就要出差回来了……
看来今晚只有疯狂加班了……………………………………………………