2013-03-06 3 views
0

SQL Server 2012를 사용하여 시스템을 구축한다는 것은 동일한 데이터 유형을 포함하지만 각 사용자마다 고유 한 웹 응용 프로그램이므로 사용자 당 하나의 데이터베이스를 사용하므로 모든 데이터베이스가 동일합니다. 구조이며 사용자가 확정 된 계정 이메일을 클릭하면 동적으로 생성되어 게재됩니다.각 새 사용자에 대한 일반 데이터베이스 복원

문제는 데이터베이스를 만드는 스크립트가 DB_GENERIC.bak라는 데이터베이스를 복원하고 예상보다 많은 시간이 걸리는 것입니다. 임을 최적화 할 수있는 방법을 모색하고 새로운 데이터베이스를 만들었지 만 시간이 절약되었습니다. (지금은 데이터베이스를 만드는 데 15 초를 사용하고 있습니다), 일반 데이터베이스는 작은 (aprox 5MB 및 600kb 압축)을 복원하고 모든 테이블은 비어 있습니다.

전체 데이터베이스 백업을 복원하는 대신 다른 방법으로이 작업을 수행 할 수 있습니까? t-sql에서 전체 generic 데이터베이스를 스크립팅하고 데이터베이스 이름을 변경하여 실행할 수 있습니까? 더 빨라지겠습니까? 아니면 리소스가 적은 백업을 생성하거나 압축하는 다른 방법이 있습니다. 데이터 나 기타 테이블, 프로 시저, 함수 및 스키마가 필요하지 않습니다. 사전에

덕분에


UDPATE : 내 질문에 대답 모든 사람에게

감사합니다, 답변 큰 도움 모든했다. 나는 @ Love2Learn 대답을 사용하는 것을 끝내고 나는 detach-copy-attach 방법을 시도했다. 그냥이 구현 된 상상 할

, 내가 담당하는 하나의 저장 프로 시저를 가지고 복사 부착 다음이 데이터베이스 템플릿에서 새 데이터베이스를 :

