Compartilhar via


Movendo bancos de dados de usuário

Em SQL Server, é possível mover os dados, log e arquivos de catálogo de texto completo de um banco de dados de usuário para um novo local, especificando o novo local do arquivo na cláusula FILENAME da instrução ALTER DATABASE. Esse método é aplicado para mover arquivos do banco de dados dentro da mesma instância do SQL Server. Para mover um banco de dados para uma outra instância do SQL Server ou para um outro servidor, use as operações de backup e restauração ou operações de anexar e desanexar.

ObservaçãoObservação

Alguns recursos do Mecanismo de Banco de Dados do SQL Server alteram a maneira como o Mecanismo de Banco de Dados armazena as informações nos arquivos de banco de dados. Esses recursos são restritos a edições específicas do SQL Server. Um banco de dados que contém esses recursos não pode ser movido para uma edição de SQL Server sem suporte para isso. Use a exibição de gerenciamento dinâmico sys.dm_db_persisted_sku_features para listar todos os recursos específicos de edição habilitados no banco de dados atual.

Os procedimentos neste tópico exigem o nome lógico dos arquivos de banco de dados. Para obter o nome, pesquise a coluna nome na exibição de catálogo sys.master_files.

ObservaçãoObservação

Ao mover um banco de dados para outra instância do servidor, para oferecer uma experiência consistente aos usuários e aplicativos, talvez seja necessário recriar alguns ou todos os metadados do banco de dados. Para obter mais informações, consulte Gerenciando metadados ao disponibilizar um banco de dados em outra instância do servidor.

Procedimento de realocação planejada

Para mover um arquivo de dados ou de log como parte de uma realocação planejada, execute as seguintes etapas:

  1. Execute a seguinte instrução.

    ALTER DATABASE database_name SET OFFLINE
    
  2. Mova o arquivo ou os arquivos para o novo local.

  3. Para cada arquivo movido, execute a seguinte instrução.

    ALTER DATABASE database_name MODIFY FILE ( NAME = logical_name, FILENAME = 'new_path\os_file_name' )
    
  4. Execute a seguinte instrução.

    ALTER DATABASE database_name SET ONLINE
    
  5. Verifique se houve alteração no arquivo executando a seguinte consulta.

    SELECT name, physical_name AS CurrentLocation, state_desc
    FROM sys.master_files
    WHERE database_id = DB_ID(N'<database_name>');
    

Realocação para manutenção de disco programada

Para realocar um arquivo como parte de um processo de manutenção de disco programada, execute as seguintes etapas:

  1. Para cada arquivo a ser movido, execute a seguinte instrução.

    ALTER DATABASE database_name MODIFY FILE ( NAME = logical_name , FILENAME = 'new_path\os_file_name' )
    
  2. Pare a instância do SQL Server ou desligue o sistema para realizar a manutenção. Para obter mais informações, consulte Interrompendo serviços.

  3. Mova o arquivo ou arquivos para o novo local.

  4. Reinicialize a instância do SQL Server ou o servidor. Para obter mais informações, consulte Serviços de inicialização e reinicialização.

  5. Verifique se houve alteração no arquivo executando a seguinte consulta.

    SELECT name, physical_name AS CurrentLocation, state_desc
    FROM sys.master_files
    WHERE database_id = DB_ID(N'<database_name>');
    

Falha no procedimento de recuperação

Se um arquivo tiver que ser movido devido à uma falha de hardware, execute as seguintes etapas para realocar o arquivo no novo local.

Observação importanteImportante

