Introdução

Copy-SQLDatabase é um cmdlet que facilita a cópia de bancos entre instâncias SQL Server. Ele adiciona uma camada de flexibilidade no processo de cópias de bancos permitindo que o usuário controle apenas configurações indispensáveis. Por exemplo, para restaurar uma base, não é necessário especificar os volumes que quais jogar os arquivos, pois o cmdlet irá determinar qual o melhor disco baseado em algoritmos pré-determinados. Além disso, o usuário pode optar por executar scripts após a base ter sido disponibilizada na instância de destino.

Com Copy-SQLDatabase você se preocupa apenas em especificar a origem e o destino da base. Adicionalmente, você pode especificar scripts para serem executados, manter permissões, etc.

 

Para começar a usar, você deve baixo o módulo “CustomMSSQL”. Acesse a página de download.
Após baixar o módulo  e certificar que instalou corretamente, você pode usar o cmdlet Copy-SQLDatabase.

Aqui está um exemplo:

Neste exemplo, é solicitado ao cmdlet que copie a base “MyDb” que se encontra na instância “ProdServer\Inst01”. Um backup da base será feito e restaurado na instância “DevInst” com o nome “MyDb”. O diretório onde o backup será feito é “\\SQLBackups\Temp$”. Este será o mesmo diretório usado pelo comando de “RESTORE” na instância de destino.

Note que não foi preciso especificar a cláusula MOVE. O cmdlet, por padrão, se encarrega de determinar os discos e o melhor local para os arquivos. Para isso, o usuário sob o qual o cmdlet está executando, precisa ter as devidas permissões no servidor de destino. Ele vai usar o WMI para obter a lista de volumes.

Por padrão, se a base já existir, o cmdlet irá remapear os arquivos da mesma no mesmo diretório que a base existente. O formato do nome dos arquivos sempre será “NomeBaseDestino.NomeLogico.Extensao”. Se a base não existir, então o cmdlet irá tentar distribuir os arquivos nos volumes que existem no servidor de destino. Por padrão ele joga os arquivos na raiz do volume. O parâmetro “RestoreFolder” indica em qual diretório ele deverá colocar os arquivos. O diretório deverá existir, pois o cmdlet ainda não suporta a criação automática do diretório no destino. Esse suporte virá nas próximas versões.

Por padrão, o cmdlet mantém as permissões, caso a base de destino já exista. Ele reconstrói as permissões aplicadas diretamente aos usuários da base, refaz o mapeamento para logins, roles e membros de roles.

 

Detecção de volumes no destino

A detectção de volume utiliza o WMI para obter todos os volumes existente no servidor de destino. O cmdlet determina qual a máquina onde a instância de destino está executando e faz uma consulta usando Get-WMIObject. Essa consulta elimina todos os volumes que não do tipo “disco” como unidades de CDROM e os volumes em que está instalado o sistema, como o C:\ na maioria dos casos.

O cmdlet suporta instâncias em cluster. Porém, a detectção dos discos na instância de destino pode considerar todos os discos da máquina, se houver discos além da instância desejada. Você pode usar o parâmetro “AllowedVolumes” para especificar um conjunto de volumes que o cmdlet deve considerar, ao invés de considerar todos. Nas próximas versões lançadas, este comportamento será alterado e o cmdlet passará a detectar os discos associados à instancia, quando em cluster.

 

 

Acompanhei a documentação aqui na script store para futuras atualizações e documentações. No Blog thesqltimes.com/blog podem ser postados artigos sobre arquitetura e técnicas e discas de uso do cmdlet.

 

Utilize “get-help Copy-SQLDatabase -Full” para obter mais informações e a documentação de todos os parâmetros. A documentação está escrita em inglês, e como está na versão beta poderá ter pontos incompletos ou mesmo erros gramaticais. Caso encontre, enviei um email para “rodrigorigomes@gmail.com” ou “rodrigo@thesqltimes.com”.

Aqui na script store, a documentação completa e em portugês será disponibilizada.