Fazendo backup de todos os bancos de dados no SQL Server

13

Eu tenho um servidor de banco de dados do Microsoft SQL Server 2005. No servidor de banco de dados, tenho cerca de 250 bancos de dados de usuários. Eu tenho que fazer um backup de todos esses bancos de dados. Como fazer backup manualmente consome muito tempo, estou procurando um script em lote ou DB, que fará automaticamente o backup de todos os 250 bancos de dados. Alguém por favor pode ajudar nisso?

Taryn
fonte

Respostas:

14

Nota: Primeiro crie uma pasta na D:unidade. (por exemplo D:\User_DataBackup\)

Etapa 1: Crie um procedimento descrito abaixo.

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

Etapa 2: Execute o procedimento acima.

 EXEC [UserDataBaseBackUp]

Você também pode agendar este procedimento. Este procedimento é testado, espero que ajude.

JP Chauhan
fonte
Funciona um tratamento, poderia ser melhorado, talvez, passando no caminho?
Robin Salih
11

Desenvolver um plano de manutenção

O SQL Server tem esse recurso incrível, onde ele criará o script e o trabalho para você

  • Passo 1:
    Botão direito do mouse sobre Maintenance PlansobManagement

    Clique com o botão direito do mouse em Gerenciamento

  • Etapa 2:
    Nomeie seu plano

    Nomear o plano

  • Etapa 3:
    Selecionar tarefa de backup do banco de dados

    Tarefa de backup do banco de dados

  • Etapa 4:
    configure a tarefa, selecione Bancos de dados, local da pasta, tipo de conexão de backup (completa, diferencial, log de transações) etc.

    Configurar a tarefa de backup

  • Etapa 5:
    configurar a programação de tarefas

    Configurar a programação de tarefas


Eu recomendo ter um plano separado para system-bases de dados e seus usuários-bases de dados para evitar qualquer tipo de problema

Links de ajuda:

AmmarR
fonte
Nota: As edições expressas do SQL Server não oferecem a funcionalidade do Plano de Manutenção.
Alan B
8

Sei que manter muitos bancos de dados com o SSMS pode ser um pouco confuso, mas é direto.

Posso recomendar uma maneira mais eficaz, usando o script de manutenção de Ola Hallengren . É muito legal e muito eficaz. E você pode fazer muito mais do que apenas fazer backup de todos os bancos de dados, executar todos os tipos de procedimentos de manutenção.

Por exemplo, você pode fazer backup de todos os bancos de dados, compactá-los e criptografá-los com um certificado de sua escolha, usando um comando como este (e todos eles são opcionais, e a criptografia e a compactação não funcionarão no SQL Server 2005, mas acho que sim) mostre a flexibilidade e a força do script de Ola):

EXECUTE dbo.DatabaseBackup @Databases = 'USER_DATABASES',
@Directory = 'C:\Backup',
@BackupType = 'FULL',
@Compress = 'Y',
@Encrypt = 'Y',
@EncryptionAlgorithm = 'AES_256',
@ServerCertificate = 'MyCertificate'
Sina Hassanpour
fonte
2

Trabalhando na resposta do JP, adicionei um parâmetro para passar o diretório de destino (e possivelmente adicionar mais opções):

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

Então:

EXEC UserDataBaseBackUp @OutputDir = 'F:\Backups\SQL Databases\'
Jerry Dodge
fonte
1

Você pode usar a instrução SELECT ou CURSOR assim:

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

OU

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 
Filip Holub
fonte
-2

Você também pode usar o PowerShell, como mostrado em Usar o PowerShell para fazer backup de todos os bancos de dados do usuário por Buck Woody:

# 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)
            }
        }     
    }
Emito
fonte