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.13 answers
-
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
Abrir o Estúdio de gestão SQL da Microsoft
- cópia de segurança da base de dados original para ficheiro (db -> tarefa -> cópia de segurança).
- Criar uma base de dados vazia com um novo nome (clone).
- Carregue para clonar a base de dados e abrir a janela de Restauração (Ver imagem)
- Seleccione o dispositivo e adicione o ficheiro bakcup do Passo 1.
- mudar o destino para a base de dados de testes
- 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.)
- Verifique com o REPLACE e com o KEEP_REPLICATION
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.
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
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.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
Usando o MS SQL Server 2012, você precisa executar 3 passos básicos:
-
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
-
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)
-
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.
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.
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.
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.
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,
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
Script baseado no Joe answer (desligar, copiar ficheiros, anexar ambos ).
- gerir o Estúdio de gestão como conta de administrador.
- 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
- 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
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.