SQL Server 2008 Express의 동일한 서버에서 SQL Server 데이터베이스를 어떻게 복제 할 수 있습니까?


271

테스트 목적으로 '복사하고 이름을 바꾸려는'데이터베이스가 포함 된 MS SQL Server 2008 Express 시스템이 있지만이를 달성하는 간단한 방법을 모릅니다.

R2 버전의 SQL Server에는 데이터베이스 복사 마법사가 있지만 슬프게도 업그레이드 할 수 없습니다.

문제의 데이터베이스는 공연입니다. 새 데이터베이스에 복사하려는 데이터베이스의 백업을 복원하려고 시도했지만 운이 없습니다.


2
백업 복원이 작동합니다. 실패한 방법에 대한 자세한 정보를 제공 할 수 있습니까?
Ed Harper

7
백업에서 복원 할 때 실수를했다는 것을 깨달았습니다. 먼저 비어있는 새 DB를 만들고 거기서 백업을 복원하려고했습니다. 내가해야 할 일은 복원 대화 상자를 불러 와서 새 데이터베이스의 이름을 먼저 만드는 대신 입력하십시오. 이렇게하면 데이터베이스가 멋지게 복제되었습니다!
Sergio

답변:


372
  1. Microsoft 웹 사이트에서 무료로 다운로드 할 수있는 Microsoft SQL Management Studio를 설치하십시오.

    버전 2008

    Microsoft SQL Management Studio 2008은 고급 서비스 가 포함 된 SQL Server 2008 Express의 일부입니다.

    버전 2012

    클릭 다운로드 버튼 체크를ENU\x64\SQLManagementStudio_x64_ENU.exe

    2014 버전

    클릭하여 다운로드 버튼을 하고 MgmtStudio을 확인64BIT\SQLManagementStudio_x64_ENU.exe

  2. Microsoft SQL Management Studio를 엽니 다 .

  3. 원본 데이터베이스를 .BAK 파일로 백업합니다 (db-> 작업-> 백업).
  4. 새 이름 (복제)으로 빈 데이터베이스를 만듭니다. 이 옵션은 선택 사항이므로 아래 설명에 유의하십시오.
  5. 데이터베이스를 복제하고 복원 대화 상자를 열려면 클릭하십시오 (이미지 참조) 복원 대화 상자
  6. 장치를 선택하고 3 단계에서 백업 파일을 추가하십시오. 백업 파일 추가
  7. 테스트 데이터베이스로 대상 변경 목적지 변경
  8. 데이터베이스 파일의 위치를 ​​변경하십시오. 원본과 달라야합니다. 텍스트 상자에 직접 입력하고 접미사를 추가하기 만하면됩니다. (참고 : 순서가 중요합니다. 확인란을 선택한 다음 파일 이름을 변경하십시오.) 위치를 바꾸다
  9. 교체 및 KEEP_REPLICATION으로 확인 교체하다

84
1. 빈 데이터베이스를 작성하지 말고 .bak 파일을 복원하십시오. 2. SQL Server Management Studio의 "데이터베이스"분기를 마우스 오른쪽 단추로 클릭하여 액세스 할 수있는 '데이터베이스 복원'옵션을 사용하고 복원 할 소스를 제공하면서 데이터베이스 이름을 제공하십시오. 심판 : stackoverflow.com/questions/10204480/…
taynguyen

1
Microsoft SQL Management Studio – 무료
Tomas Kubes

4
작동하지 않습니다- "데이터베이스가 사용 중이므로 배타적 액세스를 얻을 수 없습니다".
Emanuele Ciriachi 17 년

5
또한 "복원하기 전에 테일 로그 백업 수행"의 선택을 해제해야했습니다. 이것은 기본적으로 점검되었으며 "데이터베이스를 사용 중이므로 독점 액세스를 확보 할 수 없습니다"오류가 발생했습니다.
순무

2
내 원래 데이터베이스는 "복원"에 붙어있어
페르 도모 디비

114

복제 할 데이터베이스를 마우스 오른쪽 단추로 클릭하고을 클릭 한 다음 Tasks을 클릭하십시오 Copy Database.... 마법사를 따르십시오.


