Como mover arquivos de banco de dados do SQL Server?

103

Eu tenho um banco de dados e quero mover os arquivos .mdfe .ldfpara outro local. Mas não quero interromper o MSSQLSERVERserviço e não quero exportar para outro servidor.

Como posso fazer isso?

Mike Fal
fonte

Respostas:

154

Você não precisa interromper o serviço SQL Server para mover arquivos de banco de dados, mas precisa colocar o banco de dados específico offline. Isso ocorre porque você não pode mover arquivos enquanto eles estão sendo acessados ​​e colocar o banco de dados offline impede que os arquivos sejam usados ​​pelo aplicativo SQL Server.

O processo para movê-los é bastante simples. Desanexar / Anexar já foi descrito, mas não é tão complexo assim.

Altere os locais dos arquivos com um ALTER DATABASEcomando:

USE master; --do this all from the master
ALTER DATABASE foo
MODIFY FILE (name='DB_Data1'
             ,filename='X:\NewDBFile\DB_Data1.mdf'); --Filename is new location

Observe que você não precisa declarar o local antigo neste comando. A alteração desse caminho não entra em vigor imediatamente, mas será usada na próxima vez que o banco de dados for inicializado.

Defina o banco de dados offline

(Eu uso WITH ROLLBACK IMMEDIATEpara expulsar todos e reverter todas as transações atualmente abertas)

ALTER DATABASE foo SET OFFLINE WITH ROLLBACK IMMEDIATE;

Mover / copiar os arquivos para o novo local

