以编程方式删除大型数据库的最佳方法是什么

时间:2009-12-29 09:02:46

标签: sql-server-2005 tsql

我需要使用T-SQL在SQL Server 2005中删除一个特定的数据库。我知道在数据库trnsaction中无法完成丢弃数据库。那么如果在删除真正庞大的数据库时会发生一些意外的异常,例如。超时例外。它会使我的数据库处于不稳定状态吗?如果是,我该如何避免这种情况?

3 个答案:

答案 0 :(得分:3)

在保留数据库结构的同时删除数据库中所有记录的最佳方法是:

  1. 使数据库脱机;
  2. 禁用所有外键约束(如果强制执行参照完整性);
  3. 依次截断每个表格;
  4. 启用所有外键约束(如果需要参照完整性);
  5. 刷新所有物化视图;
  6. 重新分析数据库(因为以前的统计数据不再相关);
  7. 将数据库重新联机。
  8. 这可以以编程方式完成,但会根据您的数据库供应商和版本而有所不同。对于SQL Server 2005(您请求的版本),请尝试How to: Truncate Multiple Tables In SQL Server and the magic of sp_MSforeachtable

    如果数据库失败,这不应该使您的数据库处于不可用状态,因为它以这样的方式完成,如果它意外停止,您可以重新运行它,它将继续。

    如果您尝试使用数据库,如果脚本提前完成,那么您的数据库完全可能处于不一致状态(这是您使其脱机执行的一半原因;另一个原因是避免锁定)。

    更新:如果您只是想完全删除数据库,请参阅How do I drop a SQL Server database?。它归结为DROP DATABASE命令,但有时您也需要有效地使数据库脱机。

答案 1 :(得分:2)

取决于您运行t-sql的方式,您可以在运行命令之前更改超时。 SSMS默认为无超时,但您可以将SqlCommand的CommandTimeout更改为0(无超时)或大型。根据我的个人经验,失败的“drop database”运行并没有阻止它以后的运行成功,所以当你可能让数据库进入一个糟糕的状态时,我不相信它会在那里仍然存在但是不可挽回(但这只是我的经验,不可否认)

根据您是否要删除数据文件,我建议将数据库设置为single_user模式(如果要删除文件)或脱机(不删除文件)并立即回滚以帮助防止其他连接阻止掉落或导致其失败。

所以:

  • alter database [foo] set single_user with rollback immediate
  • alter database [foo]设置离线并立即回滚
  • drop database [foo]

确保检查drop database的各种行为(如上所述)@ http://msdn.microsoft.com/en-us/library/ms178613.aspx

答案 2 :(得分:0)

分离数据库,然后删除文件。