Se o banco de dados não puder ser iniciado, significa que ele está em modo de suspeição ou em estado não recuperado; e apenas os membros de função fixa sysadmin poderão mover o arquivo.

  1. Pare a instância do SQL Server se for iniciado.

  2. Inicie a instância do SQL Server no modo somente recuperação mestre, inserindo um dos seguintes comandos no prompt de comando.

    • Para a instância padrão (MSSQLSERVER), execute o seguinte comando.

      NET START MSSQLSERVER /f /T3608
      
    • Para uma instância nomeada, execute o seguinte comando.

      NET START MSSQL$instancename /f /T3608
      

    Para obter mais informações, consulte Como iniciar uma instância do SQL Server (comandos net).

  3. Para cada arquivo a ser movido, execute os comandos sqlcmd ou SQL Server Management Studio para executar a seguinte instrução.

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

    Para obter mais informações sobre como usar o utilitário sqlcmd, consulte Usando o utilitário sqlcmd.

  4. Saia do utilitário sqlcmd ou do SQL Server Management Studio.

  5. Pare a instância do SQL Server.

  6. Mova o arquivo ou os arquivos para o novo local.

  7. Inicie a instância do SQL Server. Por exemplo, execute NET START MSSQLSERVER. NET START MSSQLSERVER.

  8. Verifique se houve alteração no arquivo executando a seguinte consulta.

    SELECT name, physical_name AS CurrentLocation, state_desc
    FROM sys.master_files
    WHERE database_id = DB_ID(N'<database_name>');
    

Movendo catálogos de texto completo

Para mover um catálogo de texto completo, execute as seguintes etapas. Observe que quando você especificar o novo local do catálogo, somente o new_path é especificado em vez do new_path/os_file_name.

  1. Execute a seguinte instrução.

    ALTER DATABASE database_name SET OFFLINE
    
  2. Mova o catálogo de texto completo para o novo local.

  3. Execute a seguinte instrução onde logical_name é o valor na coluna nome em sys.database_files e new_path é o novo local do catálogo.

    ALTER DATABASE database_name MODIFY FILE ( NAME = logical_name , FILENAME = 'new_path')
    
  4. Execute a seguinte instrução.

    ALTER DATABASE database_name SET ONLINE
    

Como alternativa, é possível usar a cláusula FOR ATTACH da instrução CREATE DATABASE para mover um catálogo de texto completo. O exemplo seguinte cria um catálogo de texto completo no banco de dados AdventureWorks. Para mover o catálogo de texto completo para um novo local, o banco de dados AdventureWorks é desanexado e o catálogo de texto completo é fisicamente movido para um novo local. Assim, o banco de dados é anexado, especificando o novo local do catálogo de texto completo.

USE AdventureWorks;
CREATE FULLTEXT CATALOG AdvWksFtCat AS DEFAULT;
GO
USE master;
GO
--Detach the AdventureWorks database.
sp_detach_db AdventureWorks;
GO
--Physically move the full-text catalog to the new location.
--Attach the AdventureWorks database and specify the new location of the full-text catalog.
CREATE DATABASE AdventureWorks ON 
    (FILENAME = 'c:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Data\AdventureWorks_Data.mdf'), 
    (FILENAME = 'c:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Data\AdventureWorks_log.ldf'),
    (FILENAME = 'c:\myFTCatalogs\AdvWksFtCat')
FOR ATTACH;
GO

Exemplos

O exemplo seguinte move o arquivo de log AdventureWorks para um novo local como parte de uma realocação planejada.

USE master;
GO
-- Return the logical file name.
SELECT name, physical_name AS CurrentLocation, state_desc
FROM sys.master_files
WHERE database_id = DB_ID(N'AdventureWorks')
    AND type_desc = N'LOG';
GO
ALTER DATABASE AdventureWorks SET OFFLINE;
GO
-- Physically move the file to a new location.
-- In the following statement, modify the path specified in FILENAME to
-- the new location of the file on your server.
ALTER DATABASE AdventureWorks 
    MODIFY FILE ( NAME = AdventureWorks_Log, 
                  FILENAME = 'C:\NewLoc\AdventureWorks_Log.ldf');
GO
ALTER DATABASE AdventureWorks SET ONLINE;
GO
--Verify the new location.
SELECT name, physical_name AS CurrentLocation, state_desc
FROM sys.master_files
WHERE database_id = DB_ID(N'AdventureWorks')
    AND type_desc = N'LOG';