O que é um programa ou script de linha de comando simples para fazer backup de bancos de dados do servidor SQL?

94

Tenho sido muito negligente em fazer backups de banco de dados em nossos servidores internos.

Existe um programa de linha de comando simples que posso usar para fazer backup de certos bancos de dados no SQL Server 2005? Ou existe um VBScript simples?

Frank Krueger
fonte
6
Pessoalmente, tenho muito mais sorte com aplicativos de pedido de limão e utilitários de laranja de instrução. Os programas Command lime são muito mais problemáticos do que compensam.
Jim

Respostas:

108

Para fazer backup de um único banco de dados a partir da linha de comando, use osql ou 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"

Você também vai querer ler a documentação sobre BACKUP e RESTORE e procedimentos gerais .

Craig Trader
fonte
3
Há um bom script para fazer backup de todos os bancos de dados do usuário de uma vez aqui: mssqltips.com/tip.asp?tip=1070
Marnix van Valen
7
A documentação diz que WITH FORMATformata o meio de armazenamento: “ A opção FORMAT invalida todo o conteúdo da mídia, ignorando qualquer conteúdo existente. ” Certifique-se de que é isso que você deseja.
alexg
4
@Tjaart, é por isso que eu disse para ler a documentação primeiro. Se você não usar WITH FORMAT e escolher um arquivo de backup existente, o novo backup será anexado ao (s) backup (s) existente (s) no arquivo, que pode não ser o que você deseja.
Craig Trader de
@Kiquenet Bzzzzzt - Seria um produto GUI e, portanto, não um simples programa ou script de linha de comando, conforme a pergunta original.
Craig Trader
na minha instalação osql.exefoi emC:\Program Files\Microsoft SQL Server\140\Tools\Binn\OSQL.EXE
Matthew Lock
9

Eu uso o ExpressMaint .

Para fazer backup de todos os bancos de dados do usuário, eu faço, por exemplo:

C:\>ExpressMaint.exe -S (local)\sqlexpress -D ALL_USER -T DB -BU HOURS -BV 1 -B c:\backupdir\ -DS
Martin Meixger
fonte
1
Meixger, não consigo encontrar um único motivo para usar o ExpressMaint, quando SQLBackupAndFTP o supera em todos os cenários imagináveis
8

Agende o seguinte para fazer backup de todos os bancos de dados:

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)

Também há mais detalhes em meu blog: como automatizar backups do SQL Server Express .

GateKiller
fonte
Você pode explicar como agendar?
Frank Krueger
Por favor, leia minha postagem do blog. Ele detalha tudo que você precisa saber.
GateKiller
Acho que a pergunta pede algo que seja executado fora do SQL Server.
bzlm
@bzlm, como eu disse. Meu blog tem detalhes sobre como fazer isso fora do SQL Server :)
GateKiller
1
@GateKiller O link do seu blog ainda é válido? Não consigo abri-lo
Yash Saraiya
5

Eu encontrei isso na página de suporte da Microsoft http://support.microsoft.com/kb/2019698 .

Funciona muito bem! E como veio da Microsoft, acho que é bastante legítimo.

Basicamente, existem duas etapas.

  1. Crie um procedimento armazenado em seu banco de dados mestre. Veja o link msft ou se estiver quebrado, tente aqui: http://pastebin.com/svRLkqnq
  2. Agende o backup de seu agendador de tarefas. Você pode querer colocar em um arquivo .bat ou .cmd primeiro e, em seguida, agendar esse arquivo.

    sqlcmd -S YOUR_SERVER_NAME\SQLEXPRESS -E -Q "EXEC sp_BackupDatabases @backupLocation='C:\SQL_Backup\', @backupType='F'"  1>c:\SQL_Backup\backup.log            

Obviamente, substitua YOUR_SERVER_NAME pelo nome do seu computador ou, opcionalmente, tente. \ SQLEXPRESS e verifique se a pasta de backup existe. Neste caso, ele está tentando colocá-lo em c: \ SQL_Backup

John W.
fonte
1
Pelo que vale a pena, acabei usando o método acima em conjunto com o material de ola.hallengren.com, que eu acho que é muito respeitado entre a comunidade dba. Está funcionando como um encanto.
John W.
5

Você pode usar o aplicativo de backup do ApexSQL. Embora seja um aplicativo GUI, ele tem todos os seus recursos com suporte no CLI. É possível realizar operações de backup únicas ou criar uma tarefa que faria backup de bancos de dados especificados regularmente. Você pode verificar as regras de mudança e exemplificadas nos artigos:

P.Thompson
fonte
4

Estou usando tsql em uma infraestrutura Linux / UNIX para acessar bancos de dados MSSQL. Aqui está um script de shell simples para despejar uma tabela em um arquivo:

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

Eventual se você não tiver uma conexão confiável, conforme declara a chave –E

Use a seguinte linha de comando

"[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]

Onde

[dir do programa] é o diretório onde o osql.exe existe

No sistema operacional de 32 bits c: \ Arquivos de programas \ Microsoft SQL Server \
No SO de 64 bits c: \ Arquivos de programas (x86) \ Microsoft SQL Server \

[versão do servidor sql] sua versão do servidor sql 110 ou 100 ou 90 ou 80 começa com o maior número

[servidor] seu nome de servidor ou ip do servidor

[login id] seu nome de login de usuário do servidor ms-sql

[senha] a senha de login necessária

George Vrynios
fonte
1
C:\tmpo caminho está no servidor ou local ?
Kiquenet
os backups são sempre armazenados nos discos do servidor, então c: \ tmp está no servidor
George Vrynios
1

A resposta da Microsoft para fazer backup de todos os bancos de dados do usuário no SQL Express é aqui :

O processo é: copiar, colar e executar seu código (veja abaixo. Eu comentei algumas linhas estranhamente não comentadas no topo) como uma consulta em seu servidor de banco de dados. Isso significa que você deve primeiro instalar o SQL Server Management Studio (ou conectar-se ao seu servidor de banco de dados com SSMS). Esta execução de código criará um procedimento armazenado em seu servidor de banco de dados.

Crie um arquivo em lote para executar o procedimento armazenado e, a seguir, use o Agendador de tarefas para agendar uma execução periódica (por exemplo, à noite) desse arquivo em lote. Meu código (que funciona) é uma versão ligeiramente modificada do primeiro exemplo:

sqlcmd -S SQLEXPRESS -E -Q "EXEC sp_BackupDatabases @backupLocation='E:\SQLBackups\', @backupType='F'" 

Isso funcionou para mim, e eu gosto disso. Cada vez que você o executa, novos arquivos de backup são criados. Você precisará desenvolver um método de exclusão de arquivos de backup antigos regularmente. Já tenho uma rotina que faz esse tipo de coisa, então vou manter alguns dias de backups em disco (tempo suficiente para que eles sejam copiados por minha rotina normal de backup), depois vou excluí-los. Em outras palavras, sempre terei backups de alguns dias disponíveis, sem precisar restaurar meu sistema de backup.

Vou colar o script de criação de procedimento armazenado da Microsoft abaixo:

--// 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
CraigD
fonte
0

Você poderia usar um script VB que escrevi exatamente para essa finalidade: https://github.com/ezrarieben/mssql-backup-vbs/

Agende uma tarefa no "Agendador de tarefas" para executar o script como desejar e ele fará o backup de todo o banco de dados em um arquivo BAK e salvará onde você especificar.

Ezrarieben
fonte
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
Sagar Mahajan
fonte
-10

Se você pode encontrar os arquivos do banco de dados ... "cp DBFiles backup /"

Quase com certeza não é aconselhável na maioria dos casos , mas é muito simples.

BCS
fonte
1
NÃO faça isso se o SQL Server estiver em execução, mesmo que nada o esteja usando.
Craig Trader
6
As chances de usar esse método para fazer backup e restaurar um banco de dados com êxito são muito pequenas. Só funcionará SE, durante o backup e a restauração: nenhum processo do SQL Server estiver em execução, você identificar e copiar TODOS os arquivos binários envolvidos, estiver executando EXATAMENTE a mesma versão e nível de patch do SQL Server (e / ou Janelas). O formato do arquivo de backup é projetado para ser portátil entre versões; os arquivos de banco de dados binários NÃO são. Isso é verdade para TODOS os bancos de dados, não apenas para o SQL Server. Só não faça isso. REALMENTE. NÃO FAÇA ISSO.
Craig Trader
Essa resposta é 98,7% uma piada. OTOH se você for restaurar exatamente a mesma configuração (também conhecido como restauração / reversão) e puder ser desligado (também conhecido como um servidor de desenvolvimento local) e provavelmente algumas outras coisas ...
BCS