Microsoft SQL Server 2005 DB 서버가 있습니다. DB 서버에는 약 250 개의 사용자 데이터베이스가 있습니다. 이 모든 데이터베이스를 백업해야합니다. 수동으로 백업을 수행하는 데 많은 시간이 걸리므로 250 개 데이터베이스를 모두 자동으로 백업하는 배치 스크립트 또는 DB 스크립트를 찾고 있습니다. 누구든지 도와주세요.
답변
참고 : 먼저
D:
드라이브에 폴더를 만드십시오 . (예를 들어D:\User_DataBackup\
)
1 단계 : 아래에 나와있는 절차를 만듭니다.
Create PROCEDURE [dbo].[UserDataBaseBackUp]
AS
BEGIN
SET NOCOUNT ON;
DECLARE @name VARCHAR(50) -- database name
DECLARE @path VARCHAR(256) -- path for backup files
DECLARE @fileName VARCHAR(256) -- filename for backup
DECLARE @fileDate VARCHAR(20) -- used for file name
SET @path = 'D:\User_DataBackup\' -- as same as your created folder'
SELECT @fileDate = CONVERT(VARCHAR(20),GETDATE(),104)
DECLARE db_cursor CURSOR FOR
SELECT name
FROM MASTER.dbo.sysdatabases
WHERE name NOT IN ('master','model','msdb','tempdb','ReportServer','ReportServerTempDB')
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @name
WHILE @@FETCH_STATUS = 0
BEGIN
SET @fileName = @path + @name + '_' + @fileDate + '.BAK'
BACKUP DATABASE @name TO DISK = @fileName
FETCH NEXT FROM db_cursor INTO @name
END
CLOSE db_cursor
DEALLOCATE db_cursor
END
2 단계 : 위 절차를 실행하십시오.
EXEC [UserDataBaseBackUp]
이 절차를 예약 할 수도 있습니다. 이 절차가 도움이 되길 바랍니다.
답변
유지 보수 계획 개발
SQL Server에는 스크립트와 작업을 생성 할 수있는이 놀라운 기능이 있습니다.
-
1 단계 : 아래를
마우스 오른쪽 버튼으로 클릭Maintenance Plan
Management
-
2 단계 :
계획 이름 지정 -
3 단계 :
데이터베이스 백업 작업 선택 -
4 단계 :
작업 구성, 데이터베이스, 폴더 위치, 백업 유형 (전체, 차등, 트랜잭션 로그) 연결 등을 선택합니다. -
5 단계 :
작업 일정 구성
모든 종류의 문제를 피하기 위해 시스템 데이터베이스 와 사용자 데이터베이스에 대한 별도의 계획을 세우는 것이 좋습니다.
도움이되는 링크 :
답변
SSMS로 많은 데이터베이스를 유지 관리하는 것은 약간 혼란 스러울 수 있다는 사실을 알고 있지만 간단합니다.
Ola Hallengren의 유지 보수 스크립트를 사용하는보다 효과적인 방법을 추천 할 수 있습니다 . 매우 시원하고 매우 효과적입니다. 또한 모든 데이터베이스를 백업하는 것보다 훨씬 많은 작업을 수행 할 수 있으며 모든 유형의 유지 관리 절차를 수행 할 수 있습니다.
예를 들어 다음과 같은 명령을 사용하여 모든 데이터베이스를 백업하고 압축 한 다음 선택한 인증서로 데이터베이스를 암호화 할 수 있습니다 (모두 선택 사항이며 SQL Server 2005에서는 암호화 및 압축이 작동하지 않습니다). Ola의 스크립트의 유연성과 장점을 보여줍니다) :
EXECUTE dbo.DatabaseBackup @Databases = 'USER_DATABASES',
@Directory = 'C:\Backup',
@BackupType = 'FULL',
@Compress = 'Y',
@Encrypt = 'Y',
@EncryptionAlgorithm = 'AES_256',
@ServerCertificate = 'MyCertificate'
답변
JP의 답변을 연구하면서 대상 디렉토리를 전달하는 매개 변수를 추가했으며 옵션을 추가 할 수도 있습니다.
Create PROCEDURE [dbo].[UserDataBaseBackUp] (
@OutputDir varchar(255)
) AS
BEGIN
SET NOCOUNT ON;
DECLARE @name VARCHAR(50) -- database name
DECLARE @path VARCHAR(256) -- path for backup files
DECLARE @fileName VARCHAR(256) -- filename for backup
DECLARE @fileDate VARCHAR(20) -- used for file name
SET @path = @OutputDir
SELECT @fileDate = CONVERT(VARCHAR(20),GETDATE(),104)
PRINT 'Starting Backups'
DECLARE db_cursor CURSOR FOR
SELECT name FROM MASTER.dbo.sysdatabases
WHERE name NOT IN ('master','model','msdb','tempdb','ReportServer','ReportServerTempDB')
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @name
WHILE @@FETCH_STATUS = 0 BEGIN
SET @fileName = @path + @name + '_' + @fileDate + '.BAK'
PRINT 'Starting Backup For ' + @name
BACKUP DATABASE @name TO DISK = @fileName WITH FORMAT
FETCH NEXT FROM db_cursor INTO @name
END
CLOSE db_cursor
DEALLOCATE db_cursor
PRINT 'Backups Finished'
END
GO
그럼:
EXEC UserDataBaseBackUp @OutputDir = 'F:\Backups\SQL Databases\'
답변
다음과 같이 SELECT 문 또는 CURSOR를 사용할 수 있습니다.
DECLARE @PathForBackUp VARCHAR(255)
SET @PathForBackUp = 'F:\Backup\User DB\'
SELECT 'BACKUP DATABASE [' + name + '] TO DISK = N''' + @PathForBackUp + '' + name + '.bak''
WITH NOFORMAT, NOINIT, NAME = N''' + name + '_FullBackUp'', SKIP, NOREWIND, NOUNLOAD, COMPRESSION, STATS = 5'
FROM sys.databases
WHERE database_id > 4
또는
DECLARE @DBName VARCHAR(255)
DECLARE @PathForBackUp VARCHAR(255)
DECLARE @FileName VARCHAR(255)
DECLARE @DateFile VARCHAR(255)
DECLARE @SQL NVARCHAR(2048)
SET @PathForBackUp = 'F:\Backup\User DB\'
SET @DateFile = REPLACE(REPLACE(CONVERT(VARCHAR(20),GETDATE(),120) ,' ','T'), ':','')
DECLARE BACKUPING CURSOR FOR
SELECT name
FROM master.dbo.sysdatabases WHERE dbid > 4
OPEN BACKUPING
FETCH NEXT FROM BACKUPING INTO @DBName
WHILE @@FETCH_STATUS = 0
BEGIN
SET @FileName = @PathForBackUp + @DBName + '_' + @DateFile + '.BAK'
SET @SQL = 'BACKUP DATABASE '+@DBName+ ' TO DISK = '''+@FileName+''' WITH COMPRESSION '
PRINT @SQL
EXECUTE sp_executesql @sql
FETCH NEXT FROM BACKUPING INTO @DBName
END
CLOSE BACKUPING
DEALLOCATE BACKUPING
답변
Buck Woody의 PowerShell을 사용하여 모든 사용자 데이터베이스 백업에 표시된대로 PowerShell을 사용할 수도 있습니다 .
# Performs a Full backup followed by a transaction log backup on all user databases
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO") | out-null
$s = new-object ('Microsoft.SqlServer.Management.Smo.Server') 'BWOODY1\SQL2K8'
$bkdir = $s.Settings.BackupDirectory
$dbs = $s.Databases
$dbs | foreach-object {
$db = $_
if ($db.IsSystemObject -eq $False -and $db.IsMirroringEnabled -eq $False) {
$dbname = $db.Name
$dt = get-date -format yyyyMMddHHmmss
$dbbk = new-object ('Microsoft.SqlServer.Management.Smo.Backup')
$dbbk.Action = 'Database'
$dbbk.BackupSetDescription = "Full backup of " + $dbname
$dbbk.BackupSetName = $dbname + " Backup"
$dbbk.Database = $dbname
$dbbk.MediaDescription = "Disk"
$dbbk.Devices.AddDevice($bkdir + "\" + $dbname + "_db_" + $dt + ".bak", 'File')
$dbbk.SqlBackup($s)
if ($db.DatabaseOptions.RecoveryModel -ne 'Simple') {
$dt = get-date -format yyyyMMddHHmmss
$dbtrn = new-object ('Microsoft.SqlServer.Management.Smo.Backup')
$dbtrn.Action = 'Log'
$dbtrn.BackupSetDescription = "Trans Log backup of " + $dbname
$dbtrn.BackupSetName = $dbname + " Backup"
$dbtrn.Database = $dbname
$dbtrn.MediaDescription = "Disk"
$dbtrn.Devices.AddDevice($bkdir + "\" + $dbname + "_tlog_" + $dt + ".trn", 'File')
$dbtrn.SqlBackup($s)
}
}
}