从服务器删除所有数据库

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从服务器删除所有数据库相关的知识,希望对你有一定的参考价值。

我有一个服务器(SQL Server 2005)有超过300个数据库。我不想一个一个地右键单击并选择Delete

如何轻松删除所有数据库?

答案

您可以通过SSMS GUI执行此操作。选择Databases节点,然后选择F7以显示对象资源管理器详细信息,选择要删除的所有数据库,点击“删除”并选择“关闭现有连接”和“错误后继续”选项。

或者通过TSQL你可以做到

EXEC sp_MSforeachdb '
IF DB_ID(''?'') > 4
BEGIN
ALTER DATABASE [?] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
DROP DATABASE [?]
END'

由于原因应该是显而易见的,因此您可能希望用DROP命令替换PRINT命令以首先验证事情,因此上述内容未经测试。

EXEC sp_MSforeachdb '
IF DB_ID(''?'') > 4
BEGIN
PRINT (''
ALTER DATABASE [?] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
DROP DATABASE [?]'')
END
'
另一答案

这是我对同一问题的解决方案:

-- drops all user databases
DECLARE @command nvarchar(max)
SET @command = ''

SELECT  @command = @command
+ 'ALTER DATABASE [' + [name] + ']  SET single_user with rollback immediate;'+CHAR(13)+CHAR(10)
+ 'DROP DATABASE [' + [name] +'];'+CHAR(13)+CHAR(10)
FROM  [master].[sys].[databases] 
 where [name] not in ( 'master', 'model', 'msdb', 'tempdb');

SELECT @command
EXECUTE sp_executesql @command
另一答案

这将终止所有连接,并删除列表中没有的所有数据库:

('master','tempdb','model','msdb','ReportServer','ReportServerTempDB')


use [master]

DECLARE 
@DATABASENAME nVARCHAR(20)

DECLARE
@TABLE TABLE
(NAME nVARCHAR(50))

Declare @SQL nvarchar(100)

INSERT INTO @TABLE

SELECT 
name 
FROM sys.databases 
WHERE name not in 
    ('master'
    ,'tempdb'
    ,'model'
    ,'msdb'
    ,'ReportServer'
    ,'ReportServerTempDB')


while (select COUNT(*) from @table) > 0

begin

select @DATABASENAME = (select top 1 (name) from @TABLE)

DECLARE @kill varchar(8000) = '';
SELECT @kill = @kill + 'kill ' + CONVERT(varchar(5), spid) + ';'
FROM master..sysprocesses 
WHERE dbid = db_id(@DATABASENAME)

EXEC(@kill);

set @SQL = 'drop database ' + @DATABASENAME

exec sp_executesql @SQL, N'@databasename nvarchar(50)', @databasename; 

print @databasename + ' has been deleted'

delete from @TABLE where NAME = @DATABASENAME

end
另一答案

这是我的PowerShell脚本版本。 DropAllDatabases.ps1

$sqlCmdPath="C:Program FilesMicrosoft SQL ServerClient SDKODBC110ToolsBinnsqlcmd.exe"
& $sqlCmdPath -S localhost -Q "EXEC sp_MSforeachdb 'IF DB_ID(''?'') > 4 BEGIN PRINT ''?'' ALTER DATABASE [?] SET SINGLE_USER WITH ROLLBACK IMMEDIATE DROP DATABASE [?] END'"

注意:您可能需要将$ sqlCmdPath更新为您的SQL版本。

另一答案

我遇到了我的数据库问题,上面的解决方案无法正常工作。

我只是想删除我的所有数据库,但我的名字有问题。实际上,我的数据库名称如下:

093e83d-somename;
39s2ak3-anothername;

删除这些数据库(在MariaDB上测试)的更简单方法是执行以下命令:

DROP DATABASE `093e83d-somename`;

当我们直接想要从bash文件执行SQL命令时,这种名称似乎是一个问题,因为我们必须在后引号(``)之间指定数据库的名称。

如果您遇到同样的问题,并且您拥有大量数据库,则只需创建一个包含所需命令的批处理脚本,然后在SQL Server中执行此命令。

test.sh示例:

