Os arquivos de um banco de dados podem ser copiados enquanto ele estiver online?

9

Estou trabalhando na configuração de uma cópia de desenvolvimento de um banco de dados de produção no SQL Server 2008 R2 SP1. O banco de dados ativo está sendo pouco utilizado por dois desenvolvedores atualmente para consultas somente leitura, mas o novo banco de dados também terá atualizações.

Como o banco de dados tem 2,1 TB e levou um total de 3 dias para restaurar e atualizar para a versão mais recente necessária para o teste, meu plano original era criar um novo conjunto de arquivos de backup e depois restaurar a partir desses arquivos. Isso me permitiria criar a cópia de desenvolvimento do banco de dados na mesma instância e máquina SQL, sem precisar colocar o banco de dados atual offline.

No entanto, para economizar alguns dias, pensei que seria uma boa ideia copiar apenas os arquivos físicos do banco de dados e anexar a nova cópia do banco de dados. Infelizmente, quando tento copiar, recebo um erro referente ao bloqueio que o SQL Server coloca nesses arquivos.

Como não posso colocar o banco de dados offline apenas para transferir os arquivos de log (posso concluir isso antes que as pessoas entrem pela manhã), existe alguma maneira de copiar os arquivos do banco de dados ativo sem colocar o banco de dados em um estado offline? Ou devo esperar até que as pessoas vão para casa fazer isso?

Sean Long
fonte

Respostas:

11

Por que demora 3 dias para fazer backup / restaurar um banco de dados de 2,1 TB? Se se trata de mover o backup, eu suspeitaria que copiar os arquivos MDF / LDF seria realmente mais lento, pois pelo menos o backup poderia ser compactado. E se for apenas para restaurar, então, as cópias do arquivo não devem ser mais rápidas que o processo de restauração - verifique se a inicialização instantânea do arquivo está ativada . Ou obtenha E / S mais rápidas no sistema secundário.

De qualquer forma, não, você não pode copiar os arquivos MDF / LDF enquanto o banco de dados estiver online, você precisaria colocá-lo offline para fazê-lo. E esta é a MAIS ÚNICA maneira segura de copiar um banco de dados. Se algo acontecer com os arquivos enquanto eles estão desconectados / offline, agora você tem zero cópias do seu banco de dados.

Sugiro procurar maneiras de acelerar o backup / restauração - seja garantindo a compactação dos backups e a transferência dos arquivos da melhor maneira possível, usando o melhor subsistema de E / S disponível, melhorando a E / S, tornando verifique se o IFI está ativado etc.

Outra opção a considerar é o envio de log round robin - supondo que a produção esteja em recuperação total e você esteja fazendo backups regulares de log, você pode executar o envio de log para um banco de dados enquanto os desenvolvedores trabalham em outro e, quando chegar a um ponto estável, restaure com recuperação e faça com que os desenvolvedores mudem, levando as alterações recentes com eles. Agora, reinicialize o envio de logs na cópia em que eles pararam de trabalhar e ele estará pronto para eles no próximo recorte "estável", sem espera.

Aaron Bertrand
fonte
O backup levaria uma quantidade desconhecida de horas (não criei o backup original). A restauração leva 10 horas e, em seguida, a execução de atualizações para compor nossa versão de desenvolvimento leva mais 8 horas. Realmente, se estamos falando de um dia de 24 horas, leva apenas 18 horas. Falando cerca de 8 horas por dia, são basicamente 3 dias (adicionando mais tempo para copiar arquivos). Existem ABSOLUTAMENTE maneiras de ajustar o processo de backup / restauração, e é isso que vou fazer agora que sei que é esse o caminho que quero seguir.
Sean Long
0

Não, você terá que colocá-lo offline para copiar os arquivos. Se você tiver seu banco de dados dividido em arquivos / grupos de arquivos menores, isso poderá ajudar a acelerar a restauração do backup depois que você o tiver feito uma vez (dependendo de quais dados estão sendo alterados e de que são necessários para a cópia do desenvolvimento).

Tanner Corbin
fonte
0

Eu vi as outras respostas e elas fazem todo o sentido. No entanto, apenas para responder sua pergunta, você certamente pode copiar arquivos de banco de dados sem colocar o banco de dados offline. Você precisará usar a programação SMO para esse fim. Verifique isso: http://technet.microsoft.com/en-us/library/ms162175(v=sql.100).aspx

Observe que o link fornecido é para objetos de programação SMO gerais e não para uma resposta específica a esta pergunta. Ainda não o fiz, mas em breve vou tentar isso e vou deixar todos saberem (se bem me lembro) o que eu descobrir.

Mandar Shindagi
fonte
-1

Os arquivos de um banco de dados podem ser copiados enquanto ele estiver online?

Sim.

Tudo que você precisa fazer é definir o banco de dados como somente leitura:

  1. Corre:

    USE [master]
    GO
    ALTER DATABASE [Database] SET READ_ONLY WITH NO_WAIT
    GO
  2. Copie os arquivos do banco de dados - MDF, LDF etc. para o novo destino

  3. Depois que a cópia estiver concluída, você poderá desconectar e reconectar no novo local. Apenas redefina a opção somente leitura e use a mesma conta de usuário ao manipular esses arquivos. Além disso, convém excluir os arquivos antigos após a movimentação.

Outro método

Após a cópia bem-sucedida dos arquivos (etapa 2 acima):

Você pode definir o banco de dados para: Single_Usermode e depois:

  1. Corre:

    USE [master]
    GO
    ALTER DATABASE [Database] SET  Single_USER WITH NO_WAIT
    GO
  2. D:\ sendo o novo local

    ALTER DATABASE Database MODIFY FILE
    (NAME = DATABASE, FILENAME = 'D:\DATABASE.mdf')
    GO
    ALTER DATABASE OHDSI MODIFY FILE
    (NAME = DATABASE_LOG, FILENAME = 'D:\DATABASE_LOG.ldf')
    GO
  3. Verifique se os arquivos de dados no novo local ( D:\) têm acesso total à conta de serviço que está executando o SQL Server.

  4. Reinicie os serviços SQL

  5. Corre:

    USE [master]
    GO
    ALTER DATABASE [Database] SET  Multi_USER WITH NO_WAIT
    GO

Feito!

RAVicioso
fonte
Primeira observação: colocar o banco de dados no modo somente leitura causa uma interrupção efetiva se o uso normal exigir gravação no banco de dados. Segundo, eu esperaria que o SQL Server ainda tenha os arquivos bloqueados para uso se estiverem sendo lidos; se sua experiência pessoal ou documentação da MS disserem o contrário, edite-o na sua resposta. Terceiro, o conselho que geralmente vi para alterar o local de um arquivo é colocar o banco de dados offline , não apenas no modo de usuário único. Novamente, se você tiver experiência pessoal ou documentos do MS sugerindo o contrário, edite para resposta. Obrigado!
RDFozz 31/07
Está correto! Somente leitura impedirá que os usuários escrevam, mas eles poderão ler. Em seu segundo ponto - sim, você pode colocar o banco de dados offline - mas a questão é enquanto estiver online. O processo que descrevi acima funciona com o tempo de inatividade mínimo. Obrigado.
RAVicioso 31/07
@RAVicioso, o banco de dados sendo somente leitura também é uma falha. Se você não pode gravar novos dados (por exemplo, receber pedidos), seu sistema está desativado. Parece uma má ideia, não?
Erik Darling
@sp_BlitzErik - A solução funciona, mas você não poderá escrever durante esse tipo de manutenção. No seu exemplo: "receber pedidos", não será.
RAVicioso 15/08