MSDE – ‘PRIMARY’ filegroup is full

Oggi parliamo di databases.

Microsoft SQL Server è un DBMS relazionale prodotto da Microsoft.
Tabella confronto DB

Spesso il limite di 2GB relativo a MSDE può diventare un problema in quanto non ci si accorge che il database è prossimo alla soglia e quando perviene la fatidica frase

“Could not allocate space for object ‘<nometabella>’ in database ‘<nomedatabase>’ because the ‘PRIMARY’ filegroup is full.”

è tardi… il database è praticamente bloccato ed ‘inservibile’

In realtà il database non sempre è ‘veramente’ pieno ma è lo spazio allocato ad aver raggiunto il limite.

Le soluzioni sono molteplici…. ma spesso per liberare spazio bisogna in qualche modo allocarne dell’altro e questo innesca in circolo vizioso che non permette di risolvere il problema.

Lo script .sql che vi propongo può aiutare alla risoluzione, va lanciato tramite query analizer.


/* SHRINK DATABASE */
/* Michele Levada 20080130 */

/* HOW TO EXECUTE (Using query analizer) */
/* Edit –> Replace template parameter */
/* put the name of database to shrink */
/* NOTE: lauch twice for better compression */

/* Inizialmente vengono selezionate le singole tabelle e messe in */
/* ordine di grandezza asc Sucessivamente viene lanciata la */
/* reindicizzazione dei dati per singola tabella */
/* Al termine viene fatto lo shrink del database */

/* TO DO LIST */
/* Verify autogrow.. and if off turn on */
/* sp_dboption ” */
/* sp_dboption ” , ‘trunc. log on chkpt.’ , ‘TRUE’ */
/* sp_dboption ” , ‘autoshrink’ , ‘TRUE’ */

USE

CREATE TABLE #LISTATABELLE
( Nome VARCHAR (128) ,
Risorsa INT ,
Dimensione INT
)
INSERT #LISTATABELLE ( Nome, Risorsa, Dimensione )

SELECT
Nome = SYSOBJECTS.NAME ,
Risorsa = SYSOBJECTS.ID ,
Dimensione = 0
FROM SYSOBJECTS (NOLOCK)
WHERE XTYPE = ‘U’
ORDER BY NAME

UPDATE Z
SET Z.Dimensione = ( select sum(convert(dec(15),reserved))
from sysindexes
where indid in (0, 1, 255)
and ID = Z.Risorsa
)
FROM #LISTATABELLE Z

SELECT * FROM #LISTATABELLE

DECLARE @NAME VARCHAR (128)
DECLARE @COMANDO NVARCHAR (128)

DECLARE RSREINDICIZZA CURSOR READ_ONLY
FOR SELECT Nome
FROM #LISTATABELLE (NOLOCK)
ORDER BY Dimensione

OPEN RSREINDICIZZA
FETCH NEXT FROM RSREINDICIZZA INTO @name
WHILE @@FETCH_STATUS <> -1
BEGIN
IF @@FETCH_STATUS <> -2
BEGIN

set @COMANDO = N’DBCC DBREINDEX (“‘+ @NAME + ‘”)’
PRINT @COMANDO
EXECUTE sp_executesql @COMANDO

END
FETCH NEXT FROM RSREINDICIZZA INTO @name
END
CLOSE RSREINDICIZZA
DEALLOCATE RSREINDICIZZA

dbcc shrinkdatabase (”)

Tags: , ,

Comments are closed.