Memorias de un DBA

Un blog dedicado a contribuir a la comunidad SQL Server en español

El Datafile que no podia eliminarse

leave a comment »

Empezaré diciendo que el eliminar datafiles de una base de datos no es una tarea que sea del todo recomendada ni mucho menos frecuente dentro de las tareas cotidianas de una DBA, pero hay momentos en los que se va a necesitar realizarla y hay que estar preparados para saber qué hacer si esta falla, como me paso a mí.

Primero hay que entender que los datafiles son los archivos físicos de nuestra base de datos. Cuando creamos una base de datos, se crea por defecto sólo uno (basado en lo que tengamos configurado en nuestra base de datos “model”), el cual tiene como extension *.mdf. Sin embargo, nosotros podemos crear más datafiles, conocidos como secundarios y de extensión *.ndf, los cuales podemos distribuirlos entre los diferentes discos de nuestro servidor.

Ahora en mi caso particular yo estaba buscando refrescar uno de mis ambientes de desarrollo con data más reciente de mi base de datos de producción, pero dado que esta es una base de datos de más de 1TB de información y que se tiene una limitación de espacio en el ambiente de desarrollo, antes de refrescar el ambiente, se hace un trabajo de truncado de tablas de log y otras que no son importantes para el funcionamiento de la aplicación en el ambiente de desarrollo. Luego del proceso de truncado se procede a realizar un shrink de los datafiles (lo cual es algo que JAMAS se debe hacer en producción) y la eliminación de los datafiles que sobran y esto venía funcionando bien desde siempre hasta que un día FALLO.

Esta falla evitaba que el datafile se vaciara completamente, por ende, hacía imposible su eliminación, luego de mucho buscar y ver en los primeros resultados de mi búsqueda que uno nunca va a poder hacer un DBCC SHRINK con EMPTYFILE a un archivo primario (recuerdan el archivo *.mdf, ese es el primario), lo cual ya sabía, solo se puede hacer esto en los secundarios, y el archivo que no podía eliminar era efectivamente un secundario. El mensaje de error que aparecía era el siguiente:

Msg 2555, Level 16, State 2, Line 2
Cannot move all contents of file “xxx” to other places to complete the empty

Entonces lo que se me ocurrio fue buscar que objetos eran los que no se habia podido mover del datafile que queria eliminar, para esto use la siguiente consulta, la cual viene de esta pagina:

CREATE TABLE #Object_Search
(File_id          BIGINT,
Page_id          BIGINT,
pg_alloc         BIGINT,
ext_size         BIGINT,
object_id        BIGINT,
index_id         BIGINT,
partition_number BIGINT,
partition_id     BIGINT,
iam_chain_type   VARCHAR(50),
pfs_bytes        VARCHAR(50)
);
GO

INSERT INTO #Object_Search
EXEC ('DBCC EXTENTINFO(''MyDatabase'')');
GO

DECLARE @id AS INT;
SELECT @id = FILE_ID('xxx');
SELECT DISTINCT
[name]
FROM
(
SELECT OBJECT_NAME(object_id) AS name,
*
FROM #Object_Search
WHERE File_id = @id
) x;

Esto me permitio ubicar la tabla “heap” que no se estaba moviendo, lo que hice para resolver el problema fue crearle un indice cluster, y volver a ejecutar el comando DBCC SHRINKFILE con EMPTYFILE y esta vez si funciono y pude eliminar el archivo que me estaba dado problemas.

Espero que este corto articulo les haya sido de utilidad. Hasta la proxima.

 

Written by dbamemories

noviembre 11, 2016 a 4:27 pm

Publicado en SQL Server Database

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: