Respostas:
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 DATABASE
comando:
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 IMMEDIATE
para 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 .
MODIFY FILE
ordem é 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.
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
.
Properties
Files
guiaPath
e FileName
de MDF e arquivos LDF . Esta etapa é importante caso você não queira acabar procurando arquivos ausentes ...Tasks -> Detach
Databases
nó do seu servidorAttach
Add
botãoOK
Você deveria estar bem agora. Informações sobre o DETACH
- ATTACH
processo pode ser encontrada aqui .
No link about DETACH
- ATTACH
há uma recomendação de usar a ALTER DATABASE
instruçã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.
Para mover arquivos de banco de dados do sistema, siga estas etapas:
Efetue login como usuário no SSMS
Faça um backup do banco de dados criado pelo usuário por segurança.
Mate todas as sessões conectadas ao servidor pelo SSMS.
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.
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
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\
Pare a instância do SQL Server.
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.)
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.
Efetue login como sa
usuá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.
Você faz passo a passo:
fechar todas as conexões
ALTER DATABASE MyDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE
definir banco de dados com status offline
ALTER DATABASE MyDB SET OFFLINE
Para o novo caminho
ALTER DATABASE MyDB MODIFY FILE (Nome = MyDB, Nome do arquivo = 'N: \ DATA \ MyDB.MDF')
definir banco de dados com status online
ALTER DATABASE MyDB SET ONLINE
definir multiusuário
ALTER DATABASE MyDB SET MULTI_USER
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
Siga estes 4 passos simples:
CurrentLocation
coluna.
SELECT name, physical_name AS CurrentLocation FROM sys.master_files WHERE database_id = DB_ID('DATABASE_NAME');
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');
Agora, pare o servidor clicando com o botão direito do mouse em Server_Name
que você pode ver no Pesquisador de Objetos (lado esquerdo).
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.
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.
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.
master
está isento, pois seu caminho é determinado pelas opções de inicialização do SQL Server (consulte, por exemplo, esta resposta para obter detalhes).
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