Jump to content

como crear respaldos en sql server 2008?


shaniell

Recommended Posts

hola a todos necesito saber cm creear respaldo de una base de datos!!!! cada cierto tiempo programado (como una ves por semana)

y taambien cuando iegen a un tamaño especifico!!! se los agradececeria mucho!!!!!

 

 

 

(a soy estudiante!!! de analista y programacion para que no pongan mensajes mala onda qeu me dedique a otra cosa!!!!!!) jejejej graxias!!!!!!!!

Link to comment
Share on other sites

google no muerde. Para eso se usa "tareas programadas de windows",perl,el mismo sqlserver,.net,etc. Así como Analista te digo: lo busques en google o te dediques a hacer otra cosa.

Edited by =Programer=
Link to comment
Share on other sites

No es por crear polemica.

 

Pero google es una pagina externa.

 

Nosotros como foro debemos colaborar entre los mismo y no obviar las preguntas a unos buscares.

 

 

 

toda la razon, en vez de un foro ayuda pongan un link directo a google y listo

 

pero no es la idea

Link to comment
Share on other sites

SQL Server 2008 viene con una herramienta que se llama Agente de SQL. Esta herramienta te permite configurar y programar los respaldos automáticos. Ahora, mi recomendación es que hagas el respaldo con un procedimiento almacenado, de manera que puedas comprimir, copiar o mover el archivo, incluso, automáticamente grabarlo a la unidad de cinta... Y bueno, este sp lo llamas en la tarea programada del agente...

 

Salu2.

 

PD: Usuarios, por favor, no desvirtuar... se puede aportar e indicar que busque en google... no a todos se les ocurre que san google es el santo de los informáticos...

Link to comment
Share on other sites

Te dejo un script de un PA, que hice hace algunos añitos ya para SQL 2000, el cual está encargado de respaldar todas las bases de datos de un server X, creando respaldos completos, diferenciales y del registro de transacciones (log), ademas borraba los archivos de respaldo cada Y tiempo. Todo se configuraba en base a una tabla creada para este proposito. No he probado nada en 2008 pero me imagino que no debe cambiar tanto tanto la cosa...

 

ALTER PROCEDURE BackupAllBasesDatos
    @Ruta VARCHAR(128),
    @Tipo VARCHAR(4) = 'FULL' --FULL / DIFF / LOG
AS

/*
    El Formato de los Archivos de Backup corresponde a
    
    NombreBD_Tipo_yyyymmdd_hhmmss.bu

    Ejemplo nombre Archivo:
        EMPRESA_FULL_20070913_130850.bu

    Ejemplo Ejecucion del Procedimiento:
        EXEC BackupAllBasesDatos 'C:\BACKUP\', 'FULL'
*/

SET NOCOUNT ON

DECLARE @sql VARCHAR(1000)

--Crea la Tabla BackupBaseDatos si es que no existe en la base de datos en uso.
IF NOT EXISTS ( SELECT *
        FROM dbo.sysobjects
        WHERE id = OBJECT_ID(N'[dbo].[BackupBaseDatos]')
        AND OBJECTPROPERTY(id, N'IsUserTable') = 1
          )
BEGIN

    CREATE TABLE BackupBaseDatos
    (
        Nombre VARCHAR(128) PRIMARY KEY NONCLUSTERED,

        BackupFlagFull VARCHAR(1) NOT NULL
            CHECK (BackupFlagFull IN ('Y','N')),
        RetainPeriodNumberFull INT  NOT NULL,
        RetainPeriodTypeFull VARCHAR(2)  NOT NULL
            CHECK (RetainPeriodTypeFull IN ('mi', 'hh', 'dd', 'wk', 'mm')),
        
        BackupFlagDiff VARCHAR(1) NOT NULL
            CHECK (BackupFlagDiff IN ('Y','N')),
        RetainPeriodNumberDiff INT NOT NULL,
        RetainPeriodTypeDiff VARCHAR(2) NOT NULL 
            CHECK (RetainPeriodTypeDiff IN ('mi', 'hh', 'dd', 'wk', 'mm')),

        BackupFlagLog VARCHAR(1) NOT NULL
            CHECK (BackupFlagLog IN ('Y','N')),
        RetainPeriodNumberLog INT NOT NULL,
        RetainPeriodTypeLog VARCHAR(2) NOT NULL
            CHECK (RetainPeriodTypeLog IN ('mi', 'hh', 'dd', 'wk', 'mm'))
    )

END

--Obtengo todos los nombres correspondientes de todas las bases de datos del servidor.
CREATE TABLE #DBNames
(
    ID INT IDENTITY(1,1),
    Nombre VARCHAR(128) NOT NULL,
    RetainPeriodNumber INT NULL,
    RetainPeriodType VARCHAR(2) NULL
        CHECK(RetainPeriodType IN ('mi', 'hh', 'dd', 'wk', 'mm'))
)


INSERT #DBNames (Nombre)
    SELECT name 
    FROM master..sysdatabases

--Incluyo las bases de datos nuevas en la tabla de backups, por defecto no se realizan backups.
INSERT BackupBaseDatos
(
    Nombre,
    BackupFlagFull, 
    RetainPeriodNumberFull, 
    RetainPeriodTypeFull, 
    BackupFlagDiff, 
    RetainPeriodNumberDiff, 
    RetainPeriodTypeDiff,
    BackupFlagLog, 
    RetainPeriodNumberLog,
    RetainPeriodTypeLog
)
SELECT     #DBNames.Nombre,
           'N', 
           4, -- 4 Semanas para copias Full
    'wk',
           'N', 
           7, -- 7 Dias para copias Diff
    'dd',
           'N', 
           24, -- 24 horas para Logs 
    'hh'
