서버에서 모든 데이터베이스 삭제
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
여기에 제공된 인덱스를 추가한 후 합리적인 시간 내에 삭제가 처리되었습니다.
아래와 위에 언급된 최상의 솔루션이 많이 있습니다.이 솔루션도 사용할 수 있습니다.
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
'programing' 카테고리의 다른 글
MongoDB: 배열 요소의 속성에 대한 고유 인덱스 (0) | 2023.07.06 |
---|---|
Mac용 Excel의 배열 수식 (0) | 2023.07.06 |
중괄호와 와일드카드를 사용한 Oracle 텍스트 이스케이프 (0) | 2023.07.06 |
CTRL+A 바로 가기를 사용하여 블록을 선택하는 것을 에뮬레이트하는 VBA 코드는 무엇입니까? (0) | 2023.07.06 |
테이블에 대해 작성된 인덱스를 postgres에 나열하는 방법 (0) | 2023.07.06 |