如何从磁盘中删除特定的SQL * .bak文件

时间:2017-12-11 11:04:14

标签: c# sql-server database-backups smo

我有一个c#项目,其功能是复制现有的SQL数据库(2012版)。

为此,我使用SMO类BackupRestore来备份数据库,然后以新名称还原它们。数据库副本将还原为“仅复制”,以免影响数据库的整体备份和还原过程。

所有这一切都很好。

问题是我似乎无法摆脱执行备份时创建的* .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

0 个答案:

没有答案