为每个新用户恢复通用数据库

时间:2013-03-06 14:58:43

标签: sql-server database database-restore

我正在使用SQL Server 2012构建一个系统,它是一个包含相同数据类型的Web应用程序,但它是每个用户的特定类型,因此我们每个用户使用一个数据库,每个数据库具有相同的结构,并且它创建了dinamically并且在用户点击确认帐户电子邮件。

问题是创建数据库的脚本正在恢复名为DB_GENERIC.bak的数据库,并且花费的时间超出了我的预期。我正在寻找优化这种方法的方法,最终创建了一个全新的数据库,但减少了所需的时间。 (现在使用15秒创建数据库),而通用数据库恢复它的小(aprox 5mb和600kb压缩),所有表都是空的。

有没有其他方法可以完成此操作而不是恢复完整的数据库备份?我可以在t-sql上编写整个通用数据库的脚本并执行更改数据库名称吗?会更快吗? 或者是压缩或生成资源消耗较少的备份的任何其他方式,问题是我不需要数据或任何东西,只需要表,过程,函数和模式。

提前致谢


UDPATE:

感谢所有回复我问题的人,答案都非常棒,乐于助人。我最终使用@Love2Learn的答案,我尝试了分离复制附加方法。

为了让您想象这是如何实现的,我有一个存储过程,负责从具有以下内容的数据库模板中复制附加新数据库:

--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 '+@database1Name +'
MODIFY FILE (NAME = Database1_Generic, NEWNAME = '+@database1Name +')

ALTER DATABASE '+@database1Name +'
MODIFY FILE (NAME = Database1_Generic_Log, NEWNAME = '+@database1Name +'_log)

ALTER DATABASE '+@database2Name+'
MODIFY FILE (NAME = Database2_Generic, NEWNAME = '+@database2Name+')

ALTER DATABASE '+@database2Name+'
MODIFY FILE (NAME = Database2_Generic_Log, NEWNAME = '+@database2Name+'_log)
'

EXECUTE (@SQL)

我希望这可以帮助任何需要做同样事情的人,并感谢大家的答案。

儒略。

3 个答案:

答案 0 :(得分:0)

看看这个答案...... Best way to copy a database (SQL Server 2008)

最好的方法是分离复制附加。您可能希望创建一个模板数据库,并将其用作每个新数据库的基础。

答案 1 :(得分:0)

  

......问题是我不需要数据或任何东西,只需要表格,   程序,功能和模式。

第1步是从您的数据中拆分架构。使用SSMS“Script Database As ...”生成一个SQL脚本,该脚本仅包含您希望新数据库具有的架构/数据。制定未来架构模型的计划(“basedatabase.sql”,“patch01.sql”等)因为它将要发生,你将不得不将这些mod应用于许多数据库。

一旦你摆脱了数据,从脚本创建数据库将会快得多。如果速度不够快,请备份空数据库并从中恢复到新数据库。 (SQL Server Azure有一个很好的CREATE DATABASE_B AS COPY OF DATABASE_A但不在常规SQL Server中。)

BTW我同意其他海报的重要性:多个数据库的智慧;如果您希望有50位客户,这很好。如果您希望拥有10,000名客户,那么您可以通过不同的方法获得更好的服务。

答案 2 :(得分:0)

我的信念是,您可以通过编写数据库脚本并执行脚本来做到最好。这样做的好处是您可以轻松地对内容进行版本控制。此外,要将所有租户数据库升级到新版本,您还需要编写delta版本。

您可以使用脚本数据库向导创建初始脚本。请务必更改高级选项,因为它们具有 crazy 默认值。他们只会遗漏一些触发器和其他东西。