Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Reducir Tamaño MDF

223 views
Skip to first unread message

José Antonio Muñoz

unread,
Apr 12, 2010, 3:08:15 AM4/12/10
to
Hola a todos,

¿Hay alguien que me pueda ayuda para reducir el tamaño de un archivo MDF?
¿existe alguna manera?

saludos,
José Antonio Muñoz.

Nacho

unread,
Apr 13, 2010, 9:44:27 AM4/13/10
to
Este Sp me ha servido para reducir los LOG. Luego de esto debes
reorganizar los datos y liberar el espacio del DATA.
Espero que te sea de utilidad.


SET NOCOUNT ON
DECLARE @NombreLogicoArchivo sysname,
@MaxMinutos INT,
@NuevoTamano INT

-- Indique aquí su configuración.
USE [BD_1] -- Nombre de la base de datos para el que se va a
truncar el registro
-- Use sp_helpfile para identificar el nombre de archivo lógico que
desea reducir.
SELECT @NombreLogicoArchivo = 'BD_1_Data',
@MaxMinutos = 10, -- Límite de tiempo permitido para dar la
vuelta al registro.
@NuevoTamano = 2000 -- en MB

-- Configuración e inicio
DECLARE @TamanoOriginal int
SELECT @TamanoOriginal = size -- en páginas de 8 KB
FROM sysfiles
WHERE name = @NombreLogicoArchivo
SELECT ' El tamaño original del registro de ' + db_name() + ' es ' +
CONVERT(VARCHAR(30),@TamanoOriginal) + ' páginas de 8 KB ó ' +
CONVERT(VARCHAR(30),(@TamanoOriginal *8/1024)) + 'MB'
FROM sysfiles
WHERE name = @NombreLogicoArchivo
CREATE TABLE DummyTrans(DummyColumna char (8000) not null)


-- Dar la vuelta al registro y truncarlo.
DECLARE @Contador INT,
@HoraInicio DATETIME,
@TruncReg VARCHAR(255)
SELECT @HoraInicio = GETDATE(),@TruncReg = 'BACKUP LOG [' + db_name()
+ '] WITH TRUNCATE_ONLY'
-- Intentar una reducción inicial.
DBCC SHRINKFILE (@NombreLogicoArchivo, @NuevoTamano)
EXEC (@TruncReg)
-- Dar la vuelta al registro, si es necesario.
-- no se ha excedido el máximo tiempo establecido
WHILE @MaxMinutos > DATEDIFF (mi, @HoraInicio, GETDATE())
-- no se ha reducido el registro
AND @TamanoOriginal = (SELECT size FROM sysfiles WHERE name =
@NombreLogicoArchivo)
-- El valor pasado para el tamaño nuevo es más pequeño que el tamaño
actual.
AND (@TamanoOriginal * 8 /1024) > @NuevoTamano
BEGIN -- Bucle externo.
SELECT @Contador = 0 WHILE ((@Contador < @TamanoOriginal / 16)
AND (@Contador < 50000))

BEGIN -- Actualización
-- Como es un campo de tipo char, inserta 8000 bytes.

INSERT DummyTrans VALUES ('Llenar registro')
DELETE DummyTrans
SELECT @Contador = @Contador + 1
END -- Actualización Probar si un truncamiento reduce de
tamaño el registro.
EXEC (@TruncReg)
END -- Bucle externo

SELECT ' El tamaño final del registro de ' + db_name() + ' es de ' +
CONVERT(VARCHAR(30),size) + ' páginas de 8 KB ó ' +
CONVERT(VARCHAR(30),(size*8/1024)) + 'MB'
FROM sysfiles
WHERE name = @NombreLogicoArchivo
DROP TABLE DummyTrans
PRINT '*** RECUERDE: DEBE REALIZAR UNA COPIA DE SEGURIDAD COMPLETA DE
LA BASE DE DATOS***'
SET NOCOUNT OFF


0 new messages