Tenho uma tabela SQL Server 2005 chamada BRITTNEY_SPEARS_MARRIAGES
e ela possui as seguintes colunas:
MarrigeId tinyint,
HusbandName varchar(500),
MarrigeLength int
Agora eu tenho outra mesaBRITTNEY_SPEARS_MARRIAGE_STORIES
StoryId int,
MarriageId tinyint,
StoryText nvarchar(max)
O problema é que queremos atualizar MarrigeId
a coluna para um int
de um arquivo tinyint
. Nós apenas sentimos que Brittney vai ter muitos casamentos antes que tudo seja dito e feito.
Agora a BRITTNEY_SPEARS_MARRIAGE_STORIES
tabela tem 18 milhões de linhas (ei, a garota tem alguns problemas), então, quando vamos fazer a atualização, o log de transações é preenchido e nossa caixa do SQL Server morre.
Como podemos contornar isso?
Existe alguma maneira de dizer "Ei, SQL Server, vou atualizar esta coluna e torná-la maior. Confie em mim neste SQL Server. Por favor, não encha o log de transações enquanto tenta validar tudo?"
Não há como dizer ao SQL Server para não usar o log de transações.
O que você pode fazer é definir o modelo de recuperação do banco de dados como SIMPLE, que substituirá as entradas de log antigas conforme a necessidade de espaço. No entanto, você não deve fazer isso em seu servidor de produção, porque não poderá fazer certos tipos de restaurações, como restaurações pontuais.
Como alternativa, você pode definir seu arquivo de log de transações para ser maior - como uma regra não científica, eu me certificaria de que A) seu log de transações tenha pelo menos 1,5x mais espaço livre do que o tamanho de sua tabela ou B) que seu log de transações pode crescer automaticamente para uma unidade que tenha pelo menos essa quantidade de espaço livre em disco.
Você pode liberar espaço no log de transações fazendo backup do log. Se você não se importa com o conteúdo do log, jogue o arquivo fora. Um atalho para isso é
BACKUP LOG <Your Database Name> TO DISK = 'NUL:'
. Novamente, não faça isso em um servidor de produção, a menos que tenha certeza absoluta de que compreende as implicações.Outra coisa a ter cuidado (embora não seja totalmente pertinente à sua pergunta) é garantir que a tabela que você está expandindo tenha um índice clusterizado definido nela. Caso contrário, a tabela poderá incorrer em uma quantidade muito grande de fragmentação de heap e, potencialmente, tornar-se desnecessariamente grande em uma alteração como essa.
int
em vez detinyint
sp_rename
pS Se seu log de transações for grande... verifique seu modelo de recuperação. Se o seu modelo de recuperação não for
simple
, há quanto tempo você não fez backup do log?