#!/bin/bash

# Informations needed
MUSER="root"
MPASS="pass"

# We get the needed binaries
mysql=$(which mysql)
AWK=$(which awk)
GREP=$(which grep)

# We get all the DB names in DB
DB=$($MYSQL -u $MUSER -p$MPASS -e 'show databases' | $AWK '{ print $1}' | $GREP -v '^Databases' )

# For each database, we write the drop command in the file test.sql
for t in $DB
do
    echo -e "DROP DATABASE `$t`;" >> test.sql
done

# We execute the created SQL file with all the DROP commands
$MYSQL -u $MUSER -p$MPASS -e 'source test.sql;'

# We finally delete the created file.
rm test.sql

我认为这个脚本适用于所有情况。希望这有帮助。

另一答案

我使用了Pellared提供的答案并略微修改了它。

-- drops all user databases
DECLARE @command nvarchar(max)
SET @command = ''

SELECT  @command = @command
+ 'ALTER DATABASE [' + [name] + ']  SET single_user with rollback immediate;'+CHAR(13)+CHAR(10)
+ 'DROP DATABASE [' + [name] +'];'+CHAR(13)+CHAR(10)
FROM  [master].[sys].[databases] 
where [name] like 'DBName%';

-- PRINT @COMMAND
EXECUTE sp_executesql @command
另一答案

而MartinSmith的答案是正确的解决方案。我发现删除对象窗口只是处于“进行中”状态,同时删除了许多数据库中的第一个。这是由于一个过度生长的msdb备份历史记录,该历史记录试图通过选中“删除数据库的备份和还原历史记录信息”选项进行清理。

有关清理备份历史记录1 2的详细信息,请参阅这些链接

添加here提供的索引后,删除在合理的时间内处理。

另一答案

您可以像这样使用Cursor:

DECLARE @DBName VARCHAR (64)
DECLARE @SQL VARCHAR (255)

DECLARE DROPDB CURSOR FOR 
SELECT name FROM sys.databases
WHERE name NOT IN ('master','model','msdb','tempdb','distribution','ReportServer','ReportServerTempDB')

OPEN DROPDB
FETCH next FROM DROPDB INTO @DBName
WHILE @@FETCH_STATUS = 0

BEGIN
    SET @SQL = 'DROP DATABASE ' + @DBName
    PRINT @SQL
    EXEC @SQL
    FETCH next FROM DROPDB INTO @DBName
END

CLOSE DROPDB
DEALLOCATE DROPDB

在我的博客中更多地是关于这个主题。 www.pigeonsql.com

另一答案

使用T-SQL删除(删除)MS-SQL中所有数据库的安全方法是排除所有系统数据库和您要保留的任何其他数据库,以及特殊数据库,如数据仓库数据库“DW”,报告服务器数据库

排除我们要保留的所有数据库(包括所有系统数据库),可以安全地删除我们不想保留的所有其他数据库。

例如:

use master
go
declare @dbnames nvarchar(max)
declare @statement nvarchar(max)
set @dbnames = ''
set @statement = ''
select @dbnames = @dbnames + ',[' + name + ']' from sys.databases 
    where name 
    NOT IN ('master','model','msdb','tempdb') 
    AND name NOT LIKE '%AdventureWorks%' -- Database to keep 
    AND name NOT LIKE '%DW%' -- Data warehouse database
    AND name NOT LIKE '%ReportServer%' -- Report server database
if len(@dbnames) = 0
    begin
    print 'no databases to drop'
    end
else
    begin
    set @statement = 'drop database ' + substring(@dbnames, 2, len(@dbnames))
    print @statement
    exec sp_executesql @statement
    end
go

以上是关于从服务器删除所有数据库的主要内容,如果未能解决你的问题,请参考以下文章

Swift新async/await并发中利用Task防止指定代码片段执行的数据竞争(Data Race)问题

从列表视图中删除一行后刷新片段

如何从一个片段中删除数据,这些片段应该反映在google firebase中的其他片段中

从单个按钮从多个片段中提取数据

Android,如何从 Google Map V2 中删除所有标记?

如何删除使用片段管理器添加的所有片段?