我正在使用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)
我希望这可以帮助任何需要做同样事情的人,并感谢大家的答案。
儒略。
答案 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中。)
答案 2 :(得分:0)
我的信念是,您可以通过编写数据库脚本并执行脚本来做到最好。这样做的好处是您可以轻松地对内容进行版本控制。此外,要将所有租户数据库升级到新版本,您还需要编写delta版本。
您可以使用脚本数据库向导创建初始脚本。请务必更改高级选项,因为它们具有 crazy 默认值。他们只会遗漏一些触发器和其他东西。