내부 서버에서 DB 백업을 수행하는 데 너무 느슨했습니다.
SQL Server 2005에서 특정 데이터베이스를 백업하는 데 사용할 수있는 간단한 명령 줄 프로그램이 있습니까? 아니면 간단한 VBScript가 있습니까?
답변:
명령 줄에서 단일 데이터베이스를 백업하려면 osql 또는 sqlcmd를 사용 합니다.
"C:\Program Files\Microsoft SQL Server\90\Tools\Binn\osql.exe"
-E -Q "BACKUP DATABASE mydatabase TO DISK='C:\tmp\db.bak' WITH FORMAT"
WITH FORMAT
저장 매체 를 포맷합니다. " FORMAT 옵션은 기존 컨텐츠를 무시하고 전체 미디어 컨텐츠를 무효화합니다. "이것이 원하는 것인지 확인하십시오.
osql.exe
있었다C:\Program Files\Microsoft SQL Server\140\Tools\Binn\OSQL.EXE
ExpressMaint를 사용 합니다.
모든 사용자 데이터베이스를 백업하려면 예를 들면 다음과 같습니다.
C:\>ExpressMaint.exe -S (local)\sqlexpress -D ALL_USER -T DB -BU HOURS -BV 1 -B c:\backupdir\ -DS
모든 데이터베이스를 백업하려면 다음을 예약하십시오.
Use Master
Declare @ToExecute VarChar(8000)
Select @ToExecute = Coalesce(@ToExecute + 'Backup Database ' + [Name] + ' To Disk = ''D:\Backups\Databases\' + [Name] + '.bak'' With Format;' + char(13),'')
From
Master..Sysdatabases
Where
[Name] Not In ('tempdb')
and databasepropertyex ([Name],'Status') = 'online'
Execute(@ToExecute)
내 블로그에 SQL Server Express 백업 을 자동화 하는 방법에 대한 자세한 내용도 있습니다 .
Microsoft 지원 페이지 http://support.microsoft.com/kb/2019698 에서 찾았습니다 .
잘 작동합니다! 그리고 Microsoft에서 왔기 때문에 꽤 합법적이라고 생각합니다.
기본적으로 두 단계가 있습니다.
작업 스케줄러에서 백업을 예약합니다. 먼저 .bat 또는 .cmd 파일에 넣은 다음 해당 파일을 예약 할 수 있습니다.
sqlcmd -S YOUR_SERVER_NAME\SQLEXPRESS -E -Q "EXEC sp_BackupDatabases @backupLocation='C:\SQL_Backup\', @backupType='F'" 1>c:\SQL_Backup\backup.log
분명히 YOUR_SERVER_NAME을 컴퓨터 이름으로 바꾸거나 선택적으로. \ SQLEXPRESS를 시도하고 백업 폴더가 있는지 확인하십시오. 이 경우 c : \ SQL_Backup에 넣으려고합니다.
ApexSQL로 백업 응용 프로그램을 사용할 수 있습니다. GUI 응용 프로그램이지만 CLI에서 지원되는 모든 기능이 있습니다. 일회성 백업 작업을 수행하거나 지정된 데이터베이스를 정기적으로 백업하는 작업을 생성 할 수 있습니다. 스위치 규칙과 예제를 확인할 수 있습니다.
–E 스위치가 선언 한대로 신뢰할 수있는 연결이없는 경우 결국
다음 명령 줄 사용
"[program dir]\[sql server version]\Tools\Binn\osql.exe" -Q "BACKUP DATABASE mydatabase TO DISK='C:\tmp\db.bak'" -S [server] –U [login id] -P [password]
어디
[프로그램 디렉토리]는 osql.exe가있는 디렉토리입니다.
32 비트 OS c : \ Program Files \ Microsoft SQL Server \
64 비트 OS c : \ Program Files (x86) \ Microsoft SQL Server \
[sql 서버 버전] SQL 서버 버전 110 또는 100 또는 90 또는 80이 가장 큰 숫자로 시작
[서버] 서버 이름 또는 서버 IP
[로그인 ID] MS-SQL 서버 사용자 로그인 이름
[비밀번호] 필수 로그인 비밀번호
C:\tmp
서버 또는 로컬 경로 입니까?
SQL Express의 모든 사용자 데이터베이스 백업에 대한 Microsoft의 답변은 다음과 같습니다.
프로세스는 다음과 같습니다. 데이터베이스 서버에서 쿼리로 해당 코드를 복사, 붙여 넣기 및 실행합니다 (아래 참조. 상단에 주석이없는 이상한 줄 몇 개를 주석 처리했습니다). 즉, 먼저 SQL Server Management Studio를 설치해야합니다 (또는 그렇지 않으면 SSMS를 사용하여 데이터베이스 서버에 연결). 이 코드 실행은 데이터베이스 서버에 저장 프로 시저를 만듭니다.
저장 프로 시저를 실행할 배치 파일을 만든 다음 작업 스케줄러를 사용하여이 배치 파일의 주기적 (예 : 야간) 실행을 예약합니다. 내 코드 (작동)는 첫 번째 예제의 약간 수정 된 버전입니다.
sqlcmd -S SQLEXPRESS -E -Q "EXEC sp_BackupDatabases @backupLocation='E:\SQLBackups\', @backupType='F'"
이것은 나를 위해 일했고 나는 그것을 좋아합니다. 실행할 때마다 새 백업 파일이 생성됩니다. 정기적으로 오래된 백업 파일을 삭제하는 방법을 고안해야합니다. 이미 그런 작업을 수행하는 루틴이 있으므로 디스크에 며칠 분량의 백업을 보관 한 다음 (정상적인 백업 루틴으로 백업 할 수있을만큼 충분히 긴 시간) 삭제하겠습니다. 즉, 백업 시스템에서 복원 할 필요없이 항상 며칠 분량의 백업을 보유 할 수 있습니다.
아래에 Microsoft의 저장 프로 시저 생성 스크립트를 붙여 넣겠습니다.
--// Copyright © Microsoft Corporation. All Rights Reserved.
--// This code released under the terms of the
--// Microsoft Public License (MS-PL, http://opensource.org/licenses/ms-pl.html.)
USE [master]
GO
/****** Object: StoredProcedure [dbo].[sp_BackupDatabases] ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: Microsoft
-- Create date: 2010-02-06
-- Description: Backup Databases for SQLExpress
-- Parameter1: databaseName
-- Parameter2: backupType F=full, D=differential, L=log
-- Parameter3: backup file location
-- =============================================
CREATE PROCEDURE [dbo].[sp_BackupDatabases]
@databaseName sysname = null,
@backupType CHAR(1),
@backupLocation nvarchar(200)
AS
SET NOCOUNT ON;
DECLARE @DBs TABLE
(
ID int IDENTITY PRIMARY KEY,
DBNAME nvarchar(500)
)
-- Pick out only databases which are online in case ALL databases are chosen to be backed up
-- If specific database is chosen to be backed up only pick that out from @DBs
INSERT INTO @DBs (DBNAME)
SELECT Name FROM master.sys.databases
where state=0
AND name=@DatabaseName
OR @DatabaseName IS NULL
ORDER BY Name
-- Filter out databases which do not need to backed up
IF @backupType='F'
BEGIN
DELETE @DBs where DBNAME IN ('tempdb','Northwind','pubs','AdventureWorks')
END
ELSE IF @backupType='D'
BEGIN
DELETE @DBs where DBNAME IN ('tempdb','Northwind','pubs','master','AdventureWorks')
END
ELSE IF @backupType='L'
BEGIN
DELETE @DBs where DBNAME IN ('tempdb','Northwind','pubs','master','AdventureWorks')
END
ELSE
BEGIN
RETURN
END
-- Declare variables
DECLARE @BackupName varchar(100)
DECLARE @BackupFile varchar(100)
DECLARE @DBNAME varchar(300)
DECLARE @sqlCommand NVARCHAR(1000)
DECLARE @dateTime NVARCHAR(20)
DECLARE @Loop int
-- Loop through the databases one by one
SELECT @Loop = min(ID) FROM @DBs
WHILE @Loop IS NOT NULL
BEGIN
-- Database Names have to be in [dbname] format since some have - or _ in their name
SET @DBNAME = '['+(SELECT DBNAME FROM @DBs WHERE ID = @Loop)+']'
-- Set the current date and time n yyyyhhmmss format
SET @dateTime = REPLACE(CONVERT(VARCHAR, GETDATE(),101),'/','') + '_' + REPLACE(CONVERT(VARCHAR, GETDATE(),108),':','')
-- Create backup filename in path\filename.extension format for full,diff and log backups
IF @backupType = 'F'
SET @BackupFile = @backupLocation+REPLACE(REPLACE(@DBNAME, '[',''),']','')+ '_FULL_'+ @dateTime+ '.BAK'
ELSE IF @backupType = 'D'
SET @BackupFile = @backupLocation+REPLACE(REPLACE(@DBNAME, '[',''),']','')+ '_DIFF_'+ @dateTime+ '.BAK'
ELSE IF @backupType = 'L'
SET @BackupFile = @backupLocation+REPLACE(REPLACE(@DBNAME, '[',''),']','')+ '_LOG_'+ @dateTime+ '.TRN'
-- Provide the backup a name for storing in the media
IF @backupType = 'F'
SET @BackupName = REPLACE(REPLACE(@DBNAME,'[',''),']','') +' full backup for '+ @dateTime
IF @backupType = 'D'
SET @BackupName = REPLACE(REPLACE(@DBNAME,'[',''),']','') +' differential backup for '+ @dateTime
IF @backupType = 'L'
SET @BackupName = REPLACE(REPLACE(@DBNAME,'[',''),']','') +' log backup for '+ @dateTime
-- Generate the dynamic SQL command to be executed
IF @backupType = 'F'
BEGIN
SET @sqlCommand = 'BACKUP DATABASE ' +@DBNAME+ ' TO DISK = '''+@BackupFile+ ''' WITH INIT, NAME= ''' +@BackupName+''', NOSKIP, NOFORMAT'
END
IF @backupType = 'D'
BEGIN
SET @sqlCommand = 'BACKUP DATABASE ' +@DBNAME+ ' TO DISK = '''+@BackupFile+ ''' WITH DIFFERENTIAL, INIT, NAME= ''' +@BackupName+''', NOSKIP, NOFORMAT'
END
IF @backupType = 'L'
BEGIN
SET @sqlCommand = 'BACKUP LOG ' +@DBNAME+ ' TO DISK = '''+@BackupFile+ ''' WITH INIT, NAME= ''' +@BackupName+''', NOSKIP, NOFORMAT'
END
-- Execute the generated SQL command
EXEC(@sqlCommand)
-- Goto the next database
SELECT @Loop = min(ID) FROM @DBs where ID>@Loop
END
이 목적으로 정확히 작성한 VB 스크립트를 사용할 수 있습니다. https://github.com/ezrarieben/mssql-backup-vbs/
"작업 스케줄러"에서 원하는대로 스크립트를 실행하도록 작업을 예약하면 전체 DB를 BAK 파일로 백업하고 지정한 위치에 저장합니다.
SET NOCOUNT ON;
declare @PATH VARCHAR(200)='D:\MyBackupFolder\'
-- path where you want to take backups
IF OBJECT_ID('TEMPDB..#back') IS NOT NULL
DROP TABLE #back
CREATE TABLE #back
(
RN INT IDENTITY (1,1),
DatabaseName NVARCHAR(200)
)
INSERT INTO #back
SELECT 'MyDatabase1'
UNION SELECT 'MyDatabase2'
UNION SELECT 'MyDatabase3'
UNION SELECT 'MyDatabase4'
-- your databases List
DECLARE @COUNT INT =0 , @RN INT =1, @SCRIPT NVARCHAR(MAX)='', @DBNAME VARCHAR(200)
PRINT '---------------------FULL BACKUP SCRIPT-------------------------'+CHAR(10)
SET @COUNT = (SELECT COUNT(*) FROM #back)
PRINT 'USE MASTER'+CHAR(10)
WHILE(@COUNT > = @RN)
BEGIN
SET @DBNAME =(SELECT DatabaseName FROM #back WHERE RN=@RN)
SET @SCRIPT ='BACKUP DATABASE ' +'['+@DBNAME+']'+CHAR(10)+'TO DISK =N'''+@PATH+@DBNAME+ N'_Backup_'
+ REPLACE ( REPLACE ( REPLACE ( REPLACE ( CAST ( CAST ( GETDATE () AS DATETIME2 ) AS VARCHAR ( 100 )), '-' , '_' ), ' ' , '_' ), '.' , '_' ), ':' , '' )+'.bak'''+CHAR(10)+'WITH COMPRESSION, STATS = 10'+CHAR(10)+'GO'+CHAR(10)
PRINT @SCRIPT
SET @RN=@RN+1
END
PRINT '---------------------DIFF BACKUP SCRIPT-------------------------'+CHAR(10)
SET @COUNT =0 SET @RN =1 SET @SCRIPT ='' SET @DBNAME =''
SET @COUNT = (SELECT COUNT(*) FROM #back)
PRINT 'USE MASTER'+CHAR(10)
WHILE(@COUNT > = @RN)
BEGIN
SET @DBNAME =(SELECT DatabaseName FROM #back WHERE RN=@RN)
SET @SCRIPT ='BACKUP DATABASE ' +'['+@DBNAME+']'+CHAR(10)+'TO DISK =N'''+@PATH+@DBNAME+ N'_Backup_'
+ REPLACE ( REPLACE ( REPLACE ( REPLACE ( CAST ( CAST ( GETDATE () AS DATETIME2 ) AS VARCHAR ( 100 )), '-' , '_' ), ' ' , '_' ), '.' , '_' ), ':' , '' )+'.diff'''+CHAR(10)+'WITH DIFFERENTIAL, COMPRESSION, STATS = 10'+CHAR(10)+'GO'+CHAR(10)
PRINT @SCRIPT
SET @RN=@RN+1
END
DB 파일을 찾을 수있는 경우 ... "cp DBFiles backup /"
대부분의 경우에 거의 권장하지 않지만 모든 getup만큼 간단합니다.