我有一个c#项目,其功能是复制现有的SQL数据库(2012版)。
为此,我使用SMO类Backup
和Restore
来备份数据库,然后以新名称还原它们。数据库副本将还原为“仅复制”,以免影响数据库的整体备份和还原过程。
所有这一切都很好。
问题是我似乎无法摆脱执行备份时创建的* .bak文件。我应该提到正在服务器盒上创建* .bak文件。
我尝试使用系统存储过程msdb.dbo.sp_delete_backuphistory
的修改版本,它尝试删除对我从系统表创建的备份的所有引用。这运行没有错误。但是,这并没有触发我认为可能发生的文件的清理?
我也尝试过查看xp_delete_deletefile
但这似乎不合适,因为它需要一个'删除日期'参数。原因是我只想删除我创建的一个特定备份文件。
正在逐步删除备份文件吗? (1)从系统表中删除然后(2)从磁盘删除?或者是否有一个我不知道的一步过程?
有人可以指出我做错了什么,以便永久删除* .bak文件吗?
请注意,我对SQL服务器没有任何经验,所以非常感谢您的帮助。
非常感谢提前。
以下是修改后的存储过程的副本:
DECLARE @backup_set_id TABLE (backup_set_id INT)
DECLARE @media_set_id TABLE (media_set_id INT)
DECLARE @restore_history_id TABLE (restore_history_id INT)
INSERT INTO @backup_set_id (backup_set_id)
SELECT DISTINCT backup_set_id
FROM msdb.dbo.backupset
WHERE expiration_date IS NOT NULL AND expiration_date < @oldest_date AND database_name = @DBName AND is_copy_only = 1
INSERT INTO @media_set_id (media_set_id)
SELECT DISTINCT media_set_id
FROM msdb.dbo.backupset
WHERE expiration_date IS NOT NULL AND expiration_date < @oldest_date AND database_name = @DBName AND is_copy_only = 1
INSERT INTO @restore_history_id (restore_history_id)
SELECT DISTINCT restore_history_id
FROM msdb.dbo.restorehistory
WHERE backup_set_id IN (SELECT backup_set_id
FROM @backup_set_id)
BEGIN TRANSACTION
DELETE FROM msdb.dbo.backupfile
WHERE backup_set_id IN (SELECT backup_set_id
FROM @backup_set_id)
IF (@@error > 0)
GOTO Quit
DELETE FROM msdb.dbo.backupfilegroup
WHERE backup_set_id IN (SELECT backup_set_id
FROM @backup_set_id)
IF (@@error > 0)
GOTO Quit
DELETE FROM msdb.dbo.restorefile
WHERE restore_history_id IN (SELECT restore_history_id
FROM @restore_history_id)
IF (@@error > 0)
GOTO Quit
DELETE FROM msdb.dbo.restorefilegroup
WHERE restore_history_id IN (SELECT restore_history_id
FROM @restore_history_id)
IF (@@error > 0)
GOTO Quit
DELETE FROM msdb.dbo.restorehistory
WHERE restore_history_id IN (SELECT restore_history_id
FROM @restore_history_id)
IF (@@error > 0)
GOTO Quit
DELETE FROM msdb.dbo.backupset
WHERE backup_set_id IN (SELECT backup_set_id
FROM @backup_set_id)
IF (@@error > 0)
GOTO Quit
DELETE msdb.dbo.backupmediafamily
FROM msdb.dbo.backupmediafamily bmf
WHERE bmf.media_set_id IN (SELECT media_set_id
FROM @media_set_id)
AND ((SELECT COUNT(*)
FROM msdb.dbo.backupset
WHERE media_set_id = bmf.media_set_id) = 0)
IF (@@error > 0)
GOTO Quit
DELETE msdb.dbo.backupmediaset
FROM msdb.dbo.backupmediaset bms
WHERE bms.media_set_id IN (SELECT media_set_id
FROM @media_set_id)
AND ((SELECT COUNT(*)
FROM msdb.dbo.backupset
WHERE media_set_id = bms.media_set_id) = 0)
IF (@@error > 0)
GOTO Quit
COMMIT TRANSACTION
RETURN
Quit:
ROLLBACK TRANSACTION