--executing bat that copies the database-1-template.mdf and database-2-template.mdf (as well as log files) to the DATA folder in my sql instance 
--and renames them (then they'll be attached) 
DECLARE @BATCopy VARCHAR(MAX) = 'C:\helpers\copyMDFAndLogFiles.bat' 

--building command for xp_cmdshell with parameters (new databases names) 
DECLARE @command varchar(500) = @BATCopy + ' ' + @database1Name + ' ' + @database2Name 

--PRINT @command 

EXEC xp_cmdshell @command, no_output 

--attaching new databases 
SET @SQL = ' USE [master] 
CREATE DATABASE ' + @database1Name + ' 
    ON (FILENAME = ''' + @SQLDATAPath + @database1Name + '.mdf''), 
    (FILENAME = ''' + @SQLDATAPath + @database1Name + '_log.ldf'') 
    FOR ATTACH; 

CREATE DATABASE ' + @database2Name+ ' 
    ON (FILENAME = ''' + @SQLDATAPath + @database2Name+ '.mdf''), 
    (FILENAME = ''' + @SQLDATAPath+ @database2Name+ '_log.ldf'') 
    FOR ATTACH;' 

EXECUTE(@SQL) 

--renaming logical files 

SET @SQL = ' 
ALTER DATABASE '[email protected] +' 
MODIFY FILE (NAME = Database1_Generic, NEWNAME = '[email protected] +') 

ALTER DATABASE '[email protected] +' 
MODIFY FILE (NAME = Database1_Generic_Log, NEWNAME = '[email protected] +'_log) 

ALTER DATABASE '[email protected]+' 
MODIFY FILE (NAME = Database2_Generic, NEWNAME = '[email protected]+') 

ALTER DATABASE '[email protected]+' 
MODIFY FILE (NAME = Database2_Generic_Log, NEWNAME = '[email protected]+'_log) 
' 

EXECUTE (@SQL) 

나는이 희망 내가해야 할 일과 똑같은 일을해야하는 사람을 돕고, 답장을 보내 주셔서 감사합니다.

줄리안.

+0

확장성에 대해 생각해 보셨습니까? 사용자 당 데이터베이스를 보유해야하는 정말 좋은 이유가 있습니까? 연결 풀링을 활용하지 못할 수도 있습니다. –

+0

@JayWalker 사용자 당 데이터베이스를 만드는 것에 대한 결정은 내 것이 아니므로 이유가 있어야하지만 이유는 분명하지 않습니다. 아이디어는 서버가 처리 할 수있는만큼의 데이터베이스를 보유하고 (그리고 안정적으로 유지하는 것), 더 많은 데이터베이스가 필요하다면 새로운 서버가 시스템에 추가됩니다. – Julian

답변

0

이 대답을 봐 ... Best way to copy a database (SQL Server 2008)

가장 좋은 방법은 분리 복사 부착입니다. 템플릿 데이터베이스를 생성하고 이것을 각각의 새 데이터베이스에 대한 기반으로 사용하고자 할 것입니다.

+0

당신은 전적으로 옳습니다. 저는 대안을 생각하지 않았습니다. 현재 템플릿 데이터베이스의 .bak를 복원하고 있습니다. 첨부 파일을 스크립트로 작성하고 시도해보십시오. .bak를 복원하는 것보다 빠릅니다. 감사합니다 :) – Julian

+0

답변을 너무 오래 걸리는 것에 대해 죄송합니다, Stackoverflow 내게 내 질문에 대한 새로운 답변에 대한 모든 알림을 전달하지 않은 것 같습니다. – Julian

+1

@Julian Heh, 구현이 효과적인 지 알려주세요. 그렇다면 답을 받아들이고 상향 투표하는 것이 도움이된다고 생각되는 검색에서 질문을 찾는 사람들에게 분명하게 알리는 좋은 방법입니다. –

0

... 그게 내가 데이터 또는 아무것도, 그냥 테이블 절차, 기능 및 스키마가 필요 없다는 것입니다.

1 단계는 데이터에서 스키마를 분리하는 것입니다. SSMS "Script Database As ..."를 사용하여 새 데이터베이스에 갖기를 원하는 스키마/데이터 만 포함하는 SQL 스크립트를 생성하십시오. 미래의 스키마 개조 ("baseatabase.sql", "patch01.sql"등)에 대한 계획을 세우십시오. 그렇게 될 것이므로 여러분은 많은 개개의 데이터베이스에 개조해야 할 것입니다.

일단 데이터를 제거하면 스크립트에서 데이터베이스를 만드는 것이 훨씬 빠릅니다. 그렇게 빠르지 않으면 빈 DB를 백업하고 그로부터 새 데이터베이스로 복원하십시오. (SQL Server Azure는 멋진 CREATE DATABASE_B AS COPY OF DATABASE_A을 가지고 있지만 일반 SQL Server에는 없습니다.)

BTW 나는 다른 포스터들에 동의합니다 : 여러 데이터베이스의 지혜; 50 명의 고객이있을 것으로 예상된다면 괜찮습니다. 10,000 명의 고객이있을 것으로 예상된다면 다른 접근 방식을 사용하는 것이 더 나을 것입니다.

+0

매번 데이터베이스를 스크립팅하는 과정이 약간 짜증나 기 때문에 스크립팅 옵션을 우선 사용하지 않았습니다. 현재 템플릿을 백업하고 새 계정마다 해당 템플릿을 복원하는 중입니다. 나는 위에서 언급 한 detach-copy-attach를 시도 할 것이다.하지만 그게 효과가 없다면 아마 스크립트를 사용하게 될 것이다. "여러 데이터베이스의 지혜"에 관해서는 100-150 DB를 기대하고, 더 많은 것이 있다면 새로운 서버가 시스템에 추가됩니다. 그것은 내 결정이 아니었고, 그렇게하기 위해 약간의 "강제"가 있었고, 시스템 리팩터러는 커질 것입니다. – Julian

+0

답변을 너무 오래 받아서 죄송합니다, Stackoverflow 내 질문에 대한 새로운 답변에 대한 모든 알림을 전달하지 않은 것 같습니다. – Julian

+0

백업에서 복원하는 것이 스크립트에서 새 데이터베이스를 생성하는 것보다 확실히 빠릅니다. 나는 단지 스키마로 덤핑을 제안하고 "골든 마스터"데이터베이스가 스키마 만 포함하도록 다시 가져 오기를 제안합니다. 서버 당 150 개의 데이터베이스가 있어야합니다. SQL Server는 인스턴스 당 32,768 개의 데이터베이스를 지원합니다. –

0

제 생각에 당신은 데이터베이스를 스크립팅하고 스크립트를 실행하는 것이 가장 좋습니다. 이렇게하면 콘텐츠를 쉽게 버전을 바꿀 수 있다는 장점이 있습니다. 또한 모든 테넌트 데이터베이스를 새 버전으로 업그레이드하려면 델타를 스크립트 아웃해야합니다.

스크립트 데이터베이스 마법사를 사용하여 초기 스크립트를 만들 수 있습니다. 이 미친 기본값이기 때문에 고급 옵션을 변경해야합니다. 그들은 방아쇠와 다른 것들을 그냥 남겨 둘 것입니다.

+0

안녕하세요, 데이터베이스 스크립팅은 옵션 이었지만 매번 데이터베이스를 스크립팅하고 스크립트가 제대로 작동하는지 확인하는 "게으름"때문에 잠시 기다려 둡니다. 데이터베이스의 "전체 복사본"을 보유하고 있고 해당 데이터베이스로 로그인을 변경하는 것만으로도 더 빠르고 쉽게 유지할 수 있습니다 (새 계정에 대한 db의 새 버전을 배포하는 것이 템플릿 백업을 수행하는 것처럼 간단 함) . 나는 detach-copy-attach라고 말한 위의 답을 살펴볼 것입니다. 잘되지 않는다면, 나는 생각하기에 스크립팅을 끝낼 것입니다. 대답 해줘서 고마워! – Julian

+0

답변을 너무 오래 받아서 죄송합니다, Stackoverflow 내 질문에 대한 새로운 답변에 대한 모든 알림을 전달하지 않은 것 같습니다. – Julian

+0

이 흥미로운 질문을 다시 신고 해 주셔서 감사합니다. 여기에 제안 된 여러 가지 전략들이 어떻게 발굴되었는지 알고 싶습니다. 그러니 더 이상 의견을 남기세요 :) – usr

관련 문제