Como posso clonar um banco de dados do servidor SQL no mesmo servidor no servidor SQL Server 2008 Express?

Eu tenho um sistema MS SQL Server 2008 Express que contém uma base de dados que eu gostaria de 'copiar e renomear' (para fins de teste), mas eu não estou ciente de uma maneira simples de conseguir isso.

reparei que na versão R2 do servidor SQL existe um assistente de base de dados de cópias, mas infelizmente não consigo actualizar.

A base de dados em questão está em torno de um concerto. Tentei restaurar um backup da base de dados que quero copiar para uma nova base de dados, mas sem sorte.

Author: Donald Duck, 2010-09-30

13 answers

  1. Instale o Microsoft SQL Management Studio, pode descarregá-lo gratuitamente no website da Microsoft:

    Versão 2008

    Microsoft SQL Management Studio 2008 faz parte de SQL Server 2008 Express com serviços avançados

    Versão 2012

    Carregue em botão de download e verifique ENU\x64\Sqlmanagementstudio_x64_ ENU.exe

    Versão 2014

    Carregue em botão de download e verifique MgmtStudio 64BIT\Sqlmanagementstudio_x64_ ENU.exe

  2. Abrir o Estúdio de gestão SQL da Microsoft

  3. cópia de segurança da base de dados original para ficheiro (db -> tarefa -> cópia de segurança).
  4. Criar uma base de dados vazia com um novo nome (clone).
  5. Carregue para clonar a base de dados e abrir a janela de Restauração (Ver imagem) restore dialog
  6. Seleccione o dispositivo e adicione o ficheiro bakcup do Passo 1. add backup file
  7. mudar o destino para a base de dados de testes change destination
  8. mudar a localização dos ficheiros da base de dados, deve ser diferente do original. Você pode digitar diretamente na caixa de texto, basta adicionar postfix. (Nota: a ordem é importante. Seleccione a opção e depois mude os nomes dos ficheiros.) change location
  9. Verifique com o REPLACE e com o KEEP_REPLICATION with replace
 285
Author: qub1n, 2017-03-29 09:13:14

Carregue com o botão direito na base de dados para clonar, carregue em Tasks, Carregue em Copy Database.... Segue o feiticeiro e estás feito.

 96
Author: DForck42, 2017-02-16 22:12:07

Pode tentar desligar a base de dados, copiar os ficheiros para novos nomes numa linha de comandos, depois anexar ambos os DBs.

Em SQL:

USE master;
GO 
EXEC sp_detach_db
    @dbname = N'OriginalDB';
GO

Na linha de comandos (simplifiquei os caminhos dos ficheiros por este exemplo):

copy c:\OriginalDB.mdf c:\NewDB.mdf
copy c:\OriginalDB.ldf c:\NewDB.ldf

Em SQL novamente:

USE master;
GO
CREATE DATABASE OriginalDB
    ON (FILENAME = 'C:\OriginalDB.mdf'),
       (FILENAME = 'C:\OriginalDB.ldf')
    FOR ATTACH;
GO
CREATE DATABASE NewDB
    ON (FILENAME = 'C:\NewDB.mdf'),
       (FILENAME = 'C:\NewDB.ldf')
    FOR ATTACH;
GO
 76
Author: Joe Stefanelli, 2014-12-08 17:51:49
Parece que eu tinha tentado recuperar de um backup incorrectamente.

Inicialmente criei uma nova base de dados e depois tentei restaurar o backup aqui. O que eu deveria ter feito, e o que funcionou no final, foi trazer a janela de restauração e digitar o nome do novo banco de dados no campo de destino.

Então, em resumo, restaurar de um backup fez o truque. Obrigado por todos os comentários e sugestões.
 21
Author: Sergio, 2010-10-01 12:55:39
Este é o guião que eu uso. Um pouco complicado, mas funciona. Testada no servidor SQL 2012.
DECLARE @backupPath nvarchar(400);
DECLARE @sourceDb nvarchar(50);
DECLARE @sourceDb_log nvarchar(50);
DECLARE @destDb nvarchar(50);
DECLARE @destMdf nvarchar(100);
DECLARE @destLdf nvarchar(100);
DECLARE @sqlServerDbFolder nvarchar(100);

SET @sourceDb = 'db1'
SET @sourceDb_log = @sourceDb + '_log'
SET @backupPath = 'E:\tmp\' + sourceDb + '.bak' --ATTENTION: file must already exist and SQL Server must have access to it
SET @sqlServerDbFolder = 'E:\DB SQL\MSSQL11.MSSQLSERVER\MSSQL\DATA\'
SET @destDb = 'db2'
SET @destMdf = @sqlServerDbFolder + @destDb + '.mdf'
SET @destLdf = @sqlServerDbFolder + @destDb + '_log' + '.ldf'

