Sie sind auf Seite 1von 3

TRUNCAR DB PrimaveraNew

Para Limpiar el Log de Transacciones es necesario realizar un Backup


del Log
Backup log PrimaveraNeW
to disk =C:\test\BackupLog.bak
Una vez hecho el backup consultamos el nombre lgico de
los archivos del log
sp_helpdb PrimaveraNeW
Resultado:

Antes de truncar el log cambiamos el modelo de recuperacin a


SIMPLE.
ALTER DATABASE PrimaveraNeW
SET RECOVERY SIMPLE;
GO
Reducimos el log de transacciones a 1 MB.
DBCC SHRINKFILE(PrimaveraNeW_Log, 1);
GO
Cambiamos nuevamente el modelo de recuperacin a Completo.
ALTER DATABASE PrimaveraNeW
SET RECOVERY FULL;
GO

Reducir el tamao del log de transacciones de todas las


bases de datos en SQL Server.
Dndole vueltas a lo que escrib en el post anterior se me ocurri que poda crear un script
para reducir el log de transacciones de todas las bases de datos (en SQL Server 2005 y
superior), exceptuando aquellas que son del propio sistema.
El algoritmo se basa en los pasos siguientes:
1.
Recorrer todas las bases de datos que no son de sistema y que tienen el modelo de
recuperacin en completo o registro de copias masivas (quedan almacenadas en la variable de
tabla @tblBD).
2.
Poner las bases de datos que cumplen las condiciones anteriores en modelo de
recuperacin simple.
3.
Buscar los ficheros que almacenan los registros de transacciones para cada base de
datos (quedan almacenados en la tabla temporal #tblLog).
4.
Reducir el espacio de cada uno de los ficheros detectados en el paso anterior
(mediante la instruccin DBCC_SHRINKFILE)
5.
Poner el modelo de recuperacin de la base de datos al estado original (completo o
registro de copias masivas).
As que me puse manos a la obra, y aqu os lo dejo:
DECLARE @tblBD TABLE
(
IDAux SMALLINT IDENTITY(1,1),
BDID INT,
BDName VARCHAR(4000),
RecoveryModel SMALLINT
)
CREATE TABLE #tblLog
(
IDRowLog SMALLINT IDENTITY (1,1),
LogFilename VARCHAR(4000)
)
DECLARE
DECLARE
DECLARE
DECLARE
DECLARE
DECLARE

@intRecoveryModel SMALLINT
@intNumTotalBD SMALLINT
@intContBD SMALLINT=1
@intBDID INT
@strBDName VARCHAR(4000)
@strSQL AS NVARCHAR(4000)

INSERT INTO @tblBD


SELECT database_id,
name,
recovery_model
FROM sys.databases
WHERE NAME NOT IN ('master','tempdb','model','msdb')
AND recovery_model IN (1,2)
SELECT @intNumTotalBD=COUNT(*) FROM @tblBD
WHILE @intContBD<=@intNumTotalBD
BEGIN
SELECT @intBDID=BDID,
@strBDName=BDName,
@intRecoveryModel=RecoveryModel
FROM @tblBD WHERE IDAux=@intContBD
SET @strSQL='ALTER DATABASE '+@strBDName+' SET RECOVERY SIMPLE'
exec sp_executesql @strSQL

--PRINT @strsQL
DECLARE @intLogTotal AS SMALLINT
DECLARE @intPos AS SMALLINT=1
DECLARE @strLogFile AS VARCHAR(4000)
INSERT INTO #tblLog (LogFilename)
SELECT name FROM sys.master_files
WHERE database_id=@intBDID AND type=1
SELECT @intLogTotal=COUNT(*)
FROM #tblLog
WHILE @intPos<=@intLogTotal
BEGIN
SELECT @strLogFile=LogFileName
FROM #tblLog WHERE IDRowLog=@intPos
SET @strSQL='USE '+@strBDName+' DBCC SHRINKFILE('+@strLogFile+')'
EXEC sp_executesql @strSQL
--PRINT @strSQL
SET @intPos+=1
END
TRUNCATE TABLE #tblLog
IF @intRecoveryModel=1
SET @strSQL='ALTER DATABASE '+@strBDName+' SET RECOVERY FULL'
ELSE
SET @strSQL='ALTER DATABASE '+@strBDName+ ' SET RECOVERY
BULK_LOGGED'
exec sp_executesql @strSQL
--PRINT @strSQL
SET @intContBD+=1
END
DROP TABLE #tblLog
Aun as, tambin existen otras formas de lograr el mismo objetivo, con lo que podis evaluar
la opcin que ms os guste o entendis mejor.
Enjoy T-SQL!

Das könnte Ihnen auch gefallen