Número 50julio-AGOSTO 2008

Visual Basic•C#•ASP.NET•ADO.NET•AJAXSilverlight.NET Framework

dotNetManía

Revista dedicada a los profesionales de la plataforma .NET

Menú

Inicio

Números publicados

Libros

Próximo número (nº51)

Autores

¿Qué es dotNetManía?

Garantía de satisfacción

Contactar

Pedidos

Suscripciones

Renovaciones

Libros

Noticias dnm

Alhambra-Eidos llega a un acuerdo con dotNetManía para la difusión conjunta de su oferta formativa. Leer más...


Disponibles los primeros 28 números de dotNetManía en formato PDF y de libre distribución. Leer más... 

Patrocinadores

Patrocinador Oro
Microsoft

Patrocinadores Plata
Alhambra-Eidos
Solid Quality Mentors

Patrocinadores Bronce
Raona
Plain Concepts
Krasis
ABOX 

 

 

 

Nº 3 Abril 2004 SQL-Server. Diseñar la estrategia de copias de seguridad y restauraciones Material de apoyo

Por Miguel Egea
 

Todos los sistemas necesitan una salvaguarda, pero aquellos que contienen datos importantes mucho más aún. En una base de datos suele guardarse información muy viva y casi siempre trascendental para el negocio que sustentan.


La política de copias de seguridad va más allá de simplemente guardar un fichero. Debemos incluir dentro de nuestro plan de sistemas las posibles causas de catástrofe y verificar si estamos listos ante ellas

Más información

SQL Server Magazine

Restoring Databases

 

Database Journal

Rapid Database Recovery with Differential Backups

 

Databases

SQL Server Disaster Recovery 


Código fuente

Use pruebas

go

if databasepropertyex('Pruebas','recovery')<>'FULL'

  ALTER DATABASE Pruebas SET RECOVERY FULL

go

-- Creamos una tabla en la base de datos de pruebas, para que exista

-- aunque no tenga datos en el primer momento de la restauración

CREATE TABLE TablaPruebas(id int identity(1,1),

                    Descripcion char(30),

                    FechaHora datetime default getdate())

go

BACKUP DATABASE PRUEBAS TO DISK ='C:\BackupDePruebas.bak'

go

-- Ahora creamos registros para insertar dentro

-- de nuestra base  de datos

Declare @i int

SET @i=1

-- hacemos un bucle hasta 200

while @i<=200

 begin

   --

   INSERT INTO TablaPruebas (Descripcion) values

            (' El valor de @i es ' + cast(@i as char(3)))

   -- en el elemento 100 hacemos un backup de log

   -- lo vamos a hacer en el mismo fichero. Es más claro

   -- hacerlo en ficheros diferentes

    if @i=100

       BACKUP log PRUEBAS TO DISK ='C:\BackupDePruebas.bak'

   set @i=@i+1

 end

go

 

-- vamos a borrar una tabla

declare @Nombretransaccion char(20)

set @Nombretransaccion ='Borrar TablaPruebas'

begin tran @NombreTransaccion with mark

drop table Tablapruebas

Commit

go

declare @nombre varchar(100)

set @nombre='Segunda copia de lpg'

BACKUP LOG PRUEBAS TO DISK ='C:\BackupDePruebas.bak' with name=@nombre

 

Fuente 1.

 

if not object_id('backupwhennecesary') is null
    drop proc
backupWhenNecesary
go
create proc backupWhenNecesary (@file sysname)
as
    begin
       
-- primero que no se produzcan salidas no deseadas--
       
set nocount on
       
-- Necesitamos la tabla y la ruta en la que hacer el backup --
        -- podría ser a cinta directamente, pero en mi portatil no --
        -- tengo systema de cintas, así que,no puedo probarlo --
       
declare @tabla sysname
        Declare
@fileabs sysname
       
-- Creamos una tabla temporal para guardar el resultado de --
        -- DBCC --
  
create table #temp (nombre sysname,tam float,pct float,status int)
         
insert into #temp exec('DBCC sqlperf(logspace)')
          
-- Usaremos un cursor

        declare cr Cursor for
            select
nombre from #temp where pct>75
             
and DATABASEPROPERTYEX(nombre, N'RECOVERY')<>'SIMPLE'
           
-- 75 porciento de uso, si queréis más o menos,...
            -- el modelo de recuperación si es simple no permite
            -- hacer backup de log, y nosotros no queremos que nuestro
            -- procedimiento almacenado falle :-D
       
open cr
       
fetch next from cr into @tabla
       
while @@fetch_status=0
           
begin
            
-- construyo de forma dinámica el nombre del fichero en
             -- donde guardaremos la copia de seguridad
modificamos

             -- este trozo de código el día 13 de agosto de 2003

             -- El código nos lo propone el maestro Fernando Guerrero y

             -- con esta modificación guardamos ficheros de log

             -- independientes, en lugar de todo en un solo fichero.
            
set @fileabs=@file
                        + '_'
                        + @tabla
                        + '_'
                        + select
                        replace(
                        replace(
                        replace(
                        replace(
                        convert(varchar(25), getdate(), 121)
                        , '-', '')
                        , ' ', '_')
                        , ':', '')
                        , '.', '')
                +'.trn'
            -- fin modificación

 -- ejecutamos la copia
 
exec sp_executesql N'backup log @p1 to disk= @p2 ',N'@p1 sysname,

@p2 sysname',@tabla,@fileabs
               
-- a la siguiente bd.
               
fetch next from cr into @tabla
           
end
       
-- cerramos
       
close cr
       
-- liberamos
       
deallocate cr
       
-- y borramos nuestras tablas...
       
drop table #temp
end

go

Fuente 2.

 

restore database pruebas

      from disk='C:\BackupDePruebas.BAK'

      with standby='c:\standby.undo'

go

use pruebas

go

select * from pruebas..tablapruebas

 

restore log pruebas

      from disk='C:\BackupDePruebas.BAK'

      with standby='c:\standby.undo',

           file=2

go

select * from pruebas..tablapruebas

 

restore log pruebas

      from disk='C:\BackupDePruebas.BAK'

      with recovery,

           file=3,

           stopbeforemark='Borrar TablaPruebas'

go

select * from pruebas..tablapruebas

Fuente 3.

Volver
 

 

dotNetManía es una revista editada por Netalia. Más información.