Content

  

General description

En SQL Server 2000 cada base de datos se compone de dos archivos fundamentales: LOGFILE (el archivo que termina en .ldf) y DATAFILE (el archivo que termina en .mdf).

Cuando uno crea una base de datos en SQL 2000 estos archivos se crean con un tamaño definido por el usuario, ese tamaño lo va a ocupar físicamente en el disco pero no quiere decir que realmente la información que contiene en su interior es de ese tamaño. (Nota: para recuperar el espacio "vacío" de ellos se puede usar el comando shrink, que es como el REORGANIZE FILE del as400, es como desfragmentar, en fin...)

El tema es que a muchos de nuestros clientes que trabajan día a día con SQL 2000 no les preocupa saber cuánto pesa un .mdf o un log file, sino que quieren saber realmente cuanto está ocupado realmente en ese archivo, porque cuando se llena pide más lugar y si el disco rígido se llena van a tener líos grandes con el SQL. (Cuando se crea la base de datos fíjense que tanto para el LOG como para el DATA file se les puede poner que al llenarse automáticamente crezcan un 10% de tamaño).

Para tener información del datafile se usa:
    DBCC SHOWFILESTATS

Para tener información del LOGfile se usa:
    DBCC SQLPERF(LOGSPACE)

Basándome en estos dos comandos, ideé la forma de sacar información a través de un monitor "Advance DataAdapter" de thinkserver, como lo hacemos? así:

1) En la base de datos de trabajo creamos 2 tablas para la recolección de información: (una para el LOG y otra para el DATA file)
-- Paso a usar la BD Barcelona/04
USE B04_VMC_LOCAL
-- Creo la tabla para los DataFile
create table DFtable(Fileid int, FileGroup int, TotalExtents real,
UsedExtents real, LogicalName varchar(256), Filename varchar(1200))
-- Creo la tabla para los Logs
create table LOGtable(Database_Name varchar(256), Log_Size real, Log_Used real, status int)

2) Y luego en el Edit DataSource del monitor en thinkserver le meto como:
    A. EJECUCIÓN PREVIA
    -- borro info vieja e inserto la información actualizada de data file
    DELETE FROM B04_VMC_LOCAL.DBO.DFTABLE
    insert DFtable exec ('DBCC showfilestats with NO_INFOMSGS')
    -- borro info vieja e inserto la info actualizada de log file
    DELETE FROM B04_VMC_LOCAL.DBO.LOGTABLE
    INSERT LOGTable exec ('dbcc sqlperf(logspace)')

3) Y como select finalmente lo siguiente:

-- veo la info de data y log files
SELECT SUBSTRING(DF.LogicalName,1,len(DF.logicalname)-5) as Name, DF.TotalExtents/16 as [Datafile size],
DF.UsedExtents/16 as [Datafile used], (DF.TotalExtents/16) - (DF.UsedExtents/16) as [Datafile Available MB],
LF.Log_Size as [Logfile size], (LF.Log_Used * LF.Log_size)/100 as [Logfile used],
LF.Log_Size - ((LF.Log_Used * LF.Log_size)/100) as [Logfile Available MB],
(LF.Log_Size) + (DF.TotalExtents/16) as [Log + Data size],
((LF.Log_Used * LF.Log_size)/100) + DF.UsedExtents/16 as [Log + Data used],
((LF.Log_Size) + (DF.TotalExtents/16)) - (((LF.Log_Used * LF.Log_size)/100) + DF.UsedExtents/16) as [Log+Data Available MB]
FROM DFtable DF, LOGTable LF
where SUBSTRING(DF.LogicalName,1,len(DF.logicalname)-5) = LF.Database_Name

Se adjunta el monitor para que lo vean entero. 
 

Solution

Fíjense que los umbrales de ROJO, AMARILLO están hechos para algo en particular que puede no ser lo que se quiere, hay que analizar particularmente el requerimiento final del cliente en este tema. Si es que quiere ver cuando el log llega a tener espacio disponible bajo, o el datafile + log, etc. Eso es como dicen: "sal y pimienta a gusto".

Unos datitos más que pueden resultar interesantes para interpretar las tablas que larga el DBCC de showfilestats son que el SQL 2000 divide internamente todo en Pages, cada página tiene 8 Extents, y cada Extent tiene 64 KB. De ahí que divido en varios casos por 16, para transformar de Extent a MegaBytes.
 


Still have questions? We can help. Submit a case to Technical Support.

Last Modified On: October 24, 2018