Eu costumava mover bancos de dados quase constantemente, devido à reconfiguração e migrações da SAN.
Supondo que você esteja movendo um servidor inteiro de cada vez, eu usaria algo como o seu caminho # 2. (Se você estiver movendo um banco de dados de cada vez e, eventualmente, fazendo todos os bancos de dados em um servidor, isso seria mais problemático, pois seria necessário alterar os caminhos dos arquivos.)
Observe que "usuário único" não significa necessariamente VOCÊ. Você pode acessar o banco de dados DBCC CHECKDB e não conseguir entrar porque alguém já está lá. Prepare um script que você possa executar para inicializar "todos, exceto você" em um banco de dados e mantenha-o em um local acessível. Observe que o SQL 2000 não possui os mesmos recursos "mantenha todos fora" das versões mais modernas.
Um truque antigo é pausar o serviço do SQL Server. Isso impedirá novos logons, mas qualquer pessoa que já esteja conectada pode continuar como de costume. Portanto: conecte-se através de uma janela do SSMS para poder trabalhar, pausar o serviço, expulsar as conexões indesejáveis, fazer o seu trabalho através da janela de comando do SSMS (não a GUI, ela faz e quebra muitas conexões) e, em seguida, cancela a pausa o serviço. Aviso: Não tenho certeza de como isso aconteceria em um cluster. Pode querer fazer failover.
É útil ter uma maneira de manter todos os usuários de aplicativos fora de um servidor até que você termine seu trabalho. Caso contrário, as conexões poderão começar a aparecer enquanto você estiver tentando fazer coisas, o que pode levar à contenção de recursos e / ou lentidão. Eu usei as seguintes maneiras no passado, dependendo da situação exata: Desativando o (s) servidor (es) de aplicativos Uso de ALTER DATABASE .. SET RESTRICTED_USER (Se as contas de aplicativos são membros das funções db_owner, sysadmin ou dbcreator, isso é um problema. ) Informar aos usuários que o sistema estará offline em um horário específico, como uma manhã de domingo. (Isso não funcionará em um ambiente 24x7 "real"). Desconectando a NIC voltada para os servidores ou usuários de aplicativos. (Nesse caso, eu poderia entrar através de outra NIC conectada a uma rede somente para administradores ou pela OIT.)
Desanexar um grande número de bancos de dados e recolocá-los pode ser muito trabalhoso. Se você fizer isso, verifique se o seu script "anexar" foi escrito com antecedência.
Tive muito sucesso ao parar o SQL Server, copiar tudo, alterar as letras das unidades e iniciar o SQL Server. Não desanexar / anexar. Enquanto o SQL Server estiver desativado e você estiver copiando arquivos (não MOVENDO), você não terá muitos problemas, mesmo se estiver movendo os bancos de dados do sistema. Como os caminhos são os mesmos, o SQL Server não perceberá que nada mudou enquanto o serviço estava desativado. Apenas certifique-se de que as letras das unidades voltem para os volumes corretos, ou as coisas vão mal para você.
Meu problema mais frequente foi não obter as ACLs nos diretórios de arquivo corretos. As versões mais modernas do SQL Server são melhores para definir apenas as permissões necessárias à conta de serviço, enquanto as versões mais antigas parecem menos exigentes. Se você esquecer de definir as ACLs, e a conta de serviço não for um administrador local (não que eu recomende isso), um ou mais bancos de dados poderão não abrir quando a instância for iniciada. Não entre em pânico, basta alterar as ACLs e anexar o banco de dados.
Eu geralmente uso o ROBOCOPY para fazer esse tipo de trabalho. Há uma opção de linha de comando para preservar ACLs.
Usar um cálculo / verificação de CRC não é uma má ideia, mas nunca fiz isso. Quando os bancos de dados retornam, eu executo CHECKDB () em todos eles. Normalmente prepararei um script para isso com antecedência, em vez de depender manualmente de um trabalho de manutenção. Dessa forma, posso verificar primeiro alguns bancos de dados menores antes de verificar um banco de dados grande que pode levar muitos minutos ou horas para ser executado. Duvido que uma verificação de CRC (ou uma ferramenta Redgate Data Compare) encontre algo que CHECKDB () perca e, se o fizer, o SQL Server não poderá corrigi-lo.
Depois de copiar os arquivos, mas antes de reiniciar a instância, alterarei um pouco o caminho das pastas OLD renomeando uma das pastas. Essa é uma verificação extra contra o problema "opa, o servidor ainda está apontando para os arquivos antigos".
Não tenha pressa para soltar os arquivos antigos, recuperar espaço no armazenamento antigo e verifique se seus backups completos foram executados com êxito. O teste restaura alguns desses backups para outro lugar. Depois de ter boas execuções de checkdb () e bons backups completos, você pode descartar esse armazenamento antigo e desligar a Mão Esquerda.
Os piores problemas que tive com essas migrações ocorreram depois que pensei que tinha terminado. Esse seria o administrador da SAN me dizendo que algo havia acontecido e que meus sistemas de arquivos estavam embaralhados. (Reparado, reformatado, copiado novamente.)
Outro problema divertido é que a SAN está lenta sem motivo aparente. Se você acha que vai demorar 10 horas para copiar seus dados e você é copiado em 30% na hora número 9, você tem um problema. Assista aos tempos de transferência (a robocópia mostra% de cópias e fornece estimativas de tempo, ou você pode usar o Perfmon) e tenha um plano de fallback se algo der errado.
Além disso, não tenho certeza se seus volumes serão particionados para você, mas você pode ter certeza de que eles estão usando um deslocamento de 1 MB. No Windows Server 2008 e melhor, isso não deve ser um problema. No sistema operacional mais antigo, é. Há uma tonelada de coisas googlable sobre isso, e seu pessoal de armazenamento deve saber sobre isso, mas eu perguntaria.