Devo migrar dados usando desanexar / copiar / anexar ou através de backup-restore-replay?

17

Estou prestes a embarcar na migração de arquivos de banco de dados para uma nova SAN (de uma antiga SAN) e tenho algumas opções para implementar isso. (1) Foi sugerido que eu analisasse o nível de esforço de restauração de um backup completo em um novo banco de dados no servidor. No entanto, (2) meu plano original era copiar os arquivos da SAN antiga para a nova SAN, desanexando e reconectando o banco de dados.

Meu intestino me diz que eu prefiro desconectar, copiar e anexar, pois parece mais seguro, mas isso pode ser apenas a minha ingenuidade. Não quero perder uma transação ou, de alguma forma, "quebrar alguma coisa" no processo de renomear bancos de dados.

Acho que minha pergunta é se estou justificado ou não pelo meu ceticismo da opção BACKUP-RESTORE-Replay e quais são os outros méritos ou riscos dessa opção?

swasheck
fonte

Respostas:

16

Pessoalmente, eu evitaria os mecanismos de desanexação / anexação. Especialmente no SQL Server 2000, não confio que você sempre trará o servidor de volta e poderá anexar esses arquivos. Já ouvi muitas histórias em que isso não aconteceu de maneira limpa - só porque você tem um plano B não torna automaticamente o plano A sensato.

Com o backup / restauração, você não corre o risco de ir para o Plano B. Se o backup falhar, seu banco de dados ainda estará ativo. Se a restauração falhar, seu banco de dados antigo ainda estará ativo. Nos dois casos, você pode restaurar a operação do banco de dados original e revisar o plano posteriormente. Além da segurança extra aqui para interromper o SQL Server e / ou desanexar, isso também significa que você pode testar o hoo-has da metodologia de backup / restauração (supondo que atualmente você tenha espaço para executar os backups e outra instância para testar o restaurar). Você realmente não pode testar a abordagem de desanexação sem desanexar os bancos de dados ou interromper o SQL Server, e isso é difícil de fazer fora de uma janela de manutenção adequada. E, finalmente, com as outras abordagens, você não pode nem começar a copiar os arquivos até desanexar ou desativar o SQL Server.

Outro benefício sobre o método pull-out-drive-out-under-SQL-Server: com o backup / restore, você pode mover vários arquivos para letras de unidades diferentes das que estavam antes. Por exemplo, quando migramos para uma nova SAN, pudemos ter mais volumes, para podermos mover o tempdb para T: \ (que não existia antes), alguns dos dados e arquivos de log para novas letras de unidade, etc. para melhor utilizar toda a nova capacidade de E / S que tínhamos. Se você simplesmente desligar o SQL Server e trocar os discos, precisará ter as mesmas letras de unidade e o mesmo número de volumes.

Aaron Bertrand
fonte
7

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.

darin strait
fonte
2

Primeiro, consideraria a opção de simplesmente usar o recurso da matriz de armazenamento para lidar com a movimentação de dados. Se eles não estiverem disponíveis porque o fornecedor não o suporta, você não o comprou ou o administrador da SAN não sabe como fazê-lo ...

Então, eu simplesmente usaria as seguintes etapas.

  1. Apresente o novo armazenamento para o SQL Server.
  2. Pare os serviços SQL
  3. COPIE todos os dados da unidade antiga para a nova unidade (não se esqueça de incluir as permissões se estiver usando robocopy)
  4. Remova as letras das unidades antigas.
  5. Altere as letras das unidades nas novas unidades para corresponder às letras antigas
  6. Iniciar os serviços SQL

É isso aí.

Não é necessário desanexar / anexar, pois, até o SQL Server sabe que nada mudou. E se algo der terrivelmente errado, você terá a cópia antiga dos bancos de dados no LUN antigo no antigo storage array. Falhar é apenas uma questão de mudar as letras das unidades.

mrdenny
fonte