Tengo una base de datos de desarrollo de SQL Server 2005 que es una copia de 30GB en vivo. Hemos eliminado algunos datos que no son necesarios en dev, lo que reduce el espacio de archivos de datos utilizado a 20 GB. Entonces tenemos alrededor del 33% sin usar.
Necesito recuperar el espacio, lo que nos permitirá tener un segundo dev DB en el servidor (basado en la versión reducida); Sin embargo, no puedo reclamar el espacio, he hecho lo siguiente:
El tamaño inicial del archivo
SMS2_Data
es de 30 GB.DBCC SHRINKFILE (N'SMS2_Data' , 0, TRUNCATEONLY)
seguido por
DBCC SHRINKFILE (N'SMS2_Data' , 19500)
Sin alegría. He intentado hacer una copia de seguridad, creando una nueva base de datos con un tamaño inicial bajo y luego restaurando, no me alegro, ya que el tamaño inicial se sobrescribe. También he intentado:
ALTER DATABASE SMS2HazSub MODIFY FILE (NAME = 'SMS2_Data', SIZE = 20000)
Esto erró, diciendo:
MODIFICAR ARCHIVO falló. El tamaño especificado es menor que el tamaño actual.
Intenté 20800 y luego seguí subiendo hasta 29000 (29GB) y todavía no me deja cambiarlo.
Han hecho la contracción y luego cambió el modo de recuperación a partir FULL
de SIMPLE
y viceversa. Sin alegría.
Pensé que tenía que ver con algunos TEXT
campos. Tenemos alrededor de 6 en todo el sistema. Entonces, como prueba, los descarté todos y luego reduje el archivo y aún no cambié.
La única opción que queda es reimportar los datos a otra base de datos. Esto no es práctico, ya que tendría que hacerse en la base de datos en vivo, lo que conlleva demasiado riesgo. Tomamos regularmente una copia de la base de datos en vivo y sobrescribimos dev / test. Tenemos algo así como 500 mesas. Me gustaría una forma de hacerlo que no tuviera el riesgo de exportar datos a una nueva base de datos.
Intenté mover los datos a otro archivo, y copió todos menos el 5% de los datos. Esto es lo que me llevó a intentar soltar todas las columnas de texto.
El servidor está en modo de compatibilidad 90, pero es SP2. Ahora he hecho lo siguiente 3 veces: reindexar todas las tablas, base de datos de copia de seguridad, reducir el archivo, reducir la base de datos. Aún no hay alegría.
EXECUTE sp_spaceused
devoluciones:
database_name database_size unallocated space
SMS2Tests 31453.94 MB 13903.16 MB
reserved data index_size unused
16545568 KB 10602264 KB 4254360 KB 1688944 KB
fuente
Supongo que tiene un único archivo de base de datos con el nombre lógico SMS2_Data. También tiene uno o más archivos de registro de transacciones en la base de datos.
Tiene un desafío que no se puede solucionar en la copia actual de la base de datos. La información importante que declara es que el "tamaño original del archivo de base de datos es de 30 GB". Desafortunadamente, este archivo no se puede reducir más pequeño que su tamaño original.
Como ya has experimentado, SHRINKDB y SHRINKFILE no te están dando lo que quieres. Estos comandos siguen la regla no puede reducirse más pequeña que el tamaño original. Por lo tanto, solo puede reducir una base de datos al tamaño original y no más pequeña.
La copia de seguridad y restauración de la base de datos a una base de datos más pequeña existente tampoco funciona. Cuando realiza una restauración de la base de datos, los archivos de la base de datos se restauran a los tamaños de archivo tal como estaban durante la copia de seguridad. Y, el modelo de recuperación (simple, completo, etc.) no tiene relevancia para este problema.
Y, un último punto de malas noticias. Puede considerar agregar otros archivos de base de datos más pequeños a la base de datos, transferir todos los datos del archivo de 30 GB y luego soltarlo. Desafortunadamente, esto tampoco funcionará porque no puede eliminar el archivo inicial de la base de datos.
Entonces, la mejor solución es copiar los datos a otra base de datos. Tienes algunas opciones aquí, y quizás ya las conozcas. El primer paso es crear una nueva base de datos con un tamaño que sea menor que el tamaño de los datos. Luego, puede expandir el tamaño de la base de datos al tamaño requerido.
Puede considerar SSIS como una forma de transferir los datos de una base de datos a la otra. Encontrará una tarea de copia de la base de datos que lo ayudará. Puedes seguir los siguientes pasos:
Consulte información adicional sobre la tarea de la base de datos de transferencia de SSIS .
fuente
Algún espacio no utilizado en la base de datos es normal.
Si tiene muchos registros grandes (por ejemplo, cadenas largas), podría haber mucho espacio sin usar en las páginas de datos (porque un registro generalmente no se divide entre páginas).
Otra cosa es un factor de relleno: inicialmente, los índices agrupados no se crean 100% completos para evitar divisiones de página (una operación costosa) en inserciones posteriores.
Si se eliminaron muchos datos de la base de datos, el espacio previamente ocupado por estos datos no se recuperará automáticamente, permanecerá asignado a la tabla.
Intente llamar
DBCC DBREINDEX (table_name, '', 100)
a todas las tablas de su base de datos: reconstruirá todos los índices con un factor de relleno del 100%, de modo que los datos se coloquen de la manera más compacta posible. Luego intente reducir la base de datos nuevamente.fuente
Descubrí que reducir una base de datos de SQL Server puede ser problemático. Parece que tienes que hacer una canción y una rutina de baile.
Este es el proceso por el que generalmente paso:
Base de datos de Backup Shrink El registro de Backup Shrink y los archivos de base de datos por separado. Copia de seguridad Repita hasta que finalmente se encoja.
He tenido que hacer este proceso algunas veces hasta tres veces para que finalmente funcione. Hemos tenido una base de datos de más de 68 GB de tamaño, con algo del 98% de espacio no utilizado. Pasé por esta rutina de canto y baile varias veces, pero finalmente se redujo a menos de 1 GB.
fuente
Hubiera intentado reducir el tamaño inicial del archivo mdf a 29 000 MB primero, luego a 28, 000 detectando el golpe cercano.
No es razonable esperar reducir el 30% en el tamaño del archivo de la base de datos al eliminar el 30% de los datos.
Puede estimar cuánto espacio no utilizado en su base de datos por
en el contexto de su base de datos (use yourdatabaename;)
¿Puede publicar el resultado de su ejecución?
Actualización:
publiqué mi pregunta relacionada:
fuente