테스트 목적으로 '복사하고 이름을 바꾸려는'데이터베이스가 포함 된 MS SQL Server 2008 Express 시스템이 있지만이를 달성하는 간단한 방법을 모릅니다.
R2 버전의 SQL Server에는 데이터베이스 복사 마법사가 있지만 슬프게도 업그레이드 할 수 없습니다.
문제의 데이터베이스는 공연입니다. 새 데이터베이스에 복사하려는 데이터베이스의 백업을 복원하려고 시도했지만 운이 없습니다.
테스트 목적으로 '복사하고 이름을 바꾸려는'데이터베이스가 포함 된 MS SQL Server 2008 Express 시스템이 있지만이를 달성하는 간단한 방법을 모릅니다.
R2 버전의 SQL Server에는 데이터베이스 복사 마법사가 있지만 슬프게도 업그레이드 할 수 없습니다.
문제의 데이터베이스는 공연입니다. 새 데이터베이스에 복사하려는 데이터베이스의 백업을 복원하려고 시도했지만 운이 없습니다.
답변:
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
Microsoft SQL Management Studio를 엽니 다 .
복제 할 데이터베이스를 마우스 오른쪽 단추로 클릭하고을 클릭 한 다음 Tasks
을 클릭하십시오 Copy Database...
. 마법사를 따르십시오.
데이터베이스를 분리하고 명령 프롬프트에서 파일을 새 이름으로 복사 한 다음 두 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
select * from OriginalDB.sys.sysfiles
DB 파일의 위치를 찾습니다.
Permission denied
에 .mdf
파일. 지금은 필요하지 않습니다. 원래 DB의 백업이 필요했기 때문에 나중에 원본 DB를 덮어 쓸 수 있습니다. 왜 그런 오류가 발생하는지 궁금합니다.
exec sp_helpdb @dbname='TEMPDB';
백업에서 잘못 복원하려고 시도한 것으로 나타났습니다.
처음에 새 데이터베이스를 만든 다음 여기에서 백업을 복원하려고했습니다. 내가해야했던 것과 마지막에 일한 것은 복원 대화 상자를 열고 대상 필드에 새 데이터베이스의 이름을 입력하는 것이 었습니다.
즉, 백업에서 복원하면 트릭을 수행 할 수 있습니다.
모든 의견과 제안에 감사드립니다.
이것은 내가 사용하는 스크립트입니다. 조금 까다 롭지 만 작동합니다. 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
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!
여기에 언급 된 솔루션 중 어느 것도 나를 위해 효과가 없었습니다. SQL Server Management Studio 2014를 사용하고 있습니다.
대신 "옵션"화면에서 "복원 전에 테일 로그 백업 수행"확인란의 선택을 해제해야했습니다. 내 버전에서는 기본적으로 선택되어 있으며 복원 작업이 완료되지 않습니다. 선택을 해제 한 후 복원 작업이 문제없이 진행되었습니다.
MS SQL Server 2012를 사용하면 3 가지 기본 단계를 수행해야합니다.
먼저 .sql
소스 DB의 구조 만 포함 하는 파일을 생성 하십시오.
.sql
파일을 로컬로 저장하십시오둘째, 소스 DB를 .sql
파일 의 대상 DB로 바꿉니다.
마지막으로 데이터로 채 웁니다
Data Source=Mehdi\SQLEXPRESS;Initial Catalog=db_test;User ID=sa;Password=sqlrpwrd15
끝났습니다.
SQL Server 2008 R2에서 데이터베이스를 파일로 폴더에 백업하십시오. 그런 다음 "데이터베이스"폴더에 나타나는 복원 옵션을 선택하십시오. 마법사에서 대상 데이터베이스에 원하는 새 이름을 입력하십시오. 그리고 frrom 파일 복원을 선택하고 방금 만든 파일을 사용하십시오. 나는 그것을했고 그것이 매우 빠르다 (내 DB는 작지만 여전히 파블로).
데이터베이스가 크지 않은 경우 SQL Server Management Studio Express의 '스크립트 데이터베이스'명령을 볼 수 있습니다.이 명령은 탐색기에서 데이터베이스 항목 자체의 컨텍스트 메뉴에 있습니다.
스크립팅 할 대상을 모두 선택할 수 있습니다. 물론 객체와 데이터를 원합니다. 그런 다음 전체 스크립트를 단일 파일로 저장합니다. 그런 다음 해당 파일을 사용하여 데이터베이스를 다시 작성할 수 있습니다. USE
상단 의 명령이 올바른 데이터베이스로 설정되어 있는지 확인하십시오 .
이 의견을 기반으로 한 해결책은 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
Joe 답변을 기반으로 한 스크립트 ( 분리, 파일 복사, 둘 다 첨부 )
필요하지 않지만 실행시 액세스 거부 오류가 발생했을 수 있습니다.
EXEC sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
EXEC sp_configure 'xp_cmdshell', 1
GO
RECONFIGURE
GO
@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
가져 오기 / 내보내기 마법사 를 사용하여 트릭을 수행하는 다른 방법은 먼저 빈 데이터베이스를 작성한 다음 소스 데이터베이스가있는 서버 인 소스를 선택한 다음 대상에서 대상 데이터베이스가있는 동일한 서버를 선택하십시오 (빈 데이터베이스 사용) 당신은 처음에 만든 다음 완료를 누르십시오
모든 테이블을 작성하고 모든 데이터를 새 데이터베이스로 전송합니다.