Estoy experimentando algunos mensajes de error extraños en SQL Server 2017 CU3. Estoy migrando bases de datos y reorganizando grupos de archivos. Por "reorganizar" quiero decir que uso un procedimiento almacenado que crea una función de partición y un esquema de partición en el nuevo grupo de archivos para un objeto, reconstruye los índices durante la partición y luego elimina la partición.
Al final tengo algunos grupos de archivos vacíos. Sus archivos son eliminados . También se eliminan los propios grupos de archivos. Esto funciona bien en la mayoría de los casos. Sin embargo, para dos bases de datos eliminé los archivos ... me queda un grupo de archivos sin ningún archivo asociado pero
ALTER DATABASE REMOVE FILEGROUP
arroja un error 5042:
El grupo de archivos 'xyz' no se puede eliminar porque no está vacío.
Pregunta
¿Cómo puedo deshacerme de ese grupo de archivos vacío ... cuál podría ser el problema?
Ya he leído algunos problemas comunes, sin embargo, no están presentes en mi sistema:
Comprobado:
SELECT * FROM sys.partition_schemes; SELECT * FROM sys.partition_functions;
0 filas ... no quedan objetos de partición en la base de datos
UPDATE STATISTICS
para todos los objetos en la base de datossin efecto
Comprueba los índices en el grupo de archivos:
SELECT * FROM sys.data_spaces ds INNER JOIN sys.indexes i ON ds.data_space_id = i.data_space_id WHERE ds.name = 'xyz'
0 filas
Comprueba los objetos en el grupo de archivos:
SELECT au.*, ds.name AS [data_space_name], ds.type AS [data_space_type], p.rows, o.name AS [object_name] FROM sys.allocation_units au INNER JOIN sys.data_spaces ds ON au.data_space_id = ds.data_space_id INNER JOIN sys.partitions p ON au.container_id = p.partition_id INNER JOIN sys.objects o ON p.object_id = o.object_id WHERE au.type_desc = 'LOB_DATA' AND ds.name ='xyz'
0 filas
También probé DBCC SHRINKFILE
con el parámetro EMPTYFILE
antes de eliminar el archivo del grupo de archivos. Realmente no tiene sentido para mí, sin embargo, leo soluciones para describir eso como una solución. No tuvo efecto de todos modos.
Tengo algo de esperanza al leer esta pregunta sobre la falla del servidor e intenté lo siguiente:
- Actualizar todas las estadísticas
- Descarte todas las estadísticas que no estén relacionadas con índices
Sin embargo, esto no tuvo ningún efecto. Todavía tengo un grupo de archivos sin ningún archivo asociado y el grupo de archivos no se puede eliminar. Estoy totalmente perplejo ya que esto sucede en algunas bases de datos y no en otras (con la misma estructura). Cuando realizo DBCC CHECK FILEGROUP
en este grupo de archivos vacío recibo un montón de mensajes de error como el siguiente:
No se puede procesar el ID de conjunto de filas 72057594712162304 del objeto "STORY_TRANSLATIONSCCC" (ID 120387498), índice "Ref90159CCC" (ID 2), porque reside en el grupo de archivos "CCC_APPLICATION_new" (ID 8), que no se verificó.
Resultados de DBCC para 'STORY_TRANSLATIONSCCC'. Hay 0 filas en 0 páginas para el objeto "STORY_TRANSLATIONSCCC".
¿Es esto normal o apunta a algo inusual?
Esta pregunta puede ser un duplicado, sin embargo, no puedo encontrar una solución para mí en otras preguntas sobre dba.stackexchange. Echa un vistazo a la lista de lo que ya he probado. Esto es idéntico a las soluciones descritas en No se pueden eliminar los grupos de archivos no utilizados .
Más detalles
Quizás sea útil entender lo que hago antes de que ocurra el error. Estoy planeando una migración a un nuevo servidor. Actualmente estoy probando esto en una instancia de prueba. Las bases de datos se restauran desde el servidor de producción y el modelo de recuperación cambia a simple. Mi objetivo es reestructurar los grupos de archivos y pasar de un modelo con un archivo por grupo de archivos a un modelo con dos archivos por grupo de archivos. Para lograrlo, creo nuevos grupos de archivos vacíos con dos archivos cada uno y muevo los datos. Desafortunadamente, la mayoría de los objetos tienen datos LOB (XML y binario) ... así que aprovecho la partición como ayuda para mover los datos lob también. Al final, todos los datos residen en los nuevos grupos de archivos y los grupos de archivos antiguos están vacíos. Luego elimino todos los archivos y elimino el grupo de archivos correspondiente también. El grupo de archivos primario permanece y solo se agrega otro archivo.pregunta mía . Este proceso funciona bien pero en dos bases de datos los archivos se pueden eliminar pero el grupo de archivos no. Sorprendentemente, la estructura de estas bases de datos debería ser la misma que la estructura de otras bases de datos si no se encuentran problemas en el proceso de mover los datos y eliminar los antiguos grupos de archivos.
Aquí hay una lista de grupos de archivos y archivos de las dos bases de datos donde ocurre el problema:
- CCC_GENTE
antes de
+-----------------+------------+
| Filegroup | Filename |
+-----------------+------------+
| CCC_APPLICATION | CCC_APP |
+-----------------+------------+
| CCC_ARCHIVE | CCC_ARCHIV |
+-----------------+------------+
| CCC_AXN | CCC_AXN |
+-----------------+------------+
| CCC_GDV | CCC_GDV |
+-----------------+------------+
| PRIMARY | CCC |
+-----------------+------------+
después
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| Filegroup name | Filegroup temporary name | Filename (logical) | Status |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_APPLICATION | - | CCC_APP | file removed, filegroup cannot be removed (error) |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_ARCHIVE | - | CCC_ARCHIV | file and filegroup removed |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_AXN | - | CCC_AXN | file and filegroup removed |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_GDV | - | CCC_GDV | file and filegroup removed |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| PRIMARY | - | CCC | file renamed to PRIMARY_1 |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| PRIMARY | - | PRIMARY_2 | new file added |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_APPLICATION | CCC_APPLICATION_new | CCC_APPLICATION_1 | new filegroup renamed at the end |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_APPLICATION | CCC_APPLICATION_new | CCC_APPLICATION_2 | new filegroup renamed at the end |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_ARCHIVE | CCC_ARCHIVE_new | CCC_ARCHIVE_1 | new filegroup renamed at the end |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_ARCHIVE | CCC_ARCHIVE_new | CCC_ARCHIVE_2 | new filegroup renamed at the end |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_AXN | CCC_AXN_new | CCC_AXN_1 | new filegroup renamed at the end |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_AXN | CCC_AXN_new | CCC_AXN_2 | new filegroup renamed at the end |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_GDV | CCC_GDV_new | CCC_GDV_1 | new filegroup renamed at the end |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_GDV | CCC_GDV_new | CCC_GDV_2 | new filegroup renamed at the end |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
Espero que ayude un poco. También hay una segunda base de datos donde los nombres de los grupos de archivos son diferentes, pero lo dejo por razones de brevedad.
fuente
Respuestas:
Verificación doble de grupos de archivos en la base de datos
Verifique que el grupo de archivos no tenga ningún archivo adjunto emitiendo el siguiente comando:
Esto producirá una lista de grupos de archivos:
... y luego para cada grupo de archivos listado ejecutar
El resultado podría verse así:
.... y la segunda salida podría ser:
Eliminar el grupo de archivos
Si aún tiene un archivo asociado con uno de sus grupos de archivos, entonces el comando completo para eliminar el archivo lógico del grupo de archivos y el grupo de archivos en sí sería:
El grupo de archivos 'xyz' es el predeterminado
Si recibe un mensaje de error al intentar eliminar el archivo lógico del grupo de archivos que se ve así:
... entonces tendrá que establecer el grupo de
PRIMARY
archivos como el grupo deDEFAULT
archivos:El grupo de archivos 'xyz' es de solo lectura
Sin embargo, si el mensaje de error es el siguiente:
... entonces tendrá que eliminar la propiedad READ_ONLY en el grupo de
xyz
archivos:Ahora debería poder soltar el archivo lógico del grupo de archivos y el propio grupo de archivos.
Transacciones Abiertas
Si realmente no tiene un archivo (nombre_lógico / nombre_archivo_pídico) asociado con el grupo de archivos
xyz
que está tratando de eliminar, realizar una copia de seguridad del registro de transacciones podría liberar cualquier transacción que dificulte la eliminación del grupo de archivos.Marca 911
Si todo lo demás falla, es posible que desee considerar abrir una llamada con Microsoft.
Desajuste de metadatos
Agregado después de más investigación
Aparentemente hay casos en que los metadatos en la base de datos no reflejan la ubicación real de los objetos.
Referencia:
- REVISIÓN: error de inconsistencia de metadatos después de cambiar las particiones de la tabla y soltar los archivos y grupos de archivos correspondientes (Soporte de Microsoft)
- REVISIÓN: El error ocurre cuando intenta colocar o eliminar grupos de archivos o esquemas y funciones de partición en SQL Server (Soporte de Microsoft)
Estos dos casos parecen resolverse con la actualización acumulativa 3 para SQL Server 2014 SP1 y la actualización acumulativa 1 para SQL Server 2016, respectivamente. No se aplican a su situación, pero muestran que a veces los metadatos pueden estar equivocados.
El elemento que parece estar bloqueando la eliminación de su grupo de archivos es el índice, que podría almacenarse con metadatos incorrectos.
Solución posible
Considere reconstruir el índice al
Ref90159CCC
que se hace referencia en el mensaje de error.El siguiente artículo describe una situación similar y muestra cómo el autor detectó al culpable y resolvió la situación.
Referencia: SQL Server: problema de inconsistencia de metadatos y particiones de conmutador (Blog dbi-services.com)
Buscar objetos relacionados con el grupo de archivos obsoleto
Arreglé este script para verificar la mayor cantidad posible de escondites para tablas / índices / particiones / etc. que aún podría estar relacionado con el archivo de grupo de archivos descartado:
Reemplácelo
DEFAULTRO
con el nombre de su grupo de archivos obsoleto (pCCC_APPLICATION
. Ej. )Referencia: mi guión personal
Ejecútelo y vea si se muestran objetos que contengan su grupo de archivos obsoleto. Ir con el en
data_space_id
lugar de con el nombre. Las uniones son intencionalmenteFULL
para capturar referencias "huérfanas".Alternativamente, use este script más pequeño para verificar rápidamente los elementos del grupo de archivos obsoleto:
Referencia: SERVIDOR SQL - Listar todos los objetos creados en todos los grupos de archivos en la base de datos (SQLAuthority.com)
fuente
...CCC_APPLICATION_new...
es ese el grupo de archivos temporal?) Algunas ideas más y trataré de reproducirlo en mi entorno.Después de cuatro meses, el soporte técnico de Microsoft encontró una solución. De hecho, había una tabla que se refería a este grupo de archivos presumiblemente vacío.
La tabla fue identificada por la siguiente declaración:
Después de mover los datos a una nueva tabla y soltar la tabla problemática, el grupo de archivos se eliminó con éxito. El proceso de mover los datos fue: crear una nueva tabla con la misma estructura e índices, copiar datos a través de SELECT INTO, soltar la tabla anterior, cambiar el nombre de la nueva tabla (y, por supuesto, cuidar las claves externas si hay alguna en todo el proceso) )
fuente