Basta copiar os arquivos usando seu método favorito (clique em 'arrastar, XCopy, Copiar item, Robocopy)

Coloque o banco de dados online

ALTER DATABASE foo SET ONLINE;

Você pode ver isso descrito em mais detalhes aqui .

Mike Fal
fonte
13
Isso funcionou para mim. No meu caso eu também tinha que mover o arquivo LDF também usar o primeiro comando, por exemplo: USE master; --do this all from the master ALTER DATABASE foo MODIFY FILE (name='DB_Data1_log' ,filename='X:\NewDBFile\DB_Data1_log.ldf'); --Filename is new location
Dewi Rees
1
Também pode ser usado para mover os arquivos de índice de texto completo apenas atualizando o nome do arquivo para corresponder ao que você vê na caixa de diálogo de arquivos.
precisa saber é o seguinte
24
Depois de mover o (s) arquivo (s) do banco de dados, verifique se o usuário "NT SERVICE \ MSSQLSERVER" possui permissões ou se ocorrerá erros ao tentar colocar o banco de dados novamente online.
Demonslay335
O que é "nome" deveria ser? Na documentação, ele tem "nome_lógico". O que eles querem dizer?
johnny
2
@mlhDev Na verdade, no meu caso, a MODIFY FILEordem é mutável. Se você executar o MODIFY FILE primeiro, ele informará que o comando é executado com êxito e o local será alterado após uma operação offline-online (o texto é diferente, mas você entendeu). A ordem Offline-> Mover arquivos-> Online, no entanto, é importante por motivos óbvios. Marque também a nota de Demonslay335. A permissão de arquivo é importante.
Lionet Chen
50

Os arquivos MDF e LDF são protegidos e não podem ser movidos enquanto o banco de dados estiver online.

Se você não se importa de impedir que o banco de dados funcione, você pode DETACH, mova os arquivos e depois ATTACH.

  • Clique com o botão direito do mouse no nome do banco de dados
  • Selecione Properties
  • Vá para a Filesguia
  • Faça uma nota do Pathe FileNamede MDF e arquivos LDF . Esta etapa é importante caso você não queira acabar procurando arquivos ausentes ...
  • Clique com o botão direito do mouse no nome do banco de dados
  • Selecione Tasks -> Detach
  • Mova os arquivos para onde deseja
  • Clique com o botão direito do mouse no Databasesnó do seu servidor
  • Selecione Attach
  • Clique no Addbotão
  • Aponte para o novo local
  • Clique OK

Você deveria estar bem agora. Informações sobre o DETACH- ATTACHprocesso pode ser encontrada aqui .

No link about DETACH- ATTACHhá uma recomendação de usar a ALTER DATABASEinstrução se manter o banco de dados na mesma instância do SQL Server. Mais referência em Mover bancos de dados do usuário .

Se você quiser mantê-lo funcionando enquanto se move, faça um BACKUP- RESTORE. No processo de restauração, você pode definir o novo local dos arquivos de banco de dados.

Giannis Paraskevopoulos
fonte
3
Eu recomendo abrir o SQL Management Studio como administrador para evitar problemas de acesso a arquivos ao
anexar
6

Para mover arquivos de banco de dados do sistema, siga estas etapas:

  1. Efetue login como usuário no SSMS

  2. Faça um backup do banco de dados criado pelo usuário por segurança.

  3. Mate todas as sessões conectadas ao servidor pelo SSMS.

  4. Execute o seguinte comando para verificar o local do arquivo atual dos bancos de dados do sistema:

    USE master;
    SELECT * FROM sys.master_files;

Identifique o caminho e anote o caminho atual dos arquivos.

  1. Use TSQL para alterar o caminho do arquivo para todos os bancos de dados, exceto o mestre:

    ALTER DATABASE database_name MODIFY FILE ( NAME = logical_name , FILENAME = 'new_path\os_file_name' )

Por exemplo:

ALTER DATABASE tempdb
MODIFY FILE ( NAME = tempdev
, FILENAME = "DestinationPath\tempdb.mdf");

ALTER DATABASE tempdb
MODIFY FILE ( NAME = templog
, FILENAME = "DestinationPath\templog.ldf");

ALTER DATABASE model
MODIFY FILE ( NAME = modeldev
, FILENAME = "DestinationPath\model.mdf");

ALTER DATABASE model
MODIFY FILE ( NAME = modellog
, FILENAME = "DestinationPath\modellog.ldf");

ALTER DATABASE msdb
    MODIFY FILE ( NAME = MSDBData
, FILENAME = "DestinationPath\msdbdata.mdf");

ALTER DATABASE msdb
    MODIFY FILE ( NAME = MSDBLog
, FILENAME = "DestinationPath\msdblog.ldf");

Agora o local do arquivo foi alterado.

Certifique-se de mover os arquivos ldf e mdf

  1. No SSMS, clique com o botão direito do mouse no servidor e selecione propriedades. As propriedades internas vão para Configurações do banco de dados. Altere os locais padrão do banco de dados para Dados e Log para o caminho de destino. Faça logoff do servidor.

    Por exemplo: mude C:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\DATA\paraE:\projects\DataBaseFiles\MSSQL\DATA\

  2. Pare a instância do SQL Server.

  3. Copie o arquivo ou arquivos para o novo local. Use Robocopy para mover os arquivos para copiar as permissões de acesso para a pasta de destino. Abra o cmd e execute como administrador e use o seguinte comando:

    robocopy / sec sourceFolder destinationFolder

É melhor ir para o local de origem para executar o comando. Exclua outros arquivos que não sejam arquivos de banco de dados do sistema que são copiados. Por exemplo:

 robocopy /sec .\DATA E:\projects\DataBaseFiles\MSSQL\DATA\

(Aqui estamos movendo todos os arquivos de banco de dados do sistema para um novo local.)

  1. No menu Iniciar, aponte para Todos os Programas, aponte para Microsoft SQL Server, aponte para Ferramentas de Configuração e clique em SQL Server Configuration Manager.

Execute as seguintes etapas no SQL Server Configuration Manager:

No nó Serviços do SQL Server, clique com o botão direito do mouse na instância do SQL Server (por exemplo, SQL Server (MSSQLSERVER)) e escolha Propriedades. Na caixa de diálogo Propriedades do SQL Server (instance_name), clique na guia Parâmetros de Inicialização. Na caixa Parâmetros existentes, selecione o parâmetro –d para mover o arquivo de dados mestre. Clique em Atualizar para salvar a alteração. Na caixa Especificar um parâmetro de inicialização, altere o parâmetro para o novo caminho do banco de dados mestre. Na caixa Parâmetros existentes, selecione o parâmetro –l para mover o arquivo de log principal. Clique em Atualizar para salvar a alteração. Na caixa Especificar um parâmetro de inicialização, altere o parâmetro para o novo caminho do banco de dados mestre.

O valor do parâmetro para o arquivo de dados deve seguir o parâmetro -d e o valor para o arquivo de log deve seguir o parâmetro -l. O exemplo a seguir mostra os valores dos parâmetros para o local padrão do arquivo de dados mestre.

-dC:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\DATA\master.mdf
-lC:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\DATA\mastlog.ldf

Se a realocação planejada para o arquivo de dados mestre for E: \ SQLData, os valores dos parâmetros serão alterados da seguinte maneira:

-dE:\projects\DataBaseFiles\MSSQL\DATA\master.mdf
-lE:\projects\DataBaseFiles\MSSQL\DATA\mastlog.ldf

Pare a instância do SQL Server clicando com o botão direito do mouse no nome da instância e escolhendo Parar. Reinicie a instância do SQL Server.

  1. Efetue login como sausuário no SSMS e verifique o local dos arquivos de banco de dados executando a seguinte consulta:

    USE master;
    SELECT * FROM sys.master_files;

Tudo feito.

abhay sreekumar
fonte
Você pode usar a função SQL para automatizar tarefas para todos os bancos de dados: stackoverflow.com/a/19505918/439524
amuliar
3

Você faz passo a passo:

  1. fechar todas as conexões
    ALTER DATABASE MyDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE

  2. definir banco de dados com status offline
    ALTER DATABASE MyDB SET OFFLINE

  3. Para o novo caminho
    ALTER DATABASE MyDB MODIFY FILE (Nome = MyDB, Nome do arquivo = 'N: \ DATA \ MyDB.MDF')

  4. definir banco de dados com status online
    ALTER DATABASE MyDB SET ONLINE

  5. definir multiusuário
    ALTER DATABASE MyDB SET MULTI_USER

Nguyễn Hải Đăng
fonte
3

Existe uma maneira de mover arquivos de dados do banco de dados (ainda não tenho certeza se existe uma maneira de fazer isso para arquivos de log) sem colocar o banco de dados offline.

Dejan Nakarada-Kordic tem uma explicação + scripts para este método aqui: https://www.itprotoday.com/sql-server/move-database-files-without-taking-database-offline

A versão curta é que você adiciona outro arquivo de banco de dados no novo local e usa o DBCC Shrinkfile, com a opção EMPTYFILE para mover os dados do arquivo antigo para o novo arquivo. Quando isso for feito, você poderá remover o arquivo de dados antigo.

Não é a minha solução, eu estava procurando por essa solução e achei muito útil para o nosso ambiente de produção.

Thorfinn

Thorfinn Thomassen
fonte
1

Siga estes 4 passos simples:

  1. Abra o SSMS e selecione a opção Nova Consulta na parte superior da janela. Em seguida, copie e execute a consulta a seguir para encontrar o caminho do banco de dados que queremos mover para o novo caminho e observe o caminho que você mostra na CurrentLocationcoluna.

SELECT name, physical_name AS CurrentLocation FROM sys.master_files WHERE database_id = DB_ID('DATABASE_NAME');

  1. Agora ir para esse caminho e anote o nome do Database_Name.mdf & Database_Name_log.ldf arquivos. Em seguida, execute as duas consultas a seguir para mover o banco de dados para o local específico.

ALTER DATABASE DATABASE_NAME MODIFY FILE ( NAME = DATABASE_FILE_NAME , FILENAME = 'NEW_PATH\DATABASE_NAME.mdf');

ALTER DATABASE DATABASE_NAME MODIFY FILE ( NAME = DATABASE_FILE_NAME_log , FILENAME = 'NEW_PATH\DATABASE_FILE_NAME_log.ldf');

  1. Agora, pare o servidor clicando com o botão direito do mouse em Server_Nameque você pode ver no Pesquisador de Objetos (lado esquerdo).

    insira a descrição da imagem aqui

  2. Em seguida, mover os dois arquivos de Caminho Velho para Novo Caminho e novamente iniciar o servidor por-clique direito sobre Server_Name. Confirme o novo caminho do banco de dados executando novamente a consulta da 1ª etapa.

Karan Raiyani
fonte
0

Não tenho certeza de que seja a melhor maneira (gostaria de receber comentários para me dizer como não é), mas é muito simples (e rápido se você tiver um pequeno banco de dados):

Primeiro, faça backup do banco de dados em um arquivo .bak. Em seguida, restaure o banco de dados do mesmo arquivo .bak, escolhendo os novos locais de arquivo .mdf e .ldf em opções de arquivo para a tarefa de restauração.

Eu não faria isso em um ambiente de produção fora de uma janela de manutenção, pois você não pode acessar o banco de dados durante a restauração. Outros métodos que vi acima teriam desvantagens semelhantes. Após a conclusão da tarefa de restauração, você não precisa excluir o arquivo antigo. É feito automaticamente.

Todos
fonte
1
Este cenário tem algumas desvantagens. Ao restaurar, o banco de dados original deve ser substituído ou renomeado. Para bancos de dados grandes, o método introduz uma sobrecarga séria de E / S. Mover arquivos conforme descrito nos métodos desanexar-anexar ou alterar db é muito mais rápido. Se os arquivos forem movidos na mesma partição NTFS, é apenas uma operação de metadados.
VonPryz
@Ali - Backup e restauração. Pode levar mais tempo, mas geralmente é um caminho mais seguro. Veja a análise de Aaron Bertrand em: blogs.sqlsentry.com/aaronbertrand/bad-habits-file-backups Também: sqlmag.com/blog/should-i-be-using-san-snapshots-backup-solution
RLF
Para bancos de dados muito grandes, essa abordagem (e a abordagem de desanexar / anexar) introduz um tempo de inatividade substancial. Para evitar isso, coloque o banco de dados de origem no modo de recuperação total e execute a restauração de backup inicial com o banco de dados de destino deixado inoperante. Em seguida, faça backup / restaure um ou mais logs de transações. O banco de dados precisará estar inativo somente durante o backup / restauração final do log de transações, que pode conter um tempo e tamanho arbitrariamente pequenos. Obviamente, você também precisará restaurar para um nome diferente e realizar uma troca de nome. Essa abordagem é aproximadamente equivalente ao envio de logs.
18718 Brian
0

Para complementar as respostas existentes: Aqui está um script para criar as ALTER DATABASE ... MOVE ...instruções para todos os bancos de dados:

SELECT 'ALTER DATABASE ' + QUOTENAME(d.name) + 
       ' MODIFY FILE (name=' + QUOTENAME(f.name, '''') +
       ', filename=' + QUOTENAME(REPLACE(f.physical_name, 'C:\', 'D:\'), '''') +
       ');'
  FROM sys.master_files AS f 
       INNER JOIN sys.databases AS d ON f.database_id = d.database_id
 WHERE d.name <> 'master';

Nota:

  • Substitua REPLACE(f.physical_name, 'C:\', 'D:\')por qualquer transformação que você deseja fazer nos caminhos do arquivo.

  • masterestá isento, pois seu caminho é determinado pelas opções de inicialização do SQL Server (consulte, por exemplo, esta resposta para obter detalhes).

Heinzi
fonte