Hacer una copia de seguridad de todas las bases de datos en SQL Server

13

Tengo un servidor Microsoft SQL Server 2005 DB. En el servidor DB, tengo alrededor de 250 bases de datos de usuarios. Tengo que hacer una copia de seguridad de todas estas bases de datos. Dado que la copia de seguridad manual consume mucho tiempo, estoy buscando un script Batch o un script DB que automáticamente realice la copia de seguridad de las 250 bases de datos. ¿Alguien puede ayudarme en esto?

Taryn
fuente

Respuestas:

14

Nota: Primero cree una carpeta en la D:unidad. (por ejemplo D:\User_DataBackup\)

Paso 1: cree un procedimiento que se proporciona a continuación.

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

Paso 2: Ejecute el procedimiento anterior.

 EXEC [UserDataBaseBackUp]

También puede programar este procedimiento. Este procedimiento se prueba con suerte, ayudará.

JP Chauhan
fuente
Funciona de maravilla, ¿podría mejorarse quizás pasando por el camino?
Robin Salih
11

Desarrollar un plan de mantenimiento

SQL Server tiene esta característica sorprendente donde creará el script y el trabajo para usted

  • Paso 1:
    haga clic derecho Maintenance PlandebajoManagement

    Haga clic derecho en Gestión

  • Paso 2:
    nombra tu plan

    Nombra el plan

  • Paso 3:
    Seleccione la tarea de copia de seguridad de la base de datos

    Tarea de respaldo de base de datos

  • Paso 4:
    configure la tarea, seleccione las bases de datos, la ubicación de la carpeta, el tipo de conexión de respaldo (completa, diferencial, registro de transacciones), etc.

    Configurar la tarea de copia de seguridad

  • Paso 5:
    Configurar la programación del trabajo

    Configurar el horario de trabajo


Recomiendo tener un plan separado para las bases de datos del sistema y sus bases de datos de usuario para evitar cualquier tipo de problema.

Enlaces de ayuda:

AmmarR
fuente
Nota: Las ediciones Express de SQL Server no ofrecen la funcionalidad del Plan de mantenimiento.
Alan B
8

Sé con certeza que mantener muchas bases de datos con SSMS podría ser un poco confuso, pero es sencillo.

Puedo recomendar una forma más efectiva, usando el script de mantenimiento de Ola Hallengren . Es muy genial y muy efectivo. Y puede hacer mucho más que simplemente hacer una copia de seguridad de todas las bases de datos, puede hacer todo tipo de procedimientos de mantenimiento.

Por ejemplo, puede hacer una copia de seguridad de todas las bases de datos, comprimirlas y cifrarlas con un certificado de su elección, utilizando un comando como este (y todas son opcionales, y el cifrado y la compresión no funcionarán en SQL Server 2005, pero creo que lo hará muestra la flexibilidad y la fuerza del guión de Ola):

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

Trabajando en la respuesta de JP, agregué un parámetro para pasar el directorio de destino (y posiblemente agregue más opciones):

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

Por lo que entonces:

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

Puede usar la instrucción SELECT o el CURSOR de esta manera:

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

O

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
fuente
-2

También puede usar PowerShell como se muestra en Usar PowerShell para respaldar todas las bases de datos de usuario de 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
fuente