SQL Server 데이터베이스를 백업하는 간단한 명령 줄 프로그램 또는 스크립트는 무엇입니까?


94

내부 서버에서 DB 백업을 수행하는 데 너무 느슨했습니다.

SQL Server 2005에서 특정 데이터베이스를 백업하는 데 사용할 수있는 간단한 명령 줄 프로그램이 있습니까? 아니면 간단한 VBScript가 있습니까?


6
개인적으로 나는 주문 레몬 응용 프로그램과 지시 오렌지 유틸리티에 훨씬 더 운이 좋다. 커맨드 라임 프로그램은 가치보다 훨씬 더 많은 문제입니다.
Jim

답변:


108

명령 줄에서 단일 데이터베이스를 백업하려면 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"

또한 BACKUPRESTORE일반 절차 에 대한 설명서를 읽고 싶을 것 입니다.


3
모든 사용자 데이터베이스를 한 번에 백업 할 수있는 좋은 스크립트가 있습니다. mssqltips.com/tip.asp?tip=1070
Marnix van Valen

7
문서에 따르면 WITH FORMAT저장 매체 를 포맷합니다. " FORMAT 옵션은 기존 컨텐츠를 무시하고 전체 미디어 컨텐츠를 무효화합니다. "이것이 원하는 것인지 확인하십시오.
alexg

4
@Tjaart, 그것이 내가 문서를 먼저 읽으라고 말한 이유입니다. WITH FORMAT을 사용하지 않고 기존 백업 파일을 선택하면 새 백업이 파일의 기존 백업에 추가되므로 원하는 것이 아닐 수 있습니다.
Craig Trader

@Kiquenet Bzzzzzt-원래 요청에 따라 GUI 제품이므로 간단한 명령 줄 프로그램이나 스크립트가 아닙니다.
Craig Trader

내 설치에 osql.exe있었다C:\Program Files\Microsoft SQL Server\140\Tools\Binn\OSQL.EXE
Matthew Lock

9

ExpressMaint를 사용 합니다.

모든 사용자 데이터베이스를 백업하려면 예를 들면 다음과 같습니다.

C:\>ExpressMaint.exe -S (local)\sqlexpress -D ALL_USER -T DB -BU HOURS -BV 1 -B c:\backupdir\ -DS

1
Meixger, SQLBackupAndFTP가 상상할 수있는 모든 시나리오에서이를 능가 할 때 ExpressMaint를 사용하는 한 가지 이유를 찾을 수 없습니다

8

모든 데이터베이스를 백업하려면 다음을 예약하십시오.

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 백업자동화 하는 방법에 대한 자세한 내용도 있습니다 .


예약 방법에 대해 자세히 설명해 주시겠습니까?
Frank Krueger

내 블로그 게시물을 읽으십시오. 알아야 할 모든 것을 자세히 설명합니다.
GateKiller

질문 이 SQL Server 외부 에서 실행되는 것을 요구한다고 생각합니다 .
bzlm

@bzlm, 내가 말했듯이. 내 블로그 : SQL 서버의 외부에서 수행하는 방법에 대한 자세한 내용은이
GateKiller

1
@GateKiller 블로그 링크가 여전히 유효합니까? 나는 그것을 열 수 없습니다입니다
야쉬 Saraiya

5

Microsoft 지원 페이지 http://support.microsoft.com/kb/2019698 에서 찾았습니다 .

잘 작동합니다! 그리고 Microsoft에서 왔기 때문에 꽤 합법적이라고 생각합니다.

기본적으로 두 단계가 있습니다.

  1. 마스터 DB에 저장 프로 시저를 만듭니다. msft 링크를 보거나 고장난 경우 여기에서 시도하십시오 : http://pastebin.com/svRLkqnq
  2. 작업 스케줄러에서 백업을 예약합니다. 먼저 .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에 넣으려고합니다.


1
그만한 가치가 있기 때문에 나는 dba 커뮤니티에서 매우 존경받는 ola.hallengren.com 의 자료와 함께 위의 방법을 사용했습니다 . 매력처럼 작동합니다.
John W.

5

ApexSQL로 백업 응용 프로그램을 사용할 수 있습니다. GUI 응용 프로그램이지만 CLI에서 지원되는 모든 기능이 있습니다. 일회성 백업 작업을 수행하거나 지정된 데이터베이스를 정기적으로 백업하는 작업을 생성 할 수 있습니다. 스위치 규칙과 예제를 확인할 수 있습니다.


4

MSSQL 데이터베이스에 액세스하기 위해 Linux / UNIX 인프라에서 tsql을 사용하고 있습니다. 다음은 테이블을 파일로 덤프하는 간단한 쉘 스크립트입니다.

#!/usr/bin/ksh
#
#.....
(
tsql -S {database} -U {user} -P {password} <<EOF
select * from {table}
go
quit
EOF
) >{output_file.dump}

3

–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 서버 사용자 로그인 이름

[비밀번호] 필수 로그인 비밀번호


1
C:\tmp서버 또는 로컬 경로 입니까?
Kiquenet

백업은 항상 C 있도록, 서버의 디스크에 저장됩니다 : \ 서버에 TMP
조지 Vrynios을

1

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

0

이 목적으로 정확히 작성한 VB 스크립트를 사용할 수 있습니다. https://github.com/ezrarieben/mssql-backup-vbs/

"작업 스케줄러"에서 원하는대로 스크립트를 실행하도록 작업을 예약하면 전체 DB를 BAK 파일로 백업하고 지정한 위치에 저장합니다.


0
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

-10

DB 파일을 찾을 수있는 경우 ... "cp DBFiles backup /"

대부분의 경우에 거의 권장하지 않지만 모든 getup만큼 간단합니다.


1
SQL Server가 실행 중이면 아무것도 사용하지 않더라도이 작업을 수행하지 마십시오.
Craig Trader

6
이 방법을 사용하여 데이터베이스를 성공적으로 백업 및 복원 할 확률은 매우 낮습니다. 백업 및 복원 중 SQL Server 프로세스가 실행되지 않고 관련된 모든 이진 파일을 식별하고 복사하는 경우에만 작동하며, SQL Server와 정확히 동일한 버전 및 패치 수준을 실행하는 경우 (및 / 또는 Windows). 백업 파일 형식은 교차 버전 이식이 가능하도록 설계되었습니다. 바이너리 데이터베이스 파일은 아닙니다. 이것은 SQL Server뿐만 아니라 모든 데이터베이스에 해당됩니다. 그냥 하지마. 정말. 이렇게하지 마십시오.
Craig Trader

이 대답은 98.7 % 농담입니다. 정확히 동일한 설정 (복원 / 복원이라고도 함)으로 만 복원하고 종료 (로컬 개발 서버라고도 함) 및 기타 몇 가지 작업 만 수행하는 경우 OTOH ...
BCS
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.