SQL Server中备份文件累积的问题
你创建的每一个备份都是一个备份设备,关于它的细节信息都存储在msdb..backupset表中。一个备份设备可以被存储在单一文件,或是多个文件中。同样,一个文件也可以存储多个备份设备。
所以,假如你每次备份都使用相同的文件名,文件就会一直增长。一个普遍的误解是:如果你每次使用相同的文件名,那旧的备份设备就会被覆盖。但事实却不是这样的。
那我们怎么分辨一个文件中是否包括多个备份设备呢?你可以使用RESTORE HEADONLY命令来实现。
如上图,文件中的所有备份设备都被列了出来。你怎么还原一个指定的备份设备呢?你可以使用FILE参数,如下:
RESTORE DATABASE AdventureWorks FROM DISK = 'g:/backups/AdventureWorks_full.bak' WITH FILE = 3
上面的命令是从文件中的第三个备份设备中还原AdventureWorks数据库。
如果你不使用FILE参数会如何呢?SQL Server会使用第一个备份设备来还原数据库。
注意:假如你的用户总是抱怨他们还原的数据库不是他们备份的那个,那就有可能是因为备份文件包含多个备份设备,他们把错的设备还原了。
能不能从一个文件中删除某个指定的备份设备呢?答案是NO。有没有可能总是相使用相同的文件来备份,但是每次都覆盖旧的备份设备,以便使文件总是只包括最新的备份设备呢?这当然可以,只要在备份时使用INIT选项,如下:
BACKUP DATABASE AdventureWorks TO DISK = 'G:/backups/full/AdventureWorks.bak' WITH INIT
假如备份设备在创建时使用了EXPIREDATE或是RETAINDAYS选项,那么INIT选项就会在覆盖旧版本的备份设备时发生错误。当备份设 备在创建时使用了EXPIREDATE的话,那这个日期之前的备份设备就不能被覆盖。同样,当一个备份设备在创建时使用了RETAINDAYS选项,那就 暗示在它创建指定的天数内,它不能被覆盖。假如强行要覆盖备份设备的话,类似的消息会显示如下:
Server: Msg 4030, Level 16, State 1, Line 1
The medium on device 'e:/temp/testdb.bak' expires on Jun 23 2008 11:28:50:000PM and cannot be overwritten.
Server: Msg 3013, Level 16, State 1, Line 1
BACKUP LOG is terminating abnormally.
如果你依旧想覆盖那些使用了EXPIREDATE或是RETAINDAYS备份设备的话,可以使用FORMAT选项,如下:
BACKUP DATABASE AdventureWorks TO DISK = 'G:/backups/full/AdventureWorks.bak' WITH FORMAT
备份文件积累的优缺点:
优点:
- 你可以把一周的备份设备整合到一个单一文件中。例如,在一周开始时,进行一个完整备份,后面就是期间性是进行差异备份或是事务日志备份。然后当你要还原数据库时,你仅仅需要一个单一文件,所有你需要的备份备份设备都在里面了。
缺点:
- 你的所有备份都在一个单一文件中。如果文件丢失,或者整个物理磁盘损坏,这会使你丢失所有的备份设备。
- 如果你打算在每次备份后,都要把备份文件拷贝到远端位置的话,那么最早的备份设备每次都会被重复拷贝一次,因为你无法只拷贝最新的备份设备。
本文翻译自sqlbackuprestore,更多精彩内容请浏览http://www.sqlbackuprestore.com
浙公网安备 33010602011771号