0

我正在使用 SQL Server 2012 构建一个系统,它是一个包含相同数据类型但针对每个用户的 Web 应用程序,因此我们为每个用户使用一个数据库,每个数据库都具有相同的结构,并且它是动态创建的,并且在用户单击时生效在确认帐户电子邮件上。

问题是创建数据库的脚本正在恢复一个名为 DB_GENERIC.bak 的数据库,它花费的时间比我预期的要多。我正在寻找优化这一点的方法,并最终创建了一个全新的数据库,但减少了所需的时间。(现在正在使用大约 15 秒来创建数据库),通用数据库恢复它的小(大约 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 '+@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)

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

朱利安。

4

3 回答 3

0

看看这个答案...... 复制数据库的最佳方法(SQL Server 2008)

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

于 2013-03-06T15:20:54.253 回答
0

...问题是我不需要数据或任何东西,只需要表、过程、函数和模式。

第 1 步是从数据中拆分架构。使用 SSMS“将数据库脚本作为...”生成一个 SQL 脚本,该脚本仅包含您希望新数据库拥有的架构/数据。为未来的模式模块(“basedatabase.sql”、“patch01.sql”等)制定计划,因为它会发生,你必须将这些模块应用到很多数据库。

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

顺便说一句,我同意其他海报:多个数据库的智慧;如果您预计有 50 个客户,这很好。如果您希望拥有 10,000 名客户,那么采用不同的方法会更好地为您服务。

于 2013-03-06T15:48:40.790 回答
0

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

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

于 2013-03-06T15:49:21.887 回答