2013-03-06 17 views
0

林建設使用SQL Server 2012的系統,它包含相同的數據類型,但它爲每個用戶的特異性目的web應用程序,所以我們每個用戶使用一個數據庫,每一個數據庫有相同結構,並且在用戶點擊確認帳戶電子郵件時被創建並且生活。恢復通用數據庫中的每個新用戶

的問題是創建數據庫正在恢復一個名爲DB_GENERIC.bak其花費比我預期更多的時間數據庫的腳本。我正在尋找優化這種方法,並最終創建一個全新的數據庫,但減少了所需的時間。 (現在使用15秒來創建數據庫),而通用數據庫恢復其小(aprox 5mb,和600kb壓縮),所有表都是空的。

有沒有實現這一點,而不是還原完整數據庫備份的任何其他方式?我可以在t-sql上編寫整個通用數據庫並執行更改數據庫名稱嗎?它會更快嗎? 或者是壓縮或產生較低的資源消費備份的任何其他方式,事情是,我不需要數據或者什麼,只是表,過程,功能和模式。

在此先感謝


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

您是否想過可擴展性?是否有一個很好的理由讓每個用戶擁有一個數據庫?您可能無法利用連接池。 – 2013-03-06 15:12:20

+0

@JayWalker關於爲每個用戶創建數據庫的決定不是我的,所以必須有一個原因,但我不完全確定爲什麼。這個想法是要有儘可能多的數據庫作爲服務器可以處理(並保持穩定),並且如果需要更多的數據庫,則將新的服務器添加到系統中。 – Julian 2013-03-26 19:09:06

回答

0

看看這個答案... Best way to copy a database (SQL Server 2008)

最好的辦法就是分離,複製連接。您需要創建一個模板數據庫並將其用作每個新數據庫的基礎。

+0

你是完全正確的,我沒有想到的替代方案,目前正在恢復模板數據庫的.bak。我將腳本附加並嘗試,應該比恢復.bak更快。 謝謝:) – Julian 2013-03-26 18:43:33

+0

對不起,花了這麼長時間來回答,Stackoverflow似乎沒有提供任何有關我的問題的新答案的通知。 – Julian 2013-03-26 19:12:23

+1

@ Julian Heh,這很好,讓我們知道實施是否適合你。如果是這樣,接受答案和upvoting是一個很好的方法,讓那些在搜索中發現你的問題的人很容易找到你認爲有用的選項。 – 2013-03-26 19:13:30

0

......事情是,我不需要數據或任何東西,只是表, 過程,函數和模式。

第1步是從你的數據拆分架構。使用SSMS「腳本數據庫爲...」來生成只包含您希望新數據庫具有的模式/數據的SQL腳本。爲將來的模式mod(「basedatabase.sql」,「patch01.sql」等)制定一個計劃,因爲它會發生,你將不得不將這些模塊應用到很多數據庫。

一旦你擺脫了數據,創建一個腳本,數據庫會快很多。如果速度不夠快,請備份空數據庫並從中恢復到新數據庫。 (SQL Server Azure有一個不錯的CREATE DATABASE_B AS COPY OF DATABASE_A,但這不是常規的SQL Server。)

順便說一句我同意其他海報re:多智慧數據庫;如果你希望有50個客戶,這很好。如果您希望擁有10,000名客戶,則最好採用不同的方法。

+0

腳本選項首先放在一邊,因爲每次腳本化數據庫的過程都會有點煩人。我目前正在備份模板併爲每個新帳戶恢復該模板。 我會嘗試建議我上面的detach-copy-attach,但是如果這不起作用,我可能會最終使用腳本。 關於「多個數據庫的智慧」,它已經完成了大約100-150個數據庫,如果有更多的數據庫,那麼一個新的服務器將被添加到系統中。這不是我的決定,所以即使有點「被迫」這樣做,系統重構也會很大。 – Julian 2013-03-26 19:06:38

+0

對不起,花了這麼長時間來回答,Stackoverflow似乎沒有提供任何有關我的問題的新答案的通知。 – Julian 2013-03-26 19:11:54

+0

從備份恢復肯定比從腳本生成新數據庫要快。我只是建議將模式轉儲爲腳本並重新導入,以便您的「黃金主數據庫」僅包含模式。 你應該沒問題,每個服務器有150個數據庫; SQL Server支持每個實例32,768個數據庫或類似的東西。 – 2013-03-27 02:18:48

0

我的看法是,通過腳本化數據庫並執行腳本,您將是最好的選擇。這具有可以輕鬆版本化內容的優點。另外,爲了將所有租戶數據庫升級到新版本,無論如何您都需要編寫三角洲腳本。

您可以使用腳本數據庫嚮導創建初始腳本。請務必更改高級選項,因爲它們有瘋狂默認值。他們會忽略一些東西,如觸發器和其他東西。

+0

嗨,編寫數據庫腳本是一個選項,但我們暫時擱置了一段時間,因爲每次腳本數據庫都有「懶惰」,並檢查腳本是否正常運行。 擁有數據庫的「完整副本」,只需將登錄信息更改爲該數據庫似乎更快,更容易維護(例如,爲新帳戶部署新版數據庫就如同執行模板備份一樣簡單) 。我會檢查上面的答案,說分離 - 複製 - 附加,如果不好,我會結束腳本我想。謝謝回答! – Julian 2013-03-26 19:00:44

+0

對不起,花了這麼長時間來回答,Stackoverflow似乎沒有提供任何有關我的問題的新答案的通知。 – Julian 2013-03-26 19:11:20

+0

感謝您回報這個有趣的問題!我想知道這裏提出的不同策略是如何產生的。所以請隨時離開進一步的意見:) – usr 2013-03-26 19:21:23