Ir al contenido principal

Cremiento de espacio en la base de datos?

¿Por qué crece tanto mi base de datos? Un problema muy habitual (bueno, realmente no es un problema, como ahora veremos) al trabajar con SQL Server, es que una base de datos crezca y crezca hasta incluso agotar todo el espacio de disco disponible. En muchos casos, esto es debido al modo de registro completo (Recovery Full) y a la configuración de Copias de Seguridad del LOG. En este capítulo se explica este problema, así como soluciones y alternativas.

Por defecto, la base de datos MODEL de SQL Server, está configurada con el Modo de Recuperación o Modo de Registro en Completo (Recovery Full), excepto en las ediciones MSDE y SQL Express. Este modo de registro, implica que todas las transacciones ejecutadas contra la base de datos (DMLs, Planes de Mantenimiento, etc.) quedan almacenadas en el fichero (o ficheros) de LOG de la misma. Como consecuencia, con el paso del tiempo, la base de datos irá tomando cada vez un tamaño mayor, debido al aumento producido en el LOG, y si no ponemos remedio, se puede llegar a llenar el disco duro, lo cual, muy probablemente implicará una caída del servicio.
El principal problema es que siempre que creamos una base de datos, salvo que especifiquemos de forma explícita lo contrario, se creará a imagen y semejanza de MODEL, luego este problema se puede materializar sobre todas las bases de datos de nuestras Instancias. No es raro encontrar una base de datos con 20 MB de datos y 40 GB de Log...
Pero ¿cómo podemos solucionar este problema de crecimiento de bases de datos? Pues tenemos principalmente dos alternativas:
  • Cambiar el modo de registro a sencillo (Recovery SIMPLE). No es lo más recomendable, pero tenemos que admitir que es la solución más sencilla. En este modo de registro, siempre que se confirma o deshace una transacción, el espacio ocupado en el fichero de LOG se queda como espacio libre reutilizable por futuras transacciones, con lo cual, el fichero de Log es muy improbable que crezca (puede crecer por alguna transacción grande, o por múltiples transacciones activas - ej: concurrencia - pero nada prohibitivo).
  • Realizar Backups de LOG con frecuencia. Esta es la opción recomendada. Al realizar un Backup de Log, la información de las transacciones se lleva al dispositivo de Backup, y una vez que ha sido respaldada dicha información, se marca como reutilizable el espacio de LOG que utilizaba. Por ello, si hacemos Backups de Log con frecuencia, tendremos controlado el tamaño del Log de nuestras bases de datos, pero implica respaldar el LOG de nuestra base de datos con frecuencia.

    Además, en caso de necesidad, podemos restaurar nuestro último Backup FULL, y seguidamente, recuperar todos los Backups de LOG hasta el momento en el tiempo en que deseamos recuperar. Y no sólo eso... incluso si nuestro último Backup FULL está corrupto o lo hemos perdido, es posible recuperar un Backup FULL anterior y seguidamente recuperar todos los Backups de LOG hasta el momento deseado.

    Sin embargo, implica un riesgo importante: Si no es posible realizar los Backup de LOG (ej: el Agente de SQL Server está en estado detenido), seguiremos con el mismo problema de crecimiento del fichero de LOG, y además, el siguiente Backup de LOG, se llevará toda la información de LOG pendiente de respaldar, lo que puede implicar un Backup costoso.

Comentarios

Entradas populares de este blog

¿En qué puerto TCP escucha SQL Server 2005? ¿Cómo cambiar o configurar el puerto TCP de escucha de una Instancia de SQL Server 2005?

Una buena práctica inmediatamente después de instalar SQL Server 2005 es cambiar el Puerto TCP de escucha, por múltiples motivos: Seguridad, Configuración de reglas de acceso de Firewall, Aplicaciones cliente que requieren un puerto TCP estático para SQL Server, etc. En este Artículo se explica cómo averiguar en qué puerto TCP escucha SQL Server 2005, cómo cambiar el puerto TCP de escucha de SQL Server 2005, etc. Resulta de gran interés ser capaz de responder a la pregunta  ¿En qué puerto TCP escucha SQL Server?  Por defecto, una  Instancia por Defecto de SQL Server 2005  queda configurada durante la instalación para escuchar en el  puerto TCP-1433 , sin embargo,  las Instancias con Nombre  quedan configuradas durante el proceso de instalación para escuchar en  puertos TCP dinámicos , por lo tanto, cada vez que se inicie la Instancia puede que escuche en un puerto diferente. Esta situación puede resultar problemática, por un lado desde el punto de vista de la seguridad (el hecho d

¿Qué es el nivel de aislamiento (Isolation Level) de una Transacción? ¿Qué niveles de aislamiento ofrece SQL Server?

Esta capítulo explica qué es el nivel de aislamiento (isolation level) de una transacción, el comportamiento de SQL Server en operaciones de lectura o de escritura, se detallan los diferentes niveles de aislamiento basados en bloqueos (READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE) y los niveles de aislamiento basados en versionado de filas (READ COMMITTED SNAPSHOT, SNAPSHOT), se explican los males de la concurrencia (lecturas sucias, lecturas no repetibles, lecturas fantasma, y conflictos de actualización), como establecer el nivel de aislamiento deseado (SET TRANSACTION ISOLATION LEVEL y las opciones de base de datos READ_COMMITTED_SNAPSHOT y ALLOW_SNAPSHOT_ISOLATION), cómo conecer el tiempo máximo de bloqueo (@@LOCK_TIMEOUT) y como establecer el tiempo máximo de bloqueo (SET LOCK_TIMEOUT), etc. El nivel de aislamiento de una transacción (transaction isolation level)  define el grado en que se aísla una transacción de las modificaciones de recursos o datos rea

Aumentar y Reducir la TempDB en SQL Server?

Una buena práctica después de instalar SQL Server (y que interesa revisar periódicamente) es tener bien dimensionada la base de datos TEMPDB, es decir que el  tamaño inicial de TEMPDB  sea suficiente, y en consecuencia no sea necesario que TEMPDB crezca ni tampoco reducir TEMPDB (SHRINK). Esta artículo explica brevemente  para qué sirve TEMPDB , explica camo cambiar el tamaño inicial de TEMPDB (aumentar o reducir),  cómo reducir TEMPDB , cuántos ficheros son recomendables para TEMPDB, etc. ¿Para qué sirve TEMPDB?  La base de datos TEMPDB es un elemento de gran importancia en una Instancia de SQL Server, ya que  TEMPDB es la encargada de almacenar tanto los objetos temporales  (tablas temporales, procedimientos almacenados temporales, etc.),  como los resultados intermedios  que pueda necesitar crear el motor de base de datos, por ejemplo durante la ejecución de consultas que utilizan las cláusulas GROUP BY, ORDER BY, DISTINCT, etc. (es decir, las tablas temporales o WorkTables que