FROM #DBNames
LEFT OUTER JOIN BackupBaseDatos
ON BackupBaseDatos.Nombre = #DBNames.Nombre
WHERE BackupBaseDatos.Nombre IS NULL
AND LOWER(#DBNames.Nombre) <> 'tempdb'

--Quito los backups para las bases de datos que no existen.
DELETE BackupBaseDatos
WHERE NOT EXISTS (
        SELECT *
        FROM #DBNames
        WHERE #DBNames.Nombre = BackupBaseDatos.Nombre
        )

DELETE #DBNames

--Chequeo cuales son los backups que existen.
CREATE TABLE #ExistingBackups
(
    Nombre VARCHAR(128),
    ID INT IDENTITY(1,1)
)

DECLARE @Nombre VARCHAR(128),
    @RetainPeriodNumber INT,
    @RetainPeriodType VARCHAR(2),
    @UltimoBackupAMantener VARCHAR(8),
    @ID INT,
    @MaxID INT
    
INSERT #DBNames (Nombre, RetainPeriodNumber, RetainPeriodType)
SELECT Nombre, 
    CASE 
        WHEN @Tipo = 'FULL' THEN RetainPeriodNumberFull
        ELSE     CASE 
                WHEN @Tipo = 'DIFF' THEN RetainPeriodNumberDiff
                ELSE RetainPeriodNumberLog
                 END
    END,
    CASE 
        WHEN @Tipo = 'FULL' THEN RetainPeriodTypeFull
        ELSE     CASE 
                WHEN @Tipo = 'DIFF' THEN RetainPeriodTypeDiff
                ELSE RetainPeriodTypeLog
                 END
    END
FROM BackupBaseDatos
WHERE ( @Tipo = 'FULL' AND BackupFlagFull = 'Y')
OR ( @Tipo = 'DIFF' AND BackupFlagDiff = 'Y')
OR ( @Tipo = 'LOG' AND BackupFlagLog = 'Y')

SELECT @MaxID = MAX(ID), @ID = 0
FROM #DBNames

WHILE @ID < @MaxID
BEGIN
    SELECT @ID = MIN(ID)
    FROM #DBNames
    WHERE ID > @ID

    SELECT @Nombre = Nombre,
           @RetainPeriodNumber = RetainPeriodNumber,
           @RetainPeriodType = RetainPeriodType
    FROM  #DBNames
    WHERE ID = @ID

    DELETE #ExistingBackups
    
    SELECT  @sql = 'dir /B ' + @Ruta
    SELECT @sql = @sql + '"' + @Nombre + '_' + @Tipo + '*.*"'

    INSERT #ExistingBackups
    EXEC master..xp_cmdshell @sql

    IF EXISTS ( SELECT *
            FROM #ExistingBackups
            WHERE Nombre Like '%File Not Found%' OR Nombre Like '%No Se Encuentra el archivo%'
          )
        DELETE #ExistingBackups

    CREATE TABLE #UltimoBackupAMantener
    (
        UltimoBackupAMantener VARCHAR(8) NOT NULL
    )

    INSERT #UltimoBackupAMantener
    EXEC ('SELECT CONVERT(VARCHAR(8), GETDATE() - DATEADD(' + @RetainPeriodType + ', ' + @RetainPeriodNumber + ', ' + '''19000101''' + '), 112)')

    SELECT @UltimoBackupAMantener = UltimoBackUpAMantener 
    FROM #UltimoBackupAMantener

    DELETE #ExistingBackups
    WHERE Nombre > @Nombre + '_' + @Tipo + '_' + @UltimoBackupAMantener

    DECLARE @eID INT,
        @eMaxID INT,
        @eName VARCHAR(128)

    SELECT     @eID = 0,
        @eMaxID = COALESCE(MAX(ID),0)
    FROM #ExistingBackups

    WHILE @eID < @eMaxID
    BEGIN
        SELECT @eID = MIN(ID)
        FROM #ExistingBackups
        WHERE ID > @eID

        SELECT @eName = Nombre
        FROM #ExistingBackups
        WHERE ID = @eID

        SELECT @sql = 'del ' + @Ruta + '"' + @eName + '"'
        EXEC master..xp_cmdshell @sql, no_output
    END

    DELETE #ExistingBackups

    SELECT @sql = @Ruta + @Nombre + '_' + @Tipo + '_'
        + CONVERT(VARCHAR(8),GETDATE(),112) + '_'
        + REPLACE(CONVERT(VARCHAR(8),GETDATE(),108),':','')
        + '.bu'

    IF @Tipo = 'FULL'
        BACKUP DATABASE @Nombre
        TO DISK = @sql
    ELSE
       IF @Tipo = 'DIFF'
        BACKUP DATABASE @Nombre
        TO DISK = @sql
        WITH DIFFERENTIAL
       ELSE 
        BACKUP LOG @Nombre
        TO DISK = @sql
    
END

 

El uso de toda esta paja molida, era si bien me acuerdo, de la siguiente forma:

 

1.- Ejecutas el PA inicialmente, con esto se crea la tabla "BackupBaseDatos"

2.- Dentro de los campos de la tabla se pueden setear los distintos tipos de respaldo permitidos para la bd (FULL, DIFF, LOG) y la duracion de los archivos fisicos en la carpeta de respaldos dada

3.- agregar como JOB's de SQL una llamada segun cada tipo de respaldo a utilizar, es decir si quieres respaldos completos diarios agregabas un job, que ejecutaba el procedimiento alamcenado como EXEC BackupAllBasesDatos 'C:\BACKUP\', 'FULL' con calendarizacion diaria....

 

 

NOTA: sobre como agregar el JOB al Agent del SQL 2008, mira por acá

 

NOTA2: La teoría detras de toda la paja de los respaldos y tipos de respaldos acá

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...