Eu tenho executado o DB de produção que normalmente tem 50-100 inserts por minuto. Estou tentando adicionar uma nova coluna no banco de dados de produção usando,
ALTER TABLE MyDB ADD [MyColumn] varchar(30)
GO
Esta consulta continua em execução e não termina até que eu a interrompa. O que mais posso fazer?
Adicionar uma coluna anulável como essa geralmente é uma operação somente de metadados . Ou seja, ele será concluído quase instantaneamente, desde que possa obter um bloqueio de estabilidade de esquema na tabela pelo curto período de tempo necessário para adicionar a coluna.
Se você estiver vendo isso demorar muito, a causa mais provável é que outras sessões estejam bloqueando a
ALTER TABLE
instrução. Perceba também que, quando você executa aALTER TABLE
instrução, enquanto ela espera obter um bloqueio de estabilidade de esquema, ela bloqueará as consultas subsequentes nessa tabela. Você provavelmente deseja verificar a configuração do tempo limite de bloqueio para sua sessão antes de executar aALTER TABLE
instrução.Se o bloqueio de outras sessões for problemático, você pode esperar até que haja um período de menor atividade e executar o comando então. Como alternativa, você pode colocar o banco de dados no modo de usuário único , alterar a tabela e colocá-lo novamente no modo multiusuário - é claro que isso impediria que qualquer sessão acessasse o banco de dados durante esse período.
Para colocar o banco de dados no modo de usuário único e alterar a tabela, você faria algo semelhante a isto:
Esteja ciente, porém, de que configurar o banco de dados no modo de usuário único como esse fará com que todas as transações em andamento sejam revertidas, o que, dependendo de como o software cliente foi projetado, pode causar perda de dados. Quaisquer transações em andamento no momento da
ALTER DATABASE
instrução precisariam ser reexecutadas assim que o banco de dados voltasse ao modo multiusuário. Dê uma olhada na página do Microsoft Docs para ALTER DATABASE e, em particular, na seção sobreWITH ROLLBACK
várias opções que controlam como o servidor coloca o banco de dados no modo de usuário único.