나는 슬프게도 SQL Server의 R2 릴리스에서만 사용할 수 있다고 생각합니다 :-(
Sergio

7
다음은 급행에서 작동하는 방법입니다 : stackoverflow.com/questions/4269450/…
Th 00 mÄ s

2
데이터베이스에 객체를 암호화 한 경우에는 작동하지 않습니다.
cjbarth

1
요점은 실제로 어디에서해야할까요? 당신이 설명한 것은 매우 직관적입니다. 이전에 일부 도구 (0xDBE, Visual Studio SQL Server 개체 탐색기)에서 정확하게 시도했지만 그러한 기능을 찾지 못했습니다.
David Ferenczy Rogožan

3
불가능합니다! 작업-> 데이터베이스를 복사 할 메뉴 항목 없음
raiserle

95

데이터베이스를 분리하고 명령 프롬프트에서 파일을 새 이름으로 복사 한 다음 두 DB를 모두 연결할 수 있습니다.

SQL에서 :

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

명령 프롬프트에서 (이 예제를 위해 파일 경로를 단순화했습니다) :

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

SQL에서 다시 :

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

1
완전한! 이것은 나를 위해 일한 독특한 솔루션입니다! 고마워요!
thiagoh 2016 년

9
select * from OriginalDB.sys.sysfilesDB 파일의 위치를 ​​찾습니다.
JohnLBevan

예, 특별한 도구가 필요하지 않기 때문에이 솔루션을 가장 좋아합니다. 그러나 나는 한 newdb을 만들 수 없습니다, 그것은 말한다 Permission denied.mdf파일. 지금은 필요하지 않습니다. 원래 DB의 백업이 필요했기 때문에 나중에 원본 DB를 덮어 쓸 수 있습니다. 왜 그런 오류가 발생하는지 궁금합니다.
David Ferenczy Rogožan

2
SQL 서비스를 중지하고, mdf 및 ldf 파일을 복사하고, 새 데이터베이스의 이름을 바꾸고, SQL 서비스를 다시 시작한 후 master 아래에서 마지막 create database 명령을 실행하면 원본 데이터베이스를 분리 할 필요가 없습니다. USE master ; 데이터베이스 작성 NewDB ON (FILENAME = 'C : \ NewDB.mdf'), (FILENAME = 'C : \ NewDB.ldf') ATTACH; GO
danpop

1
가장 빠른 방법은 +1입니다. @JohnLBevan 우수한 의견뿐만 아니라, 당신은 또한 사용할 수 있습니다exec sp_helpdb @dbname='TEMPDB';

30

백업에서 잘못 복원하려고 시도한 것으로 나타났습니다.

처음에 새 데이터베이스를 만든 다음 여기에서 백업을 복원하려고했습니다. 내가해야했던 것과 마지막에 일한 것은 복원 대화 상자를 열고 대상 필드에 새 데이터베이스의 이름을 입력하는 것이 었습니다.

즉, 백업에서 복원하면 트릭을 수행 할 수 있습니다.

모든 의견과 제안에 감사드립니다.


이 작업을 수행하면 대화 상자에서 파일이 원래 백업 한 데이터베이스와 동일한 위치에 있음을 알려줍니다. 따라서 파일을 덮어 쓸까 두려워 두 복원 할 용기가 없습니다.
Niels Brinch

2
Neils, 기본적으로 파일은 스냅 샷에서 동일합니다. 새로 이름이 지정된 데이터베이스에 대한 새 파일을 작성하기 위해 이름을 변경할 수 있습니다.
Colin Dabritz

PS :이 방법에는 SQL 에이전트 서비스가 필요합니다. db 복사 작업을 시작하기 전에 실행 중인지 확인하십시오.
dvdmn

당신은 이제이 답변을 세 번이나 도와주었습니다. 나는 그것을 만드는 대신 입력하는 것을 잊어 버립니다. + 맥주
Piotr Kula

이것과 '파일'창에서 .mdf 및 .log 파일의 이름을 바꾸면 나에게 도움이되었습니다.
Wollan

17

이것은 내가 사용하는 스크립트입니다. 조금 까다 롭지 만 작동합니다. SQL Server 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

2
내 환경에서 파일 이름이 db 이름과 일치하지 않으므로 ( 다른 복원 에서 온 ) SET @sourceDb_log = (SELECT files.name FROM sys.databases dbs INNER JOIN sys.master_files files ON dbs.database_id=files.database_id WHERE dbs.name=@sourceDb AND files.type=1)비슷한 쿼리가있는 @sourceDb_data에 대한 별도의 변수가 필요했습니다 (에서 대체 files.type=0). HTH!
Dan Caseley

11

여기에 언급 된 솔루션 중 어느 것도 나를 위해 효과가 없었습니다. SQL Server Management Studio 2014를 사용하고 있습니다.

대신 "옵션"화면에서 "복원 전에 테일 로그 백업 수행"확인란의 선택을 해제해야했습니다. 내 버전에서는 기본적으로 선택되어 있으며 복원 작업이 완료되지 않습니다. 선택을 해제 한 후 복원 작업이 문제없이 진행되었습니다.

여기에 이미지 설명을 입력하십시오


2
이 대답은 나의 하루를 구했습니다.
Dilhan Jayathilake

2
너무 내 하루에 저장 :
ashilon

1
SQL Server 2017에서이 작업을 수행하지 않으면 원본 데이터베이스는 "복원 중 ..."으로 유지됩니다. 귀하의 솔루션이 트릭을 수행했습니다-감사합니다!
mu88

9

MS SQL Server 2012를 사용하면 3 가지 기본 단계를 수행해야합니다.

  1. 먼저 .sql소스 DB의 구조 만 포함 하는 파일을 생성 하십시오.

    • 소스 DB를 마우스 오른쪽 버튼으로 클릭 한 다음 작업 , 스크립트 생성
    • 마법사를 따라 .sql파일을 로컬로 저장하십시오
  2. 둘째, 소스 DB를 .sql파일 의 대상 DB로 바꿉니다.

    • 대상 파일에 마우스 오른쪽 클릭, 선택 새 쿼리Ctrl-H(또는 편집 - 찾기 및 바꾸기 - 빠른 교체 )
  3. 마지막으로 데이터로 채 웁니다

    • 대상 DB를 마우스 오른쪽 버튼으로 클릭 한 다음 작업데이터 가져 오기 를 선택하십시오.
    • 데이터 소스 드롭 다운이 " SQL 서버용 .net 프레임 워크 데이터 제공자 "로 설정되고 DATA ex 아래에 연결 문자열 텍스트 필드가 설정되었습니다.Data Source=Mehdi\SQLEXPRESS;Initial Catalog=db_test;User ID=sa;Password=sqlrpwrd15
    • 목적지와 동일하게
    • 전송하려는 테이블을 확인하거나 "source : ..."외에 확인란을 선택하여 모두 확인하십시오.

끝났습니다.


그건 그렇고, 가져 오기 데이터가 대상 테이블에 없으면 테이블을 만들 수 있다고 생각합니다. 간단한 솔루션 +1
Khurram Ishaque

6

SQL Server 2008 R2에서 데이터베이스를 파일로 폴더에 백업하십시오. 그런 다음 "데이터베이스"폴더에 나타나는 복원 옵션을 선택하십시오. 마법사에서 대상 데이터베이스에 원하는 새 이름을 입력하십시오. 그리고 frrom 파일 복원을 선택하고 방금 만든 파일을 사용하십시오. 나는 그것을했고 그것이 매우 빠르다 (내 DB는 작지만 여전히 파블로).


4

데이터베이스가 크지 않은 경우 SQL Server Management Studio Express의 '스크립트 데이터베이스'명령을 볼 수 있습니다.이 명령은 탐색기에서 데이터베이스 항목 자체의 컨텍스트 메뉴에 있습니다.

스크립팅 할 대상을 모두 선택할 수 있습니다. 물론 객체와 데이터를 원합니다. 그런 다음 전체 스크립트를 단일 파일로 저장합니다. 그런 다음 해당 파일을 사용하여 데이터베이스를 다시 작성할 수 있습니다. USE상단 의 명령이 올바른 데이터베이스로 설정되어 있는지 확인하십시오 .


1
고마워, 데이터베이스는 (대략 공연) 상당히 크므로 나쁜 일이 발생할 수 있다고 생각합니다 :-)
Sergio