BACKUP DATABASE @sourceDb TO DISK = @backupPath

RESTORE DATABASE @destDb FROM DISK = @backupPath
WITH REPLACE,
   MOVE @sourceDb     TO @destMdf,
   MOVE @sourceDb_log TO @destLdf
 16
Author: bluish, 2014-03-14 15:34:55

Usando o MS SQL Server 2012, você precisa executar 3 passos básicos:

  1. Primeiro, gerar um ficheiro .sql contendo apenas a estrutura do Código DB

    • carregue com o botão direito no código DB e depois Tarefas depois gerar programas
    • siga o assistente e salve o ficheiro {[[0]} localmente
  2. Em segundo lugar, substitua o DB de origem pelo de destino no ficheiro .sql

    • carregue com o botão direito no ficheiro de destino, selecione Nova Consulta e Ctrl-H ou (Editar - Localizar e substituir - Rápida substituição)
  3. Finalmente, preencher com dados

    • carregue com o botão direito no DB de destino e seleccione então Tarefas e Dados De Importação
    • a lista de fontes de dados definida como "framework Data provider for SQL server " + define o campo de texto da cadeia de ligação sob os dados ex: Data Source=Mehdi\SQLEXPRESS;Initial Catalog=db_test;User ID=sa;Password=sqlrpwrd15
    • faça o mesmo com o destino
    • assinale a tabela que deseja transferir ou assinale para além de "fonte: ..."para verificar todos eles

Acabou.

 9
Author: Mehdi Benkirane, 2015-10-06 16:11:46

No servidor SQL 2008 R2, faça backup do banco de dados como um arquivo em uma pasta. Em seguida, escolheu a opção Restaurar que aparece na pasta" base de dados". No Assistente indique o novo nome que deseja na base de dados de destino. E escolha restaurar o arquivo frrom e usar o arquivo que você acabou de criar. Eu jsut fez isso e foi muito rápido (meu DB era pequeno, mas ainda) Paulo.

 6
Author: pabloelustondo, 2012-11-14 16:43:07
Nenhuma das soluções mencionadas aqui funcionou para mim-estou usando o SQL Server Management Studio 2014.

Em vez disso, tive de desligar a opção "Take tail-log backup antes de restaurar" no ecrã "Opções": na minha versão, é assinalada por omissão e impede que a operação de restauração seja concluída. Depois de desligá-lo, a operação de restauração prosseguiu sem problemas.

enter image description here

 6
Author: Emanuele Ciriachi, 2017-05-23 08:42:22

Se a base de dados não for muito grande, poderá ver os comandos 'Script Database' no SQL Server Management Studio Express, que estão num menu de contexto do item da base de dados em si no explorer.

Você pode escolher tudo para script; você quer os objetos e os dados, é claro. Você então vai salvar o script inteiro para um único arquivo. Então você pode usar esse arquivo para recriar a base de dados; certifique-se apenas de que o comando USE no topo está configurado para a base de dados adequada.

 3
Author: Andrew Barber, 2010-09-30 09:39:48

Outra forma de fazer o truque usando o Assistente de importação / exportação , Escolha a origem é o seu servidor com a base de dados de origem, e depois, no destino, escolha o mesmo servidor com a base de dados de destino (você precisa de criar a base de dados vazia primeiro), depois carregue em terminar

Irá criar todas as tabelas e transferir todos os dados para a nova base de dados,

 2
Author: Mohanad Kaleia, 2016-10-10 16:12:42

A solução, com base neste comentário: https://stackoverflow.com/a/22409447/2399045 . Basta definir a configuração: nome do DB, pasta temporária, pasta de ficheiros db. E depois de executar você terá a cópia de DB com o nome no formato "sourceDBName_yyyy-mm-dd".

-- Settings --
-- New DB name will have name = sourceDB_yyyy-mm-dd
declare @sourceDbName nvarchar(50) = 'MyDbName';
declare @tmpFolder nvarchar(50) = 'C:\Temp\'
declare @sqlServerDbFolder nvarchar(100) = 'C:\Databases\'

--  Execution --
declare @sourceDbFile nvarchar(50);
declare @sourceDbFileLog nvarchar(50);
declare @destinationDbName nvarchar(50) = @sourceDbName + '_' + (select convert(varchar(10),getdate(), 121))
declare @backupPath nvarchar(400) = @tmpFolder + @destinationDbName + '.bak'
declare @destMdf nvarchar(100) = @sqlServerDbFolder + @destinationDbName + '.mdf'
declare @destLdf nvarchar(100) = @sqlServerDbFolder + @destinationDbName + '_log' + '.ldf'

SET @sourceDbFile = (SELECT top 1 files.name 
                    FROM sys.databases dbs 
                    INNER JOIN sys.master_files files 
                        ON dbs.database_id = files.database_id 
                    WHERE dbs.name = @sourceDbName
                        AND files.[type] = 0)

SET @sourceDbFileLog = (SELECT top 1 files.name 
                    FROM sys.databases dbs 
                    INNER JOIN sys.master_files files 
                        ON dbs.database_id = files.database_id 
                    WHERE dbs.name = @sourceDbName
                        AND files.[type] = 1)

BACKUP DATABASE @sourceDbName TO DISK = @backupPath

RESTORE DATABASE @destinationDbName FROM DISK = @backupPath
WITH REPLACE,
   MOVE @sourceDbFile     TO @destMdf,
   MOVE @sourceDbFileLog  TO @destLdf
 1
Author: Pavel Samoylenko, 2018-02-15 14:18:52

Script baseado no Joe answer (desligar, copiar ficheiros, anexar ambos ).

  1. gerir o Estúdio de gestão como conta de administrador.
Não é necessário, mas talvez acesso negado erro na execução.
  1. configurar o servidor sql para executar o xp_ cmdshel
EXEC sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
EXEC sp_configure 'xp_cmdshell', 1
GO
RECONFIGURE
GO
  1. execute o programa, mas digite os nomes dos seus db nas variáveis @dbName e @copyDBName antes.
USE master;
GO 

DECLARE @dbName NVARCHAR(255) = 'Products'
DECLARE @copyDBName NVARCHAR(255) = 'Products_branch'

-- get DB files
CREATE TABLE ##DBFileNames([FileName] NVARCHAR(255))
EXEC('
    INSERT INTO ##DBFileNames([FileName])
    SELECT [filename] FROM ' + @dbName + '.sys.sysfiles')

-- drop connections
EXEC('ALTER DATABASE ' + @dbName + ' SET OFFLINE WITH ROLLBACK IMMEDIATE')

EXEC('ALTER DATABASE ' + @dbName + ' SET SINGLE_USER')

-- detach
EXEC('EXEC sp_detach_db @dbname = ''' + @dbName + '''')

-- copy files
DECLARE @filename NVARCHAR(255), @path NVARCHAR(255), @ext NVARCHAR(255), @copyFileName NVARCHAR(255), @command NVARCHAR(MAX) = ''
DECLARE 
    @oldAttachCommand NVARCHAR(MAX) = 
        'CREATE DATABASE ' + @dbName + ' ON ', 
    @newAttachCommand NVARCHAR(MAX) = 
        'CREATE DATABASE ' + @copyDBName + ' ON '

DECLARE curs CURSOR FOR 
SELECT [filename] FROM ##DBFileNames
OPEN curs  
FETCH NEXT FROM curs INTO @filename
WHILE @@FETCH_STATUS = 0  
BEGIN
    SET @path = REVERSE(RIGHT(REVERSE(@filename),(LEN(@filename)-CHARINDEX('\', REVERSE(@filename),1))+1))
    SET @ext = RIGHT(@filename,4)
    SET @copyFileName = @path + @copyDBName + @ext

    SET @command = 'EXEC master..xp_cmdshell ''COPY "' + @filename + '" "' + @copyFileName + '"'''
    PRINT @command
    EXEC(@command);

    SET @oldAttachCommand = @oldAttachCommand + '(FILENAME = "' + @filename + '"),'
    SET @newAttachCommand = @newAttachCommand + '(FILENAME = "' + @copyFileName + '"),'

    FETCH NEXT FROM curs INTO @filename
END
CLOSE curs 
DEALLOCATE curs

-- attach
SET @oldAttachCommand = LEFT(@oldAttachCommand, LEN(@oldAttachCommand) - 1) + ' FOR ATTACH'
SET @newAttachCommand = LEFT(@newAttachCommand, LEN(@newAttachCommand) - 1) + ' FOR ATTACH'

-- attach old db
PRINT @oldAttachCommand
EXEC(@oldAttachCommand)

-- attach copy db
PRINT @newAttachCommand
EXEC(@newAttachCommand)

DROP TABLE ##DBFileNames
 1
Author: Evgeny Ivanov, 2018-06-07 15:49:11

Você poderia apenas criar uma nova base de dados e então ir para tarefas, importar dados, e importar todos os dados da base de dados que você deseja duplicar para a base de dados que você acabou de criar.

 1
Author: TheFab92, 2018-07-04 19:08:06