SQL Server cómo evitar que el registro de transacciones se llene al actualizar una columna a un int

18

Tengo una tabla de SQL Server 2005 llamada BRITTNEY_SPEARS_MARRIAGESy tiene las siguientes columnas:

MarrigeId tinyint, 
HusbandName varchar(500),
MarrigeLength int

Ahora tengo otra mesa BRITTNEY_SPEARS_MARRIAGE_STORIES

StoryId int, 
MarriageId tinyint, 
StoryText nvarchar(max)

El problema es que queremos actualizar la MarrigeIdcolumna a intdesde a tinyint. Sentimos que Brittney tendrá muchos matrimonios antes de que todo esté dicho y hecho.

Ahora la BRITTNEY_SPEARS_MARRIAGE_STORIEStabla tiene 18 millones de filas (oye, la niña tiene algunos problemas), así que cuando vamos a hacer la actualización, el registro de transacciones se llena y nuestro cuadro de SQL Server muere.

¿Cómo podemos evitar esto?

¿Hay alguna forma de decir "Hola, SQL Server, voy a actualizar esta columna y hacerla más grande. Confía en mí en este SQL Server. Por favor, no llenes el registro de transacciones mientras intentas validar todo".

codingguy3000
fuente

Respuestas:

7

No hay forma de decirle a SQL Server que no use el registro de transacciones.

Lo que puede hacer es establecer el modelo de recuperación de la base de datos en SIMPLE, que sobrescribirá las entradas de registro antiguas a medida que se necesite espacio. Sin embargo, no debe hacer esto en su servidor de producción, ya que no podrá hacer ciertos tipos de restauraciones, como las restauraciones en un momento determinado.

Alternativamente, puede configurar su archivo de registro de transacciones para que sea más grande; como regla general no científica, me aseguraría de que A) su registro de transacciones tenga al menos aproximadamente 1.5 veces más espacio libre que el tamaño de su tabla o B) que su registro de transacciones puede crecer automáticamente a una unidad que tenga al menos aproximadamente esta cantidad de espacio libre en disco.

Puede liberar espacio en el registro de transacciones haciendo una copia de seguridad del registro. Si no le importa el contenido del registro, deseche el archivo. Un atajo para esto es BACKUP LOG <Your Database Name> TO DISK = 'NUL:'. Nuevamente, no haga esto en un servidor de producción a menos que esté absolutamente seguro de comprender las implicaciones.

Otra cosa a tener en cuenta (aunque no es del todo pertinente a su pregunta) es asegurarse de que la tabla que está expandiendo tenga un índice agrupado definido en ella. Si no es así, la tabla podría incurrir en una gran cantidad de fragmentación de almacenamiento dinámico y potencialmente volverse innecesariamente grande en un cambio como este.

Dave Markle
fuente
5
  • Suelta cualquier clave foránea
  • Crear nuevas tablas con en intlugar detinyint
  • Mueva las filas por lote de 1000 (insértelos en la nueva tabla, elimínelos de la anterior)
  • Suelta las mesas viejas
  • Cambie el nombre de las nuevas tablas a los nombres antiguos usando sp_rename
  • Recrea las claves foráneas

pS Si su registro de transacciones es grande ... verifique su modelo de recuperación. Si su modelo de recuperación no es simple, ¿cuánto tiempo pasó desde la última vez que realizó una copia de seguridad del registro?

Andomar
fuente
Es decir, dado que realizó una copia de seguridad del registro, la copia de seguridad de la base de datos no hará que el registro sea más pequeño.
HLGEM
@HLGEM: Tienes razón, acabo de leer un artículo de Paul Randal sobre ese tema. Sin embargo, como inesperado, si solo hiciera copias de seguridad completas, su registro seguiría creciendo.
Andomar