Nesse post vou falar como movimentar os arquivos de um banco de dados de uma unidade/diretório para outra unidade/diretório.
Ai você pensa:
“Pra que? Já sei como faz isso. Não tem nenhuma novidade.” ou
“Aaahh,,, isso é facil, uso o bom e velho backup/restore ou o detach/attach…”
Isso é verdade, não tem nenhuma grande novidade em fazer a movimentação mas, ai vem a parte divertida, pra que fazer do método fácil se podemos fazer do método interessante?
1.- Backup/Restore
Se executarmos o bom e velho backup/restore, no momento do restore podemos alterar o caminho onde os arquivos irão ser gravados, isso é simples.
Apenas precisaremos executar o processo de backup que, dependendo do tamanho da base, pode demorar alguns minutos ou até umas horas. Além de ter que ter um espaço para armazenar o backup ou executá-lo através de uma unidade de backup.
2.- Detach/Attach
Usando o Detach ganhamos algum tempo, você vai apenas mover os arquivos de log e dados para outro lugar e anexar a base novamente.
O problema disso é se você usar o Service Broker ou até o Mirror, você terá que refazer o processo.
3.- Alter Database (o “método interessante”)
Esse “método” a seguir cria uma procedure para executar a movimentação do banco para outro local usando o Alter database, mas é possível executá-lo em diversos bancos como vou demonstrar:
Vamos criar 2 bases de dados para testar:
create database banco1
create database banco2 |
Agora execute o scritp abaixo para criar a procedure que irá executar a movimentação dos arquivos:
IF ( OBJECT_ID(‘dbo.sp_MoveDatabase’) IS NOT NULL ) begin DROP PROCEDURE dbo.sp_MoveDatabase end GO create procedure sp_MoveDatabase @NewDataFolder nvarchar(1000), as set nocount on; if right(@DbList,1) = ‘,’ Begin End set @String = @DbList BEGIN END Begin exec sp_configure ‘xp_cmdshell’ , ‘1’ print ‘NewMdfFolder is ‘ + @NewDataFolder SET @RowNum = 1 Begin — Derruba todas as conexoes configurando como single user with immediate — configura db off line begin –move arquivos files begin set @NewPath = @NewLogFolder + @FileName — altera caminho dos arquivos set @sql = ‘ALTER DATABASE [‘ + @DbName + ‘] SET ONLINE;’ — aceita multi user novamente. reconfigure RECONFIGURE |
** ATENÇÃO **
Os diretórios de destino já devem estar criados, caso você execute a procedure sem criar o destino o script vai alterar o caminho da base e não vai movimentar os arquivos e quando ela foi trazida online ela vai apresentar erro.
** ATENÇÃO 2 **
Esse script é do tipo “Vai filhão”, quando ele for executado todos os usuários conectados serão desconectados sem dó nem piedade, todas as transações que eles estiverem executando serão dropadas. As conexões apenas poderão ser reestabelecidas após o termino da movimentação.
Para executar a procedure execute-a da seguinte forma:
exec sp_MoveDatabase @NewDataFolder = ‘c:\teste\’, @NewLogFolder = ‘d:\teste\’, @sDbList = ‘banco1, banco2’ |
Se tudo der certo, as bases banco1 e banco2 estarão seus novos destinos.