2
권리; 그것은 최선의 방법이 아닙니다. 대신 스크립트 데이터베이스를 사용하여 새 데이터베이스에 구조를 만든 다음 가져 오기 / 내보내기를 사용하여 데이터를 이동할 수 있습니다. 먼저 스크립트 데이터베이스를 수행하십시오. 가져 오기 / 내보내기는 테이블이 존재하지 않는 경우 테이블을 작성하므로 테이블이 어떻게 작동하지 않을 수 있습니다.
Andrew Barber

4

이 의견을 기반으로 한 해결책은 https://stackoverflow.com/a/22409447/2399045 입니다. DB 이름, 임시 폴더, db 파일 폴더 등의 설정 만 설정하십시오. 그리고 실행 후에는 "sourceDBName_yyyy-mm-dd"형식의 이름을 가진 DB 사본이 생성됩니다.

-- 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

3

Joe 답변을 기반으로 한 스크립트 ( 분리, 파일 복사, 둘 다 첨부 )

  1. 관리자 계정으로 Managment Studio를 실행하십시오.

필요하지 않지만 실행시 액세스 거부 오류가 발생했을 수 있습니다.

  1. xp_cmdshel를 실행하도록 SQL 서버 구성
EXEC sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
EXEC sp_configure 'xp_cmdshell', 1
GO
RECONFIGURE
GO
  1. 스크립트를 실행하되 이전 에 DB 이름 @dbName@copyDBName변수를 입력하십시오 .
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

3

새 데이터베이스를 만든 다음 작업으로 이동하여 데이터를 가져오고 복제하려는 데이터베이스에서 방금 만든 데이터베이스로 모든 데이터를 가져올 수 있습니다.


2

가져 오기 / 내보내기 마법사 를 사용하여 트릭을 수행하는 다른 방법은 먼저 빈 데이터베이스를 작성한 다음 소스 데이터베이스가있는 서버 인 소스를 선택한 다음 대상에서 대상 데이터베이스가있는 동일한 서버를 선택하십시오 (빈 데이터베이스 사용) 당신은 처음에 만든 다음 완료를 누르십시오

모든 테이블을 작성하고 모든 데이터를 새 데이터베이스로 전송합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.