programing

서버에서 모든 데이터베이스 삭제

starjava 2023. 7. 6. 21:44
반응형

서버에서 모든 데이터베이스 삭제

300개 이상의 데이터베이스가 있는 서버(SQL Server 2005)가 있습니다.하나씩 마우스 오른쪽 단추를 클릭하고 선택하지 않습니다.Delete.

모든 데이터베이스를 쉽게 삭제하려면 어떻게 해야 합니까?

SSMS GUI를 통해 이 작업을 수행할 수 있습니다.다음을 선택합니다.Databases그런 다음 노드를 클릭하여 Object Explorer 세부 정보를 표시하고 삭제할 모든 데이터베이스를 선택한 다음 "Delete"를 누르고 "Close Existing Connections" 및 "Continue after error" 옵션을 선택합니다.

대신 TSQL을 통해 할 수 있습니다.

EXEC sp_MSforeachdb '
IF DB_ID(''?'') > 4
BEGIN
EXEC(''
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 스크립트 버전이 있습니다.모든 데이터베이스 삭제.ps1

$sqlCmdPath="C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\110\Tools\Binn\sqlcmd.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 버전으로 업데이트해야 할 수 있습니다.

T-SQL을 사용하여 MS-SQL의 모든 데이터베이스를 삭제(삭제)하는 안전한 방법은 보관할 모든 시스템 데이터베이스 및 기타 데이터베이스와 Data Warehouse 데이터베이스 "DW", Report 서버 데이터베이스와 같은 특수 데이터베이스를 제외하는 것입니다.

모든 시스템 데이터베이스를 포함하여 유지하려는 모든 데이터베이스를 제외하면 유지하지 않을 다른 모든 데이터베이스만 안전하게 삭제할 수 있습니다.

예:

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

데이터베이스에 문제가 있어서 위의 솔루션이 작동하지 않았습니다.

데이터베이스를 모두 삭제하고 싶었지만 이름에 문제가 있었습니다.실제로, 저는 다음과 같은 이름의 데이터베이스를 참조하십시오.

093e83d-somename;
39s2ak3-anothername;

이러한 데이터베이스(MariaDB에서 테스트됨)를 삭제하는 가장 쉬운 방법은 다음 명령을 실행하는 것입니다.

DROP DATABASE `093e83d-somename`;

백따옴표('') 사이에 데이터베이스 이름을 지정해야 하기 때문에 bash 파일에서 SQL 명령을 직접 실행하려는 경우 이러한 이름이 문제가 되는 것 같습니다.

동일한 문제가 있고 데이터베이스가 많은 경우 필요한 모든 명령으로 배치 스크립트를 만든 다음 SQL 서버에서 이 스크립트를 실행하면 됩니다.

예를 들어 테스트를 사용합니다.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

저는 이 스크립트가 모든 경우에 효과가 있다고 생각합니다.이것이 도움이 되었기를 바랍니다.

커서는 다음과 같이 사용할 수 있습니다.

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

저는 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

마틴 스미스의 대답은 옳은 해결책이지만,많은 데이터베이스 중 첫 번째 데이터베이스를 삭제하는 동안 개체 삭제 창이 '프로세스 중' 상태로 표시되어 있는 것을 발견했습니다.이는 '데이터베이스용 백업 및 복원 기록 정보 삭제' 옵션을 선택한 상태에서 정리를 시도하는 msdb 백업 기록이 지나치게 커졌기 때문입니다.

백업 기록 정리에 대한 자세한 내용은 다음 링크를 참조하십시오. 12

여기에 제공된 인덱스를 추가한 후 합리적인 시간 내에 삭제가 처리되었습니다.

enter image description here

아래와 위에 언급된 최상의 솔루션이 많이 있습니다.이 솔루션도 사용할 수 있습니다.

DECLARE @Counter INT , @MaxId INT, 
        @CountryName VARCHAR(100),@sql varchar(100)
SELECT @Counter = min(database_id) , @MaxId = max(database_id) 
FROM sys.databases 
 
WHILE(@Counter IS NOT NULL
      AND @Counter <= @MaxId)
BEGIN
 --begin try
if exists(select name from (select name from sys.databases where database_id=@Counter) as s where s.name not in ('master','tempdb','model','msdb','ReportServer$SQLEXPRESSTempDB','ReportServer$SQLEXPRESS')) 
begin
  SELECT @CountryName = name
   FROM sys.databases where  database_id=@Counter 
    
   PRINT CONVERT(VARCHAR,@Counter) + '. Database name is ' + @CountryName  ;
     SET @SQL = 'DROP DATABASE ' + @CountryName 
    PRINT @SQL
    EXEC (@SQL)
print 'success'
end
else

begin 
print 'Skipped'
end
 

 
--  end try
 -- begin catch
  --end catch
  
  
   SET @Counter  = @Counter  + 1        
END

언급URL : https://stackoverflow.com/questions/5777483/drop-all-databases-from-server

반응형